本文档提供真实场景下的 A/B 测试完整案例,每个案例覆盖:业务背景 实验设计 数据 分析过程 决策 复盘。目标是让读者从"知道理论"到"会做决策"。
某短视频平台计划将推荐模型的召回层从协同过滤升级为双塔模型。团队预期新模型能提升用户观看时长。
| 要素 | 配置 |
|---|---|
| 实验单元 | 用户 ID |
| 对照组 | 协同过滤召回(老模型) |
| 实验组 | 双塔模型召回(新模型) |
| 主指标(OEC) | 人均观看时长(分钟/天) |
| 护栏指标 | 人均点赞率、人均评论率、次日留存率、App 崩溃率 |
| 样本量 | 每组 50 万用户 |
| 实验时长 | 14 天(含 3 天模型预热期) |
| 分流比例 | Control 10% / Treatment 10% |
Step 1:SRM 检验
Control 502,134 人,Treatment 501,872 人。 = 0.07,p = 0.79。通过。
Step 2:整体效应(CUPED 修正后)
| 指标 | Control | Treatment | 效应量 | 相对变化 | 95% CI | p-value |
|---|---|---|---|---|---|---|
| 人均观看时长 | 32.5 min | 32.9 min | +0.4 min | +1.23% | [-0.1, +0.9] | p = 0.11 |
| 人均点赞率 | 4.20% | 4.18% | -0.02pp | -0.48% | [-0.15, +0.11] | p = 0.72 |
| 次日留存 | 58.3% | 58.4% | +0.1pp | +0.17% | [-0.2, +0.4] | p = 0.51 |
整体结论:不显著。 新模型在平均意义上并未带来显著提升。
Step 3:HTE 分析(按用户活跃度分组)
直觉告诉我们不能就此放弃新模型可能对不同用户群体产生不同的效果。我们按实验前 30 天的活跃天数将用户分为三组:
| 用户分层 | Control 时长 | Treatment 时长 | 效应量 | p-value |
|---|---|---|---|---|
| 低活(< 5 天) | 8.2 min | 9.1 min | +0.9 min (+10.9%) | p = 0.003 |
| 中活(5-15 天) | 28.4 min | 28.7 min | +0.3 min (+1.1%) | p = 0.28 |
| 高活(> 15 天) | 52.1 min | 51.0 min | -1.1 min (-2.1%) | p = 0.02 |
多重检验校正(Bonferroni,m=3 _adjusted = 0.017):
发现:新模型在低活用户上有显著正向效果,但对高活用户可能有微弱的负面影响。
Step 4:护栏指标分组检查
| 分组 | 点赞率变化 | 次日留存变化 | 方向 |
|---|---|---|---|
| 低活 | +0.5pp (显著) | +0.8pp (显著) | 正向 |
| 高活 | -0.3pp (不显著) | -0.2pp (不显著) | 无显著变化 |
最终决策:分层上线低活用户用新模型,高活用户保留老模型。
理由:
某电商平台测试会员订阅价格调整:月费从 29 元降至 25 元(降幅 13.8%)。预期降低价格能提升订阅转化率,但需要评估整体 GMV 影响。
| 要素 | 配置 |
|---|---|
| 实验单元 | 用户 ID(仅包含近 30 天未订阅的潜在用户) |
| 对照组 | 月费 29 元(现价) |
| 实验组 | 月费 25 元(新价) |
| 主指标(OEC) | 人均 GMV(订阅费 + 平台交易佣金) |
| 次级指标 | 订阅转化率、ARPU |
| 护栏指标 | 次日留存率、客诉率 |
| 样本量 | 每组 20 万用户 |
| 实验时长 | 21 天 |
| 分流比例 | Control 50% / Treatment 50% |
Step 1:SRM 检验
通过。
Step 2:主指标分析
| 指标 | Control | Treatment | 效应量 | 相对变化 | 95% CI | p-value |
|---|---|---|---|---|---|---|
| 订阅转化率 | 3.20% | 4.15% | +0.95pp | +29.7% | [+0.6, +1.3]pp | p < 0.001 |
| ARPU(订阅费) | 0.93 元 | 1.04 元 | +0.11 元 | +11.8% | [+0.05, +0.17] | p < 0.001 |
| 人均 GMV(含交易佣金) | 5.82 元 | 5.64 元 | -0.18 元 | -3.1% | [-0.42, +0.06] | p = 0.14 |
转化率大幅提升,订阅 ARPU 提升(因为更多人订阅),但人均 GMV 下降且不显著。
Step 3:拆解 GMV 下降的原因
人均 GMV = 订阅费收入 + 交易佣金收入
订阅费:
Control: 0.93 元
Treatment: 1.04 元 (+11.8%)
交易佣金:
Control: 4.89 元
Treatment: 4.60 元 (-5.9%)
订阅费增长了,但交易佣金下降了。为什么?
进一步按用户分层分析发现:降价吸引了大量"边际用户"(原本因为价格未订阅的用户)。这批用户的特征是:订阅意愿强但消费能力弱,订阅后在平台上的交易反而低于平均。
Step 4:ROI 估算
Control 年化 GMV 预估:5.82 12 = 69.84 元
Treatment 年化 GMV 预估:5.64 12 = 67.68 元
单用户 GMV 下降:2.16 元/年
假设 100 万潜在用户:
总收入损失 = 100 万 2.16 元 = 216 万/年
最终决策:不上线。
理由:
后续行动:
某新闻 App 计划重新设计首页的信息流布局:将原本的单列大图改为双列小图 + 标题。预期新布局能提升用户滑动深度和内容点击量。
| 要素 | 配置 |
|---|---|
| 对照组 | 单列大图布局(老 UI) |
| 实验组 | 双列小图布局(新 UI) |
| 主指标 | 人均内容点击次数 |
| 护栏指标 | 人均阅读时长、次日留存率、卸载率 |
| 样本量 | 每组 30 万用户 |
| 实验时长 | 14 天 |
| 分流比例 | Control 50% / Treatment 50% |
整体分析:
| 指标 | Day 1-3 | Day 4-7 | Day 8-14 |
|---|---|---|---|
| 点击次数变化 | +12.4% *** | +8.1% ** | +3.2% (p=0.08) |
| 阅读时长变化 | +5.2% * | +1.8% | -2.1% (p=0.18) |
| 次日留存变化 | +0.3pp | -0.1pp | -0.5pp (p=0.04) |
趋势非常明显:效果在随时间衰减。
效应量随时间变化(点击次数):
+12%
+8%
+3%
~~~~(不再显著)
D1-3 D4-7 D8-14
最终决策:不上线,但保留洞察。
决策逻辑:
有价值的洞察:
某电商 App 计划将推送策略从"每天固定 2 次"改为"基于用户活跃时间个性化推送,每天最多 3 次"。预期提升用户打开率和下单转化。
| 要素 | 配置 |
|---|---|
| 对照组 | 固定时间推送,每天 2 次(早 10 点、晚 8 点) |
| 实验组 | 个性化时间推送,每天最多 3 次 |
| 主指标 | 人均 GMV |
| 护栏指标 | 推送打开率、卸载率、推送关闭率(用户在系统设置中关闭通知) |
| 样本量 | 每组 40 万用户 |
| 实验时长 | 28 天(需要足够长时间观察卸载行为) |
| 分流比例 | Control 50% / Treatment 50% |
Step 1:整体指标
| 指标 | Control | Treatment | 效应量 | p-value |
|---|---|---|---|---|
| 人均 GMV | 12.40 元 | 13.15 元 | +0.75 元 (+6.0%) | p = 0.02 |
| 推送打开率 | 8.2% | 7.1% | -1.1pp (-13.4%) | p < 0.001 |
| 推送关闭率 | 2.1% | 3.8% | +1.7pp (+81%) | p < 0.001 |
| 卸载率 | 0.8% | 1.2% | +0.4pp (+50%) | p = 0.01 |
Signal 矛盾:GMV 显著提升,但三条护栏指标全部恶化。
Step 2:深度拆解
不是所有用户都收到了更多推送只有那些活跃时间不在早 10 点和晚 8 点的用户才会接收到第 3 条推送。
| 用户群体 | 平均推送条数 | GMV 变化 | 卸载率变化 |
|---|---|---|---|
| 原活跃时间匹配(仍 2 条) | 2.0 2.1 | +3.2% | +0.1pp (ns) |
| 原活跃时间不匹配(新增第 3 条) | 2.0 2.8 | +11.5% ** | +1.2pp ** |
发现:GMV 的增长几乎全部来自"新增推送"的用户群体,但这批用户的卸载率也大幅上升。
Step 3:ROI 估算
受益:GMV +0.75 元/人/28 天 +9.75 元/人/年
损失:卸载率 +0.4pp
假设:
- 总用户 1000 万
- 单用户年 LTV = 150 元
- 卸载用户流失率 80%(假设卸载后 20% 会回来)
年 GMV 增益 = 1000 万 9.75 = 9750 万元
年用户流失损失 = 1000 万 0.4% 150 元 80% = 4800 万元
净收益 = 9750 - 4800 = 4950 万元
最终决策:灰度上线,但缩小触达范围。
搜索团队测试两种排序策略:当前策略(按相关性排序),候选策略(按相关性 点击率排序)。采用 Interleaving(成对比较)方法进行对比。
| 对比维度 | 传统 A/B | Interleaving |
|---|---|---|
| 每用户看到 | 只体验一种排序 | 两种排序结果混合(穿插展示) |
| 信号来源 | 组间对比 | 同一用户的点击偏好 |
| 敏感度 | 基准 | 通常高 10-100 倍 |
| 所需样本量 | 大 | 小(可少至 1/10) |
适用条件:两种排序返回的结果集高度重叠,混合展示不影响用户体验。
| 要素 | 配置 |
|---|---|
| 方法 | Team-Draft Interleaving(轮流从两组结果中选取,去重后呈现) |
| 度量 | Preference Score = (候选策略点击数 - 当前策略点击数) / 总点击数 |
| 样本量 | 5,000 次搜索(传统 A/B 需 50,000+) |
| 实验时长 | 3 天 |
| H | Preference Score = 0(两种排序无差异) |
| 指标 | 值 |
|---|---|
| 总搜索次数 | 5,127 |
| 当前策略被点击数 | 2,183 |
| 候选策略被点击数 | 2,589 |
| Preference Score | +0.079 |
| 95% CI(Bootstrap) | [+0.042, +0.116] |
| t 统计量 | t = 4.21 |
| p-value | p < 0.001 |
候选策略的点击偏好显著为正(+7.9%),且仅用了 3 天、5,000 次搜索。
佐证指标:
| 指标 | 当前策略 | 候选策略 | 差异 |
|---|---|---|---|
| 首条 CTR | 31.2% | 34.8% | +3.6pp |
| 平均点击位置 | 1.82 | 1.65 | 更高(结果更靠前) |
最终决策:候选策略显著优于当前策略,进入传统 A/B 验证阶段。
注意:Interleaving 告诉你"哪个更好",但不能直接告诉你"好了多少"(因为用户行为在混合展示中与被单独展示时有差异)。所以 Interleaving 通常用于快速筛选候选策略,最终确认效果还需要传统 A/B。
后续传统 A/B(每组 10 万用户,14 天)验证结果:
| 指标 | 效应量 | p-value |
|---|---|---|
| 搜索点击率 | +5.2% | p = 0.003 |
| 搜索成交率 | +3.8% | p = 0.01 |
传统 A/B 结果与 Interleaving 方向一致,但效应量略小(5.2% vs 7.9%),符合预期。
某网约车平台测试"雨天高峰补贴"策略:在下雨 + 高峰期对司机提供额外的每单补贴(+5 元),以提高供给响应速度。实验在一个大型城市的 8 个区域中进行。
如果按乘客随机分组:
实验组乘客:看到更多可用车辆(因为司机被补贴吸引)
对照组乘客:可用的车辆减少(司机优先接实验组的单)
对照组体验被人为"恶化"
实验组的提升部分来自"抢了对照组的资源"
策略的真实效果被高估
这叫做溢出效应(Spillover Effect)实验组的行为影响了对照组的结果。
| 要素 | 配置 |
|---|---|
| 实验单元 | 地理区域(8 个区域中随机选择 4 个区域作为实验组) |
| 对照组 | 4 个区域:正常计价(无额外补贴) |
| 实验组 | 4 个区域:雨天高峰每单额外补贴 5 元 |
| 主指标 | 乘客平均等待时长、订单完成率 |
| 护栏指标 | 每单司机收入(不能大幅下降)、安全事故率 |
| 实验时长 | 30 天(覆盖足够的雨天数) |
| 分析方法 | 集群随机化的 t 检验(自由度 = 区域数 - 2 = 6) |
集群级分析(每个区域是一个数据点):
| 区域 | 分组 | 平均等待时长(s) | 订单完成率 |
|---|---|---|---|
| A | Control | 245 | 82.3% |
| B | Control | 261 | 80.1% |
| C | Control | 238 | 83.5% |
| D | Control | 254 | 81.2% |
| E | Treatment | 187 | 88.7% |
| F | Treatment | 195 | 87.2% |
| G | Treatment | 203 | 86.9% |
| H | Treatment | 178 | 89.4% |
集群级 t 检验(Welch):
| 指标 | Control 均值 | Treatment 均值 | 效应量 | p-value |
|---|---|---|---|---|
| 等待时长 | 249.5s | 190.8s | -58.7s (-23.5%) | p = 0.008 |
| 订单完成率 | 81.8% | 88.1% | +6.3pp | p = 0.015 |
为什么不用乘客级数据分析:
如果用乘客级数据(忽略集群结构),p-value 会被严重低估:
| 分析方法 | 等待时长效应量 | p-value |
|---|---|---|
| 乘客级(错误,忽略集群) | -58.7s | p < 0.00001 |
| 集群级(正确) | -58.7s | p = 0.008 |
用错误的分析方法会得到极度膨胀的假阳性。
经济学分析市场均衡推演:
无补贴时:
司机供给曲线 S
乘客需求曲线 D
均衡价格 P,均衡成交量 Q
有补贴时:
司机供给曲线右移 S S(更多司机愿意出车)
乘客需求不变 D
新均衡价格 P < P(乘客实际支付下降),Q > Q(成交量上升)
全量影响预估:
如果全量上线,等待时长下降幅度可能略小于实验测量值
因为当所有区域都有补贴时,司机不再有"被偏爱的区域"
但仍会整体提高供给意愿
最终决策:全量上线,但调整为每单补贴 3 元(原设计 5 元)。
理由:
某 B2B SaaS 公司计划重新设计注册引导流程,预期提升商户的注册完成率。问题:平台只有约 800 个活跃商户,新注册商户每月仅 200 家左右。传统的样本量计算方法给出的数字无法满足。
Power Analysis:
= 0.05, = 0.20
Baseline 注册完成率 = 40%
MDE = 10pp(从 40% 50%)
= 0.4 0.6 = 0.24
n = 2 (1.96 + 0.84) 0.24 / 0.10
= 2 7.84 0.24 / 0.01
= 376 人/组
376 人/组 2 组 = 752 人
每月只新增 200 家 需要跑 3.8 个月才能达到样本量
不现实
策略 1:放宽 MDE
| MDE | 每组所需样本 | 所需时间 |
|---|---|---|
| 10pp | 376 | 3.8 个月 |
| 15pp | 167 | 1.7 个月 |
| 20pp | 94 | 1 个月 |
决策:将 MDE 上调到 15pp。理由:B2B 业务中 15pp 的注册率提升已具有商业价值(月均新增 30 家商户 年化 360 家 按 LTV 计算年收入增量约 72 万)。
策略 2:使用 CUPED 降低方差
用商户注册前的"访问频率"和"功能浏览深度"作为协变量:
$$Y_{cuped} = Y_{注册完成} - \theta \cdot (X_{访问频率} - \mu_X)$$
CUPED 后方差降低约 35%( 0.6)。
$$n_{effective} = n_{original} \times (1 - \rho^2) = 167 \times 0.64 \approx 107$$
所需时间从 1.7 个月进一步缩短到 1.1 个月。
策略 3:引入贝叶斯先验
利用上一轮注册流程优化实验的先验信息:
将先验整合到分析中:
先验: ~ Normal(0.08, 0.05)
实验数据:对照组 38/100,实验组 52/107
后验:P( > 0.10 | data) = 89.3%
| 要素 | 配置 |
|---|---|
| 对照组 | 当前注册流程 |
| 实验组 | 新注册引导流程 |
| 主指标 | 注册完成率 |
| MDE | 15pp |
| 预计样本量 | 每组 110 家(CUPED 调整后) |
| 预计时长 | 35 天 |
| 分析方法 | 贝叶斯 Beta-Binomial(含历史先验) |
实验进行 35 天后:
对照组:105 家注册尝试,42 家完成(40.0%)
实验组:112 家注册尝试,55 家完成(49.1%)
效应量:+9.1pp
95% 贝叶斯可信区间:[+1.2pp, +17.0pp]
P( > 0) = 98.7%
P( > 5pp) = 85.4%
决策:上线新注册流程。
虽然效应量未达到 MDE(15pp),但:
某内容平台测试"阅读奖励"策略:用户每阅读 3 篇文章,获得小额积分奖励。预期能提升用户的阅读篇数和留存率。
| 要素 | 配置 |
|---|---|
| 对照组 | 无阅读奖励 |
| 实验组 | 每阅读 3 篇文章奖励 5 积分 |
| 主指标 | 人均日均阅读篇数 |
| 护栏指标 | 次日留存、篇均阅读时长、每日积分消耗 |
| 样本量 | 每组 25 万用户 |
| 实验时长 | 14 天 |
| 分流比例 | Control 50% / Treatment 50% |
| 指标 | Control | Treatment | 效应量 | p-value |
|---|---|---|---|---|
| 人均日均阅读篇数 | 8.3 | 8.4 | +0.1 (+1.2%) | p = 0.34 |
| 次日留存 | 42.1% | 42.0% | -0.1pp | p = 0.62 |
| 篇均阅读时长 | 85s | 82s | -3s (-3.5%) | p = 0.08 |
| 每日积分消耗 | 0 | 5.2 积分 | - | - |
整体结论:策略无效。
复盘维度 1:实验执行是否有问题?
| 检查项 | 结果 |
|---|---|
| SRM 检验 | 通过 |
| 数据质量 | 正常 |
| 实验时长 | 足够(14 天) |
| 用户是否真的获得了积分? | 是(积分系统数据确认) |
| 用户是否知道积分的存在? | 问题发现:调研显示仅 32% 的实验组用户注意到积分奖励 |
核心发现:不是策略本身无效,而是策略的触达率太低大部分用户根本不知道有积分奖励。
复盘维度 2:假设的哪个环节错了?
原始假设链:
发放积分 用户感知到激励 用户增加阅读 留存提升
断裂点在第二步"用户感知到激励"没有被充分触发。积分发放是后台静默的,没有在用户阅读第 3 篇文章时弹出明显的奖励反馈。
复盘维度 3:实验设计本身的问题
| 问题分类 | 具体问题 | 严重程度 |
|---|---|---|
| 策略设计 | 触达率过低(32%) | 致命 |
| 策略设计 | 激励强度不足(需 300 篇才能兑换) | 严重 |
| 技术实现 | 积分到账延迟 24 小时 | 严重 |
| 实验假设 | 原始假设链断裂在"感知"环节 | 需要修正 |
## 实验复盘:{实验名称}
### 1. 实验原假设
因为 [观察],我们相信 [策略] 会带来 [预期效果]。
### 2. 实际结果
- 主指标:效应量 = ,p-value =
- 护栏指标:正常 / 异常
### 3. 执行诊断
- [ ] SRM 检验通过?
- [ ] 数据质量正常?
- [ ] 实验时长足够?
- [ ] 用户是否真的接触到了策略?
- [ ] 技术实现是否正确?
### 4. 假设链断点分析
策略 [中间变量 1] [中间变量 2] 目标指标
/ / / /
### 5. 根因分类
- [ ] 假设本身错误(策略方向有问题)
- [ ] 执行不到位(触达率/技术问题)
- [ ] 激励/干预强度不足
- [ ] 实验设计缺陷(样本量/时长/指标)
### 6. 经验沉淀
- 学到了什么:
- 如果重来会怎么做:
- 对后续实验的指导: