作者AgileSeptor (S.Duncan_JB)
看板DataScience
标题[心得] A/B Testing 常见的「偷看结果」问题
时间Sat Aug 22 19:26:51 2020
[关键字]: A/B Testing
[重点摘要]:
- A/B Testing 的正确做法,是预先决定实验样本数,
并禁止偷看结果、甚至提前结束实验
- 偷看结果会使伪阳性错误率(Type-1 Error)上升
- 在严重的状况,会让你手中看似有统计显着性的决策,
20% 以上是错误的
最近在工作中发现团队会对 A/B Testing 的统计检定有些迷思
常会因为检验出现统计显着性就想提早结束实验
因此整理成一篇文章,与大家一起探讨这样会有什麽问题
我也在文章内附上 Google Colab 的 Python 程式码,透过实作来呈现问题
网志好读版:
https://haosquare.com/ab-testing-peeking/
# A/B Testing:「偷看结果」将成为最大的错误
如果你身处该开始推行 A/B Testing 的团队,相信你曾遇到过这样的情境:
「我们的产品隔日回访率一般是 40%,我看了数据,现在执行的 A/B Testing,B 组的新
设计让回访率提升到 42% 了,我们立刻让所有使用者采用 B 组设计吧!」会议中,同事
兴奋地提出这项建议,大家也纷纷同意。
「原本不是设定 A/B Testing 要执行一周吗?现在才执行两天、样本数总共才蒐集两万人
而已,要等一周资料蒐集完整才能做决策吧?」有人提出疑惑。
「可是 A/B 组的 KPI 差异有统计显着性啊!就决定让产品改用新设计的 B 组吧!」主管
看完数据就这麽做出决议。
乍看之下,只要通过统计显着性的检验,就应该是有科学方法的严谨决策。然而,这个 A/
B Testing 情境的问题,是在实验样本蒐集完整之前「偷看结果」。偷看结果最严重的下
场,是让你手中看似有统计显着性的决策,20% 以上是错误的。这篇笔记将说明为何会有
此问题、以及如何避免。
如果你喜欢写 Code 实作,我在 Google Colab 也用 Python 呈现了本文探讨的问题。
https://reurl.cc/yggaNa
## 实验的「预期问题」什麽?
产品在执行 A/B Testing 之前,我们会先决定这个实验所需样本数。现在网路上也有许多
人设计方便的计算机可以使用,不需要统计软体就能算出所需样本数。当然,你不需要知
道所有统计检定的数学推导、也能运用 A/B Testing 改善产品,但是,你至少该知道「所
需样本数」背後的假设是什麽。
例如,APP 在做 A/B Testing 常见的 KPI 之一是「次日留存率」,也就是新进使用者隔
日会再使用此 APP 的比例。如果 APP 目前次日留存率是 40%,团队做了一项新设计,并
期望这项新设计会让次日留存率提高至少 1%,那麽,为此新设计做的 A/B Testing,所需
样本数计算会如下图:
https://i.imgur.com/u0FktsW.png
「只要 A/B 两组都各有至少 37,719 个样本,并且 B 组的次日留存率超过 41%,就能拒
绝虚无假设,说明 B 组的设计较好。」这样的解释还不足够,这段叙述忽略了假设检定预
期内会发生的问题,这些预期问题就写在上图计算机的下半部:
- Statistical Power 80%:如果 A/B 两组确实有差异,有 80% 的机率,会被统计检定确
实侦测到
- Significance Level 5%:如果 A/B 两组其实并没有差异,有 5% 机率,统计检定会因
为随机性判定成有差异(伪阳性)
换句话说,设定 Significance Level 为 5%,用正确的方法持续做多次 A/B Testing 实
验,每 100 次拒绝虚无假设、并决定采用实验组( B 组)新设计的状况,预期约有 5 次
会是错误的(明明 B 组没有更好我们还是改采用它)。
如果你是决策者,你当然可以觉得 5% 的伪阳性错误率风险太高。以此例而言,同样是现
有次日留存率 40%、期望 B 组提高 1%,如果你想要更保守点,把上图计算机最下方的
Significance Level 从 5% 改成 1%,你就可以让 A/B Testing 预期内的伪阳性错误率(
Type-1 Error)下降到 1%,并看到计算机告诉你,为了让统计信心提高,你需要增加更多
所需样本数。
比起 Statistical Power,对 Significance Level 讨论较多,是因为伪阳性错误造成的
成本较高。以疫苗研发为例,如果检验出现伪阳性错误,表示明明没有成效、却生产千万
支疫苗给全台湾人民使用,这会是多大的浪费!在 Significance Level 的假设下,统计
检定控制了对伪阳性错误的预期,但是在 A/B Testing 的情境中,如果决策者偷看了实验
结果,这项控制将失效、伪阳性错误率大大提高。
## 「偷看」的问题
在前面段落提及范例:APP 目前次日留存率是 40%、期望的留存率差异是 1%,需要每组至
少 37,719 个样本。下图是据此设计、实际商业决策会遇到的 A/B Testing 偷看情境:我
们预先设定每组总共要蒐集 40,000 个样本,但是每蒐集 10,000 个样本我们就偷看一下
结果。然而,此情境刻意设计 A/B 两组母体没有成效差异。
https://i.imgur.com/3QB5737.png
两条线分别是 A/B 两组,随着蒐集样本数量增加、次日留存率的变化状况。
如图所示,这项实验中,当我们在两组各只蒐集 10,000 个样本就急着偷看结果:
- 两组 KPI 分别是 41.2% 与 39.5%
- 做了卡方检定也观察到显着性(P-value < 0.05)
如果在此就决定 B 组较好并采用,会做出明明 A/B 两组没有差异、却仍改采用实验组的
错误决策。也就是说,偷看 A/B Testing 结果提高了伪阳性错误率。
如果乖乖等到蒐集完预先设定的 40,000 样本数,并不代表决策者可以完美避免掉伪阳性
错误,而是可以把伪阳性错误率控制在预期内的 5%。若偷看结果、并提早结束 A/B
Testing,伪阳性错误将会大於 5%,而且偷看越是猴急、错误率会越高。
### 越急着偷看、问题越严重
实际写 Python Code (见参考资料) 设计实验、观察偷看频率的差异,在 A/B 两组实际上
并没有成效差异(也就是 A/A Testing)的状况下:
- 每累积 33.3%(三分之一)所需样本数偷看一次,若有显着差异就提前结束实验,伪阳
性决策错误率还低於 10%
- 更猴急点,每累积 5% 所需样本数就偷看一次,若有显着差异就提前结束实验,伪阳性
决策错误率会超过 20%!
也就是说,如果允许无限制偷看 A/B Testing 结果,那你所做出的改变、并且自以为会让
产品更好的决策,至少 20% 是错误的!
这并不是一个夸张的情境,实验者样本蒐集速度缓慢的时候,更容易失去耐心而步入这项
错误。40,000 所需样本数的 5% — 也就是每组各 2,000 人,当你是刚起步、或者仍在测
试阶段的 APP 设计者,要蒐集 2,000 人样本可能需要半个月时间,会害你觉得 A/B
Testing 进度太慢,就想急着做统计检定、下结论。
## 正确做法:预先决定实验样本数,并禁止偷看
解释了这麽多,都是为了呈现问题的严重性,而要解决这个问题也不难:事先决定好实验
所需样本数,并且数据分析师要把关 A/B Testing 流程,未达所需样本数、不可偷看结果
也不可贸然决策。
A/B Testing 所需样本数,来自团队共同决定出的要素:
- 数据分析师提出现有 KPI 为何
- 团队讨论出期望提高 KPI 达到多少量,才值得做出决策、并改变产品
- 统计检定需要多少信心、可容许多少伪阳性错误率
A/B Testing 完整蒐集所需样本数才做检定,这些团队共同决定、对实验假设的共识才有
意义。就算样本蒐集缓慢,可以考虑提高 Significance Level,增加预期内伪阳性错误率
、以换取所需样本数下降;而不是用偷看、提早结束实验的方式,加快实验结束的速度、
却让伪阳性错误决策增加到预期外的范围。
注:上述计算机是依照经验法则的公式找出所需实验样本数
https://www.evanmiller.org/how-not-to-run-an-ab-test.html
## 结语
偷看 A/B Testing 结果的问题,除了前述在样本蒐集缓慢的状态下容易发生以外,我个人
认为在热血沸腾的团队工作也很容易发生相同问题。产品设计者有过多的点子,都想透过
A/B Testing 来验证新点子是否有成效,实验刚上线没多久就追着数据分析部门要结果:
「看起来差异显着了耶?可以改了吗?可以执行下一个实验了吗?」
作为资料科学家、或者作为决策者,为了避免团队的热血因为脱缰的伪阳性错误、而变成
徒劳无功,你必须为了团队的产品保持耐心,做好事前的实验设计、并且让实验确实遵守
设计达到所需样本数,再做决策。
参考资料:
- Evan Miller: How Not To Run an A/B Test
-
https://www.evanmiller.org/how-not-to-run-an-ab-test.html
- 好豪的 Google Colab: A/B Testing 问题 Python 实作
-
https://reurl.cc/yggaNa
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.12.23.135 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1598095615.A.678.html
1F:推 st1009: 推推 感谢分享 08/22 22:32
2F:推 art1: 解释得好清楚 08/22 22:54
3F:推 blackmaninEE: 推 学到新知识 08/23 01:24
4F:推 TreeMan: 推推 08/23 08:11
5F:推 lin8399: 感谢知识分享! 08/24 07:55
6F:推 ce270651: 推 08/25 01:24
7F:推 nickchen0304: 推 08/25 14:17
8F:推 soild47: 推 08/25 21:53
9F:推 sugarkitten: 推 08/27 07:10
10F:推 albertviking: 请问看多久这事要怎麽决定呢 09/01 11:46
需要多少样本数, 取决於你的假设, 包括信心水准与期望差异大小
然後带着假设去按文中的计算机决定样本数
至於要多久时间, 就看你实际收样本的速度了
11F:→ Wengboyu: 偷看 但直到Sample收满再决定 会有差吗? 09/02 17:39
如果偷看能忍住、完全忽略是否显着,当然就没差
可是如果你偷看又不会做决策... 何必偷看?
※ 编辑: AgileSeptor (60.250.32.97 台湾), 09/03/2020 10:51:30
12F:→ Wengboyu: 时间到了,需要报告xD 每次都要写但书 人没收满仅供参考 09/03 18:32
13F:推 bearching: 请问一下 如果用蒙提霍尔问题的观点来看这个问题,偷看 09/15 16:24
14F:→ bearching: 结果再做决策,我想也许比较容易提高成功机率吧 09/15 16:24
15F:→ bearching: ? 如果把偷看当作主持人开门看到山羊的话,也许可以多 09/15 16:25
16F:→ bearching: 做些讨论? 09/15 16:25