作者:阿澤,複旦大學,Datawhale成員
“A/B測試不一定是最好的評估方法。它不是萬能的,但不會A/B測試肯定是不行的。”
—— 位元組跳動副總裁楊震原
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcucjZ1QmNxEjY2IzYkVWYhZWY0cDM2IjZ5UGN4EDMmJjYvwFN2UDN4gjMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
這邊文章是按照對A/B測試的思考過程來寫的,不難,希望能幫助大家了解什麼是A/B測試。
1. A/B Test
假設我們做了一個 A/B 實驗,然後我們會想知道自己的實驗是否能得到顯著的效果。你可以通過經驗判斷,但更嚴謹的方法是通過統計學公式計算 p 值是否小于設定的顯著性水準
\alpha
,進而判斷實驗結果是否顯著。
舉個?,我們有以下四格表:
對照組 | 實驗組 | 合計 | |
---|---|---|---|
轉換 | 15 | 8 | 23 |
不轉換 | 35 | 42 | 77 |
合計 | 50 | 50 | 100 |
通過以上統計結果我們來嘗試計算一下 p 值。
- 喂!評估組的同學,p 值怎麼計算啊?
- 照着我的這個公示敲!
于是我得到了 z 值的計算公式:
z = \frac{\left(\frac{x_{1}}{n_{1}}-\frac{x_{2}}{n_{2}}\right)}{\sqrt{\frac{x_{1}+x_{2}}{n_{1}+n_{2}} \cdot\left(1-\frac{x_{1}+x_{2}}{n_{1}+n_{2}}\right) \cdot\left(\frac{1}{n_{1}}+\frac{1}{n_{2}}\right)}}
其中,
x_1,x_2,n_1,n_2
分别為轉換 A/B 測試的轉換數和樣本總數。
然後屁颠的将統計值(
x_1 = 15,x_2=8,n_1 =n_2=50
)帶入到公式中并計算出 z 值為 1.66,
然後用 excel 來計算:
p=2*(1-NORMSDIST(abs(z)))=0.096
,大于 0.05 不顯著。
NORMSDIST 可以計算标準正态分布的累積機率。
以上便完成了 A/B 測試的計算。
如果事情到此就結束,那豈不是太淺薄了。
這邊問幾個簡單的問題:
- A/B 測試不是基于假設檢驗的嗎?假設在哪兒呢?檢驗在哪兒?
- 這個 z 值公式哪來的?
為了搞清楚這些問題,我們繼續探究。
2. A/B Test 原理
2.1 假設檢驗
假設檢驗是研究如何根據抽樣後獲得的樣本來檢查抽樣前所作假設是否合理,A/B Test 從本質上來說是一個基于統計的假設檢驗過程,它首先對實驗組和對照組的關系提出了某種假設,然後計算這兩組資料的差異和确定該差異是否存在統計上的顯著性,最後根據上述結果對假設做出判斷。
我們再用上面的資料走下流程。
首先,我們做一個假設:
- 原假設
H_0
:實驗組和對照組無顯著差異;
- 備擇假設
H_1
:實驗組和對照組存在顯著差異。
假設檢驗的核心是證僞,是以原假設是統計者想要拒絕的假設,無顯著差異我們也可以了解為:實驗組和對照組的統計差異是由抽樣誤差引起的(誤差服從正态分布)。
然後,我們需要選一個檢驗方法來對我們做的假設進行驗證。
常用的假設檢驗方法有 z 檢驗、t 檢驗和卡方檢驗等,不同的方法有不同的适用條件和檢驗目标。比如我們常說 z 檢驗适用大樣本而 t 檢驗适用于小樣本。實驗組的樣本容量 > 30,是以我們這裡采用 z 檢驗。又由于我們檢驗的目标是兩組樣本(差別于單組樣本),是以其 z 值的計算公式為:
Z = \frac{\bar{X_1} - \bar{X_2}}{\sqrt{\frac{S_1^2}{n_1}+\frac{S_2^2}{n_2}}}
由于我們的資料是轉換/不轉換,是以我們可以令轉換的樣本為 1,不轉換的樣本為 0,進而算出 ,(通過正态分布的累積機率分布)得到單邊機率 P(0<x<1.67)=0.4525。</x<1.67)=0.4525
x1 = np.array([1]*15 + [0]*35)
x2 = np.array([1]*8 + [0]*42)
# ddof = 1 用于計算樣本标準差,差別于總體标準差
z = (x1.mean() - x2.mean()) / np.sqrt(x1.var(ddof = 1)/50 + x2.var(ddof = 1)/50)
z
"""
1.6699
"""
複制
以上便是假設檢驗的基本步驟。我可能還會有一些疑問,比如說:
- 什麼是雙側檢驗?
- 為什麼 z 檢驗适用大樣本,而 t 檢驗适用小樣本?
- 四格表不是應該用卡方檢驗的嗎?
2.2 檢驗方式
檢驗方式分為兩種:雙側檢驗和單側檢驗。單側檢驗又分為兩種:左側檢驗和右側檢驗。
這幾種檢驗方式的劃分很簡單:
- 雙側檢驗:備擇假設沒有特定的方向性,形式為“≠”這種檢驗假設稱為雙側檢驗;
- 單側檢驗:備擇假設帶有特定的方向性 形式為">""<"的假設檢驗,稱為單側檢驗 "<"稱為左側檢驗 ">"稱為右側檢驗。
我們的備擇假設:實驗組和對照組存在顯著差異。其實就是在說是實驗組 ≠ 對照組。是以是雙側檢驗(此時原假設也成為零假設)。
然後我們根據檢驗方式不同,得到不同的 p 值計算方式。(p 值其實就是計算拒絕域的機率值,放一張圖,友善大家更好的了解)
2.3 檢驗統計量
我們來看下假設檢驗的原假設:實驗組和對照組無顯著差異。那麼該怎麼去描述兩組實驗有差異呢?我們需要一個統計量來描述兩組實驗。
在 A/B 測試中我們關注的兩組實驗轉換率的差異,是以我們可以通過樣本的轉換率
\rho
來衡量兩組實驗的差異。是以原假設可以翻譯為:
\rho_1 - \rho_2 = 0
(兩者轉換率沒差别)。
轉換率是樣本統計量的一種,此外還可以用均值、方差等作為樣本統計量。
我們引入檢驗統計量的概念:根據樣本觀測結果計算得到的,并據以對原假設和備擇假設做出決策的某個樣本統計量,稱為檢驗統計量。是以本次 A/B 測試中檢驗統計量為
\rho_1 - \rho_2
。
檢驗統計量是用于假設檢驗計算的統計量,實際上是對總體參數的點估計量,但點估計量不能直接作為檢驗統計量,隻有将其标準化後,才能用于度量它與原假設的參數值之間的差異程度。是以我們将檢驗統計量标準化:
檢驗統計量 = \frac{點估計量-總體均值}{總體标準差}
= \frac{檢驗統計量}{\sqrt{\frac{\sigma_1^2}{n_1}+\frac{\sigma_2^2}{n_2}}}
\bar X_i
為獨立地抽自總體
X_i \sim N(\mu_i, \sigma_i)
的一個容量為
n_i
的樣本的均值。則變量
\bar X_1 - \bar X_2
的均值和方差為:
E(\bar X_1 - \bar X_2) = E(\bar X_1) - E(\bar X_2)Var(\bar X_1 - \bar X_2) = Var(\bar X_1) + Var(\bar X_2)= \frac{\sigma_1^2}{n_1} + \frac{\sigma_2^2}{n_2}
樣本均值的方差:
Var(\bar X_1) = Var(\frac{1}{n_1}(X_1 + X_2 +...+X_n))=\frac{1}{n_1^2}Var(X_1 + X_2 +...+X_n)=\frac{1}{n_1}Var(X_1)=\frac{\sigma_1^2}{n_1}
總體的均值為我們的原假設,即為 0(
\rho_1 - \rho_2 = 0
),當樣本容量較大(n>30)時,我們可以用樣本标準差
s
來表示總體标準差
\sigma
,此時我們便得到了 z 檢驗統計量:
Z = \frac{\bar X_1 - \bar X_2}{\sqrt{\frac{\sigma_1^2}{n_1}+\frac{\sigma_2^2}{n_2}}}
= \frac{\bar X_1 - \bar X_2}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}}
z 檢驗雖然能夠進行樣本統計量的差異性檢驗,但是它要求樣本容量足夠大,這是不一定能夠做到。
這時候 t 檢驗就粉墨登場了,在兩獨立樣本均值檢驗中,t 值計算公式如下(推導略):
T=\frac{\bar{X}_1-\bar{X}_2}{\sqrt{\frac{\sum (X_1-\bar{X_1})^2+\sum (X_2-\bar{X_2})^2}{n_1+n_2-2}\times\frac{n_1+n_2}{n_1\times n_2}}}
根據自由度
df=n-1
,查 t 值表,找出規定的 t 理論值并進行比較,然後确定顯著性水準。
t 檢驗在使用前需要注意三點:
- 分析的資料對象需要滿足正态分布或近似正态分布;
- 得知樣本均值和樣本标準差;
- 已知總體均值(由原假設可知總體均值為 0);
t 檢驗統計量較 z 檢驗統計量多了一個自由度的變量,用來懲罰小樣本,增加其拒絕
H_0
的難度,因而小樣本下采用 t 檢驗,優于 z 檢驗。
當樣本數量增加時,t 檢驗會快速收斂于 z 檢驗。(是以這裡用 t 檢驗算出來也是 1.67)
2.3 置信區間與統計誤差
我們再看下假設檢驗的原假設:實驗組和對照組無顯著差異。這一小節我們來講下顯著的概念。
我們統計出的實驗組的轉化率為 0.3,而對照組的轉換率為 0.16。我們是否可以說明實驗組比對照組的轉換效果要好 0.14?其實更準确的說法是:實驗組比對照組的轉換效果要好 0~0.28 (
0.14\pm 0.14
),置信度為 90%。
[0, 0.28] 是我們所說的置信區間 [
(\bar X_1 -\bar X_2) \pm Z_{\frac{\alpha}{2}} * \sqrt{\frac{S_1^2}{n_1} + \frac{S_2^2}{n_2}}
],這裡的第一個 0.14 是兩組樣本的均值(
\bar X_1 -\bar X_2
)第二個 0.14 是統計誤差,計算方式為
Z_{\frac{\alpha}{2}} * \sqrt{\frac{S_1^2}{n_1} + \frac{S_2^2}{n_2}}
,置信度是我們的算出接受域的機率值 90%。我們可以說:我們有 90% 的把握實驗組比對照組的轉換效果要好 0~0.28。從機率的角度來解釋:我們做 100 次實驗,有 90 次的轉換率差異是在 0~0.28 之間。
置信區間是一個區間,使得重複實驗 n 次具有一定機率(這個機率就是置信度)的結果都落在此區間内。根據置信區間的不同表現,我們可以來判斷試驗結果顯著與否:如果置信區間的上下限同為正/負,則說明試驗結果是統計顯著的;如果置信區間為一正一負,則說明版本間差異不大。
值得注意的是,置信區間同為正或負時,隻能說明試驗是統計顯著的(也就是試驗組和對照組有差異),但是這個差異有可能是非常小,在實際應用中微不足道的。是以,隻有兼備統計顯著和效果顯著兩個特征的結果,才能說明該實驗是可用,并且值得釋出的。
2.4 中心極限定律
中心極限定理是機率論的重要定理,我們來複習下:
中心極限定理指的:是給定一個任意分布的總體。每次從這些總體中随機抽取 n 個抽樣,一共抽 m 次。然後把這 m 組抽樣分别求出平均值,這些平均值的分布接近正态分布。
我們注意總體本身的分布不要求正态分布,下圖很形象的表達這個點:
從上圖我們看到:随着抽樣次數增多,樣本均值的抽樣分布趨向于服從正态分布,且其均值越接近于總體的平均值。
是以正是因為有了中心極限定律,我們才能使用 A/B 測試:通過樣本均值來估計總體均值。
而檢驗統計量這塊,我們可以看到當抽樣次數達到 30 時,樣本均值可以視為總體均值。這也是為什麼 z 檢驗和 t 檢驗以樣本量為 30 做個分界。(當然劃分界線沒那麼嚴格,29 次也可以用 z 檢驗)
補充學習大數定律:在無數次獨立同分布的随機事件中,事件的頻率趨于一個穩定的機率值,這是大數定律。兩者在不同的次元上。
2.5 z 檢驗的計算方式
上面是通過手算檢驗統計量,更簡單的方法是寫個 python 腳本:
x1 = 15
x2 = 8
n1 = n2 = 50
import numpy as np
from statsmodels.stats.proportion import proportions_ztest as ztest
ztest(np.array([x1, x2]), np.array([n1, n2]))
"""
# 源代碼計算方式,和評估組同學給出的計算方式一緻
輸出:(1.663369597, 0.09623847)
"""
複制
x1 x2 順序倒過來隻影響 z 值(相反數),不影響 p 值。
3. A/B Test 的兩類錯誤
我們知道假設檢驗的有兩類錯誤:
H0 正确(真實情況) | H0 錯誤(真實情況) | |
---|---|---|
拒絕 H0(研究結論) | I 類錯誤 | 正确 |
接受 H0(研究結論) | 正确 | II 類錯誤 |
I 類錯誤稱之為棄真:實驗組和對照組沒有顯著差異,但我們接受了方案推了全量。減少這種錯誤的方法就是提高顯著性水準,比如 p 值小于 0.05 才算顯著,而不是小于 0.1,顯著性水準是人為給定的犯一類錯誤的可以接受的上限(p 值為犯 I 類錯誤的機率
\alpha
)。
如果在實驗剛開始時,統計顯著性的波動非常明顯,這可能受到**新奇效應(Novelty Effect)**的影響。對于使用者有感覺的 A/B 測試,如 UI 改版、新的營運方案、新功能上線等,實驗組做的任何改變都可能引起使用者的注意,好奇心驅使他們先體驗一番,進而導緻 A/B 測試中實驗組效果一開始優于對照組,p 值極小,實驗效果非常顯著。但是一段時間過去後,使用者對于新的改版不再敏感,實驗組效果回落,顯著性可能會下降,最後趨于穩定。是以我們可以通過增加實驗周期進而避免這種新奇效應的影響。
II 類錯誤稱之為存僞:實驗組和對照組有顯著差異,但我們沒有接受方案。
II 類錯誤和統計功效 (power) 有關,統計功效可以簡單了解為真理能被發現的可能性。統計功效 =
1-\beta
,而
\beta
為犯第二類錯誤的機率。影響統計功效的因素有很多,主要的有三個:統計量、樣本量和 I 類錯誤的機率
\alpha
。
- 統計量好了解,比如上面的實驗統計量為:[0, 0.28],如果你的實驗的統計量為 [0.2, 0.48],自然範 II 類錯誤的機率會小很多;
- 增加樣本容量可以同時減少兩類錯誤,這個也很好了解;
- 與 I 類錯誤有關是因為,顯著性水準越高,對統計量的要求就越高。
下圖展示了兩類錯誤的聯系(這裡的
\alpha
為單邊假設,差別于 AB 測試中的雙邊假設):
一般來說,I 類錯誤的危害要比 II 類錯誤的危害要大。
增加樣本容量可以同時減少兩類錯誤,那麼我們應該需要多少樣本容量呢?
統計學裡給出了最小樣本量計算的公式:
n=\frac{\sigma^{2}}{\Delta^{2}}\left(Z_{\alpha / 2}+Z_{\beta}\right)^{2}
其中,
\beta
為 II 類錯誤的機率,
\alpha
為 I 類錯誤的機率,Z 為正态分布的分位數函數,σ 為标準差,Δ 為兩組數值的差異(
\rho_1 - \rho_2
)。從這個公式可以知道,在其他條件不變的情況下,如果實驗兩組數值差異越大或者數值的波動性越小,所需要的樣本量就越小。
實際 A/B 測試中,我們關注的較多的一類是比例類的數值,如點選率、轉化率、留存率等,也就是說結果非 A 即 B。比例類數值的假設檢驗在統計學中叫做兩樣本比例假設檢驗。其最小樣本量計算的公式為:
n=\frac{\left(Z_{\alpha / 2} \cdot \sqrt{2 \cdot \frac{\left(\rho_{1}+\rho_{2}\right)}{2} \cdot\left(1-\frac{\left(\rho_{1}+\rho_{2}\right)}{2}\right)}+Z_{\beta} \cdot \sqrt{\rho_{1} \cdot\left(1-\rho_{1}\right)+\rho_{2} \cdot\left(1-\rho_{2}\right)}\right)^{2}}{\left|\rho_{1}-\rho_{2}\right|^{2}}
通常設定
\alpha
為 0.05,
\beta
為 0.2。
用 python 算一下:
from statsmodels.stats.power import zt_ind_solve_power
from statsmodels.stats.proportion import proportion_effectsize as es
zt_ind_solve_power(effect_size=es(prop1=0.3, prop2=0.16), alpha=0.05, power=0.8, alternative="two-sided")
"""
138.8426
"""
複制
可以看到,我們應該需要準備 139 個樣本。
以上便是 AB 測試的全部内容,才疏學淺,如有錯誤,還望指證。