数字化营销:A/B 测试简介

A/B测试随着互联网和增长黑客的发展被人们广泛熟知,在企业决策中的一些场景中能够提供很好的数据支撑,是数据科学中很重要的组成部分。就是希望通过假设检验的方式确定我们的实验组和对照组是否具备显著差异。在具体的项目实施过程中也可能会发现想要做好一个A/B测试没有想象中的那么简单。

A/B测试所适用的场景

A/B测试并不是能够在所有的企业决策里面发挥作用。通常有一种比喻,A/B测试能够告诉我们如何才能爬上山峰,但是并不能够告诉我们应该爬哪一座山。与此同时,我们还需要考虑实验的结果是否能够获取以及样本是否能够随机筛选等。

适合A/B测试的场景

  1. 测试初始化页面的布局。 [非常容易控制,而且指标很清晰]
  2. 电影推荐算法,是否有效。 [指标清晰,数据可控]
  3. 更改后端框架,页面加载速率等。[有两套系统是可以测试的]

不适合A/B测试的场景

  1. 网站卖车,页面的变更是否提高了复购率或者推荐?[车是耐消品,时间太长而且没有数据]
  2. 更新品牌包括Logo? [情感冲击太大,用户习惯会需要时间,不适合根据短期的AB测试数据做出决策]
  3. 在线购物,网站商品是否齐全?[没法知道用户到底需要啥,该信息无法通过对照实验获取]
  4. 添加白金服务。[无法通过AB测试看添加白金服务是否是一个好的商业选择,因为用户需要主动购买,那么用户分组就不是一个随机的过程。]

A/B测试的流程和结果评估

具体实践中我们见过很多这样的例子: 业务人员在线下想通过组合销售来提升客单价,并希望得出结论该组合销售的策略是否有效。于是在接下来的两个小时内分别观察消费人数和对应的消费金额。结束后统计发现两组活动中B组的客单价(56元)相比于A组(48元)有16.7%的提升,于是工作人员就很开心地得到结论:新的组合销售策略能够有效提升客单价。但实际上这个实验是失败的,我们甚至没有80%的概率说明这件事情显著有效(该样本组的单边T检验P-value=0.2)。

A/B测试的原理

通过上面的例子我们发现想要彻底了解A/B测试就需要了解它背后的逻辑、假设前提以及实现方法。A/B测试本质上讲就是一个假设检验的过程,该方法最早应用在农业场景下,当时把一块土地分成好几个部分并种植不同的农作物,从而比较两种农作物的产量是否具备显著差异。之后该方法也应用在很多个方面,例如我们通常所说的可控临床测试就是典型假设检验方法。甚至在有限受试者的情况下,如何避免统计样本划分和评估的非随机性(称作偏倚问题)也会有很多处理的方法(例如在实验中加入安慰剂)。

对总体的某种规律提出一个假设,通过样本数据来推断,决定是否拒绝这一假设,这样的统计活动称为假设检验,适用的场景还有很多:

  1. 某产品的次品率是否不超过3%?
  2. 男生群体平均身高是否大于女生群体平均身高?
  3. 身高是否服从正态分布?
  4. 抽烟与慢性支气管炎是否有关?

以上面我们自己的例子来看,两个小时内,每个用户进店并且购买的情况其实是有两组采样数据,那么这两组采样数据都会满足各自背后的分布(我们是未知的)。那么我们可以提出两种假设:假设H0:两组用户的客单价的分布一样,并没有差异。假设H1:两组用户购买背后的分布不一样,满足两个不同的分布。这里的H0称为原假设/零假设(Null Hypothesis),H1称为备选假设/对立假设/备择假设(Alternative Hypothesis)。我们就是希望通过采样的数据来评价,到底有多大的可能性来接受或者拒绝原假设。

在判断两个假设的过程中就会有可能存在两种错误:

分别称为拒真错误(第一类错误)和纳伪错误(第二类错误)。假设检验的核心问题是如何控制犯两类错误的概率。值得注意的是,这两个概率为条件概率。犯第一类错误的概率常用\alpha表示, 第二类错误的概率用\beta表示。

