二元資料(Binary Data)—也就是 Yes / No 的資料—經常會作為 A/B Test 的測試目標,例如:
- 訪客是否點選網頁廣告
- 新加入 APP 的顧客明天會不會再次上線
- 造訪網站首頁的顧客有無購買本日主打商品
在做 A/B Testing 時,我們會將二元資料轉換成比例資料,比較控制組與對照組的比例誰高誰低,資料科學家們使用假設檢定來進行比較,問題在於:比例數據該做什麼統計檢定呢?
有趣的是,如果你上網搜尋比例資料的 A/B 測試該怎麼做,會有兩種答案:一種是 Z 檢定、一種是 卡方檢定,使用哪種才是對的呢?這篇筆記將會向你解釋:這兩種都可以!
依照數據類型為 A/B Testing 選擇適當的統計檢定,是資料科學家必備的知識。這篇筆記會教學比例數據的 A/B Test 究竟該用什麼統計檢定,我將會介紹 Z 檢定與卡方檢定之間的關聯,以及什麼情況下這兩者都可以使用。
這則筆記所有計算與圖表的 R 語言程式碼,都分享在 好豪的 GitHub,我在程式碼裡不只使用既有函式、我也示範如何手動運算假設檢定的 P-value,讓讀者能透過邊閱讀、邊玩程式碼,徹底理解 Z 檢定與卡方檢定。
(如果你對卡方檢定還不是很熟悉,推薦你先閱讀筆者的 卡方檢定白話教學 或 實戰用法,再回來看這篇文會更清楚喔!)
目錄
問題範例
假設我們的 A/B Testing 測試目標是 APP 新使用者隔日再上線比例的 留存率 數據。在 A 與 B 兩組各蒐集四萬人樣本之後,得到如下結果:
隔日未上線人數 | 隔日再上線人數 | |
---|---|---|
A 組 | 24,035 | 15,965 |
B 組 | 23,762 | 16,238 |
A 組的隔日留存率是 39.9%、B 組則是 40.6%,到底 0.7% 的差異能不能做出「B 組表現比較好」的結論,我們需要統計檢定的幫忙才能決定。請讀者在繼續閱讀前可以先想想看,如果要比較 A 與 B 組誰的隔日再上線比例較高,該用什麼統計檢定呢?
常態分佈變數的數學性質
在進入主題之前,我們需要先簡短複習一下統計學課本裡一再出現的常態分佈。常態分佈變數的運算具有許多重要的性質,以下筆記提及的三項性質都是資料科學家不得不了解的,而其中與卡方分佈有關的性質更和我們今天要討論的議題習習相關!
相加後是常態分佈
多個互相獨立的常態分佈變數相加組成的變數,仍是常態分佈
更完整地說,多個互相獨立的常態分佈變數的線性組合,仍是常態分佈。
在下圖左方,三個常態分佈變數彼此獨立、而且平均值與變異數都不同,線性組合之後、畫出直方圖,依然是常態分佈的鐘型曲線,我們可以用圖右下的 Q-Q Plot 來驗證、確認是常態分佈。(延伸閱讀:一看就懂的 Q-Q Plot 判讀常態分佈教學)

平方和是卡方分佈
多個互相獨立的標準常態分佈變數平方後相加得到的變數,是卡方分佈
如果 \(Z_1, Z_2, Z_3, …, Z_\nu\) 是互相獨立的標準常態分佈變數,則 \(Y = Z_1^2 + Z_2^2 + … + Z_\nu^2\) 是自由度為 \(\nu\) 的卡方分佈。
註記:
- 標準常態分佈 指的是平均值為 0、標準差為 1
- \(\nu\) 唸作 “nu”
下圖是 3 個標準常態分佈變數平方和的範例:

平方和再相除是 F 分佈
兩個互相獨立的卡方分佈變數相除,是 F 分佈
如果:
- \(U_1\) 是自由度為 \(\nu_1\) 的卡方分佈變數
- \(U_2\) 是自由度為 \(\nu_2\) 的卡方分佈變數
- \(U_1\) 與 \(U_2\) 互相獨立
則 \(F = \frac{U_1/\nu_1}{U_2/\nu_2}\) 是自由度為 \((\nu_1, \nu_2)\) 的 F 分佈。
再承接我們上個小節學到的:多個標準常態變數平方和、除以另一組多個標準常態變數平方和,將會是 F 分佈。
以下圖示範例,是 3 個標準常態分佈變數平方和的卡方變數、除以 4 個標準常態分佈變數平方和的卡方變數,得到自由度 (3, 4) 的 F 分佈:

