落ちこぼれナースの統計チャレンジ

元落ちこぼれ看護師(保健師)が、私と同じく統計にドキドキしている看護学生や保健師さんに、簡単な言葉で届けるために始めたブログです。

t検定入門 ~その差、本当に意味ある?~


どうも、ツシマです。
私による記念すべき第2回目の統計記事は、「t検定」についてです。
国家試験や卒論を控えている看護学生の皆さんも、統計の知識を忘却の彼方に置いてきてしまった皆さんも、ここで一緒に学びましょう!!


A地区とB地区、何かが違う…?

「A地区の住民、なんか血圧高すぎじゃね?」

あなたは、A地区とB地区の住民の健診結果を見ていました。
B地区は平均127mmHg、でもA地区は134mmHg。
「えっ、7mmHgも違うやんけ!これは健康格差では…?」

……ちょっと待った!!!それは本当に意味のある差なんでしょうか?

たまたま違って見えるだけかもしれないし、
実は大きな地域差かもしれない。

そんなときに登場するのが、t検定です。

t検定ってなに?

t検定は、2つのグループの平均値の差に“意味があるか”を調べる統計手法です。

つまり、差が「偶然」か、「本物」なのかを調べることができます。

たとえば…

  • 健康指導の前後で体重は本当に減ったのか?
  • A地区とB地区で血糖値の平均に差はあるか?
  • 男性と女性で運動時間に違いはあるか?

など、「2つのグループを比べたい!」という場面で大活躍します。

このように、保健師がt検定が使える場面はたくさんあります。

t検定って2種類あんねん

実はt検定は2種類存在するのです。

  • Studentのt検定
  • Welchのt検定

どちらも2つのグループを比較するという点では同じですが、前提条件が異なります。

Studentのt検定

「2つのグループは、データのばらつきも同じ」という前提で2つのグループを比較します。

簡単にいうと、理想主義者タイプです。

「分散(ばらつき)が同じ」という前提なので、

  • 人数が同じ
  • バラつきも似ている

というきれいな条件下では、問題なく使えます。

Welchのt検定

「2つのグループのばらつきが違っていても、それぞれきちんと考慮するよ」という検定です。

Studentのt検定とは反対に、現実主義者タイプです。

  • グループごとの人数がバラバラ
  • バラつきが全然違う

そうです、保健師の現場では、Welchのt検定の方が適していることが多いと考えられます。

なぜ保健師が使うならWelchのt検定が良いの?

現場でありがちなケースとしては、

  • 女性30人・男性8人
  • 65歳未満10人・高齢者20人
  • そもそもばらつきがどうなってんのか想像できねーよ

このような状況では、理想主義者のStudentのt検定は向かないのです。

だからこそ、Welchのt検定が役立ちます。

t検定の比較

  • Studentのt検定

分散が同じと仮定。

サンプル数・バラつきが似ている時に有効

  • Welchのt検定

分散が異なってもOK。

人数やばらつきが不均等な、現場の実データに向いている。

実際にやってみた

架空のデータを使ってt検定をやってみます。

Studentのt検定

調査対象のA地区とB地区の人達の人数が同じだったとします。

地区収縮期血圧
A125
A127
A123
A124
A126
A128
A122
A129
A127
A125
A126
A124
B124
B126
B122
B127
B125
B128
B123
B126
B125
B127
B124
B126

こんなに単純なデータは滅多にありませんが、今回はt検定の説明のためなので多めにみてください。

そして、Excelの「データ」タブ→「データ分析」機能を使ってStudentのt検定をやった結果がこちら。

t-検定: 等分散を仮定した2標本による検定
 変数 1(A地区)変数 2(B地区)
平均125.5125.25
分散4.272727273.11363636
観測数1212
プールされた分散3.69318182
仮説平均との差異0
自由度22
(t値)0.318651
P(T<=t) 片側0.37649834
t 境界値 片側1.71714437
P(T<=t) 両側(p値)0.75299667
t 境界値 両側(両側t境界値)2.07387307 

