Menu

A/B 测试偷看模拟器

两千次测试,A 和 B 是同一个页面,跑在你的流量上。看看每天偷看的人会把多少次判为有赢家,而同样的测试又会骗到多少次等到结束日期才看的人。

作者 Nethanel Bar, Co-founder & CEO

最后更新

准备好真正学会编程了吗?

Coddy 让你在浏览器里编写真实代码来学习:互动课程、即时反馈,卡住时还有 AI 帮忙。

A/B 测试中代价最高的习惯,用你的数据来模拟

这个习惯是这样的:你启动一个测试,每天早上打开数据面板。指标慢慢上升,回落,又上升,某个周二它越过了 95%。你宣布结果,上线赢家,然后继续下一件事。问题在于 p 值会来回游走。即使两个变体完全相同,p 值也会在某些天碰巧低于 0.05,只是之后又会回升。在第一次越过阈值时停止,意味着你恰好在它路过时抓住了它,而你以为自己拥有的置信水平已经不存在了。

影响之大常常让人吃惊。在 95% 置信度下,只在结束时看一次的测试大约每 20 次会骗你一次,这是你一开始就接受的约定。如果同样的测试连续四周每天都看,并在第一个显著的日子就停止,模拟器通常会显示:在什么都没变的测试中,有四分之一甚至更多出现了假赢家。Evan Miller 最早的文章估计,每天偷看的人假阳性率超过 20%;Optimizely 在 2015 年重建了自己的统计引擎,正是因为客户的假阳性率已经超过了这个数字。把每天查看改成每周查看,损失大约能减半,但无法消除。

这里的模拟如实说明自己做了什么:每次测试都按真实转化率为两组生成转化,在每次查看时对目前收集到的全部数据做普通的双比例 z 检验,并记录偷看的人会在哪里停下。图中每一条路径是一次测试,每一个点都是某个早上有人会宣布结果的时刻。把真实提升设为 +10%,就能看到故事的另一半:偷看的人提前抓到了真实效果,但报告的提升被夸大了,而且即使效果为零,他也会同样急切地宣布“赢了”。

模拟结果说明了什么

  • p 值是一种随机游走。在原假设下,任何一次查看时它都服从均匀分布,也就是说,在任何一个早上,它都有 5% 的概率低于 0.05。二十八个早上下来,这些概率就累积起来了。
  • 假阳性率取决于你查看的次数,而不是测试运行多久。每周看一次的四周测试,比每天看一次的两周测试更不容易被骗。
  • 提前停止会夸大提升。偷看的人在幸运的一天停止时,那天观察到的提升本来就格外大。很多上线后“褪色”的赢家,往往就是这么来的。
  • 解决办法要么是自律,要么换一种检验。自律:提前确定样本量和结束日期,只看一次结果。换一种检验:序贯方法,例如 Optimizely、Statsig 和 Eppo 使用的始终有效 p 值,本来就是为持续查看设计的,代价是需要更大的样本量。
  • 贝叶斯面板也不能幸免。每天查看“成为最优的概率”,并在达到某个阈值时采取行动,只是同一个问题换了件外衣。

如何使用这个模拟器

  1. 输入你的转化率和每日访客数

    模拟按你的真实转化率生成转化,所以 p 值的游走幅度和你实际会看到的噪声一致。

  2. 设置计划时长和查看频率

    每天、每三天或每周。偷看者的比率和诚实比率之间的差距,就是这个习惯的代价。

  3. 把真实提升保持为无

    这样每次测试都是 A/A 测试:任何赢家本来就是误报。之后再切换到 +10% 或 +30%,看看偷看的人遇到真实效果时会怎样。

  4. 看两个大数字

    偷看者比率是每天查看的人宣布赢家的频率。结束日期比率应该接近你选择的 alpha;如果确实如此,说明诚实的测试兑现了它的承诺。

  5. 再运行一次

    每次运行都会随机生成新的测试。比率会有小幅变化,差距却不会。

A/A 测试中的典型假阳性率

在 95% 置信度下,只在结束时诚实地看一次,大约有 5% 的概率被骗。下面是根据模拟和相关文献得出的大致数字,适用于在第一次显著时就停止的偷看者。

