AB测试避坑指南

AB测试避坑指南

前言

最近在上海居家隔离已经将近两个月的时间,一转眼已经夏天了。虽然生活有诸多不易,但总归是比较有条理。居家隔离的事实无法改变,心想倒不如利用这段时间,把之前的一些经验沉淀下来。一方面能够系统的把自己的思路梳理一下,另一方面若是能帮到一些人,给大家提供了一些新的思路,那我也觉得很开心了。

本文主要是把自己之前一些AB测试中遇到的一些案例,分享一些我的经验和思考。主要关注案例分析,而不是关于AB测试的入门文章。

如何处理网络效应或者外部效应?

在大多数情况下,AB测试是判断因果关系最科学的方法之一。其中很重要的一个原因,就是通过随机化进行了变量控制,对照组和实验组几乎完全相同,只有要测试的内容是不同的。这样就能比较准确的衡量测试内容的准确效果。

但是在某些情况下,即使是随机分配的AB测试,也会遇到无法准确测试效果的情况。最常见的就是有网络效应或者外部效应的测试情形。所谓的网络效应,或者外部效应,简单来说就是对照组和实验组不是完全独立的,他们会相互影响从而使测试结果出现误差。

在游戏领域,一种情况就是价格测试。AB测试可以帮助找到一个游戏道具或者皮肤的最优价格。假设我们想测试一个皮肤究竟是买100元还是200元能获得更高的总收入,对照组100元,实验组200元。这时候如果实验组的玩家,通过论坛或者其他途径知道了自己花200元买的内容有人只需要花100元,那么很多实验组的玩家可能不愿意花200元进行购买。不过如果没有100元作为对照的话,可能有些玩家还是愿意购买的。这里我们遇到的情况就是对照组的价格,对实验组玩家的购买意愿造成了影响,会造成我们低估200元价格的总营收。实际情况中,对价格进行AB测试,是一件很困难的事情。一方面是因为前面提到的测试结果可能不准确,另一方面也是担心对玩家不公平导致玩家抱怨甚至流失。

那如果我们要测试的内容存在上述提到的外部效应应该怎么办呢?对于一款全球发行的产品来说,一种可能的方法是在类似的国家间设定不同的价格,例如美国和加拿大。如果两个国家玩家行为比较类似的话,可以通过两个国家在不同价格上的表现估算出效果。虽然也会存在玩家抱怨的问题,但因为是不同国家所以玩家的不公平感会相对同一个国家不同价格低一些。如果想更精确评估效果的话,可以用Google开源的CausalImpact 对不同国家间的关系进行建模预测。

如何测试一个变动对长期指标的影响?

AB测试可以很方便的测试出一个变化的短期效果,例如营收或者留存的变化。不过很多时候,我们同样关注该变化对长期的影响。比如我们想知道对360日留存或者360日LTV(用户生命周期价值)的影响。不过我们又不能等到观察到一年的数据才对AB测试结果作出结论,然后改进产品。这时候我们该怎么办呢?

其实除了AB测试,在游戏领域的其他场景中,我们也会面临类似的挑战。比如在买量增长中,我们不可能等到玩家进入游戏一年后才计算回本率然后优化我们的广告投放策略。

这个时候一种常见的方法就是构建一个用短期指标预测长期指标的模型。比如前面提到的LTV,就可以用前7日的玩家数据来预测360日LTV。这样在AB测试中,我们通过观察短期指标以及模型预测值的变化,就可以在AB测试早期估算出一项变动对长期指标的影响。

如何排除“新颖性效应”的影响?

新颖性效应(Novelty Effect)在游戏领域很常见。玩家很喜欢游戏内出现新内容和新玩法。如果玩家看到一项新内容,可能不管他喜不喜欢,一开始都愿意去试一下。这时候我们可能就会遇到一个问题,我们可能看到一个内容更新后实验组的数据比对照组好很多,但很有可能这个提升主要是因为玩家看到了新内容,而不是因为这个新内容有多好。这个时候我们应该怎么处理呢?还有一个相关的问题,比如我们上线了一个部落推荐系统,然后看到加入部落的人数增加了。这个提升主要是因为我们的推荐算法准确呢,还是仅仅是因为玩家看到了这个新功能都想试一下?

