一、为什么要做A/B Testing?
A/B Testing用于产品方案的对比,在快速产品迭代的场景下会出现这个需求,使产品不断的演化、升级。为了更好的使用A/B Testing,需要对产品十分熟悉,明确产品需要升级和迭代的方向。
二、A/B Testing的流程
假设只对新版和旧版两个版本做测试(实际中也可以对多个版本同时测试),另外,在提升指标部分,实际中可以确定唯一的提升指标,如仅测试CTR,也可以确定多个提升指标,如CTR和Quantity,但每个因子的显著水平以及实验整体的最小样本量的计算方式会与单一因子有所不同。下图流程中标蓝的为和统计知识比较相关的部分。
三、举个栗子
3.1 实验假设及分流
假设我们对广告投放的落地页(landing page)的设计进行改版,把落地页的版式进行调整,调整前的版本为老版本,记做A,调整后的版本为新版本,记做B。我们选定Conversion Rate作为标准,判断B版是否优于A版。
这里我们有两个假设。
H0: ( 原假设,Null Hypothesis) 老版本的效果和新版本一样,即老版本的CR和新版本的一样。这是我们希望通过实验推翻的假设。
H1:(备择假设,Alternative Hypothesis),可以是老版本的效果和新版本的不一样,或者是老版本的效果没有新版本好。
A/BTest就是要验证H0是否正确(这个放到下一步再说)。
另外,上线AB实验时,需要对流量进行分流,这就需要确定分流的依据。实际中需要结合实验的平台(如APP或者PC,以及区分服务端还是客户端),来决定分流依据是什么,如用户的deviceid,或者是登录用户的userId等。
具体分流时,针对新老两个版本的情况,把流量分为4份。B为实验组(新版本)的流量,C和D为控制组的流量(老版本)。B=C+D,即实验组和控制组的流量比例为1:1,而C和D的流量相等,B:C:D=50%:25%:25%。另外,针对一些异常流量以及B、C、D剩下来的流量,由A兜底。
C和D版本的目的是用来做AA检测,保证实验过程中流量是平稳的。在AA检测通过的情况下,再做AB检测。
此处仅为一个实验的例子,如果实际中一个页面有多个实验存在,为保证实验和实验之间互相独立,则需要对实验进行分层,保证实验之间为正交关系,互不影响。具体来说,假设一个页面层的流量有如下6根柱子这么多。如果现在同时要进行3个实验,保证每个用户只稳定的分流到一个实验中去,则需要把流量分为6份,3份黑色的为老版本,3份黄色的为新版本,但是是针对1b, 2b, 3b这三个不同的实验。每个黑色和黄色的柱子就组成了每个实验的老版本和新版本的全部流量。
3.2 假设检验
3.2.1 四种情况
针对新版本是否比老版本好,以及我们是否能检测到,有以下四种情况。
真实情况 | 真实情况 | |
---|---|---|
我们的判断 | 没区别(H0) | 有区别(H1) |
没区别 | 没效果 | Type II Error (False Negative) 误判为没效果 |
有区别 | Type I Error (False Positive) 误判为有效果 | Statistical Power |
表格里代表了四种情况——
(1)实际没区别,我们也判断出来了没区别。这种就不用管了。
(2)实际没区别,但是我们判断错了,我们判断出来有区别。这个就是Type I Error,第一类错误(False positive),误判为有效果。第一类错误发生的概率记做。
实际中我们会非常严格的控制第一类错误发生的概率。因为第一类错误发生可能会带来比较重大的损失。比如一个改版实际没效果,你确认为有效果,投入生产后并不会给公司带来收益,造成资源的浪费。
因此alpha一般都会控制在5%。即我们容忍第一类错误发生的概率是5%。
(3)实际有区别,我们误判为没区别。这个就是Type II Error,第二类错误(False Negative),误判为没有效果。第二类错误发生的概率为。
实际中,我们对这一类错误的容忍程度较高。即便是个有提升的方案,但是我们没有识别出来,也就算了,至少没有直接负面的效果。
一般取20%。同时降低第一类和第二类错误的概率,就是增加sample数(population都检测完了,当然最准确)
(4)实际有区别,我们也检验出来了有区别。这个叫做statistical power。是指实验有区别的情况下,我们正确检测出来他有区别的概率,反映了检测的能力。举个夸张的例子,如果新版本真的比老版本好,但是我们只有30%的能力检测出来这一点,那这个实验也没有啥用。根据条件概率,statitical power = 1-。Power与alpha、sample size(主要)和effect size等因素都有关。
3.2.2 假设检验
先说下P值(significance level)。
假设老版本的CR是5%,而新版本的CR是5.5%。
假设H0为真,那么在原有版本的CR分布中,检测到5.5%这个值的概率,即为P值。相在H0为真的前提下,计算CR>=5.5%的概率P(CR>=5.5% | H0 is True)。
假设H0是真的,也就是老版本和新版本的效果其实是一样的,那么我们检测到实验结果是5.5%的概率有多大?
这个概率如何计算?
说到这里,再讲一下z-score。z-score=(x-)/。即观测值距离这个分布的均值,隔了多少个标准差。z-score可正可负,因为观测值可能比均值大,也可能比均值小。用z-score看p-value是多少,就要查表了,或者用R和python计算。
所以,除了知道老版本的CR均值为5%之外,我们还需要计算老版本的方差,还需要知道新版本我们的样本量是多少。加上一些对参数的假设,我们用单边检测,检测到CR为5.5%的概率如下:
z_test <- function(x, mu, s, n, tailed){
z<-(x-mu)/(s/sqrt(n))
if(tailed == 1) return (cat('Z-Score - ', z, '\np-value - ', pnorm(-abs(z))))
if(tailed == 2) return (cat('Z-Score - ', z, '\np-value - ', 2 * pnorm(-abs(z))))
if(tailed != 1 | tailed != 2) return ('can only be one or two tailed')
}
z_test(0.055, 0.05, 0.05, 100, 1)
#Z-Score - 1
#p-value - 0.1586553
z_test(0.055, 0.05, 0.05, 1000, 1)
#Z-Score - 3.162278
#p-value - 0.0007827011
可以看到,对样本量的假设不一致的情况下,得到的结果也是不同的。如果这个概率<=5%(significance level,也就是我们第一类错误的概率),就是说我们只有<=5%的概率才能检测到新版本的CR是5.5%,那么我们就拒绝原假设,接受备择假设。
3.2.3 在实验开始之前——Effect Size & Sample Size
其实在计算p值之前,在开始实验之前,最重要的一步是确定,这个实验要做多久?我们需要多少样本?
我们不能边做实验边看p值,等p值显著了就把实验停止掉。而是要在实验开始之前就确定好实验周期,以及Effect Size,从而计算最小样本量是多少,依据最小样本量及其平时我们每日的流量,计算得到实验周期。
Effect Size是强调差异的程度(或者关系的程度),比如R方就是一种effect size。这里的Effect Size,是指第一个分布和第二个分布的均值相差有多大。不同指标的effect size会非常不同,我们希望的effect size也会不同。以转化率为例,我们希望检验出来的差别至少是0.5%。如果在0.5%以下,假设是提升了0.3%,就算检测出来了,从业务层面来说我们可能也觉得没有意义。
下图说明了sample size和power的关系,以及effect size和power的关系。这里重点看右边(因为我们希望通过effect size和power来反推sample size)。右边的三个小图,从上到下,effect size从1到2在不断变大,相应的,power(蓝色部分的面积)也在变大,即如果差别越大,检测出来这种差别的能力就越强,这样如果保持power不变,那需要的sample size就越小。
四、A/B流程- 重新梳理
A/B Testing中,核心流程如下。在确认主指标和参数之后,可以在网上搜索A/B Test Sample Size Calculator计算最小样本量,或者公司有自己的算法可以套公式计算。然后等实验结束,做好AA检验,保证分流没问题,再做AB检验,看P值结果就可以了。
参考资料:
非统计专业?5分钟搞懂如何计算A/B测试样本量
P-value From Z-Score Function in R
Power & Effect Size