← 授業トップへ戻る


本日の目標

  1. 独立2標本t検定の論理を理解する
  2. Rで t.test() を実行し,結果を解釈できる
  3. 効果量(Cohenの d)を計算・解釈できる
  4. 発展:t統計量と効果量 d の式を,自分で導ける

準備:パッケージの読み込み

この回のコードは,すべて tidyverse を読み込んだ状態で動きます。 RStudioを起動したら,まずこれを実行してください。

library(tidyverse)

毎回必要です。読み込まないまま filter() や ggplot() を使うと, 「関数が見つかりません」というエラーになります。


1. 2群の平均値を比較するとき

「差がある」とはどういうことか?

  • A組の平均点:75点,B組の平均点:80点
  • この5点の差は偶然のばらつきか,本当の差か?

→ t検定(独立2標本t検定) で統計的に判断します


2. t検定の仕組み

仮説の設定

  • 帰無仮説 H₀:2群の母平均は等しい(μ₁ = μ₂)
  • 対立仮説 H₁:2群の母平均は異なる(μ₁ ≠ μ₂)

t統計量

\[t = \frac{\bar{x}_1 - \bar{x}_2}{SE_{差}}\]

  • 分子:2群の平均値の差
  • 分母:標準誤差(ばらつきの大きさを考慮)

→ t値が大きいほど「差が大きく,偶然とは言いにくい」

導出①:分母の \(SE_{差}\) は,2つの標準誤差から作られる

2群の平均値の差 \(\bar{x}_1 - \bar{x}_2\) も,標本を取り直すたびに揺れる量です。その揺れの大きさが分母になります。

分散は,2群が互いに独立なら和について加法的です。引き算でも符号は効きません(\(\mathrm{Var}[-X] = \mathrm{Var}[X]\))。したがって

\[\mathrm{Var}[\bar{X}_1 - \bar{X}_2] = \mathrm{Var}[\bar{X}_1] + \mathrm{Var}[\bar{X}_2]\]

各群の標本平均の標準誤差は \(SE_i = s_i / \sqrt{n_i}\) なので,平方根を取って

\[SE_{差} = \sqrt{SE_1^2 + SE_2^2} = \sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}\]

これが \(t = \dfrac{\bar{x}_1 - \bar{x}_2}{SE_{差}}\) の分母の正体です。

数値で確かめる:mtcars では,オートマ \(SE_1 = 0.8796\),マニュアル \(SE_2 = 1.7103\) なので

\[SE_{差} = \sqrt{0.8796^2 + 1.7103^2} = 1.9232\]

平均差 \(7.2449\) をこれで割ると \(7.2449 / 1.9232 = 3.7671\) となり,あとで t.test() が返す \(t = -3.7671\) の絶対値と一致します(符号は引き算の向きの違いです)。

この式は「2群が独立」を使っています。 同じ人を2回測ったデータ(前後比較など)では2つの測定が独立ではないので,この足し算は成り立ちません。その場合は先に差を取って1標本として扱います(第11回の対応のあるt検定)。

使った数学:分散の加法性と,平方根。独立でなければ共分散の項が残ります。

導出②:なぜ正規分布ではなく \(t\) 分布なのか

もし母標準偏差 \(\sigma\) が分かっていれば,平均の差を \(\sigma\) から作った標準誤差で割った量は標準正規分布に従います。分母が定数だからです。

しかし実際には \(\sigma\) は分かりません。手元の標本から \(s\) を計算して代わりに使います。すると分母もランダムに揺れる量になります。

\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{s_1^2/n_1 + s_2^2/n_2}}\]

たまたま \(s\) が小さめに出た標本では,分子が普通でも比が大きくなります。この「分母のブレ」のぶんだけ,\(t\) の分布は正規分布より裾が重くなります。標本が小さいほど \(s\) が当てにならないので,裾はさらに重くなります。これを表すのが自由度です。自由度が大きくなると \(t\) 分布は標準正規分布に近づき,\(n\) が十分大きければ違いは実用上なくなります。

数値で確かめる:mtcars の Welch法では \(df = 18.33\) と小数になります。これは2群の分散が異なる場合に自由度を近似的に決めるためです。等分散を仮定する Student法では \(df = n_1 + n_2 - 2 = 30\) となり,\(t = -4.1061\),\(p = 0.000285\) です(Welch法は \(t = -3.7671\),\(p = 0.001374\))。

使った数学:標準化と,未知の母数を推定量で置き換えるという考え方。なお \(t\) 分布の密度関数そのものを導くのは,この科目の範囲外です。


3. Rで独立2標本t検定を実行する

例:オートマ vs. マニュアル車の燃費

# mtcars データ:am(0=オートマ, 1=マニュアル)ごとの燃費(mpg)
mtcars |>
  group_by(am) |>
  summarise(n = n(), mean_mpg = mean(mpg), sd_mpg = sd(mpg))
# 箱ひげ図で確認
mtcars |>
  mutate(am = factor(am, labels = c("オートマ", "マニュアル"))) |>
  ggplot(aes(x = am, y = mpg, fill = am)) +
  geom_boxplot() +
  geom_jitter(width = 0.1, alpha = 0.5) +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "トランスミッション別の燃費", x = "トランスミッション", y = "燃費 (mpg)") +
  theme_bw() +
  theme(legend.position = "none")

# t検定の実行
t.test(mpg ~ am, data = mtcars)
## 
##  Welch Two Sample t-test
## 
## data:  mpg by am
## t = -3.7671, df = 18.332, p-value = 0.001374
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -11.280194  -3.209684
## sample estimates:
## mean in group 0 mean in group 1 
##        17.14737        24.39231

mpg ~ am という書き方(チルダ記法) ~ の左に「比べたい数値」,右に「グループを表す列」を書きます。 「am で分けたときの mpg」という意味です。 第9回の xtabs(Freq ~ Sex + Survived, ...) や,第13回の分散分析 aov(...) でも同じ形を使います。 Rで「何を何で説明するか」を書くときの共通の書式だと覚えてください。

出力の1行目が Welch Two Sample t-test になっていることに注目。 t.test() は何も指定しないとWelch法で計算します(§4で扱います)。

結果の読み方

    Welch Two Sample t-test

data:  mpg by am
t = -3.7671, df = 18.332, p-value = 0.001374
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -11.280194  -3.209684
sample estimates:
mean in group 0 mean in group 1
       17.14737        24.39231
項目 意味
t t統計量(負の値 = group0 < group1)
df 自由度
p-value p値(< 0.05 で有意)
95% CI 平均差の95%信頼区間(0を含まなければ有意)
mean in group 0/1 各群の平均値

4. 等分散性の検定

Welch法(分散が等しくない場合に対応)とStudent法(等分散を仮定)の使い分け:

# 等分散性の検定(F検定)
var.test(mpg ~ am, data = mtcars)
## 
##  F test to compare two variances
## 
## data:  mpg by am
## F = 0.38656, num df = 18, denom df = 12, p-value = 0.06691
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.1243721 1.0703429
## sample estimates:
## ratio of variances 
##          0.3865615

教科書などでよく見るのは,次の使い分けです。

  • p < .05 → 分散が有意に異なる → Welch法を使う
  • p ≥ .05 → 分散が等しいと判断 → Student法でも可
