A/B 测试结果不显著
场景描述
新功能上线 A/B 测试 2 周后,实验组转化率提升了 0.3%,但 p 值 = 0.12,未达到 0.05 的显著性阈值。产品经理问"能不能全量上?"
排查思路
详细分析
1. 检查样本量是否足够
from scipy import stats
import numpy as np
# 最小样本量估算
baseline_rate = 0.05 # 基线转化率 5%
mde = 0.003 # 最小可检测效应 0.3%
alpha = 0.05 # 显著性水平
power = 0.8 # 统计功效
# 使用公式估算
effect_size = mde / np.sqrt(baseline_rate * (1 - baseline_rate))
from statsmodels.stats.power import NormalIndPower
analysis = NormalIndPower()
n = analysis.solve_power(effect_size=effect_size, alpha=alpha, power=power)
print(f"每组需要样本量: {int(n)}") # 可能需要 50 万+
常见问题:样本量不足
如果实验需要每组 50 万样本但只跑了 20 万,即使真有效果也检测不出来。解法:
- 延长实验:继续跑直到达到所需样本量
- 增大流量:从 5%/5% 改为 20%/20%
- 降低 MDE:评估 0.3% 的提升是否值得检测(可能 1% 才有业务价值)
2. 检查 SRM(Sample Ratio Mismatch)
-- 检查实验组和对照组样本量比例
SELECT experiment_group, COUNT(*) AS n
FROM experiment_log
WHERE experiment_id = 'exp_001'
GROUP BY experiment_group;
-- 期望 50:50,如果是 51000:49000 正常
-- 如果是 55000:45000 → SRM 问题,实验无效
3. 检查新奇效应
-- 按实验天数看效果趋势
SELECT DATEDIFF(dt, '2024-01-01') AS day_n,
experiment_group,
SUM(convert) * 1.0 / COUNT(*) AS cvr
FROM experiment_log
WHERE experiment_id = 'exp_001'
GROUP BY day_n, experiment_group
ORDER BY day_n;
-- 如果前几天效果好,后面逐渐消失 → 新奇效应
决策矩阵
| 情况 | 建议 |
|---|---|
| 样本量不足 | 延长实验或加大流量 |
| 效应量远小于 MDE | 即使显著也业务价值低,不上线 |
| SRM 问题 | 实验无效,修复分流后重跑 |
| 确实不显著 | 接受结论,不上线或优化方案重新测试 |
| p = 0.06~0.10 | 边界情况,考虑加大样本量或用贝叶斯重新评估 |
常见面试问题
Q1: p 值 = 0.06,能不能上线?
答案:
不建议仅因为接近阈值就上线。正确做法:
- 评估业务价值:0.3% 的提升带来多少收入?值不值得冒 6% 的误判风险?
- 继续收集数据:如果样本量还没到位,继续跑
- 贝叶斯分析:计算"实验组优于对照组的概率",如果 > 90% 可以考虑
- 看置信区间:如果 CI 下限接近 0 但上限较大,说明还有提升空间
Q2: 产品经理坚持要上线怎么办?
答案:
- 量化风险:说明"有 12% 的概率这个效果是假的"
- 折中方案:建议灰度上线 50% 继续观察
- 分人群分析:也许总体不显著但某个人群显著
- 书面记录:无论最终决策如何,记录数据分析师的建议
相关链接
- 显著性检验 - p 值与置信区间
- 样本量计算 - 最小样本量
- A/B 测试常见陷阱 - Peeking、SRM
- 进阶方法 - 贝叶斯 A/B 测试