gitbook/AB测试从0到1/docs/323696.md
2022-09-03 22:05:03 +08:00

17 KiB
Raw Permalink Blame History

07 分析测试结果:你得到的测试结果真的靠谱吗?

你好,我是博伟。

经过前面的确定目标和假设、确定指标、选取实验单位、计算所需样本大小后我们终于来到了A/B测试的最后一站分析测试结果。

在正式开始之前我想先问你一个问题拿到测试结果之后就可以马上进行分析了吗肯定不行。因为只有确定测试结果值得信赖之后才可以进行分析。其实分析A/B测试结果并不难难的是如何得出值得信赖的结果从而给业务以正确的指导。

为什么这么说呢接下来我就通过一个音乐App要提高用户升级率的例子和你先拆解下导致测试结果不可靠的因素有哪些然后再看看具体该怎么分析。

案例导入

通常情况下音乐App有两种盈利模式一种是提供免费音乐但是会在App中加广告通过广告赚钱一种是让用户付费订阅App享受高品质的免广告音乐。

我们的这款音乐App是两种盈利模式都有但是从长期盈利效果和用户体验来看采用用户付费订阅的模式会更胜一筹。因此我们计划在双十一前后针对App里的免费用户做一次促销吸引他们付费。

现在有这么两条广告语为了通过A/B测试验证哪条更有效将其分别放到实验组和对照组

  • 对照组广告语:千万曲库免广告无限畅听,用户升级,免费试用半年!
  • 实验组广告语即日起到11月15日用户升级免费试用半年

现在我们来完成A/B测试的整体设计方案。

  • 确定目标:使更多的免费用户升级成为付费用户。
  • 提出假设:通过在广告语中加入倒计时这种增加紧迫感的信息,能够提升免费用户的升级率。
  • 确定实验单位免费用户的用户ID。
  • 实验组/对照组随机分配50%/50%。
  • 评价指标:用户升级率 = 点击广告升级的用户数 / 看到广告的用户数。
  • 评价指标的波动范围:[1.86%2.14%]。

设计好了A/B测试的框架实施了A/B测试后我们就可以等待分析测试结果了。那什么时候可以查看测试结果停止A/B测试呢这是保证测试结果可信赖要解决的第一个问题。

什么时候可以查看测试结果?

还记得我们上节课,在计算测试要达到显著性结果所需的最小样本量时,用到的一个公式吗?

A/B测试所需的时间 = 总样本量 / 每天可以得到的样本量。

结合这个公式再根据App中每天免费用户的流量我们可以计算出这个测试在理论上需要跑10天。

其实,这个公式只是理论上推导,具体到A/B测试的实践中我们要确定测试时间除了考虑样本量的大小外还要考虑指标周期性变化的因素

如果指标具有强烈的周期性变化,比如周中和周末的变化很大,那么这时候的测试时间要包含至少一个周期的时间,以排除指标周期性变化的影响。

在音乐App这个案例中我们通过历史数据发现在周末升级的用户要比周中多。这就说明用户升级率这个评价指标会以每周为单位形成周期性的变化所以我们的测试至少要跑7天。而我们通过最小样本量已经算出了本次测试需要跑10天包含了一个周期所以我们可以放心地把测试时间定为10天。

我再多补充一句,如果计算出的测试时间小于一个周期的时间,那么最好也按照一个周期来算,这样做更为保险。

不过啊,在测试实际进行的过程中,有可能出现这样一种情况:在预计时间之前,评价指标出现了显著不同。这时候你就要小心了,如果提前结束测试,就会前功尽弃。我来给你具体解释下。

假设负责这个测试的数据分析师是第一次做A/B测试所以特别激动兴奋每天都在观测实验计算测试结果。在实验进行到第6天的时候样本量还没有达到预期他发现实验组和对照组的评价指标出现了显著的不同。这位数据分析师就在想测试结果在预计时间之前达到了统计显著,这个实验是不是提前成功了呢?

答案当然是否定的。

一方面因为样本量是不断变化的所以每次观测到的测试其实都可以算作新的实验。根据统计上的惯例A/B测试一般有5%的第一类错误率α也就是说每重复测试100次平均就会得到5次错误的统计显著性的结果。

这就意味着如果我们观测的次数变多的话那么观测到错误的统计显著结果的概率就会大大提升这是多重检验问题Multiple Testing Issue的一种体现。关于多重检验问题我会在第9节课中详细讲解。

另一方面提前观测到统计显著的结果这就意味着样本量并没有达到事先估算的最小样本量那么这个所谓的“统计显著的结果”就极有可能是错误的假阳性False Positive。“假阳性”是指两组事实上是相同的而测试结果错误地认为两组显著不同。

因此这位数据分析师还不能提前结束这次测试,仍然需要继续观测实验。

如果测试已经跑到了第10天样本量也达到了之前计算的量那是不是就可以开始分析A/B测试的结果了呢

答案依旧是不行。