ナニソレイミワカンナイですね。

順を追って解説します。

  • 平均

ぱっと見でも、A地区とB地区ではほとんど差がありませんね。

  • 分散

これも似たり寄ったり。

  • 観測数

12人ずつ。バランスが良いですね。だからこそStudentのt検定を使ってみたのですが。

  • プールされた分散

A地区・B地区の2つのグループの分散を合体させたものです。

  • 自由度

自由度をざっくり言うと、「データの中で自由に動ける数」=「ある条件を満たしつつ、“自由に決められるデータの数”」のことです。

統計の計算で使える情報の量だと思ってください。

今回のStudentのt検定では、

自由度=地域Aの人数+地域Bの人数-2

今回のケースでは、

A地区:12人、B地区:12人
→ 自由度 = 12 + 12 − 2 = 22

これは「2グループからそれぞれ平均を計算したため、2つの制約1があるから−2」です。

自由度が大きいほど、正規分布に近づき、安定した「信頼できる検定」になります。

  • t値

t値は、2つのグループの平均の差が、バラつきに比べてどれくらい大きいかを示す指標です。

つまり、「この差、バラつきを考えてもちゃんと大きいと言えるの?」ということを数値で示してくれます。

t = (平均A − 平均B) ÷ 差の標準誤差(ばらつき+人数で決まる)

平均の差が大きいほどt値が大きく、バラつきが大きいほどt値が小さくなります。

t値の判断基準としては、

t値が両側境界値(後述)より大きければ→有意差あり(p値が小さい)

