跳轉到

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 精確檢定。

練習#

  1. 對 12/100 這個資料,把 r.binom_test 的 alternative 改成 'less' 與 'two.sided',各得到什麼 p 值?為什麼這裡 'greater' 與 'two.sided' 數字相同?提示:精確二項的雙尾 p 值定義是「所有機率不超過觀察值機率的結果的機率總和」,這與「兩側較小者 × 2」不同;因為 12 遠在 \(p_0 = 0.05\) 的右尾,雙尾 p 值就等於右尾的機率。
  2. 孟德爾資料若改用均勻假設(\(p_i = 1/4\)),\(X^2\) 會變成多少?p 值呢?這說明「先決定 \(H_0\) 的比例」有多重要。提示:r.chisq_test(obs) 不給 p 時預設就是均勻。
  3. 用 r.chisq_test_table 檢定一個 3×2 的列聯表(例如把上面 100 人的資料再拆成三個年齡層),看自由度變成多少。並比較有沒有 Yates 校正的差別。提示:3×2 表不會套用 Yates 校正。
  4. 抽 30 片晶片,其中 4 片 defective。分別用 r.binom_test(4, 30, 0.05) 與 r.prop_test(4, 30, 0.05),觀察兩者的 p 值差多少。為什麼?提示:期望次數 \(30\times0.05 = 1.5\) 遠小於 5,近似失效。
  5. 找一個你自己或新聞中的「比例」問題(民調支持率、產品不良率),分別用 r.binom_test 與 r.prop_test 計算,並寫下你會採用哪一個、理由是什麼。提示:報導「支持率 47%」而抽樣 500 人時,兩個方法的差異有多大?