俗话说心急吃不了热豆腐为了确保实验在具体实施过程中按照我们预先设计的进行保证中途不出现Bug那么在正式分析实验结果前我们还要进行测试的合理性检验Sanity Check从而保证实验结果的准确性。

在第3和第4节课我们学过为了确保在具体实施过程中不会出现破坏统计合理性的Bug我们可以用护栏指标来保证统计品质。这时我们可以使用实验/对照组样本大小的比例和实验/对照组中特征的分布这两个护栏指标。这是保证测试结果可信赖,我们要关注的第二个问题。

保障统计品质的合理性检验

检验实验/对照组样本量的比例

我们预设的是实验组和对照组的样本量各占总样本量的50%,现在我们来看看实验过程中有没有发生什么变化。

各组样本量占总样本量的比例也是概率也是符合二项分布的所以具体的操作方法参见第4节课指标波动性的相关内容

  • 首先根据二项分布的公式$\sqrt{\frac{p(1-p)}{n}}$算出标准误差。
  • 然后以0.550%为中心构建95%的置信区间。
  • 最后,确认实际的两组样本量的比例是否在置信区间内。

如果总的比例在置信区间内的话就说明即使总的比例不完全等于50%/50%,也是非常接近,属于正常波动,两组样本量大小就符合预期。否则,就说明实验有问题。那该如何确认和解决潜在问题呢?

回到我们的A/B测试上来我们实验组的样本量315256对照组的样本量为315174。通过公式我们求得标准误差为
计算出来的结果是0.06%我们构建了95%的置信区间[50%-1.96*0.06%, 50%+1.96*0.06%] = [49.88%,50.12%],也就是两组占比的波动范围,然后算出总体的实验组/对照组的样本量比例=50.01%/49.99%。

可以看到,两组占比均在置信区间内,属于正常波动。也就是说,两组样本量符合均分的预期,成功通过了实验/对照组样本量的比例这个合理性检验。那我们接下来就可以进行实验/对照组中特征的分布这个合理性检验了。

检验实验/对照组中特征的分布

A/B测试中实验组和对照组的数据要相似才具有可比性。这里的相似我们可以通过比较两组的特征分布来判断。

常用的特征包括用户的年龄、性别、地点等基本信息或者可能影响评价指标的特征。比如在音乐App这个案例中我们还可以查看用户平时的活跃程度。如果这些特征在两组中分布比例相差较大则说明实验有问题。

一旦从合理性检验中发现了问题就不要急着分析实验结果了实验结果大概率是不准确的。我们要做的就是找到出现问题的原因解决问题并重新实施改进后的A/B测试。

找原因的方法主要有以下两种:

  • 和工程师一起从实施的流程方面进行检查看看是不是具体实施层面上两组有偏差或者bug。
  • 从不同的维度来分析现有的数据看看是不是某一个特定维度存在偏差。常用的维度有时间、操作系统、设备类型等。比如从操作系统维度去看两组中iOS和Android的用户的比例是否存在偏差如果是的话那说明原因和操作系统有关。

通过数据分析发现这两组数据中重要特征的分布基本一致说明两组数据是相似的。这就意味着我们已经通过了合理性检验接下来我们就可以分析A/B测试的结果了。

最后,我还想跟你强调一下,这两个合理性检验是都要进行的,这是保障实验质量的关键。这两种检验如果没有通过的话都会使实验结果不准确,具体来说,实验/对照组样本量的比例和实验设计不相同时会出现样本比例不匹配问题Sample Ratio Mismatch实验/对照组的特征分布不相似则会导致辛普森悖论问题Simpson Paradox这两类问题我们会在第11节课中重点讲解。

如何分析A/B测试的结果

其实分析A/B测试的结果主要就是对比实验组和对照的评价指标是否有显著不同。那怎么理解“显著”呢其实“显著”就是要排除偶然随机性的因素通过统计的方法来证明两者的不同是事实存在的而不是由于波动性造成的巧合。

那具体怎么做呢?

首先我们可以用统计中的假设检验Hypothesis Testing计算出相关的统计量然后再来分析测试的结果。最常用的统计量是用P值P value和置信区间(Confidence Interval)这两种统计量。

你可能会说假设检验中有各种各样的检验Test我应该选取什么检验来计算P值和置信区间呢这里我们不需要理解这些检验的复杂理论解释只要熟悉实践中常用的3种检验方法的使用场景就可以了

  1. Z检验Z Test

当评价指标为概率类指标时比如转化率注册率等等一般选用Z检验在A/B测试中有时又被称为比例检验Proportion Test来计算出相应的P值和置信区间。

  1. T检验T Test

当评价指标为均值类指标时比如人均使用时间人均使用频率等等且在大样本量下可以近似成正态分布时一般选用T 检验来计算相应的P值和置信区间。

  1. Bootstrapping

当评价指标的分布比较复杂在大样本量下也不能近似成正态分布时比如70%用户的使用时间OEC等一般采用Bootstrapping的方法从P值或者置信区间的定义来计算P值和置信区间具体方法请参见第三节课指标波动性的相关内容