t値がその範囲であれば→有意差なし(p値が大きい)

  • p値(両側2

p値は簡単に言えば、「本当は差がないはずなのに、こんなに差があるとは…偶然にしてはできすぎじゃね?」ということを数字で表したものです。

一般に「有意水準(α)3」は0.05(5%)です。

今回の場合は、p値は0.753だったため、「今回の検定では有意差がみられなかった」とみなします。

ちなみによく間違えられがちですが、

❌p値が小さい=差が大きい → p値は差の大きさではなく信頼性を示します

❌p値が大きい=差がない →差があるとは言えなかっただけ

❌p値だけ見ればOK →統計的有意とは臨床的な意味があるとは限りません

恥ずかしながら私もつい最近まで誤解してました。これを機に統計つよつよ保健師になっちゃいましょう。

  • 両側t境界値

両側t境界値は、「t値がこの数値より大きい(小さい)と、有意な差があるとみなしてOK!」というボーダーラインです。

今回は、
t値 = 0.318
両側t境界値 = ±2.074
p値 = 0.753

今回の t値(0.318)はその範囲内なので、
 →「差は有意ではない(偶然の範囲内)」と判断されます。

Welchのt検定

お待たせしました。次はWelchのt検定をやってみます。
Welchのt検定とは、グループごとの人数がバラバラで、バラつきの差が大きいデータに使うんでしたね。

お次に使うデータはこちらです。

地区収縮期血圧
A125
A128
A122
A130
A126
A129
A127
A124
A123
A125
A128
A127
A126
A124
A129
B132
B145
B120
B138
B150
B142
B135
B149
B140

そして、Welchのt検定の結果がこちら。

t-検定: 分散が等しくないと仮定した2標本による検定




変数 1(A地区)変数 2(B地区)
平均126.2139
分散5.686.75
観測数159
仮説平均との差異0
自由度9
-4.0452441
P(T<=t) 片側0.00145281
t 境界値 片側1.83311293
P(T<=t) 両側0.00290561
t 境界値 両側2.26215716

もう一度結果を見ていきましょう。

  • 平均

A地区は穏やかなのに対し、B地区はなかなかパンチが効いていますね。

  • 分散

B地区は分散がでかくて個性豊かすぎですね。

  • 観測数

A地区が15人に対し、B地区は9人。B地区の人にはもう少し健診に来てもらいたいですね。

  • t値

t値が-4.05で両側t境界値が±2.262。t値が両側t境界値を飛び越えています。
この差は偶然では済まされません…!

  • 自由度

Studentのt検定とは異なり、人数も分散もバラバラなので自由度は自動で計算されます。

  • p値(両側)

今回は0.0029…有意水準(0.05)を下回っているので、この差は有意と考えられます。

まとめ

t検定は難しそうですが、実態は「2つの平均を比べるだけ」です。

味方につければ強力です。

これから楽しいt検定ライフをお過ごしください!

おまけ Pythonでt検定をやるには?

ここから先は、Pythonを使ったt検定について私の備忘録を書きます。
保健師・看護学生の方々は読み飛ばしてもOKです。

先ほどのA地区・B地区のデータを使って、Pythonを使ったコードを作ります。

  • Studentの検定
import pandas as pd
from scipy import stats

# データ読み込み
path = 'ファイルパス名'
df_student = pd.read_excel(path)

# グループ分け
groupA_student = df_student[df_student['地区'] == 'A']['収縮期血圧']
groupB_student = df_student[df_student['地区'] == 'B']['収縮期血圧']

# Studentのt検定(equal_var=True)
t_stat_student, p_value_student = stats.ttest_ind(groupA_student, groupB_student, equal_var=True)

print("\nStudentのt検定結果(分散が等しい前提)")
print(f"t値 = {t_stat_student:.4f}")
print(f"p値 = {p_value_student:.4f}")

# 有意水準
alpha = 0.05

# Studentの検定結果判定
if p_value_student < alpha:
    print("→ Student検定:有意差あり(差は偶然ではない)")
else:
    print("→ Student検定:有意差なし(偶然の範囲)")

出力:
→ Student検定:有意差なし(偶然の範囲)

  • Welchのt検定
import pandas as pd
from scipy import stats

# データ読み込み
path = 'ファイルパス名'
df_welch = pd.read_excel(path)

# グループ分け
groupA_welch = df_welch[df_welch['地区'] == 'A']['収縮期血圧']
groupB_welch = df_welch[df_welch['地区'] == 'B']['収縮期血圧']

# Welchのt検定(equal_var=False)
t_stat_welch, p_value_welch = stats.ttest_ind(groupA_welch, groupB_welch, equal_var=False)

print("Welchのt検定結果(分散が異なる前提)")
print(f"t値 = {t_stat_welch:.4f}")
print(f"p値 = {p_value_welch:.4f}")

# 有意水準
alpha = 0.05

# Welchの検定結果判定
if p_value_welch < alpha:
    print("→ Welch検定:有意差あり(差は偶然ではない)")
else:
    print("→ Welch検定:有意差なし(偶然の範囲)")

出力:

→ Welch検定:有意差あり(差は偶然ではない)

脚注:

  1. 制約:自由度の中に平均(という条件)があると、最後の値は「自分で決められない=制約されてしまう」ということです。
    例えば、「5人の血圧の平均が130になるようにしなさい」と言われた場合、
    1人目:128
    2人目:132
    3人目:131
    4人目:127
    まで自由に決められます。
    しかし、
    5人目:計算で自動的に決まってしまいます!
     → 平均130にするには、合計650が必要。4人分で既に518なので、
      650 − 518 = 132
    この状態を、「自由ではない」=「制約がある」というのです。
    今回のA地区・B地区のケースでは、2つの地区それぞれに「平均」という条件をつけているため、合計で-2の制約があります。 ↩︎
  2. 両側検定とは、「差がある」ことを判断したい時に、差が
    プラス側に大きい(例:A>B)、マイナス側に大きい(例:A<B)のどちらにも注目する検定のことです。
    片側検定は、上記のどちらかのみに注目します。
    今回のt検定では、敢えて片側検定には触れていません。 ↩︎
  3. 有意水準:「どこまでなら偶然として許せるかのライン」です。つまり、「これくらいの確率で”偶然”が起きるのなら、偶然としてみなすのはやーめた」という判定ラインです。 ↩︎

コメントを残す