样本量计算
问题
A/B 实验需要多少样本量?如何计算最小样本量?
答案
核心参数
| 参数 | 符号 | 含义 | 常用值 |
|---|---|---|---|
| 显著性水平 | α | 假阳性概率(Type I Error) | 0.05 |
| 统计功效 | 1-β | 检测到真实效应的概率 | 0.80 |
| 最小检测效应 | MDE (δ) | 你关心的最小提升幅度 | 业务决定 |
| 基准值 | p₀ / μ₀ | 当前指标值 | 历史数据 |
| 标准差 | σ | 指标的波动性 | 历史数据 |
比例类指标(转化率)
其中:
- = 基准转化率
- = MDE(绝对值)=
- = 1.96(α=0.05,双尾)
- = 0.84(Power=0.80)
示例:当前转化率 10%,希望检测 1% 的提升(10% → 11%)
每组约 14,112 用户,两组共 28,224 用户。
均值类指标(客单价、时长)
示例:平均客单价 200 元,标准差 80 元,检测 10 元提升
每组约 1,004 用户。
Python 计算
from scipy import stats
import numpy as np
def sample_size_proportion(p0: float, mde: float, alpha: float = 0.05, power: float = 0.80) -> int:
"""比例指标样本量计算(每组)"""
z_alpha = stats.norm.ppf(1 - alpha / 2)
z_beta = stats.norm.ppf(power)
p_avg = p0 + mde / 2
n = ((z_alpha + z_beta) ** 2 * 2 * p_avg * (1 - p_avg)) / (mde ** 2)
return int(np.ceil(n))
def sample_size_mean(sigma: float, mde: float, alpha: float = 0.05, power: float = 0.80) -> int:
"""均值指标样本量计算(每组)"""
z_alpha = stats.norm.ppf(1 - alpha / 2)
z_beta = stats.norm.ppf(power)
n = ((z_alpha + z_beta) ** 2 * 2 * sigma ** 2) / (mde ** 2)
return int(np.ceil(n))
# 转化率:基准 10%,检测 1% 提升
print(sample_size_proportion(0.10, 0.01)) # ~14112
# 客单价:标准差 80,检测 10 元提升
print(sample_size_mean(80, 10)) # ~1004
影响样本量的因素
| 你想要的 | 对样本量的影响 | 原因 |
|---|---|---|
| 更小的 α(0.05→0.01) | ↑ 增加 | 更严格,需要更多证据 |
| 更高的 Power(0.80→0.90) | ↑ 增加 | 更不容易漏掉真实效应 |
| 更小的 MDE | ↑ 大幅增加 | 检测微小变化需要更多数据 |
| 指标方差更大 | ↑ 增加 | 信噪比低,需更多样本 |
| 基准转化率接近 50% | ↑ 增加 | 方差 p(1-p) 在 50% 最大 |
常见问题处理
样本量不够怎么办?
| 方法 | 做法 | 代价 |
|---|---|---|
| 增大 MDE | 只检测更大的效应 | 可能错过小提升 |
| 降低 Power | 0.80 → 0.70 | 更容易漏掉效应 |
| 增加流量 | 扩大实验范围 | 风险扩大 |
| 降低方差 | CUPED 方差缩减 | 实现复杂 |
| 延长实验 | 积累更多行数 | 占用时间 |
多组实验的样本量
如果有 3 个或更多实验组:
- 每组对比 → 需要做多重比较校正(Bonferroni)
- 校正后的 α' = α / 比较次数
- 样本量会显著增加
常见面试问题
Q1: 样本量计算中最关键的参数是什么?
答案:MDE(最小检测效应)。它由业务决定——你关心的最小提升是多少。MDE 对样本量的影响是平方关系:MDE 缩小一半,样本量增加 4 倍。
Q2: 某实验跑了 3 天就显著了,可以提前停吗?
答案:不建议。原因:
- Peeking 问题:反复查看+提前停止会膨胀假阳性率
- 周效应:3 天不能覆盖完整周期
- 新奇效应:早期数据可能有偏
- 如果确实想提前停止,需使用序贯检验(Sequential Testing)方法
Q3: 如何确定 MDE?
答案:从业务角度出发:
- ROI 倒推:改动成本多少?需要多大提升才值得?
- 历史基准:同类改动通常带来多大提升?
- 实际约束:给定流量和时间,能检测到多小的效应?
- 一般经验:转化率的 MDE 通常在相对提升 2%-5%
Q4: 为什么 Power 通常选 0.80 而不是更高?
答案:
- 0.80 是学术界和工业界的惯例平衡点
- 提高到 0.90 需要增加约 30% 的样本量
- Power=0.80 意味着有 20% 概率漏掉真实效应(Type II Error)
- 对于高风险决策(如定价改动),可以提高到 0.90