National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 78 24°C PM2.5 18
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 20

ANOVA 與無母數檢定

三組以上的比較、事後比較,Mann-Whitney 與 Kruskal-Wallis
Interaction實作 30 minute(s)

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 把組間與組內的平方和自己算一次,確認兩者一樣。

互動練習:組間與組內變異

三組虛構的進步分數,每組 8 人。短橫線是組平均、灰色虛線是全體平均、淡色直線是每個人離組平均的距離。拖動滑桿,看 ANOVA 表怎麼變。

事後比較: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 與無母數檢定

1.

比較 4 組時,為什麼不直接兩兩做 t 檢定?

2.

其他條件不變,只把每一組裡面每個人的差異放大(組平均不變),F 值會?

3.

ANOVA 得到 F=3.36、p=0.037,Tukey 事後比較只有 A 對 B 的 p=0.034,其他兩對 p 都大於 0.05。下面哪一個說法最恰當?

4.

下面哪一種情況,最適合改用 Kruskal-Wallis 而不是 ANOVA?

5.

下面程式會印出什麼?

from scipy import stats
res = stats.f_oneway([1, 2, 3], [4, 5, 6], [7, 8, 9])
print(round(res.statistic, 1))
第 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。

這一課完成了!
Next lesson:卡方檢定與簡單線性迴歸
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。