前言

A/B测试是一种以假设检验为基础的对照实验,在当今广泛的应用于互联网企业中。关于A/B测试,在实际的实施中会有很多需要解决的问题,本文只是简单的介绍一下A/B测试,包括其理论基础,最小样本量的计算,以及其结果的解释与可能出现的情况等。

A/B测试理论基础

假设检验

A/B测试的理论基础是统计学中的假设检验,对此不了解的读者可以移步假设检验(一)——参数检验,这里简单结合业务场景再回顾一下。在互联网行业,A/B测试主要用于评估改动的影响,如页面修改,新功能等的影响。在确认产品更新,改动有正面影响后再上线。在如今日活量巨大的互联网产品中,贸然全量上线可能会引起巨大损失,而A/B测试就成为了上线前的保障。

上面说到,A/B测试主要用于评估改动的影响,将其翻译为假设检验的语言,改动就是假设,而影响就是我们关注的重要指标,因此假设一般写为

假设1:改动前的关键指标等于改动后的关键指标

假设2:改动前的关键指标不等于改动后的关键指标

而A/B测试中的A,B,就是指代改动前与改动后。

我们来套用几个实际场景,例如,电商场景,我们可以将关键指标设置为成交额,假设现在要测试一个页面的改动对成交额的影响,记页面1的总体均值为μ1\mu_1,页面2的总体均值为μ2\mu_2,那么假设可以写为

H0:μ1μ2=0vsH1:μ1μ20H_0: \mu_1 - \mu_2 = 0 \quad \mathrm{vs} \quad H_1: \mu_1 - \mu_2 \ne 0

注:我们都知道,假设检验有三种,两种单侧检验,一种双侧检验。但是,在A/B测试中,一般使用的都是双侧检验,主要有以下两个原因。第一,双侧检验可以同时照顾到正向与负向的效果,万一这个改动就真的是负优化呢。第二,双侧检验可以让数据发挥更大的作用,毕竟,单侧检验相当于提前限制A一定不可能比B小(大),这是包含了我们的主观想法的,做A/B测试的目的自然是想要更多的发挥数据的作用,因此最好不要在其中添加主观想法。

大样本u检验(z检验)

完成假设的建立后,接下来就是选择统计量了。A/B测试中常用的就是大样本u检验。因为在A/B测试中,既然是测试了,那样本量就是由自己设定的,并且一般获取难度不会很大,因此一般是满足大样本的条件的。而且,我们关心的关键指标中,有很多其实是不服从正态分布的,例如点击率,付费率等,这时候利用大样本u检验,就可以规避掉这个问题。因此,在A/B测试中,大多数情况下,我们都可以直接使用大样本u检验。

接着我们来回顾一下大样本u检验,简单来说,根据中心极限定理,从一个均值为μ\mu,方差为σ2\sigma^2的总体中,抽取nn个样本,当nn足够大时,样本均值x\overline{x}服从正态分布

xN(μ,σ2n)\overline{x} \sim N(\mu,\frac{\sigma^2}{n})

因此可以构造统计量uu

u=xμσ/nN(0,1)u = \frac{\overline{x} - \mu}{\sigma/\sqrt{n}} \sim N(0,1)

当方差未知时,可以使用样本方差进行估计,即统计量uu

u=xμs/nu = \frac{\overline{x} - \mu}{s/\sqrt{n}}

并且这也可以扩展到双总体的情况,也就是A/B实验中所使用的,其统计量为

u=xys12m+s22nu = \frac{\overline{x}-\overline{y}}{\sqrt{\frac{s_1^2}m+\frac{s_2^2}n}}

注:我们常说的n>30n > 30的大样本判定方式其实更多的是一种经验之谈,严格意义上的大样本自然是$$

关键指标

回顾完了假设检验,我们再来结合实际业务中,我们可能会使用到的关键指标,举例说明A/B实验中的假设检验是如何进行的。业务中我们常用的关键指标大致可以分为两个大类,分别为

