比例資料的 A/B Testing 該用卡方還是 Z 檢定?

by 好豪
Published: Last Updated on

二元資料(Binary Data)—也就是 Yes / No 的資料—經常會作為 A/B Testing 的測試目標,例如:

  • 訪客是否點選網頁廣告
  • 新加入 APP 的顧客明天會不會再次上線
  • 造訪網站首頁的顧客有無購買本日主打商品

在做 A/B Testing 時,我們會將二元資料轉換成比例資料,比較控制組與對照組的比例誰高誰低,資料科學家們使用假設檢定來進行比較,問題在於:比例數據該做什麼統計檢定呢?

有趣的是,如果你上網搜尋比例資料的 A/B Testing 該怎麼做,會有兩種答案:一種是 Z 檢定、一種是 卡方檢定,使用哪種才是對的呢?這篇筆記將會向你解釋:這兩種都可以!

依照數據類型為 A/B Testing 選擇適當的統計檢定,是資料科學家必備的知識。這篇筆記會教學比例數據的 A/B Testing 究竟該用什麼統計檢定,我將會介紹 Z 檢定與卡方檢定之間的關聯,以及什麼情況下這兩者都可以使用。

這則筆記所有計算與圖表的 R 語言程式碼,都分享在 好豪的 GitHub,我在程式碼裡不只使用既有函式、我也示範如何手動運算假設檢定的 P-value,讓讀者能透過邊閱讀、邊玩程式碼,徹底理解 Z 檢定與卡方檢定。


問題範例

假設我們的 A/B Testing 測試目標是 APP 新使用者隔日再上線比例的 留存率 數據。在 A 與 B 兩組各蒐集四萬人樣本之後,得到如下結果:

隔日未上線人數隔日再上線人數
A 組24,03515,965
B 組23,76216,238
A/B Testing 範例數據列聯表

A 組的隔日留存率是 39.9%、B 組則是 40.6%,到底 0.7% 的差異能不能做出「B 組表現比較好」的結論,我們需要統計檢定的幫忙才能決定。請讀者在繼續閱讀前可以先想想看,如果要比較 A 與 B 組誰的隔日再上線比例較高,該用什麼統計檢定呢?


常態分佈變數的數學性質

在進入主題之前,我們需要先簡短複習一下統計學課本裡一再出現的常態分佈。常態分佈變數的運算具有許多重要的性質,以下筆記提及的三項性質都是資料科學家不得不了解的,而其中與卡方分佈有關的性質更和我們今天要討論的議題習習相關!

相加後是常態分佈

多個互相獨立的常態分佈變數相加組成的變數,仍是常態分佈

更完整地說,多個互相獨立的常態分佈變數的線性組合,仍是常態分佈。

