A/B测试实例
说了那么多假设检验的理论,现在来让我们上手操作一下。
这里我自己编造了一个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,属于小效应量,虽然试验组的购买转化率与对照组的购买转化率之间的差异具有显著性,但差异不大。
最终结论:试验组的购买转化率与对照组的购买转化率之间有显著差异,虽然差异不大,但达到优化目标。