均值类:成交额,活跃时长等

概率类:点击率,留存率等

我们结合场景来感受一下,例如还是上述的电商场景,关键指标为成交额,两个总体分别对应页面1与页面2,样本数量分别为mmnn,样本方差为s12s_1^2s22s_2^2,样本成交额均值为x\overline{x}y\overline{y},计算统计量u0=xys12m+s22nu_0 = \frac{\overline{x}-\overline{y}}{\sqrt{\frac{s_1^2}m+\frac{s_2^2}n}},再计算pp值为p=2(1Φ(u0))p = 2(1 - \Phi(|u_0|))

再看一个例子,广告场景,我们想要检验新的设计是否比旧设计好,关键指标为点击率,两个总体分别对应设计1与设计2,这里注意一下,点击率在这里是作为均值而存在的,因为每一个样本(用户)只会有一个是否点击广告,也就是0或1,因此点击率是指一整个组的点击率。记样本数量分别为mmnn,各组别点击率为p1p_1p2p_2,样本方差为s12=p1(1p1)s_1^2 = p_1(1 - p_1)s22=p2(1p2)s_2^2 = p_2(1 - p_2),计算统计量u0=p1p2s12m+s22nu_0 = \frac{p_1 - p_2}{\sqrt{\frac{s_1^2}m+\frac{s_2^2}n}},再计算pp值为p=2(1Φ(u0))p = 2(1 - \Phi(|u_0|))

以上就是A/B测试的基本原理及其使用。

A/B测试流程

在介绍完A/B测试的理论基础后,我们就可以来看看A/B测试的全貌了。所谓A/B测试,其本质是我们人为进行的一次对照实验,而假设检验只是我们用于在实验完成后下结论的一个工具,也就是其为A/B测试的最后一步。这与我们在学习假设检验时遇到的例子相比,这不仅仅是对现有数据的随机抽样及检验,而是一个从抽样,分组等各方面都可以有我们自己设计的实验。也因此,在A/B测试,假设检验的前置步骤以及后续的解读才是更为重要的,前者关系到数据的质量,做好实验设计才可以使得假设检验发挥出其该有的作用,而后者关系到我们如何解读与使用假设检验的结果。

我们先来看看A/B测试的流程

image-20240315160815961

套用至上面的例子来说,就是在所有用户中选一部分进实验,然后分组,其中一个组的用户会用到经过改进的页面2,另外一个组则会继续使用旧版的页面1,这与生物实验上的实验组与对照组的思想是类似的。可以看到,这其中我们可以进行介入的就是参与测试的用户,以及分组的策略。这也是我们需要重点关注的问题

最小样本量

首先我们需要关注的就是样本量,对于测试来说,当然是样本量越大最终测试的结果越准确,但是我们进行A/B测试的出发点就是不希望太多的用户使用到未经过测试的改进或功能,并且,进行A/B测试的用户量过大,也会导致测试成本过高,也就是说,假设检验要求尽可能多的样本量,而A/B测试要求尽可能少的样本量,为此,我们必须在这两者之间找到一个平衡。

我们先来看看最小样本量的计算公式

n=σ2Δ2(Zα/2+Z1β)2n=\frac{\sigma^{2}}{\Delta^{2}}\Big(Z_{\alpha/2}+Z_{1 - \beta}\Big)^{2}

该公式是通过控制犯两类错误的概率推导出的,具体推导可见A/B测试中最小样本量计算公式的推导,各参数意义如下

nn:一个组别的样本量,也就是说,对于一般的两个组别的A/B测试,所需总样本量为2n2n

σ2\sigma^{2}:方差,一般用原有数据的样本方差替代

Δ2\Delta^{2}:实验组与对照组之间的均值差,一般设定为我们主观认为均值会提升的值,例如,原点击率为1%,我们希望改动后提升至1.5%,差值就为0.5%

α\alpha:犯第一类错误概率,一般取0.05

