实验设计
问题
如何设计一个科学的 A/B 实验?从假设到分流有哪些关键步骤?
答案
实验设计流程
1. 提出假设
| 概念 | 含义 | 示例 |
|---|---|---|
| H₀(原假设) | 实验无效果 | 新首页不改变转化率 |
| H₁(备择假设) | 实验有效果 | 新首页提升转化率 |
| 单尾检验 | 只关心单方向变化 | 只关心"提升",不关心"下降" |
| 双尾检验 | 关心双方向变化 | 关心"变化"(提升或下降) |
何时选单尾 vs 双尾?
- 双尾更安全:大多数实验应使用双尾——你需要知道改动是否伤害了指标
- 单尾有争议:仅在你确信不会有负面效果时才用(极少见)
- 面试中推荐默认选双尾,并解释原因
2. 指标选择
指标层级
| 类型 | 定义 | 示例 |
|---|---|---|
| 主指标(Primary Metric) | 实验成功的核心判据,通常 1 个 | 注册转化率 |
| 次要指标(Secondary) | 辅助理解实验效果 | 页面停留时长、点击率 |
| 护栏指标(Guardrail) | 不能变差的底线指标 | 页面加载时间、用户投诉率 |
好指标的 SMART 原则
- Specific:明确计算口径
- Measurable:可量化
- Attributable:可归因到实验变更
- Relevant:与业务目标相关
- Timely:在实验周期内可观测
OEC(Overall Evaluation Criterion)
| 特征 | 说明 |
|---|---|
| 综合核心指标 | 将多个指标加权合成一个 |
| 避免矛盾 | 点击率涨了但转化率降了 → 看 OEC |
| 需谨慎设计 | 权重选择直接影响决策 |
3. 实验单元(Randomization Unit)
| 单元 | 适用场景 | 风险 |
|---|---|---|
| 用户(User ID) | 最常见,登录态产品 | — |
| 设备(Device ID) | 未登录产品 | 同一用户多设备 |
| Cookie | Web 产品 | 用户清 Cookie |
| 页面浏览(Page View) | 页面级实验 | 同一用户前后体验不一致 |
| 地理区域 | 配送、运营实验 | 样本量小 |
实验单元与分析单元必须一致
如果按用户分流,分析时也应按用户聚合。如果按用户分流却按 PV 分析,会违反独立性假设,导致 p 值偏低(假阳性增加)。
4. 分流方案
哈希分流
import hashlib
def get_bucket(user_id: str, experiment_id: str, num_buckets: int = 100) -> int:
"""根据用户 ID 和实验 ID 确定分桶"""
key = f"{experiment_id}_{user_id}"
hash_value = int(hashlib.md5(key.encode()).hexdigest(), 16)
return hash_value % num_buckets
# 分配到对照组或实验组
bucket = get_bucket("user_123", "exp_homepage_v2")
group = "control" if bucket < 50 else "treatment"
分流检验(AA 测试)
在实验上线前或初期,验证分流是否随机:
| 检验项 | 方法 | 阈值 |
|---|---|---|
| 样本量比例 | 卡方检验 | p > 0.05 |
| 各组指标基线 | t 检验 | p > 0.05 |
| 用户属性分布 | 卡方检验 | 各维度均 p > 0.05 |
SRM(Sample Ratio Mismatch):如果实际分流比例偏离预期(如 50:50 变成 48:52),实验结果不可信,需排查分流 Bug。
5. 实验周期
| 考虑因素 | 说明 |
|---|---|
| 最小检测效应 | 效应越小越需要更长时间 |
| 流量 | 日活越大,达到样本量越快 |
| 周效应 | 至少跑 1-2 周以覆盖工作日+周末 |
| 新奇效应 | 用户对新功能的新鲜感消退后再判断 |
| 学习效应 | 用户需要时间适应新体验 |
最低运行周期
即使样本量提前达标,也建议至少跑满一个完整周期(7 天),以排除日期效应。
常见面试问题
Q1: 如何为一个电商「新结账流程」设计 A/B 实验?
答案:
- 假设:H₁ = 新流程提升购买转化率
- 主指标:购买转化率 = 下单用户 / 进入结账用户
- 护栏指标:页面加载时间、客服投诉率、客单价
- 实验单元:用户 ID(登录态)
- 分流:50:50 随机分流,先跑 AA 检验
- 样本量:根据当前转化率和 MDE 计算
- 周期:至少 2 周(覆盖周末 + 排除新奇效应)
Q2: 主指标和护栏指标冲突了怎么办?
答案:
- 主指标显著提升但护栏指标下降 → 不能直接上线
- 需要分析护栏指标下降的原因和幅度
- 常见案例:弹窗推送提升了点击率但增加了用户投诉
- 决策原则:护栏指标是底线,不可突破
Q3: 实验期间发现 Bug 需要修复怎么办?
答案:
- 立即修复,但需要记录修复时间
- 修复后有两个选择:
- 截断数据:只分析修复前或修复后的数据
- 重新开始:重置实验,从头跑
Q4: 为什么不建议用页面浏览(Page View)作为实验单元?
答案:同一用户在刷新或多次访问时可能看到不同版本,导致:
- 用户体验不一致(一会儿看到 A,一会儿看到 B)
- 违反**独立同分布(i.i.d.)**假设
- 方差估计偏低,假阳性率升高