# Student法(var.equal = TRUE)
t.test(mpg ~ am, data = mtcars, var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  mpg by am
## t = -4.1061, df = 30, p-value = 0.000285
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -10.84837  -3.64151
## sample estimates:
## mean in group 0 mean in group 1 
##        17.14737        24.39231

このデータではどうなったか

上の var.test() の結果は F = 0.387, p = .067 でした。\(p \geq .05\) なので, さきほどの使い分けに従えば「等分散と判断してStudent法」になります。

それでも,この授業ではWelch法の結果(§3・§6)を採用します。 理由は2つあります。

① F検定の結果で手法を選ぶ(2段階の手続き)のは,現在は推奨されていません。 「有意でなかったから等分散」は「等分散であることが示された」とは違います。 n が小さいと差があっても有意になりにくいだけで,このデータも標準偏差は 3.83 対 6.17(分散で2.6倍)とかなり違います。p = .067 は境界すぐそばの値です。 さらに,検定の結果を見てから次の検定を選ぶと,全体の第1種の誤りの確率が 名目の5%からずれてしまいます。

② Welch法は,等分散のときに使っても損がほとんどありません。 分散が等しい場合でもWelch法の性能はStudent法とほぼ変わらず, 等しくない場合にはStudent法より明らかに正確です。 最初からWelch法にしておけば,等分散かどうかを判断する必要がありません。

この授業の方針:独立2標本t検定は t.test() をそのまま使う(=Welch法)。 var.test() は「手法を選ぶため」ではなく,2群のばらつきの違いそのものを知りたいときに使ってください。

なお var.test() のF検定は,データが正規分布から外れていると結果が当てにならないことが 知られています。これも,F検定に判断を委ねない理由のひとつです。


5. 効果量:Cohenの d

p値は「差が有意かどうか」しか教えてくれません。 「どのくらいの差か」 を表すのが効果量です。

\[d = \frac{\bar{x}_1 - \bar{x}_2}{SD_{プール}}\]

分母の \(SD_{プール}\) は,2群の標準偏差を1つにまとめたものです。 それぞれの群の標準偏差を,自由度 \(n_i - 1\) で重みづけして平均します。

\[SD_{プール} = \sqrt{\frac{(n_1 - 1)s_1^2 + (n_2 - 1)s_2^2}{n_1 + n_2 - 2}}\]

下のコードは,この式をそのまま書いたものです。var() が \(s^2\) にあたります。

# Cohenの d を手動で計算
auto   <- mtcars |> filter(am == 0) |> pull(mpg)
manual <- mtcars |> filter(am == 1) |> pull(mpg)

mean_diff <- mean(manual) - mean(auto)
sd_pooled <- sqrt(((length(auto)-1)*var(auto) + (length(manual)-1)*var(manual)) /
                  (length(auto) + length(manual) - 2))
d <- mean_diff / sd_pooled
round(d, 2)
## [1] 1.48

Cohenの d の目安

d の値 効果の大きさ
0.2 小
0.5 中
0.8以上 大
導出③:\(d\) は「標準偏差何個分」,\(t\) は「それに \(\sqrt{n}\) を掛けたもの」

効果量の式

\[d = \frac{\bar{x}_1 - \bar{x}_2}{SD_{プール}}\]

は,分子と分母が同じ単位です。割り算で単位が消えるので,\(d\) は単位のない数になります。つまり「差は標準偏差いくつ分か」だけを表します。

測定単位を変えても \(d\) は変わりません。 燃費を mpg から km/L に換算(\(\times 0.425144\))しても,分子も分母も同じ倍率で変わるため \(d = 1.4779\) のまま一致します。

ここで \(t\) と \(d\) の関係を見ます。等分散を仮定する Student法では,両者は次の式で厳密に結ばれます。

\[t = d \times \sqrt{\frac{n_1 n_2}{n_1 + n_2}}\]

数値で確かめる:\(d = 1.4779\),\(\sqrt{19 \times 13 / 32} = 2.7783\) なので積は \(4.1061\)。Student法の \(t = 4.1061\) と完全に一致します。

この式の右辺で,\(d\) には \(n\) が入っていません。\(n\) は平方根の側にだけ入っています。つまり

  • \(d\) は標本サイズを増やしても変わらない(差そのものの大きさ)
  • \(t\) は標本サイズを増やすと \(\sqrt{n}\) に比例して大きくなる(したがって \(p\) は小さくなる)

同じデータを複製して \(n\) だけ増やすと,これがはっきり見えます(上の式に合わせて \(t\) はStudent法の値です)。

データの量 合計 \(n\) \(t\)(Student法) \(d\)
そのまま 32 4.11 1.48
2倍 64 5.90 1.50
4倍 128 8.42 1.51
10倍 320 13.37 1.52

\(t\) は3倍以上になるのに,\(d\) はほとんど動きません(わずかな増加は,プールした標準偏差の自由度 \(n_1 + n_2 - 2\) が変わるためです)。

この表の「そのまま 32」の \(t = 4.11\) は Student法の値です。 §3でWelch法が返した \(t = 3.77\) とは別の数字なので,混同しないでください。 Welch法でも「\(n\) を増やすと \(t\) は大きくなり,\(d\) は動かない」という結論は同じです (Welch法だと 3.77 → 5.43 → 7.75 → 12.32)。

「有意」は \(n\) を増やせば作れますが,「重要」はそうではありません。 これが,p値だけでなく効果量を併せて報告する理由です。

使った数学:無次元量(単位が消える割り算)と,平方根。


6. 結果の報告

論文・レポートでの記述例:

マニュアル車(M = 24.39, SD = 6.17)の燃費は, オートマ車(M = 17.15, SD = 3.83)に比べて有意に高かった, t(18.33) = 3.77, p = .001, d = 1.48。

報告の要素:各群の M と SD,t値,df,p値,効果量 d

\(t\) と \(d\) の符号について。 t.test(mpg ~ am) の出力は \(t = -3.77\) でした。これは am = 0(オートマ)から am = 1(マニュアル)を引いた向きだからで,「マニュアルのほうが低い」という意味ではありません。 報告では上の例のようにどちらが高いかを言葉で書くので,数値は絶対値で構いません。 ただし言葉と符号が食い違わないように気をつけてください。

信頼区間も書けるとより良い報告になります。 §3の出力にある 95% CI \([-11.28,\ -3.21]\) は「平均差がこの範囲にありそうだ」という区間です。 「マニュアル車の燃費は 3.21〜11.28 mpg 高い(95% CI)」と添えると, 「有意かどうか」だけでなく差の大きさの不確かさまで伝わります。


演習

演習1:基本統計量の確認

iris データを使って,setosa と versicolor の Petal.Length を比較します。 まず,2群の平均・標準偏差・サンプルサイズを確認してください。

iris |>
  filter(Species %in% c("setosa", "versicolor")) |>
  group_by(Species) |>
  summarise(n = n(), mean = mean(___), sd = sd(___))

演習2:箱ひげ図

演習1の2群を箱ひげ図で比較してください。

演習3:t検定の実行

iris の setosa と versicolor の Petal.Length を比べるt検定を実行し, 結果を解釈してください。

iris_sub <- iris |> filter(Species %in% c("setosa", "versicolor"))
t.test(___ ~ ___, data = iris_sub)

演習4:レポート形式でまとめる

演習3の結果を,論文の結果の節として1〜2文で記述してください。 (M, SD, t値, df, p値を含める)


本日のまとめ

  • 独立2標本t検定で「2群の平均値の差が偶然かどうか」を検定できる
  • t.test() で t値・df・p値・信頼区間を取得
  • 効果量 Cohenの d で「差の大きさ」を表す
  • 結果の報告では M, SD, t, df, p, d を記載する

宿題・予習

  • 演習3〜4を仕上げ,スクリプトを保存
  • 次回は 対応のあるt検定とデータ構造 を学びます
  • 「対応あり」と「対応なし」の違いを教科書で確認しておく

← 授業トップへ戻る