Learning Objectives
- 說出比較三組以上時,為什麼不直接兩兩做 t 檢定
- 用組間變異與組內變異解釋 F 值,並用 scipy.stats.f_oneway 做單因子 ANOVA
- ANOVA 顯著之後,用 Tukey HSD 事後比較找出是哪幾組不同
- 在資料是順序尺度、很偏或有極端值時,改用 Mann-Whitney 或 Kruskal-Wallis 這類以名次為基礎的檢定
三種教學方式,哪一種比較好?
上一課比較了 A、B 兩種教學方式。teaching_trial.csv 其實有三種:A、B、C 各 60 人(模擬資料,不是任何學校的真實實驗)。
直覺的做法是兩兩比較:A 對 B、A 對 C、B 對 C,做三次 t 檢定。
問題在上一課的多重比較:每次檢定都有 5% 的假陽性機會,做三次,「至少一次假陽性」的機率就超過 5%(三個檢定互相獨立時約 1 − 0.95³ ≈ 14%); 組數越多,兩兩比較的次數增加得越快(5 組就要比 10 次)。
單因子變異數分析(one-way ANOVA)先用一個檢定回答:「這幾組的母體平均是不是全部相同?」 如果答案是「不全相同」,再用事後比較找出是哪幾組不同,事後比較本身會控制多重比較的錯誤率。
F 值:組間差異和組內差異的比
ANOVA 把每個人和全體平均的差距拆成兩部分:
| 部分 | 意思 | 平方和 |
|---|---|---|
| 組間(between) | 各組平均離全體平均多遠 | 每組「人數 × (組平均 − 全體平均)²」加總 |
| 組內(within) | 每個人離自己那一組的平均多遠 | 每個人「(值 − 組平均)²」加總 |
各自除以自由度得到均方(MS),兩者相除就是 F:
F = 組間均方 ÷ 組內均方 (組間自由度=組數 − 1,組內自由度=總人數 − 組數)
- 組平均差得越多 → 組間變大 → F 變大。
- 組內每個人差異越大 → 組內變大 → F 變小:同樣的平均差,被個人差異「淹沒」了。
- 虛無假設(各組母體平均都相同)為真時,F 通常在 1 附近;F 越大,p 值越小。
- η²(eta 平方)=組間平方和 ÷ 總平方和:分數的變異有多少比例和分組有關,是 ANOVA 常用的效果量。
ANOVA 的前提:各組獨立、組內大致常態、各組變異數差不多。各組人數夠多時,對常態的要求比較寬鬆。
逐步看:f_oneway 與自己算 F
先用 SciPy 一行算出 F 與 p,再用 groupby 把組間與組內的平方和自己算一次,確認兩者一樣。
事後比較:Tukey HSD
ANOVA 顯著只說「不全相同」。要知道哪幾組不同,常用 Tukey HSD(honestly significant difference,Tukey, 1949):
它同時比較每一對組,並把「整組比較的型一錯誤率」控制在 α,所以比直接做三次 t 檢定保守。
SciPy 的 stats.tukey_hsd(a, b, c) 回傳的結果可以直接印出:每一列是一對組的平均差、p 值與信賴區間;各組人數不同時,它用的是 Tukey-Kramer 的做法。
讀表時注意:組的編號依你傳入的順序(0、1、2),(0 - 1) 是「第 0 組減第 1 組」,每一對會正反各出現一次。
逐步看:哪兩組的差異達顯著
不靠平均:以名次為基礎的無母數檢定
t 檢定與 ANOVA 比的是平均,也需要大致常態的前提。有些資料不適合:
- 順序尺度:滿意度 1~5 分,「5 分和 4 分的差距」不一定等於「2 分和 1 分的差距」,算平均有爭議。
- 很偏或有極端值:幾個極端值就能把平均拉走。
無母數檢定把所有資料一起排序、換成名次,再比較各組的名次:
| 情況 | 平均(有母數) | 名次(無母數) |
|---|---|---|
| 兩組獨立 | ttest_ind |
mannwhitneyu(Mann-Whitney U) |
| 三組以上 | f_oneway |
kruskal(Kruskal-Wallis H) |
它們檢定的是「各組的分布是否相同」;各組分布形狀相似時,可以解讀成中位數的差異。名次對極端值不敏感,但也丟掉了「差多少」的資訊, 資料符合 t 檢定的前提時,t 檢定通常比較有檢定力。
SciPy 的預設:mannwhitneyu 是雙尾(alternative='two-sided'),method='auto' 在其中一組 8 筆以下且沒有同分時用精確分布,
否則用常態近似(含同分校正與連續性校正);kruskal 用卡方分布近似並做同分校正。滿意度這種資料同分很多,所以會用常態近似。
逐步看:三種教學方式的滿意度
實作:三門課的期末成績
讀入 grades.csv,取出「微積分」「統計學」「英文」三門課的期末成績(final),分別做 ANOVA(f_oneway)與 Kruskal-Wallis(kruskal)。
統計量四捨五入到小數 2 位,p 值用科學記號寫到小數 1 位(f"{p:.1e}"),印成兩行:
F: ... p: ...
H: ... p: ...
小測驗:ANOVA 與無母數檢定
比較 4 組時,為什麼不直接兩兩做 t 檢定?
其他條件不變,只把每一組裡面每個人的差異放大(組平均不變),F 值會?
ANOVA 得到 F=3.36、p=0.037,Tukey 事後比較只有 A 對 B 的 p=0.034,其他兩對 p 都大於 0.05。下面哪一個說法最恰當?
下面哪一種情況,最適合改用 Kruskal-Wallis 而不是 ANOVA?
下面程式會印出什麼?
from scipy import stats
res = stats.f_oneway([1, 2, 3], [4, 5, 6], [7, 8, 9])
print(round(res.statistic, 1))
重點整理
- 三組以上不要直接兩兩做 t 檢定:假陽性會累積。先做單因子 ANOVA(
stats.f_oneway)。 - F=組間均方 ÷ 組內均方:組平均差越多、組內差異越小,F 越大。η² 是組間平方和占總平方和的比例。
- ANOVA 顯著只表示「不全相同」;用 Tukey HSD(
stats.tukey_hsd)找出哪幾對不同。未達顯著不等於相同。 - 順序尺度、很偏或有極端值:用名次為基礎的檢定,兩組
mannwhitneyu、三組以上kruskal。 - 報告結果時,除了 p 值,也要寫各組的平均(或中位數)、效果量與信賴區間。
- 下一課處理類別對類別(卡方檢定)與數值預測數值(簡單線性迴歸)。
參考資料:Tukey, J. W. (1949). Comparing individual means in the analysis of variance. Biometrics, 5(2), 99–114。