19 KiB
A/B 测试:用数据"做决策"
::: tip 🎯 核心问题 如何科学地验证产品改动的效果? 这就像问:新按钮真的更好用吗?还是用户只是因为新鲜感多点了一下?A/B 测试解决的就是"用数据说话"的问题——不是我觉得好,而是数据证明真的好。 :::
0. 先问一个问题:你有没有经历过这些"伪成功"?
场景一:被数据骗了
你改了购物车的结算按钮颜色,从蓝变红。一周后一看数据:点击率提升了 30%!
你很高兴,宣布大获成功。但三周后,点击率悄悄回到了原水平,甚至还不如之前。
真相:这是"新奇效应"——用户因为好奇多点了几次,新鲜劲过后就恢复了。
场景二:假阳性陷阱
你同时测试了 20 个不同的改进方案。有一个方案显示"统计显著"(p < 0.05),你立即全量上线。
一个月后,用户满意度下降了。
真相:同时测试 20 个方案,即使全部无效,也有 64% 的概率至少有一个"显著"(1 - 0.95^20)。你看到的"显著"只是随机波动。
场景三:辛普森悖论
你的数据显示:B 版本的转化率(7.3%)高于 A 版本(5.6%)。但拆分数据后却发现:
- 移动端:A 8% > B 6%
- 桌面端:A 4% > B 3%
每个渠道 A 都更好,但合并后 B 反而赢了!
真相:流量分配不均(移动端占 80% 流量,且更多分配给了 B),导致加权平均后 B 看起来更好。
好的 A/B 测试就像科学的临床试验——严谨设计、足够样本、长期观察,才能得出可信结论。
1. 什么是 A/B 测试?
A/B 测试是一种对比实验方法:将用户随机分成两组,分别体验不同版本,比较关键指标(如转化率、点击率)的差异,从而判断哪个版本更优。
1.1 用医学试验来类比
| 医学试验 | A/B 测试 | 说明 |
|---|---|---|
| 对照组(安慰剂) | A组(对照组) | 使用当前版本,作为基准 |
| 实验组(新药) | B组(实验组) | 使用新版本,验证效果 |
| 治愈率 | 转化率 | 衡量是否"成功"的指标 |
| 统计显著性 | 统计显著性 | 结果是否可信 |
关键原则:除了版本不同,其他所有条件必须相同(随机分配、同时运行、相同用户群)。
1.2 A/B 测试的完整流程
1. 提出假设
↓
2. 设计实验(确定指标、样本量)
↓
3. 开发并部署实验
↓
4. 运行实验(收集数据)
↓
5. 分析结果(统计检验)
↓
6. 做出决策(全量/放弃/迭代)
2. A/B 测试的核心价值
2.1 避免"拍脑袋决策"
没有 A/B 测试时,决策往往依赖:
- HiPPO(Highest Paid Person's Opinion):最高领导说了算
- 设计直觉:设计师觉得这样更好看
- 模仿竞品:竞争对手这么做,我们也这么做
问题:这些方法都忽略了真实的用户行为。
2.2 降低风险
上线前不知道用户会不会买账?先小范围测试,用 1% 流量验证,避免全量上线后造成损失。
2.3 持续优化
通过不断的小实验,积累小的提升,最终实现显著增长。这就是"增长黑客"的核心方法。
3. 实验设计:对照组与实验组
3.1 随机分配的重要性
正确的做法:每个用户有 50% 概率进入 A 组,50% 概率进入 B 组
错误的做法:
- 前半天所有用户进 A 组,后半天进 B 组(时间差异)
- 移动端用户进 A 组,桌面端进 B 组(设备差异)
- 新用户进 A 组,老用户进 B 组(用户类型差异)
为什么随机很重要?
只有随机分配,才能保证两组用户在其他所有方面都相似(年龄、设备、使用习惯等),这样才能公平比较。
3.2 流量分配演示
👇 动手试试看:点击下方按钮,观察流量如何随机分配到两组:
::: tip 💡 50/50 分配是最优的 虽然有 30/70 或 20/80 的分配策略,但 50/50 能最快检测出差异。除非你对新版本极度不放心,否则不推荐使用非对称分配。 :::
4. 样本量计算:需要多少用户才够?
4.1 为什么不能"看着办"?
样本量太小 → 统计功效不足,即使有真实差异也检测不出来(假阴性) 样本量太大 → 浪费资源,运行时间过长
正确做法:实验前计算所需样本量。
4.2 影响样本量的四个因素
| 因素 | 影响 | 典型值 |
|---|---|---|
| 基准转化率 | 越高,所需样本越少 | 2% - 10% |
| 最小检测提升 | 越小,所需样本越多 | 相对提升 5% - 20% |
| 显著性水平 (α) | 越小,所需样本越多 | 0.05 (95%置信度) |
| 统计功效 (1-β) | 越大,所需样本越多 | 0.8 (80%功效) |
直觉理解:
- 你想检测的差异越小(比如只提升 5%),就需要更多样本才能"看清"
- 你想要的结果越确定(比如 99% 置信度 vs 95%),就需要更多证据
4.3 样本量计算公式
对于比例指标(转化率),简化的样本量公式为:
n = (Zα + Zβ)² × [p1(1-p1) + p2(1-p2)] / (p2 - p1)²
其中:
n= 每组所需样本量Zα= 显著性水平对应的 Z 值(α=0.05 时,Zα=1.96)Zβ= 统计功效对应的 Z 值(80%功效时,Zβ=0.84)p1= 基准转化率p2= 目标转化率 = p1 × (1 + 相对提升)
4.4 样本量计算示例
场景:购物车结算按钮,当前转化率 5%,希望检测 20% 的相对提升(即 6%)。
p1= 5% = 0.05p2= 6% = 0.06Zα= 1.96 (α=0.05)Zβ= 0.84 (80%功效)
n = (1.96 + 0.84)² × [0.05×0.95 + 0.06×0.94] / (0.06 - 0.05)²
n ≈ 6,932
每组需要 6,932 个样本,两组共需 13,864 个样本。
如果每天有 5,000 个访客,大约需要 3 天才能达到足够样本量。
::: tip 💡 在线计算工具
- Evan Miller 的样本量计算器 - 业界标准
- Optimizely 的样本量计算器 :::
5. 统计显著性:如何判断结果"可信"?
5.1 P 值是什么?
P 值:如果两个版本真的没有差异(零假设为真),观察到当前数据(或更极端数据)的概率。
通俗理解:P 值越小,说明"纯属巧合"的可能性越小。
常用阈值:
p < 0.05:统计显著,有 95% 的信心说差异不是随机的p < 0.01:高度显著,有 99% 的信心p ≥ 0.05:不显著,差异可能是随机波动
5.2 置信区间
置信区间:真实差异可能落入的范围。
示例:
- 相对提升:+15%
- 95% 置信区间:[+5%, +25%]
解读:我们有 95% 的信心认为,真实提升在 5% 到 25% 之间。
::: warning ⚠️ 常见误解 置信区间不是"有 95% 的概率在这个区间内",而是"如果我们重复实验 100 次,95 次的区间会包含真实值"。
对于单次实验,真实值要么在区间内,要么不在。但我们不知道是哪种情况。 :::
5.3 A/B 组结果对比演示
👇 动手试试看:调整转化率和样本量,观察统计显著性的变化:
关键观察:
- 相对提升越大,P 值越小(越容易显著)
- 样本量越大,P 值越小(越容易显著)
- 转化率越低,需要更大样本量才能达到相同显著性
6. A/B 测试的常见误区
6.1 过早停止实验(Peeking 问题)
问题:看到结果"显著"就立即停止实验,不再继续观察。
真相:P 值会随着数据积累而波动。你看到的"显著"可能只是暂时的随机波动。
Airbnb 的真实案例:
- 第 7 天:p = 0.05,结果显著,B 版本领先
- 第 14 天:p = 0.15,不再显著
- 第 30 天:p = 0.42,完全中性
如果第 7 天就停止,就会得出错误的结论。
解决方案:
- 实验前计算所需样本量,达到后才能分析
- 使用序贯检验(Sequential Testing),预设"窥探"点和调整后的显著性阈值
6.2 辛普森悖论
问题:分组看 B 更差,但合并后 B 反而更好(或相反)。
根本原因:混淆变量(Confounding Variable)分布不均。
示例:
移动端(占 80% 流量):
- A 组:8% 转化率(分配了 40% 流量)
- B 组:6% 转化率(分配了 40% 流量)
桌面端(占 20% 流量):
- A 组:4% 转化率(分配了 10% 流量)
- B 组:3% 转化率(分配了 10% 流量)
合并数据:
- A 组:(8%×0.4 + 4%×0.1) / 0.5 = 7.2%
- B 组:(6%×0.4 + 3%×0.1) / 0.5 = 5.4%
但如果是这样分配:
移动端:A 组 40% 流量,B 组 40% 流量
桌面端:A 组 0% 流量,B 组 20% 流量(不平衡!)
合并数据:
- A 组:(8%×0.4) / 0.4 = 8%
- B 组:(6%×0.4 + 3%×0.2) / 0.6 = 5%
但如果不加权,直接平均:A=5.6%, B=7.3%(B 反而赢了!)
解决方案:
- 确保随机化正确,每个子群体流量分配一致
- 按关键维度(设备、流量来源、用户类型)分别分析
- 使用 A/A 测试验证随机化是否有效
6.3 P-hacking(P 值操纵)
问题:通过尝试不同方法,直到找到"显著"结果。
常见形式:
- 子群挖掘:主指标不显著,就按年龄、地区、设备细分,宣称某个子群显著
- 选择性报告:同时测了 10 个指标,只报告显著的 1 个
- 延长实验:看到 p = 0.06,就再跑几天,"看看能不能降到 0.05 以下"
问题:这些都会大幅增加假阳性率。
解决方案:
- 预先注册假设和指标,实验过程中不改变
- 同时测试多个指标时,使用 Bonferroni 校正或 FDR(False Discovery Rate)控制
- 严格控制"窥探"次数
6.4 新奇效应
问题:用户因好奇点击新功能,导致短期数据虚高。
示例:
- 新按钮上线首周:点击率 +30%
- 第二周:+15%
- 第三周:+5%
- 第四周:0%(甚至 -2%,新鲜感过后,用户发现并不好用)
解决方案:
- 至少运行 2 个完整业务周期(通常 2-4 周)
- 观察趋势是否稳定,而不是只看绝对值
- 对长期指标(如用户留存)的重视度高于短期指标(如点击率)
6.5 统计功效不足
问题:样本量太小,即使有真实差异也检测不出来(假阴性)。
示例:预期提升 5%,但只跑了 1,000 个样本,结果显示"不显著",你就放弃了。
实际上,如果检测 5% 的提升,需要约 30,000 样本才能达到 80% 功效。
解决方案:
- 实验前必须计算样本量
- 如果资源有限,可以考虑:
- 提高最小检测提升(比如从 5% 改为 10%)
- 降低统计功效(从 80% 降到 70%,但会增加假阴性风险)
- 延长测试时间
7. 实战案例
7.1 案例 1:按钮颜色测试
背景:电商网站购物车结算按钮,当前为蓝色,想测试红色是否能提升转化率。
实验设计:
- 假设:红色按钮更醒目,能提升转化率 10%
- 指标:结算按钮点击率(点击次数 / 访问次数)
- 基准转化率:5%
- 目标转化率:5.5%(相对提升 10%)
- 所需样本量:每组约 30,000(使用在线计算器)
- 流量分配:50/50
- 显著性水平:α = 0.05
- 统计功效:80%
结果:
- 运行 7 天后达到所需样本量
- A 组(蓝):5.02%
- B 组(红):5.15%
- 相对提升:+2.6%
- P 值:0.23(不显著)
- 95% 置信区间:[-1.7%, +6.9%]
决策:结果不显著,无法确认红色按钮更好。考虑到:
- 转化率提升很小(即使真实,也只有 2.6%)
- 置信区间包含 0(甚至包含负值)
- 红色按钮可能影响品牌一致性
最终决定:保持蓝色按钮,尝试其他优化方向(如按钮文案、大小、位置)。
7.2 案例 2:注册流程简化
背景:SaaS 产品注册流程需要填写 10 个字段,想测试减少到 5 个字段是否能提升注册率。
实验设计:
- 假设:字段更少 → 注册率更高
- 指标:注册完成率(完成注册数 / 开始注册数)
- 基准转化率:25%
- 目标转化率:30%(相对提升 20%)
- 所需样本量:每组约 2,000
- 流量分配:50/50
结果:
- A 组(10 字段):24.8%
- B 组(5 字段):31.2%
- 相对提升:+25.8%
- P 值:< 0.001(高度显著)
- 95% 置信区间:[+18.2%, +33.4%]
决策:结果高度显著,全量上线 5 字段版本。
后续跟踪:
- 新用户注册率提升了 25.8%
- 用户质量(后续付费率)没有下降
- 用户反馈"注册很快很方便"
7.3 案例 3:推荐算法优化
背景:视频网站推荐算法,想测试新的协同过滤算法是否能提升用户观看时长。
实验设计:
- 假设:新算法推荐更精准 → 观看时长更长
- 指标:人均每日观看时长(分钟)
- 基准:45 分钟/天
- 目标:提升 5% → 47.25 分钟/天
- 所需样本量:每组约 10,000 用户
- 运行时间:至少 4 周(覆盖完整用户行为周期)
结果(4 周后):
- A 组(旧算法):45.2 分钟/天
- B 组(新算法):46.8 分钟/天
- 相对提升:+3.5%
- P 值:0.07(接近显著,但未达到 0.05 阈值)
- 95% 置信区间:[-0.2%, +7.2%]
决策:
- 统计不显著,但趋势积极(P 值接近 0.05)
- 置信区间下限接近 0(-0.2%),风险很小
- 新算法成本增加不大(服务器资源 +5%)
最终决定:谨慎全量上线,但:
- 持续监控关键指标
- 准备快速回滚方案
- 一个月后重新评估
一个月后:
- 观看时长提升稳定在 +4%
- 用户留存率无显著变化
- 服务器成本增加可接受
结论:实验成功。
8. 用 AI 辅助 A/B 测试设计
AI 可以帮助你快速设计实验、计算样本量、分析结果。关键在于提供清晰的上下文。
8.1 提示词模板:样本量计算
你是一位资深的 A/B 测试专家。请帮我计算实验所需的样本量。
## 业务背景
[描述你的业务场景,例如:电商网站、SaaS 产品、移动 App]
## 当前指标
- 关键指标:[转化率/留存率/点击率等]
- 当前数值:[基准值,如 5%]
- 指标类型:[比例指标/均值指标]
## 实验设计
- 预期相对提升:[如 10%,即从 5% 提升到 5.5%]
- 显著性水平 (α):0.05 (95% 置信度)
- 统计功效 (1-β):0.8 (80%)
- 流量分配:50/50
## 请求
1. 计算每组所需样本量
2. 假设每天有 [X] 个访问用户,估算需要运行多少天
3. 给出实验设计建议
8.2 提示词模板:结果分析
你是一位资深的 A/B 测试专家。请帮我分析实验结果。
## 实验结果
- A 组(对照组):
- 样本量:10,000
- 转化数:500
- 转化率:5.0%
- B 组(实验组):
- 样本量:10,000
- 转化数:550
- 转化率:5.5%
## 请求
1. 计算相对提升(百分比)
2. 计算 Z 值和 P 值
3. 计算 95% 置信区间
4. 判断是否统计显著(α = 0.05)
5. 给出决策建议(全量/放弃/继续观察)
6. 指出实验可能存在的偏倚或问题
8.3 提示词模板:常见问题诊断
你是一位资深的 A/B 测试专家。我的实验遇到了问题,请帮我诊断。
## 问题描述
[描述你遇到的问题,例如:
- 运行两周后 P 值仍在 0.5 左右,完全不显著
- A 组和 B 组数据差异很大,完全不像随机分配
- 第 3 天结果显示显著,但第 7 天又不显著了]
## 实验信息
- 指标:[转化率等]
- 基准值:[如 5%]
- 预期提升:[如 10%]
- 流量分配:[50/50]
- 运行天数:[如 7 天]
- 总样本量:[如 5,000]
## 请求
1. 分析可能的原因
2. 提供诊断建议
3. 给出解决方案
::: tip 💡 追问技巧
- "请用通俗语言解释什么是 P 值"
- "我的置信区间包含 0,这意味着什么?"
- "如何判断是否存在辛普森悖论?"
- "什么情况下可以使用非 50/50 的流量分配?" :::
名词速查表
| 名词 | 英文 | 解释 |
|---|---|---|
| A/B 测试 | A/B Testing | 对比实验,随机分配用户到不同版本,比较指标差异 |
| 对照组 | Control Group | 使用当前版本的组(A 组),作为基准 |
| 实验组 | Treatment Group | 使用新版本的组(B 组),验证效果 |
| 转化率 | Conversion Rate | 完成目标行为的用户占比(如购买、注册) |
| 零假设 | Null Hypothesis | 假设两组没有差异的起点,目标是"推翻"它 |
| P 值 | P-value | 如果零假设为真,观察到当前数据的概率 |
| 统计显著性 | Statistical Significance | P 值 < 0.05,结果不太可能是随机的 |
| 置信区间 | Confidence Interval | 真实差异可能落入的范围(如 95% CI) |
| 统计功效 | Statistical Power | 检测到真实效应的概率(1-β),通常 80% |
| 第一类错误 | Type I Error | 假阳性(说有差异,实际没有),α 控制 |
| 第二类错误 | Type II Error | 假阴性(说没差异,实际有),β 控制 |
| 显著性水平 | Significance Level | 容忍第一类错误的概率,通常 α = 0.05 |
| 效应量 | Effect Size | 差异的大小(相对提升多少),不只是是否显著 |
| 样本量 | Sample Size | 每组需要的用户数,需提前计算 |
| 随机分配 | Random Assignment | 每个用户有相同概率进入任一组 |
| 单尾检验 | One-tailed Test | 只检验"更好"(不关心"更差") |
| 双尾检验 | Two-tailed Test | 检验"有差异"(更好或更差都算) |
| 辛普森悖论 | Simpson's Paradox | 分组看趋势一致,合并后趋势相反 |
| P-hacking | P-hacking | 操纵数据或方法以获得显著结果 |
| 新奇效应 | Novelty Effect | 用户因好奇产生的短期行为变化 |
| 序贯检验 | Sequential Testing | 预设多个检查点,动态调整显著性阈值 |
参考资源
在线工具
经典文章
书籍推荐
- 《Trustworthy Online Controlled Experiments》- Ron Kohavi 等
- 《Designing Experiments》- Geoffrey Keppel