这个问题的解决相对比较简单,有几种可能的方法。第一种是多测试一段时间,看看这个效果的提升能不能持续。如果提升很快就下降了,那有可能前期的增长是来自于新颖性效应。第二种方法是看新玩家和老玩家的区别。理论上来说新玩家是不存在新颖性效应的,因为所有内容对他来说都是新的。如果我们观察到新玩家的提升不显著,老玩家提升比较显著的话,那也有可能是新颖性带来的提升。第三种会更加复杂一些,我们可以设计一个ABC测试来区分增长的原因。以上面提到的部落推荐系统为例,我们可以设计如下三个实验组:

  • A: 没有部落推荐系统
  • B: 有部落推荐系统,不过是随机推荐或者基于简单规则推荐
  • C: 有完整的推荐系统(带推荐算法)

这样通过对比B和A组的表现,可以知道推荐系统本身带来的效果,包括新颖性效应。通过对比C组和B组的表现,我们可以得知推荐算法具体带来的增长。

多个AB测试同时进行怎么办?

在一些特定的情况下,比如测试不同游戏的Logo,或者不同的广告素材中,我们可能会同时进行多个AB测试。这个时候,我们是否需要进行格外的处理,还是跟单个AB测试一样,在0.05水平的上进行显著性检验就可以呢?

这里我们简单回顾下p值<0.05的含义:意味着我们犯错的概率是5%。换句话说,有5%的可能性,实验组效果和对照组没有区别,而仅仅是因为随机或者运气导致我们观察到了现在的数据。从这一点来说,当我们同时进行多个AB测试的时候,比如10个Logo测试,我们犯错的概率就不是5%了,而是(1 - 95%^10)=40%!

所以在同时进行多个版本的AB测试的时候,我们可以进行Bonferroni修正 : 将p值检验从0.05改为0.05/N, N是同时进行AB测试的数量。以上面的10个测试为例,我们犯错的概率是(1-99.5%^10)=4.9%.

为什么不能提前停止测试?

现在想象一个AB测试,我们上线了一个新功能,计划测试14天。在测试进行了7天后,我们忍不住测了下显著性,发现已经实验组已经显著好于对照组了。我们很开心的提前终止了测试并且将新功能上线。这样的操作有什么问题么?

这里我们犯的错误,和上面提到的多个AB测试类似:如果我们多做几次显著性检验,尽管我们用了0.05的显著性标准,但还是会有很高的概率犯错,发现显著性但实际上并没有。以这里的14天测试为例,如果我们忍不住每天都做一次显著性测试,那在这14天至少发现一次显著性的概率是多少(假设真实情况是实验组和对照组没有差别)?答案是(1-95%^14) = 51%。也就是说我们有一半的概率会犯错。

所以在实际操作中,如果定好了14天才看显著性,就不要提前多次查看数据,更不要提前看到显著性结果就下结论终止实验。如何通俗的解释这个问题呢?我们可以以足球为例:在刚刚结束的欧冠半决赛中,皇马在最后几分钟才逆转曼城进入决赛。但如果我们在比赛中任意时间查看数据,很有可能看到曼城领先皇马。如果这个时候我们就下结论曼城赢了,这显然是不对的。只有最终的比分才关键,中间任何时候都有可能某个队领先然后被逆转。

拓展阅读

  1. 前面提到的显著性问题,以及常见的样本数量问题,很多也可以通过贝叶斯AB测试来解决。
  2. Airbnb 技术团队有一篇不错的文章介绍AB测试的经验。
  3. Uber 技术团队有一遍介绍AB测试系统架构的文章