ABtest数学原理

问题

假设现在有一个新的点击注册文案,想要测试它的效果,实验人员将实验分为对照组和实验组,给对照组看原来的文案,而给实验组看新的文档。实验结果是,对照组中的14500人中有1450人注册点击,而在实验组的14500人中有1600人点击注册,如何通过实验数据来判定新的文案是否优于老的文案?

主要看两个指标:第一个是实验是否统计显著(statistically significant);第二个是统计功效(statistical power)是否满足。

统计显著

首先看实验是否统计显著,即pvalue是否小于显著性水平,使用的方法是假设检验。具体方法是当零假设(两个版本没有区别)成立时,算出得到观测数据的概率pvalue,如果这个概率小于显著性水平,则拒绝零假设,实验结果显著。pvalue具体计算方式如下: 假设p1,p2为两个版本的总体点击率,对控制组的样本均值设为X1bar,实验组的样本均值为X2bar,根据中心极限定理,X1bar和X2bar均满足正态分布。根据两个独立正态分布变量之和依旧是正态分布,X1bvar-X2bar也满足正态分布。于是有 avatar

然后建立零假设p1-p2=0,并计算z-score,如果z-score大于显著性水平所在的临界值,那么就拒绝原假设,即p1不等于p2。这里需要注意的是,就算拒绝了原假设,它也是有概率成立的,只是这个概率太小,一般显著性水平alpha设置在0.05,那么只能说95%的概率原假设是不成立的。如果pvalue小于alpha,但是真实结果是p1等于p2,这类错误叫做第一类错误,让alpha的值较小可以降低这类错误的发生。

统计功效

第二个指标是统计功效。需要让这个指标达标,样本数量需要满足一定的要求。在实验开始前,先计算每个实验的分流数,让实验经过那么多流量后,该实验的统计功效才能得到满足,分流数的计算方法为(来自http://www.evanmiller.org/ab-testing/sample-size.html)

1
2
3
4
5
6
7
8
9
10
11
12
function num_subjects(alpha, power_level, p, delta) {
    if (p > 0.5) {
        p = 1.0 - p;
    }
    var t_alpha2 = ppnd(1.0-alpha/2);
    var t_beta = ppnd(power_level);

    var sd1 = Math.sqrt(2 * p * (1.0 - p));
    var sd2 = Math.sqrt(p * (1.0 - p) + (p + delta) * (1.0 - p - delta));

    return (t_alpha2 * sd1 + t_beta * sd2) * (t_alpha2 * sd1 + t_beta * sd2) / (delta * delta);
}

其中alpha为显著性水平,power_level是功效值,p是控制组基准值,delta为实验的最小差异。当实验经过那么多流量后,如果统计显著,那么该实验就是可信的;如果统计不显著,我们要确保这两个版本确实没有足够大的差异,即接受零假设p1=p2,此时会发生的一种情况是,p1不等于p2,只是这次实验中,p1-p2的值刚好落在假设检验的接受域中,这类错误称为第二类错误(接受了错误的原假设)。为了让第二类错误足够少,可以让p1-p2这个正态分布足够窄,那么落在Z_alpha之内的值的概率就足够小,此类情况的概率就足够小。

在以上两种指标都达标时,当实验结果显著时,它大概率就是显著的(显著性水平保证了第一类错误小于5%);当实验结果不显著时,它大概率就是不显著的(统计功效保证了对这个不显著的结果有多大的信心)。

实验组和控制组还可以计算置信区间,表示总体参数的范围。置信区间有两种解释方式。 第一种是计算一个结果本身的置信区间,比如Click/Impression=10/10000,那么它的置信区间为0.001±sqrt(0.1*0.9 / 10000) 第二种是计算某组相对控制组的提升百分比置信区间,我们采取这种方式展示。

不仅要看最终是否显著,还需要看趋势:试想有一个改进在白天可以提升100%,而在夜晚下降了20%,如果只看最终的结果,那么一定是显著的,但是通过看趋势我们完全可以看到晚上的异常值,从而更细粒度地发现问题。

实验方法论

  • 根据alpha、power_level、p、delta计算出实验最小分流数(若知道pv,则可以算出实验时间),这个计算需要用户自行用工具计算(很多在线工具)
  • 设置实验参数、上线实验
  • 实验期间观察关键指标的变化趋势,看是否有大起大落等异常现象
  • 经历了最小分流数后,实验结束,看实验是否显著(pvalue小于显著性水平)。如果显著,则较有信心改进版会有提升;若不显著,则改进版可能真的没什么效果
  • 置信区间表明了上线后提升的范围