在下圖左方,三個常態分佈變數彼此獨立、而且平均值與變異數都不同,線性組合之後、畫出直方圖,依然是常態分佈的鐘型曲線,我們可以用圖右下的 Q-Q Plot 來驗證、確認是常態分佈。(延伸閱讀:一看就懂的 Q-Q Plot 判讀常態分佈教學

多個互相獨立的常態分佈變數的線性組合,仍是常態分佈(製圖 R Code:好豪的 GitHub

平方和是卡方分佈

多個互相獨立的標準常態分佈變數平方後相加得到的變數,是卡方分佈


如果 Z_1, Z_2, Z_3, …, Z_\nu 是互相獨立的標準常態分佈變數,則 Y = Z_1^2 + Z_2^2 + … + Z_\nu^2 是自由度為 \nu 的卡方分佈。

註記:

下圖是 3 個標準常態分佈變數平方和的範例:

3 個標準常態分佈變數平方和是自由度為 3 的卡方分佈(製圖 R Code:好豪的 GitHub

平方和再相除是 F 分佈

兩個互相獨立的卡方分佈變數相除,是 F 分佈

如果:

  • U_1 是自由度為 \nu_1 的卡方分佈變數
  • U_2 是自由度為 \nu_2 的卡方分佈變數
  • U_1U_2 互相獨立

F = \frac{U_1/\nu_1}{U_2/\nu_2} 是自由度為 (\nu_1, \nu_2) 的 F 分佈。

再承接我們上個小節學到的:多個標準常態變數平方和、除以另一組多個標準常態變數平方和,將會是 F 分佈。

以下圖示範例,是 3 個標準常態分佈變數平方和的卡方變數、除以 4 個標準常態分佈變數平方和的卡方變數,得到自由度 (3, 4) 的 F 分佈:

兩個互相獨立的卡方分佈變數相除,是 F 分佈(製圖 R Code:好豪的 GitHub

該用卡方還是 Z 檢定?

回到本篇要討論的主題,究竟比例數據的 A/B Testing 該用卡方還是 Z 檢定?

答案是都可以!這兩種方法的檢定結果與 P-value 都會一模一樣。要解釋為什麼,就要用到剛剛複習的數學性質、還有卡方檢定的特性。

皮爾森卡方檢定在比例數據的 A/B Testing,用到的是 獨立性檢定,檢定時的自由度是 (r - 1) \times (c - 1)rc 分別是列聯表的列數與欄數),當 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 計算:

Z 檢定與卡方檢定 P-value 結果相同(製圖 R Code:好豪的 GitHub

檢定之間的差別

雖然在 A/B 兩組比例數據的比較中,Z 檢定與卡方檢定結果會相同,但是兩者的統計概念仍存在差異。

假設不同

以下我們同樣以本文的 問題範例 說明。

Z 檢定(雙尾):

  • 虛無假設:A 與 B 兩組,隔日再上線人數比例相同
  • 對立假設:A 與 B 兩組,隔日再上線人數比例不同

卡方檢定(獨立性檢定):

  • 虛無假設:「隔日是否再上線」與「使用者為 A 或 B 組」兩變數無關聯
  • 對立假設:「隔日是否再上線」與「使用者為 A 或 B 組」兩變數有關聯

實驗設定不同

兩項檢定的實驗設定差異在於:比較比例的兩個群體是否來自同一個母體

使用 Z 檢定比較比例數據時,資料是分別蒐集自兩組不同母體。例如:進行兩個國家的問卷調查,美國蒐集 1,000 人樣本、日本蒐集 1,000 人樣本。

使用卡方獨立性檢定比較比例數據時,資料來自同一個母體,我們觀察的是其中的兩個變數的關聯性。例如:同一間醫院的所有病患資料,檢驗「是否吸菸」與「是否得肺癌」之間的關聯性。

A/B Testing 屬於哪項實驗設定,筆者好豪並沒有明確的答案,我主觀認為較符合 Z 檢定的兩母體實驗設定(A 與 B 組各為一個群體),如果有相關經驗的讀者,希望可以跟我分享你的看法。

兩項檢定假設與實驗設定不同的概念性差異,不會影響統計結果,只會影響資料科學家如何解釋數據


注意:樣本數夠不夠?

需要提醒的是,上述「卡方與 Z 檢定結果相同」是基於樣本數夠多的假設,例如,我們可以用「列聯表內所有欄位(的 期望值)都至少要有 5 個樣本」來判斷。

要是不符合這個樣本數夠多的假設,卡方檢定或 Z 檢定都不適合拿來檢驗比例數據的 A/B 兩組差異。如果讀者確實遇到這類問題,值得嘗試的解決方案包括:

資料科學家進行 A/B Testing 之前,會預先計算需要樣本數(延伸閱讀:樣本數計算方法),並從蒐集樣本數所需時間評估實驗是否可行。因此絕大多數時候,實驗能上線都是預期樣本數夠多、也就不用太煩惱這小節提到的樣本數不足問題。在筆者好豪的經驗,樣本數過少的實驗可能發生在測試階段的產品,例如,只開放一萬人測試使用的手機 APP。


結語

不管是資料科學的實戰還是面試,「該使用哪個假設檢定」絕對是經常會被問的。這篇筆記裡,我從常態分佈變數的數學性質出發,說明只有兩組的 A/B Testing 使用卡方或 Z 檢定比較比例大小差異結果會相同。筆記中的所有計算與視覺化都有 R 語言程式碼、分享在 我的 GitHub 裡,相信讀者跟著程式碼算一遍之後,將會徹底學會這兩項檢定的關聯。

這篇筆記的撰寫動機,是看到《資料科學的建模基礎》中介紹的常態分佈變數運算特性,我讀過常態分佈與卡方分佈之間的關係後、就聯想到這個 A/B Testing 的常見問題。在此感謝旗標出版社提供試閱,我不只從書中學到許多統計分析會忽略的問題點,也找到寫出這篇筆記、與大家分享知識的靈感。

data-science-math-model《資料科學的建模基礎 – 別急著coding!你知道模型的陷阱嗎?》(博客來連結)


參考資料:


你正在研究 A/B Testing 嗎?筆者好豪正持續寫作 A/B Testing 相關的學習筆記 與程式碼分享,推薦你繼續閱讀:

如果這些文章對你有幫助,歡迎追蹤 好豪的 Facebook 粉絲專頁,我會持續撰寫 A/B Testing 與資料科學相關的文章,與你分享!

推薦閱讀