該用卡方還是 Z 檢定?
回到本篇要討論的主題,究竟比例數據的 A/B Testing 該用卡方還是 Z 檢定?
答案是都可以!這兩種方法的檢定結果與 P-value 都會一模一樣。要解釋為什麼,就要用到剛剛複習的數學性質、還有卡方檢定的特性。
皮爾森卡方檢定在比例數據的 A/B Testing,用到的是 獨立性檢定,檢定時的自由度是 \((r – 1) \times (c – 1)\)(\(r\) 與 \(c\) 分別是列聯表的列數與欄數),當 A/B Testing 是處理二元資料、且恰好只有兩組比較時(不是 A/B/C/D Testing),欄數與列數都是 2,自由度為 \((2-1) \times (2-1)\)、恰好為 1。
也就是說,A 與 B 兩組比較比例差異時,卡方檢定用到的是自由度為 1 的卡方分佈
而我們在執行 Z 檢定的時候,使用的是單一個標準常態分佈變數。這單一個標準常態分佈變數取平方,就會是自由度為 1 的卡方分佈(利用剛剛複習過的「標準常態分佈變數平方和是卡方分佈」性質,只是這裡只使用一個標準常態分佈變數)。因此,Z 檢定與自由度為 1 的卡方檢定結果將會相同。
R 語言函式:prop.test()
我們直接用 R 語言裡比較比例數據差異的函式 prop.test()
來進一步說明。
將本文的 問題範例 數據帶入 prop.test()
,輸出結果如下:
> ab_test <- prop.test(x = c(15965, 16238), n = c(40000, 40000), correct = FALSE)
> ab_test
2-sample test for equality of proportions without continuity
correction
data: c(15965, 16238) out of c(40000, 40000)
X-squared = 3.8736, df = 1, p-value = 0.04905
alternative hypothesis: two.sided
95 percent confidence interval:
-1.362143e-02 -2.856642e-05
sample estimates:
prop 1 prop 2
0.399125 0.405950
可以看到函式為我們輸出了卡方檢定的結果 X-squared = 3.8736
,也如我們所預期的是自由度 1(df = 1
)。根據我們目前所學,這個數字開根號就應該是 Z 檢定的統計量 Z = sqrt(X-squared) = 1.9682
,如下方程式碼所示:
> ab_test$statistic
X-squared
3.873632
> z_stat <- unname(sqrt(ab_test$statistic))
> z_stat
[1] 1.968154
卡方跟 Z 檢定的關係確實如此嗎?我們也可以利用本文的 問題範例,手動算一遍兩個檢定的統計量,驗證上方的函式輸出結果。
Z 檢定範例
(公式參考)
\(p_{pooled} = \frac{15965 + 16238}{40000 + 40000} = 0.4025375\)
\(z = \frac{p_2 – p_1}{\sqrt{p_{pooled}(1-p_{pooled})(\frac{1}{n_1}+\frac{1}{n_2})}} = \frac{\frac{16238}{40000} – \frac{15965}{40000}}{\sqrt{0.4025(1-0.4025)(\frac{1}{40000}+\frac{1}{40000})}} = 1.968154\)
卡方檢定範例
(公式參考)
期望成功與期望失敗數:
\(e_{success} = 40000 \times \frac{15965 + 16238}{40000 + 40000} = 40000 \times 0.4025375 = 16101.5\)
\(e_{failure} = 40000 \times (1 – e_{success}) = 40000 \times 0.5974625 = 23898.5\)
\(\chi^2 = \frac{(24035 – 23898.5)^2}{23898.5} + \frac{(23762 – 23898.5)^2}{23898.5} + \frac{(15965 – 16101.5)^2}{16101.5} + \frac{(16238 – 16101.5)^2}{16101.5} \\ = 3.873632\)
手動計算出的 Z 檢定與卡方檢定統計量都符合 prop.test()
輸出結果了,對吧!我們也可以用視覺化的方式來呈現這些結果的 P-value 計算:

