跳到主要内容

实验设计

问题

如何设计一个科学的 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)未登录产品同一用户多设备
CookieWeb 产品用户清 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 实验?

答案

  1. 假设:H₁ = 新流程提升购买转化率
  2. 主指标:购买转化率 = 下单用户 / 进入结账用户
  3. 护栏指标:页面加载时间、客服投诉率、客单价
  4. 实验单元:用户 ID(登录态)
  5. 分流:50:50 随机分流,先跑 AA 检验
  6. 样本量:根据当前转化率和 MDE 计算
  7. 周期:至少 2 周(覆盖周末 + 排除新奇效应)

Q2: 主指标和护栏指标冲突了怎么办?

答案

  • 主指标显著提升但护栏指标下降 → 不能直接上线
  • 需要分析护栏指标下降的原因和幅度
  • 常见案例:弹窗推送提升了点击率但增加了用户投诉
  • 决策原则:护栏指标是底线,不可突破

Q3: 实验期间发现 Bug 需要修复怎么办?

答案

  • 立即修复,但需要记录修复时间
  • 修复后有两个选择:
    1. 截断数据:只分析修复前或修复后的数据
    2. 重新开始:重置实验,从头跑

Q4: 为什么不建议用页面浏览(Page View)作为实验单元?

答案:同一用户在刷新或多次访问时可能看到不同版本,导致:

  • 用户体验不一致(一会儿看到 A,一会儿看到 B)
  • 违反**独立同分布(i.i.d.)**假设
  • 方差估计偏低,假阳性率升高

相关链接