β\beta:犯第二类错误概率,一般取0.2

实验设计

理想情况下的A/B测试当然是对于两组完全相同的用户,在平行时空下让其分别在实验组与对照组进行测试。也就是说,我们希望我们的实验组与对照组之间的差异性尽可能的小,这样我们的A/B测试结果才会更准确。这方面的内容,较多较杂,而且更多是视情况使用,但总体而言都是再向着更科学的方向迈进,这里仅简单介绍一些常用的方法。

抽样策略

在样本量充足,特征较少的情况,我们只需要使用随机抽样,大数定理就可以保证实验组与对照组的样本大体相同。但是在实际使用中,情况往往没有那么理想,这时候我们可以用一些抽样策略使得分组更科学,例如分层抽样

分层抽样是根据一定特征,将样本总体分为多个集合,再根据该集合占样本总体的比例,按比例在该集合中进行随机抽样。在A/B测试中,我们常常可以使用用户画像为基准进行分层抽样。用户画像说起来其实并不复杂,以下表为例

特征 特征取值
性别 男,女
地区 广州,深圳,上海
年龄 18岁以下,18-30,30-50,50及以上

根据上述特征,我们可以将所有用户分为2×3×4=242 \times 3 \times 4 = 24种不同类型的用户,如第一种用户是性别为男,在广州,18岁以下的用户,这就是用户画像。根据每个分层占总体的比例,我们在这个层中进行随机抽样。例如,我们现在有100000个用户,我们需要抽1000个用户来做A/B测试,现在我们进行分层抽样,假设第一种用户(男,广州,18岁以下)有4000个,占总用户数的4%,那么我们就要在这个层中,随机抽取1000×41000 \times 4% = 40个样本,以此类推。这样,就可以保证抽取出来的各种用户的比例与原总体相同

分流

在实际业务中,同一时间可能有多个A/B测试同时进行,该如何保证这些A/B测试之间不相互影响,这也是需要解决的问题。一个最简单的方法是令所有参与A/B测试的用户相斥,也就是一个用户不可能同时参与多个A/B测试。当然,这是一个很费用户量的方法,当样本量不够用时,我们可以使用正交分流。正交分流的思想与上文提到的分层抽样较为相似,假设我们有两个A/B测试,其对照组分别记为A1A_1A2A_2,实验组记为B1B_1B2B_2,则我们可以取两个实验所需的最大样本数,并将其划分为4个组,分别为A1A2A_1A_2A1B2A_1B_2B1A2B_1A_2B1B2B_1B_2,包含A1A_1的组则作为第一个A/B测试的对照组,包含B1B_1的组则作为第一个A/B测试的实验组,第二个A/B测试同理。

A/A测试

A/A测试指额外设置对照组,以降低随机性的影响,提高实验组的可信度。一般来说,A/A测试两组的差异性应该是很小的,如果出现了A/A测试差异较大的情况,说明实验设计有问题,这其中一定有没有考虑到的因素,此时即使进行A/B测试,其结果也是不可信的。

结果解读及常见问题

理论上,A/B测试的结果就是读一下pp值,然后判断是否显著,就可以下判断了。但是现实往往没有这么简单,可能会出现以下情况

情况1:测试结果统计意义上不显著

当测试结果在统计意义上不显著时,我们并不用直接给其判死刑。可以通过图表等方式,例如将每天的指标值进行对比,若每天都是实验组的表现更好,我们其实也可以认为实验组对关键指标是有提高的。

情况2:测试结果在统计意义上显著,该改动一定能上线吗

其实不然,由于A/B测试是一个单因素实验,因此,这会出现忽略其他因素的问题,当我们优化一个因素时,这可能对其他因素有影响,并且这个影响有可能是负面的,因此我们还需要多因素综合判断。

总结

本文简单介绍了A/B测试的理论基础,以及设计A/B测试中可能遇到的问题与解决方法,最后介绍了A/B测试可能出现的结果及如何进行解读。