7.4 比例檢定與卡方檢定#
本節目標#
- 理解「比例」與「類別資料」為什麼不能直接用 t 檢定
- 分辨精確二項檢定(
r.binom_test)與比例檢定(r.prop_test)的差異與連續校正 - 用卡方適合度檢定(
r.chisq_test)檢驗一組類別次數是否符合假設比例 - 用卡方獨立性檢定(
r.chisq_test_table)處理列聯表 - 了解 Pearson 1900 年的卡方統計量與 Yates 1934 年的連續校正各自解決了什麼問題
問題:比例與類別,不能用平均數思考#
前兩節的 t 檢定都假設資料是「連續量測值」:填充機重量、電池壽命、收縮壓。但有一大類問題不是這樣的:
- 比例:100 片藥裡有 12 片不良品,這個不良率是不是高於標示的 5%?
- 類別次數:某工廠生產的零件,按顏色分成 4 類,觀察次數 315 / 101 / 108 / 32,這個比例符不符合 9:3:3:1?
這兩種資料的共同特徵是:背後的母體參數是「機率」或「比例」,不是「平均值」。用 t 檢定會出錯。
更根本的問題是:當期望次數很小時,近似會失效。卡方統計量假設期望次數夠大(比如 ≥5)才準確;小樣本需要用精確方法。本節會把這條界線畫清楚。
理論:三個檢定的分工#
1900:Pearson 的卡方統計量#
19 世紀末,生物學家面對大量「類別次數是否符合某個比例」的問題(例如孟德爾的豌豆)。當時的生物統計學派(以 Karl Pearson 為首)信仰常態分布,但生物資料常常嚴重偏斜。
Karl Pearson 在 1900 年發表〈On the criterion that a given system of deviations from the probable in the case of a correlated system of variables is such that it can be reasonably supposed to have arisen from random sampling〉,提出卡方統計量:
$$ X^2 = \sum_{i=1}^{k}\frac{(x_i - m_i)^2}{m_i}
$$ 其中 \(x_i\) 是觀察次數、\(m_i = n p_i\) 是假設下的期望次數。Pearson 證明:當 \(n\) 夠大時,\(X^2\) 近似服從 \(\chi^2_{k-1}\)(自由度是 \(k-1\) 而非 \(k\),因為總和 \(\sum x_i = \sum m_i = n\) 是一個限制)。
Pearson 當時留下一個漏洞:期望次數是從資料估計出來的(例如估計母體比例),這個「\(X^2\) 會偏大」的問題讓爭議持續了 20 年。Fisher 在 1922 與 1924 年的兩篇論文〈On the Interpretation of \(\chi^2\) from Contingency Tables〉正確處理了這個問題(自由度要依估計的參數數目扣減),從此卡方檢定才有了嚴格的理論基礎。
1922–1924:Fisher 補上卡方的理論漏洞#
Pearson 當時留下一個漏洞:期望次數是從資料估計出來的(例如估計母體比例),這個「\(X^2\) 會偏大」的問題讓爭議持續了 20 年。Fisher 在 1922 與 1924 年的兩篇論文〈On the Interpretation of \(\chi^2\) from Contingency Tables〉正確處理了這個問題(自由度要依估計的參數數目扣減),從此卡方檢定才有了嚴格的理論基礎。
1934:Yates 的連續校正#
卡方統計量把離散次數當成連續變數處理,會系統性高估統計量。Frank Yates 在 1934 年提出校正:把每格的 \(|x_i - m_i|\) 減去 0.5
$$ X^2_{Yates} = \sum_{i=1}^{k}\frac{\left(|x_i-m_i| - 0.5\right)^2}{m_i}
$$ 校正讓統計量變小、p 值變大,檢定更保守。它只在 \(2\times2\) 表上有意義(其他表格自由度更大、近似本來就夠好),這也是 R 的 chisq.test 只對 2×2 表預設套用校正的原因。
精確二項 vs 比例檢定#
- 精確二項檢定(
r.binom_test):直接把 \(H_0\) 下的二項分布算出來,\(p\) 值 = \(P(X \ge x)\)(或對稱的雙尾版本)。沒有任何近似,小樣本也準確。代價是 p 值的「格點性」——它只能取某些離散值。 - 比例檢定(
r.prop_test):用卡方統計量(\(X^2\) 來自 \((x-np_0)^2/(np_0(1-p_0))\) 的推導),是一種漸近近似。\(correct=True\)(預設)時套用 Yates 校正。樣本大時兩者幾乎一樣,樣本小時差距明顯。
適合度 vs 獨立性#
- 適合度檢定(
r.chisq_test):一組類別次數是否符合指定的機率向量。自由度 \(k-1\)。 - 獨立性檢定(
r.chisq_test_table):列聯表的兩個變數是否獨立。自由度 \((r-1)(c-1)\)。
兩者的統計量形式相同(都是「(觀察 − 期望)²/期望」加總),差別只在期望次數怎麼算:適合度用外部指定的 \(p_i\);獨立性用「行總和 × 欄總和 / 總和」。
動手:比例檢定#
情境:藥廠抽驗,12/100 不良#
藥廠宣稱不良率不超過 5%。品管抽了 100 片,發現 12 片不良。要檢定不良率是否高於 5%(\(H_0: p = 0.05\) 對 \(H_1: p > 0.05\))。
精確二項檢定#
import rstatistics as r
print(r.binom_test(12, 100, 0.05, alternative='greater'))
Exact binomial test
data: 12 and 100
number of successes = 12, number of trials = 100, p-value = 0.004274
alternative hypothesis: true probability of success is greater than 0.05
95 percent confidence interval:
0.07072184 1.00000000
sample estimates:
probability of success
0.12
讀法:
- 精確:p 值 = \(P_{H_0}(X \ge 12)\),其中 \(X \sim Binomial(100, 0.05)\)。這是精確值,沒有近似。
- p = 0.00427 < 0.05 → 證據足夠,不良率確實高於 5%。
- 95% CI 下界 0.0707:95% 信心不良率在 7.07% 以上。CI 的下界大於 5%,與 p < 0.05 是同一件事的兩種說法(對偶性,第 7.5 節專講)。
sample estimates: probability of success 0.12就是樣本比例 \(12/100\)。
比例檢定(卡方近似 + Yates 校正)#
print(r.prop_test(12, 100, 0.05, alternative='greater'))
1-sample proportions test with continuity correction
data: 12 out of 100, null probability 0.05
X-squared = 8.8947, df = 1, p-value = 0.00143
alternative hypothesis: true p is greater than 0.05
95 percent confidence interval:
0.07237937 1.00000000
sample estimates:
p
0.12
\(p_0 = 0.05\) 時期望次數 \(n p_0 = 5\),恰好在「近似還堪用」的邊界。Yates 校正讓結果比精確法更保守(0.00143 vs 0.004274)。
關掉連續校正看看#
print(r.prop_test(12, 100, 0.05, alternative='greater', correct=False))
1-sample proportions test without continuity correction
data: 12 out of 100, null probability 0.05
X-squared = 10.316, df = 1, p-value = 0.0006595
alternative hypothesis: true p is greater than 0.05
95 percent confidence interval:
0.07632601 1.00000000
sample estimates:
p
0.12
關掉校正後 p 值從 0.00143 掉到 0.00066——校正的影響不小。這是因為觀察值 12 離期望值 5 只有 7 的差距,0.5 的扣減佔了 7% 的相對量。
實務建議:\(n\) 大(期望次數 ≫ 5)時,校正與否差別微小,預設開著即可;\(n\) 小時,用精確二項檢定
r.binom_test,它沒有近似問題。
動手:卡方適合度檢定——孟德爾的豌豆#
1865:孟德爾與被遺忘的實驗#
Gregor Mendel 在 1856–1863 年間在布爾諾修道院的菜園裡栽培了約 28,000 株豌豆,觀察 7 個性狀(種子形狀、種子顏色、花色、豆莢形狀、莢色、花位、株高)。他發現的規律今天稱為孟德爾法則:
- 顯性/隱性:\(F_1\) 全是顯性表型。
- 分離律:\(F_2\) 出現 3:1 的表型比。
- 獨立分配律:兩個性狀的 \(9:3:3:1\) 比。
1866 年論文〈Versuche über Pflanzen-Hybriden〉發表,但被當時的生物學界忽略,直到 1900 年 Hugo de Vries、Carl Correns、Erich von Tschermak 各自獨立重新發現(其中 Correns 讀到 de Vries 的腳註才認出孟德爾的優先權),孟德爾主義才成為現代遺傳學的基礎。
Fisher 在 1936 年的著名論文〈Has Mendel's work been rediscovered?〉重建了孟德爾的實驗,用卡方檢定分析他的 F2 資料,發現資料與理論期望吻合得「太好了」——好到不像隨機抽樣的結果。Fisher 主張「most, if not all, of the experiments have been falsified to agree closely with Mendel's expectations」。這就是著名的孟德爾悖論(the too-good-to-be-true paradox)。後來 Hartl、Fairbanks、Edwards 等人重新分析原始資料,認為 Fisher 的解讀有誤,事件最終平息,但這段歷史本身就是「統計方法如何重新檢視既有結論」的最佳教材。
現在讓我們親手重做 Fisher 的分析。
F2 代的觀察資料#
下表是文獻中常見的孟德爾 F2 資料(出自 1866 年論文,經後世教科書整理):一個雙因子雜交(圓形/皺形、黃色/綠色)的觀察次數:
| 表型 | 觀察次數 \(x_i\) | 理論比例 | 理論機率 \(p_i\) |
|---|---|---|---|
| 圓形黃色 | 315 | 9 | 9/16 |
| 皺形黃色 | 101 | 3 | 3/16 |
| 圓形綠色 | 108 | 3 | 3/16 |
| 皺形綠色 | 32 | 1 | 1/16 |
總數 \(n = 556\)。
跑卡方適合度檢定#
obs = [315, 101, 108, 32]
p_theory = [9/16, 3/16, 3/16, 1/16]
print(r.chisq_test(obs, p_theory))
Chi-squared test for given probabilities
data: x
X-squared = 0.47002, df = 3, p-value = 0.9254
手算:期望次數 \(m_i = 556 \times p_i\) = 312.75、104.25、104.25、34.75。
$$ X^2 = \frac{(315-312.75)^2}{312.75} + \frac{(101-104.25)^2}{104.25} + \frac{(108-104.25)^2}{104.25} + \frac{(32-34.75)^2}{34.75}
$$ $$ = 0.0057 + 0.2716 + 0.1373 + 0.0553 = 0.47002
$$ p = 0.9254——資料與 9:3:3:1 的吻合度高得離譜。這正是 Fisher 注意到的現象。
把兩個性狀分開看#
Fisher 的分析重點之一是分性狀看:
print("形狀(圓 vs 皺):", r.chisq_test([315+108, 101+32], [3/4, 1/4]))
print("顏色(黃 vs 綠):", r.chisq_test([315+101, 108+32], [3/4, 1/4]))
形狀(圓 vs 皺):
Chi-squared test for given probabilities
data: x
X-squared = 0.34532, df = 1, p-value = 0.5568
顏色(黃 vs 綠):
Chi-squared test for given probabilities
data: x
X-squared = 0.0095923, df = 1, p-value = 0.922
顏色的 \(X^2 = 0.0096\) 幾乎等於零:觀察到的 416 黃 : 140 綠 與理論的 417 : 139 幾乎完全一致。對照組是「\(H_0\) 為真時 \(\chi^2_1\) 的中位數約 0.455」,0.0096 遠在左尾——這就是 Fisher 說的「好得可疑」。形狀那組也偏小(0.345 < 0.455)。
順帶一提:把「卡方統計量遠小於自由度」解讀為「資料太整齊,可能是假的」,正是 Fisher 1936 年的論點起點。今天統計學界對此的共識是:Fisher 的統計論證有效,但他的解釋(造假)過於強烈;原始筆記的重讀支持「孟德爾確實做了某種選擇性取捨」的溫和版本。
動手:卡方獨立性檢定——列聯表#
情境:性別與咖啡/茶偏好#
一間公司調查 100 位員工(45 男、55 女),記錄他們的飲料偏好(咖啡/茶):
gender = ['M']*45 + ['F']*55
pref = ['coffee']*30 + ['tea']*15 + ['coffee']*25 + ['tea']*30
t = r.table(gender, pref, x_name='性別', y_name='偏好')
print(t)
偏好
性別 coffee tea
F 25 30
M 30 15
r.table 像 R 的 table() 一樣把兩個類別變數交叉計數。(列的順序是字母序 F 在 M 前,與 gender 陣列中 M 先出現無關。)
檢定獨立性#
print(r.chisq_test_table([[25, 30], [30, 15]]))
Pearson's Chi-squared test with Yates' continuity correction
data: x
X-squared = 3.6833, df = 1, p-value = 0.05496
期望次數怎麼算?以「F × coffee」格為例:\(E = \frac{(\text{行總和}) \times (\text{欄總和})}{\text{總和}} = \frac{55 \times 55}{100} = 30.25\)。四格的期望次數是 30.25、24.75、24.75、20.25。
自由度 \((2-1)(2-1) = 1\)。p = 0.05496 > 0.05 → 在 \(\alpha = 0.05\) 下不拒絕獨立性:資料不足以說性別與偏好有關。
關掉 Yates 校正#
print(r.chisq_test_table([[25, 30], [30, 15]], correct=False))
Pearson's Chi-squared test
data: x
X-squared = 4.4995, df = 1, p-value = 0.0339
p = 0.0339 < 0.05,結論翻轉! 這是本節最值得停下來想的一刻:
- Yates 校正(保守):不顯著
- 不校正(近似原樣):顯著
兩個 p 值都「對」,但決策不同。這正是為什麼實務報告時必須寫明有沒有做連續校正,以及為什麼 2×2 小表其實該用 Fisher 精確檢定(第 8 章非參數方法)而不是糾結校正。
實務建議: - 2×2 表且期望次數小 → 用 Fisher 精確檢定(
r.fisher_test),它沒有近似問題。 - 期望次數都夠大(≥5)→ 用卡方,correct=True預設即可。 - 報告時務必寫明校正與否,並盡量同時給出效應量(如 Cramér's \(V\)),因為卡方只告訴你「有無關係」,不告訴你「關係多強」。
與 R 對照#
R 的 binom.test、prop.test、chisq.test 是原廠實作:
binom.test(12, 100, p = 0.05, alternative = "greater")
prop.test(12, 100, p = 0.05, alternative = "greater")
prop.test(12, 100, p = 0.05, alternative = "greater", correct = FALSE)
Exact binomial test
data: 12 and 100
number of successes = 12, number of trials = 100, p-value = 0.004274
alternative hypothesis: true probability of success is greater than 0.05
95 percent confidence interval:
0.07072184 1.00000000
sample estimates:
probability of success
0.12
1-sample proportions test with continuity correction
data: 12 out of 100, null probability 0.05
X-squared = 8.8947, df = 1, p-value = 0.00143
alternative hypothesis: true p is greater than 0.05
95 percent confidence interval:
0.07237937 1.00000000
sample estimates:
p
0.12
1-sample proportions test without continuity correction
data: 12 out of 100, null probability 0.05
X-squared = 10.316, df = 1, p-value = 0.0006595
alternative hypothesis: true p is greater than 0.05
95 percent confidence interval:
0.07632601 1.00000000
sample estimates:
p
0.12
孟德爾資料:
chisq.test(c(315, 101, 108, 32), p = c(9,3,3,1)/16)
chisq.test(c(315+108, 101+32), p = c(3,1)/4)
chisq.test(c(315+101, 108+32), p = c(3,1)/4)
Chi-squared test for given probabilities
data: c(315, 101, 108, 32)
X-squared = 0.47002, df = 3, p-value = 0.9254
Chi-squared test for given probabilities
data: c(315 + 108, 101 + 32)
X-squared = 0.34532, df = 1, p-value = 0.5568
Chi-squared test for given probabilities
data: c(315 + 101, 108 + 32)
X-squared = 0.0095923, df = 1, p-value = 0.922
列聯表:
gender <- c(rep("M",45), rep("F",55))
pref <- c(rep("coffee",30), rep("tea",15), rep("coffee",25), rep("tea",30))
table(gender, pref)
tab <- matrix(c(25,30,30,15), nrow=2, byrow=TRUE)
print(tab)
chisq.test(tab)
chisq.test(tab, correct = FALSE)
pref
gender coffee tea
F 25 30
M 30 15
[,1] [,2]
[1,] 25 30
[2,] 30 15
Pearson's Chi-squared test with Yates' continuity correction
data: tab
X-squared = 3.6833, df = 1, p-value = 0.05496
Pearson's Chi-squared test
data: tab
X-squared = 4.4995, df = 1, p-value = 0.0339
與 rstatistics 完全一致,連 table() 的排版都一樣。參數名對應:R 的 correct = 對 Python 的 correct=,R 的 alternative = 對 Python 的 alternative=。R 的 chisq.test 對 2×2 表預設套用 Yates 校正,對其他尺寸則不套用——r.chisq_test_table 也follow同樣規則。
小結#
- 比例資料用
r.binom_test(精確,無近似)或r.prop_test(卡方近似 + Yates 校正)。小樣本用精確法。 - Pearson 1900 年提出卡方統計量 \(X^2 = \sum (x_i-m_i)^2/m_i\),\(n\) 大時近似 \(\chi^2_{k-1}\);Fisher 1922/1924 補上了「期望次數由資料估計」的漏洞;Yates 1934 提出 0.5 連續校正(只對 2×2 有意義)。
- 適合度檢定(
r.chisq_test)檢驗類別次數是否符合指定比例,df = \(k-1\);獨立性檢定(r.chisq_test_table)處理列聯表,df = \((r-1)(c-1)\)。 - 孟德爾 1866 年的豌豆資料是卡方檢定的經典舞台:Fisher 1936 年用 \(X^2 = 0.0096\)(顏色 3:1)指出資料「好得可疑」,引發長達半世紀的孟德爾悖論。
- 連續校正會影響結論(例:性別 × 偏好例,0.055 vs 0.034)。報告時必須寫明校正與否;小表改用 Fisher 精確檢定。
練習#
- 對 12/100 這個資料,把
r.binom_test的alternative改成'less'與'two.sided',各得到什麼 p 值?為什麼這裡'greater'與'two.sided'數字相同?提示:精確二項的雙尾 p 值定義是「所有機率不超過觀察值機率的結果的機率總和」,這與「兩側較小者 × 2」不同;因為 12 遠在 \(p_0 = 0.05\) 的右尾,雙尾 p 值就等於右尾的機率。 - 孟德爾資料若改用均勻假設(\(p_i = 1/4\)),\(X^2\) 會變成多少?p 值呢?這說明「先決定 \(H_0\) 的比例」有多重要。提示:
r.chisq_test(obs)不給p時預設就是均勻。 - 用
r.chisq_test_table檢定一個 3×2 的列聯表(例如把上面 100 人的資料再拆成三個年齡層),看自由度變成多少。並比較有沒有 Yates 校正的差別。提示:3×2 表不會套用 Yates 校正。 - 抽 30 片晶片,其中 4 片 defective。分別用
r.binom_test(4, 30, 0.05)與r.prop_test(4, 30, 0.05),觀察兩者的 p 值差多少。為什麼?提示:期望次數 \(30\times0.05 = 1.5\) 遠小於 5,近似失效。 - 找一個你自己或新聞中的「比例」問題(民調支持率、產品不良率),分別用
r.binom_test與r.prop_test計算,並寫下你會採用哪一個、理由是什麼。提示:報導「支持率 47%」而抽樣 500 人時,兩個方法的差異有多大?