TT Lab
开始
学习 学习路径 课程

开发者创业 — 先验证再动手

A/B 测试 — 比 p 值更先要看的东西

在 TT Lab 中继续学习

一句话总结

A/B 测试的结论不是靠一个 p 值得出的。要先确认这四点:①分配比例是否符合设计(SRM)②人数是否足够捕捉到效应(统计功效)③是否只在事先定好的时点看过一次(偷看)④比较了几次(多重比较)——然后再用置信区间来说明效应的大小。

为什么需要它

越是小团队,越急着做实验。流量少,所以每天都打开仪表板看,在 p 降到 0.05 以下的那一天说一声“赢了”就上线。如果没有结果,就按设备、新访客与回访客拆开来看,一旦有一个显著,就为那个细分群体做功能。这两种情况都很常见,也都是把偶然误认为发现的最快办法。

Johari 等人的 Peeking at A/B Tests(KDD 2017)报告说,经典的 p 值和置信区间,只有在事先确定样本量时才成立,如果不断盯着仪表板,一旦变得显著就停下来,假阳性的概率会大幅膨胀。另外,Fabijan 等人的样本比例不匹配研究(KDD 2019)把观测到的分配比例与预期不同的 SRM,当作多种数据质量问题的“症状”来处理,并写明存在 SRM 的实验,其分析是不可信的。

工作原理

SRM——最先要看。如果按 50:50 分配,两边的用户数应当相近。用卡方拟合优度检验(自由度 1)来衡量与期望值的差,本实验把 p < 0.001 视为 SRM。一边有一部分用户从记录中丢失的缺陷(重定向失败、机器人过滤、应用版本),会把转化率也推向一边。如果发现了 SRM,就不要解读转化率,而是先去找原因。

两个比率的 z 检验与置信区间。差值 = B 的转化率 − A 的转化率。检验统计量在“两边相同”的假设下,用合并(pooled)比率求标准误;95% 置信区间则用各自比率求出的非合并标准误,乘以 1.96(准确地说是 NormalDist().inv_cdf(0.975))。Python 标准库的 statistics.NormalDist 提供了正态分布的 cdf 和 inv_cdf,所以不需要外部软件包。如果置信区间不包含 0,并且是正方向,那么除了“B 更好”之外,还可以说明好多少(下限是多少)。

统计功效与样本量。要在基准转化率 p1 上,以显著性水平 α(双侧)和统计功效 1−β 捕捉到绝对值 δ 的差异,每一边所需的人数,用正态近似为

n = ⌈ ( z(1−α/2)·√(2·p̄(1−p̄)) + z(1−β)·√(p1(1−p1) + p2(1−p2)) )² / δ² ⌉,  p2 = p1 + δ, p̄ = (p1+p2)/2

要在基准转化率 11% 附近,以 α=0.05、统计功效 80% 来捕捉 1 个百分点,每一边需要远超过一万人(示例)。在样本不足的实验中显著的效应,往往会被估计得比实际更大——Gelman 和 Carlin(2014)把这称为 Type M(量级)错误。所以样本量要在开始实验之前确定。

偷看。即使是 A/A 实验(两边是同一个界面),如果每天都计算累计 p 值,总有一天会降到 0.05 以下。如果只在定好的日子看一次,那一天的 p 就是结论。如果想每天都看,就要使用像序贯检验这样为此目的而设计的方法。

多重比较。如果把五个变体分别与对照组比较,或者拆成十个细分群体,即使没有效应,出现一个低于 0.05 的结果也是很自然的。Holm(1979)的逐步向下方法,是把 p 值从小到大排列,在第 k 个上乘以 (m−k+1) 并与 α 比较,在第一次超过的地方停止。它比 Bonferroni 更不保守,同时又把整体假阳性概率控制在 α 以下。

在现场相遇的样子

如何发现自己做错了

下一项实验要做什么

你将针对四个实验,把 SRM 检查、两个比率的 z 检验与置信区间、样本量计算做成函数,在 A/A 实验按日期的累计 p 中确认偷看的陷阱,在五个变体和十个细分群体中确认 Holm 校正前后的差异。最后为每个实验用一页纸给出上线决策。评分器会用随机输入再次调用你的函数。