还有一个重要的概念是p-value它表达的是假设H0为真的情况下,我们获得实验所观察到数据的概率有多少。通常这个数据小于0.05的时候,我们就认为有95%的信心认为原假设是错误, 因为采集到的数据在满足原假设的前提下,只有5%的概率被采集到。那么我们愿意冒这么大的风险去做判断。但是这里也要注意不同的场景下临界值得选取会不一致,比如说在药物测试的时候,该概率会更加严苛。一般来说我们可以这样认定评估:

  • p_value > 0.1: 没有显著性
  • 0.05<p_value <0.1: 弱显著性
  • 0.01<p_value <0.05: 有显著性
  • 0.001<p_value <0.01: 强显著性
  • p_value < 0.001: 极强的显著性
客单价例子的T检验结果

我们现在可以尝试一下之前的例子中的情况,两组客户消费价格对比,是否能够看出具备显著性客单价的提升。这里看得出来P-value有0.2,那么意味着我们具备20%的可能性说明sample2中采集的数据来自于和sample1同一个分布,所以我们并不能推翻原假设。这里用到的AB测试可视化工具来自于大神Evan Miller分享。其中背后的代码也在JS中有实现,是一个很不错的工具推荐给想要具体实施的小伙伴作为参考。同时在python中用ScipyPingouin也能直接实现上述的T-student‘s检验。

以上都是了解假设检验原理需要了解的基本概念,但是具体的公式还是会有很多的推导过程,读一读会觉得清晰很多。自己一开始理解这个问题还是有很多细节会觉得困惑(譬如我们的观测数据其实是一次采样,原始假设的概率分布我们并不知道),直到看到了以下这几个材料。写的很清楚,我就不重复工作了,有兴趣深究的人可以仔细看看下面的材料:

  1. https://bookdown.org/hezhijian/book/test.html
  2. https://blog.csdn.net/Queen0911/article/details/121718236

A/B测试的流程

凭直觉也会发现样本采集量和最后的结果评估是相关的(数据越多一般原始分布的方差会小,高斯分布会越紧),例如扔硬币,次数多的情况下正反面的结果才更加均衡。A/B实验也是如此,样本量越大,我们越有能力说明较小的差异。所以通常流程如下:

AB测试的流程

一般会根据对商业或者业务有价值的最小提升量进行估计,譬如客单价提升5%才具备业务价值,那么实验前会根据该假设去评估需要进入实验的最小人数(提升目标越小,需要的样本量越大) ,这一步称为最小样本量估计。这样就能估计出保守的需要进入实验的人数,但是在实际实验中可能并不需要这么多人就能说明我们实验有效,因为我们的结果得差异可能更加显著,我们的估计是保证业务有意义情况下的最大人数。

上述步骤中还提到添加互斥组和流量分配,这里其实涉及到下面一部分的内容,我们如何能够高效的进行A/B测试.

如何高效地执行A/B测试

A/B测试的理论部分在上面已经讲完了,但是因为通常用户流量有限,需要进行AB测试的内容繁多,所以在实际执行中的AB测试需要提高效率。那么这里就引入了实验层的概念,简单来说就是如果两个实验之间并不会相互影响(譬如通过用户线上消费的客单价来评价商品图片的变更策略和包裹中的文案对用户是否加入会员),那么我们希望该用户能够同时进入两个实验中来提高用户的复用率,从而能够在用户数量有限的情况下尽可能的多进行不同的测试。

用户正交分层示意图

如果两个实验会相互影响结果,那么这两个实验需要进入同一个实验层(互斥组)。如下图所示,下图每一个实验层其实都是全量的用户,互斥的实验是需要放在一个层内防止用户被多个实验相互干扰。还有一点要注意的是,一开始很多人会想通过选取标签来划分用户,譬如把带有某标签的用户筛选出来然后让他们进入两个不同的组内进行实验。但是这种做法是错误的,因为余下的用户就不再是随机的了,而变为不具备某标签的用户。所以上图中的不同实验组是原始的全量用户,按照比例进行划分,在进入实验组后再按照我们想要选取的标签进行筛选实验。而且为了保证用户的随机性,如右图所示不同实验层之间的用户也会尽量打散,并不会被分入不同层的同一个实验组中。

流量在不同层中的分配

A/B测试看似简单,但是背后的数学假设和推理还是需要一定的数理统计功底,具体实施的过程中也需要系统开发方面的支持。本文只是简单的介绍了AB测试的主要步骤,其中具体的实现方式还需要看我们实施的场景,譬如是选择卡方检验还是Z检验等等。

发表评论

您的电子邮箱地址不会被公开。