1. 为什么AB实验结果总是不显著?
做过AB测试的同学一定遇到过这种情况:辛辛苦苦设计实验、收集数据,最后却发现结果不显著。那种感觉就像精心准备了一桌饭菜,结果客人尝了一口说"还行吧"。更糟的是,这种情况在业务中非常普遍 - 根据我过去5年参与的上百个AB测试项目统计,超过60%的实验最终结果都不显著。
造成这种现象的核心原因主要有三个:
-
指标波动太大:比如电商场景下的GMV指标,受节假日、促销活动等因素影响,天然波动就很大。这就好比在嘈杂的菜市场里,你想听清别人说话,必须提高音量。
-
样本量不足:特别是B端产品或新功能测试时,流量本来就少。就像用显微镜观察细胞,放大倍数不够就看不清楚。
-
效应量太小:很多优化带来的提升可能只有1%-2%,这种细微差别需要非常精确的测量才能发现。
2. CUPED:用历史数据给实验"降噪"
2.1 CUPED的核心思想
CUPED(Controlled-experiment Using Pre-Experiment Data)是我最喜欢的一个实验加速技术。它的核心思路很巧妙:利用实验前的历史数据作为"参照物",来消除实验期间的随机波动。
想象一下,你要测量两个人的身高差,但他们都站在摇晃的船上。直接测量会很不准。但如果先记录他们站在平地上的身高,再用这个数据来修正船上的测量结果,精度就会高很多。CUPED就是这个原理。
2.2 具体实现步骤
-
选择协变量:通常使用与目标指标高度相关的历史数据。比如:
- 对于转化率:用实验前30天的用户转化情况
- 对于GMV:用实验前用户的历史消费金额
-
计算修正系数θ:
code复制θ = Cov(Y,X)/Var(X)其中Y是实验指标,X是协变量
-
计算修正后的指标:
code复制Y_cuped = Y - θ*(X - E[X])
2.3 实战案例
去年我们优化电商搜索页时,使用CUPED将实验周期从14天缩短到9天。具体操作:
- 选取协变量:用户过去30天在该品类的GMV
- 计算得出θ=0.43
- 修正后指标方差降低了37%
- 最终在9天时就检测到了1.8%的GMV提升(p=0.04)
注意:协变量选择不当反而会增加方差。我们曾错误地使用用户年龄作为协变量,结果方差增加了15%。教训是:一定要选与目标指标强相关的协变量。
3. 序列检验:安全地"偷看"实验结果
3.1 传统检验的问题
做实验时,业务方总是忍不住每天看数据。但传统统计检验要求固定样本量,中途"偷看"会导致假阳性率飙升。就像反复抛硬币,看多了总会遇到连续5次正面。
3.2 mSPRT算法原理
序列检验(Sequential Testing)通过动态调整显著性阈值来解决这个问题。它的核心是混合序列概率比检验(mSPRT):
code复制Λₙ = ∫ [fθ(Data)/f₀(Data)] dH(θ)
当Λₙ > 1/α时判定显著。这个阈值会随样本量增加而动态变化,前期很高,后期逐渐降低。
3.3 实施建议
-
设置合理的监控频率:
- 重大改版:每小时检查
- 常规实验:每天检查
- 长期实验:每周检查
-
定义双重阈值:
- 正向阈值(提前推广)
- 负向阈值(立即回滚)
-
配合最小观察期:
- 至少覆盖1个完整周末
- 通常不少于3天
我们曾用这个方法提前3天发现一个导致转化率下降8%的bug,避免了数百万损失。
4. P2BB:用概率说话
4.1 频率学派的局限
当p值=0.08时,传统结论是"不显著"。但对业务来说,这可能意味着:
- 有92%的把握认为方案更好
- 预期收益可能是百万级
4.2 贝叶斯方法优势
P2BB(Probability to Be Best)计算的是B方案优于A方案的后验概率:
code复制P2BB = P(μ_B > μ_A | Data)
这个数字对业务方直观多了。比如:
- "新版本有85%的概率更好"
- "预期提升1.5%,但有10%的风险会下降0.5%"
4.3 实际应用技巧
-
选择合适的先验分布:
- 无信息先验:完全依赖数据
- 保守先验:对大幅提升持怀疑态度
-
结合预期损失(Expected Loss)分析:
code复制EL = E[max(0, μ_A - μ_B)]即使P2BB很高,如果EL也很大,仍需谨慎
-
可视化展示:用概率密度曲线比单一数字更有说服力
去年一个P值=0.09的实验,P2BB=88%,我们决定上线后确实带来了1.2%的GMV提升。
5. 方法组合与选择指南
5.1 方法对比
| 方法 | 适用场景 | 优势 | 注意事项 |
|---|---|---|---|
| CUPED | 高波动指标 小流量实验 |
不增加流量 缩短周期 |
需要质量好的历史数据 |
| 序列检验 | 需要频繁监控 高风险实验 |
安全地实时监控 快速止损 |
需要专业统计工具 |
| P2BB | 边缘结果 向管理层汇报 |
直观易懂 风险评估 |
先验选择影响大 |
5.2 组合使用建议
-
常规实验流程:
- 设计阶段:考虑是否适用CUPED
- 执行阶段:启用序列检验监控
- 分析阶段:对边缘结果补充P2BB分析
-
资源有限时的优先级:
- 先实现序列检验(避免灾难性结果)
- 再实现CUPED(提升实验效率)
- 最后考虑P2BB(优化决策质量)
6. 常见问题与避坑指南
6.1 CUPED常见错误
-
协变量过时:使用3个月前的历史数据,相关性已经很低
- 修复:使用最近30天数据,并检查相关性
-
忽略分段效应:整体相关但分段不相关
- 修复:分用户群体验证协变量有效性
6.2 序列检验陷阱
-
过早终止:看到早期正向趋势就匆忙决策
- 案例:某实验前2天显著正向,但第3天开始逆转
-
多重检验:同时监控太多指标导致假阳性
- 方案:控制family-wise error rate
6.3 P2BB实施难点
-
先验争议:业务方质疑先验选择的主观性
- 解决:展示不同先验下的敏感性分析
-
结果冲突:P值不显著但P2BB很高
- 处理:结合其他业务指标综合判断
7. 工具与资源推荐
7.1 开源工具
-
CUPED实现:
- Python:statsmodels库
- R:
lm()函数配合残差分析
-
序列检验:
- Google的Sequential A/B Testing框架
- 我们自己开发的R包
seqtest
-
P2BB计算:
- PyMC3(贝叶斯建模)
- Stan(高性能贝叶斯推断)
7.2 商业解决方案
- 优化实验平台(Optimizely)的企业版
- Google Optimize 360
- 我们的自研AB测试系统(内部使用)
提示:刚开始建议先用开源工具实现核心逻辑,等业务规模大了再考虑商业方案。我们就是从Python脚本开始,逐步发展成完整系统的。
8. 进阶方向
对于想深入研究的同学,推荐以下几个方向:
-
CUPED扩展:
- 多协变量CUPED
- 非线性CUPED
-
贝叶斯方法:
- 分层贝叶斯模型
- 贝叶斯bandit算法
-
因果推断:
- 双重差分(DID)
- 合成控制法
这些方法在特定场景下可以进一步提升实验的敏感度和可靠性。比如我们用多协变量CUPED在某个实验中进一步将方差降低了12%。