查看频率4 周内查看次数假赢家比例
只在结束时看一次1约 5%
每周4约 10% 至 13%
每 3 天9 至 10约 15% 至 20%
每天28约 25% 至 30%
连续 12 周每天84超过 35%

三种习惯的模拟

每天查看的人

转化率 5%,每天 1,000 名访客,28 天,每天早上查看。在我们的一次运行中:2,000 次 A/A 测试里,偷看的人约有 28% 宣布了赢家;只在结束时看一次的是 4.5%。

误报率高出六倍,而这个测试看起来很谨慎,因为每天都有人盯着。那些“赢家”一半判 B 胜,一半判 A 胜,因为根本没有东西可找。

每周查看的人

同样的流量,同样的时长,每周查看一次。在我们的一次运行中:偷看者约为 12%,结束时查看为 5%。

查看四次而不是二十八次有很大帮助,但仍然让承诺的比率翻了一倍多。除了只看一次,没有任何查看次数能守住这个承诺。

真实的 +10% 提升

在同样的流量下,把 B 的真实提升设为 +10%。在这个流量下,28 天的诚实测试对这么小的提升统计功效有限;偷看的人则更常在幸运的日子里提前停止。

这是最有诱惑力的情况:偷看的人似乎发现得更快。但它停下的日子正是提升看起来最大的日子,所以上线时的估计被夸大了;而且把提升设为零时,同样的习惯也会找到一个“赢家”。

偷看结果的常见错误

  • 在第一个显著的早上就停止。这就是本页的全部内容。只有只看一次结果,置信水平才代表它所说的意思。
  • 延长一个“差一点就显著”的测试。因为结果接近显著而决定多跑几天,是反方向的偷看,同样会抬高假阳性率。
  • 每天查看“只是为了确认没出问题”。留意 bug 没问题,盯着 p 值就不行了。在结束日期之前,看流量分配和错误率,不要看提升。
  • 以为贝叶斯面板让偷看变得安全。每天查看概率阈值并据此行动,同样会导致误判率膨胀。
  • 报告停止当天的提升。如果必须提前停止,请报告置信区间,并预期真实提升会小于点估计。

偷看问题常见问题

A/B 测试中的偷看问题是什么?

对一个固定期限的测试反复查看结果,并在第一次看起来显著时就停止。因为数据不断进来时 p 值会波动,每查看一次,就多一次碰巧越过阈值的机会。在 95% 置信度下连续一个月每天查看的测试,在什么都没变的情况下,大约每四次就会出现一次假赢家,而不是置信水平承诺的 5%。

在测试结束前查看结果是错的吗?

查看没问题,据此行动才是问题。检查流量是否均匀分配、两个变体是否都能正常加载、转化是否被记录。不要看提升或置信度,也不要让你看到的东西把结束日期提前或推后。

如果想持续查看结果,该怎么做 A/B 测试?

使用序贯方法。始终有效 p 值、成组序贯设计等方法本来就允许随时查看,代价是在同样的统计功效下需要更大的样本量。大多数现代平台都提供这类方法。这个模拟器模拟的是经典的固定期限测试,因为大多数表格和面板上的计算(包括本站其他标签页)都是这种测试。

如果每周查看一次,偷看还有影响吗?

影响小一些,但仍然有。在 95% 置信度下,四周内查看四次通常会让假阳性率翻倍。唯一能守住承诺比率的查看次数是一次。

为什么模拟器使用 A/A 测试?

因为两组完全相同时,任何赢家本来就是误报,所以模拟器报告的比率正是所模拟习惯的假阳性率。打开真实提升可以看到另一面:偷看的人在幸运的日子提前停止,并报告被夸大的效果。

贝叶斯检验能解决偷看问题吗?

单靠它不能。持续查看贝叶斯概率并在固定阈值时行动,同样会让错误决策增多,Georgi Georgiev 等人已经证明了这一点。配合恰当决策规则和先验的贝叶斯方法,在持续监控下可以表现良好,但仅仅“用贝叶斯”并不能解决问题。

其他开发者工具

Coddy 编程语言插图

和 Coddy 一起学编程

开始