现在我们已经拿到了如下的测试结果:

  • 实验组样本量为315256升级的用户为7566升级率为2.4%。
  • 对照组样本量为315174升级的用户为6303升级率为2.0%。

因为评价指标的波动范围是[1.86%,2.14%]所以我们可以得出实验组的升级率2.4%并不属于正常范围,很有可能显著不同于对照组。

接下来我们就可以通过P值法和置信区间法来分析这个测试结果验证我们的假设是否正确。

P值法

首先我们可以采取P值法借助一些计算工具常见有Python、R还有网上的一些在线工具比如这个网站都可以计算P值。具体选择哪个工具根据自己的喜好来就可以。我个人比较喜欢选用R来计算

results <- prop.test(x = c(7566, 6303), n = c(315256, 315174))

因为用户升级率这个评价指标属于概率类指标,所以我们选择了专门针对概率类指标的函数prop.test

通过计算我们可以得到P值 < $2.2 e^{-16}$

根据统计惯例一般我们会把测试的显著水平Significance Levelα定为5%统计上的约定俗成再把计算出来的P值和5%相比。当P值小于5%时说明两组指标具有显著的不同。当P值大于5%时,说明两组指标没有显著的不同。如果你对这块概念还不是很清楚,可以回顾下第二节课中假设检验的内容。

从上面的结果可以看出P值远远小于5%且接近于0说明两组指标具有显著的不同这就意味着实验组的广告语确实能提升免费用户的升级率。

置信区间法

在第三节课介绍指标时我们学习了该怎样构建置信区间。现在我们要比较实验组和对照组的评价指标是否显著不同也就是看两者的差值是不是为0。这时候我们就要构建两组指标差值$\left(p_{\text {test}}-p_{\text {control}}\right)$的置信区间了。

置信区间的具体计算我们也可以借助Python和R等软件当然你也可以使用我在第二讲时介绍过的具体函数这里我们还是用R的prop.test这个函数。

其实当我们在上面用这个函数计算P值时R也顺便把95%的置信区间算出来了:

由图可见95%的置信区间为[0.0033, 0.0047]。

接下来我们需要比较一下两组指标是否有统计显著的不同也就是要看看这个置信区间是否包括0。

我们知道数值在置信区间内均为正常波动如果置信区间包括0的话就说明两组指标的差值也有可能为0两组指标是相等的。而如果置信区间不包括0的话就说明两组指标的差值不为0两组指标是显著不同的。

显然,[0.0033, 0.0047]这个置信区间是不包括0的也就是说我们的测试结果是统计显著的。那对应到业务上与对照组的广告语千万曲库免广告无限畅听用户升级免费试用半年相比带有紧迫感的实验组广告语实验组广告语即日起到11月15日用户升级免费试用半年能吸引更多用户升级也就验证了我们最开始的假设是成立的。

学到这里,我们发现无论是P值法还是置信区间法都可以用来分析A/B测试结果是否具有统计显著性。那么在实际应用中该如何选择呢两者有什么差别吗

其实,在大部分情况下这两种方法是通用的,只要选择一种就可以。但如果需要考虑实施变化后的收益和成本的关系时,我们就要选择置信区间法了。

因为要考虑收益和成本的关系时除了满足结果在统计上是显著的两组指标不相同差值的置信区间不包括0还不够更要让结果在业务上也是显著的两组指标不仅要不相等而且其差值δ >= $\delta_{\text {收支平衡}}$,并且差值的置信区间的范围都要比$\delta_{\text {收支平衡}}$大)。

小结

这节课我们主要讲解了A/B测试中如何分析结果根据实践经验我给你总结了3个要点

  • 切莫心急,一定要等到达到足够样本量时再分析测试结果。
  • 分析结果前一定要做合理性检验来确保测试的质量否则一旦实施过程中出现Bug就会功亏一篑。
  • 一定要根据指标和数据的特点,选择正确的分析方法来得出可以驱动业务的结论。

数据领域有一句名言“Garbage in, garbage out”意思就是“放进去的是垃圾产出的还是垃圾”。这句话放在A/B测试中同样适用如果A/B测试没有设置好或者虽然计划得很好但要是在实施过程中出现了问题也会得到错误的结果和结论从而给业务带来难以估量的损失。

所以前面我们用4节课来讲怎么设置实验今天又花了很多篇幅来介绍确保结果是可信赖的都是在给“分析测试结果”做铺垫。

好了今天这个音乐App的测试得到了显著的结果皆大欢喜。但是如果结果不显著又该怎么办呢

关于这个问题我们在第9节课再来好好讨论

思考题

你觉得分析结果前的合理性检验还可以参考哪些护栏指标呢?为什么?

欢迎在留言区写下你的思考和答案,我们一起交流讨论。如果你觉得有所收获,欢迎你把这一讲分享给你的朋友,邀请他一起学习。