說了那么多假設檢驗的理論,現在來讓我們上手操作一下。
這里我自己編造了一個A/B測試的例子:
某公司原來的購買轉化率是30%,現在想通過把其網頁上的”購買“按鈕加大一倍,使購買轉化率提升到33%。
可以看到這里的對比指標是轉化率,因此這里適用兩獨立樣本比率檢驗。
原假設:對照組的購買轉化率與試驗組的購買轉化率無顯著差異
備擇假設:對照組的購買轉化率與試驗組的購買轉化率有顯著差異
在測試之前,我們需要先確定樣本量。假設我想要達到的功效為80%,顯著性水平為5%,通過statsmodels計算樣本量的步驟如下:
首先計算出我們想要達到的效應量,即購買轉化率提升到33%對應的效應量是多少,然后再通過效應量,功效,顯著性水平計算出每組所需的樣本量。
from statsmodels.stats.proportion import proportion_effectsize from statsmodels.stats.power import zt_ind_solve_power effect_size=proportion_effectsize(prop1=0.3, prop2=0.33, method='normal') sample_size=zt_ind_solve_power(effect_size=effect_size, nobs1=None, alpha=0.05, power=0.8, ratio=1.0, alternative='two-sided')
這里解釋一下,zt_ind_solve_power函數里的參數ratio=1表示試驗組和對照組的樣本量相同,alternative='two-sided'表示是雙尾檢驗。
計算結果是:每組樣本大約需要3762個觀測值。
接下去進行A/B測試。假設兩種方案各有5000個用戶參與測試,原方案有1545個用戶完成轉化,優化方案有1670個用戶完成轉化。用statsmodels計算p值:
from statsmodels.stats.proportion import proportions_ztest z_score, p_value=proportions_ztest(count=[1545,1670], nobs=[5000,5000], value=None, alternative='two-sided')
proportions_ztest函數里的count表示對照組和試驗組完成轉化的人數,nobs表示各組樣本的觀測人數。
計算出的p值是:0.007。p<=α,結果是顯著的。
計算置信區間:
p1=1545/5000 p2=1670/5000 n1=n2=5000 p=(n1*p1+n2*p2)/(n1+n2) from scipy.stats import norm z_critical=norm.ppf(0.975) #計算臨界值 margin=z_critical*(p*(1-p)*(1/n1+1/n2))**0.5 #計算邊際誤差 lower=p-margin #置信區間下限 upper=p+margin #置信區間上限
置信區間是(0.3, 0.34)。
可以看到,試驗組的購買轉化率與對照組的購買轉化率之間有顯著差異。
接下去完成假設檢驗報告:
1, 描述統計
對照組樣本:5000個用戶,其中有1545人完成轉化。p1=0.309。
試驗組樣本:5000個用戶,其中有1670人完成轉化。p2=0.334。
2, 推斷統計
(1)假設檢驗
原假設:試驗組的購買轉化率p2-對照組的購買轉化率p1=0
備擇假設:試驗組的購買轉化率p2-對照組的購買轉化率p1≠0
檢驗類型:兩獨立樣本比率檢驗
樣本量:對照組5000,試驗組5000
抽樣分布類型:p1-p2近似正態分布
檢驗方向:雙尾
顯著性水平α:0.05
檢驗統計量的值:-2.68
p值:0.007
結論:p<=α,拒絕原假設,試驗組的購買轉化率與對照組的購買轉化率之間有顯著差異。
(2)置信區間
置信度:0.95
置信度對應的檢驗統計量的值:-1.96, 1.96
置信區間:(0.3, 0.34)
3,效應量
效應量的類型:Cohen's h
效應量的值:0.086
對效應量的解釋:效應量低於0.2,屬於小效應量,雖然試驗組的購買轉化率與對照組的購買轉化率之間的差異具有顯著性,但差異不大。
最終結論:試驗組的購買轉化率與對照組的購買轉化率之間有顯著差異,雖然差異不大,但達到優化目標。