檢定之間的差別
雖然在 A/B 兩組比例數據的比較中,Z 檢定與卡方檢定結果會相同,但是兩者的統計概念仍存在差異。
假設不同
以下我們同樣以本文的 問題範例 說明。
Z 檢定(雙尾):
- 虛無假設:A 與 B 兩組,隔日再上線人數比例相同
- 對立假設:A 與 B 兩組,隔日再上線人數比例不同
卡方檢定(獨立性檢定):
- 虛無假設:「隔日是否再上線」與「使用者為 A 或 B 組」兩變數無關聯
- 對立假設:「隔日是否再上線」與「使用者為 A 或 B 組」兩變數有關聯
實驗設定不同
兩項檢定的實驗設定差異在於:比較比例的兩個群體是否來自同一個母體。
使用 Z 檢定比較比例數據時,資料是分別蒐集自兩組不同母體。例如:進行兩個國家的問卷調查,美國蒐集 1,000 人樣本、日本蒐集 1,000 人樣本。
使用卡方獨立性檢定比較比例數據時,資料來自同一個母體,我們觀察的是其中的兩個變數的關聯性。例如:同一間醫院的所有病患資料,檢驗「是否吸菸」與「是否得肺癌」之間的關聯性。
A/B Test 屬於哪項實驗設定,筆者好豪並沒有明確的答案,我主觀認為較符合 Z 檢定的兩母體實驗設定(A 與 B 組各為一個群體),如果有相關經驗的讀者,希望可以跟我分享你的看法。
兩項檢定假設與實驗設定不同的概念性差異,不會影響統計結果,只會影響資料科學家如何解釋數據。
注意:樣本數夠不夠?
需要提醒的是,上述「卡方與 Z 檢定結果相同」是基於樣本數夠多的假設,例如,我們可以用「列聯表內所有欄位(的 期望值)都至少要有 5 個樣本」來判斷。
要是不符合這個樣本數夠多的假設,卡方檢定或 Z 檢定都不適合拿來檢驗比例數據的 A/B 兩組差異。如果讀者確實遇到這類問題,值得嘗試的解決方案包括:
- 葉氏連續校正
- R 語言:
prop.test()
設定correct=TRUE
- R 語言:
- Fisher’s Exact Test
- R 語言:
fisher.test()
- R 語言:
資料科學家進行 A/B 測試之前,會預先計算需要樣本數(樣本數計算方法),並從蒐集樣本數所需時間評估實驗是否可行。因此絕大多數時候,實驗能上線都是預期樣本數夠多、也就不用太煩惱這小節提到的樣本數不足問題。在筆者好豪的經驗,樣本數過少的實驗可能發生在測試階段的產品,例如,只開放一萬人測試使用的手機 APP。
結語
不管是資料科學的實戰還是面試,「該使用哪個假設檢定」絕對是經常會被問的。這篇筆記裡,我從常態分佈變數的數學性質出發,說明只有兩組的 A/B Test 使用卡方或 Z 檢定比較比例大小差異結果會相同。筆記中的所有計算與視覺化都有 R 語言程式碼、分享在 我的 GitHub 裡,相信讀者跟著程式碼算一遍之後,將會徹底學會這兩項檢定的關聯。
這篇筆記的撰寫動機,是看到《資料科學的建模基礎》中介紹的常態分佈變數運算特性,我讀過常態分佈與卡方分佈之間的關係後、就聯想到這個 A/B 測試的常見問題。在此感謝旗標出版社提供試閱,我不只從書中學到許多統計分析會忽略的問題點,也找到寫出這篇筆記、與大家分享知識的靈感。
《資料科學的建模基礎 – 別急著coding!你知道模型的陷阱嗎?》(博客來連結)
參考資料:
- 《資料科學的建模基礎》
- 《R 錦囊妙計》
- Dr. Laura K. Gray-Steinhauer, University of Alberta
- Udemy 課程:貝氏機器學習 A/B Testing
你正在研究 A/B Testing 嗎?筆者好豪正持續寫作 A/B Testing 相關的學習筆記 與程式碼分享,推薦你繼續閱讀:
- 怎麼決定該不該用 t 檢定?白話理解中央極限定理
- A/A Test:商業實驗不能忘的前置動作
- Sequential A/B Testing:只需要加減法的 A/B Testing?
- 多重檢定問題:一定會有人中樂透
- 顯著水準能不能從 0.05 改成 0.01?
如果這些文章對你有幫助,歡迎追蹤 好豪的 Facebook 粉絲專頁,我會持續撰寫 A/B Testing 與資料科學相關的文章,與你分享!