4. A/B 测试的样本量计算:样本量公式、效应量、显著性水平与功效的权衡、常见样本量计算工具
A/B 测试的样本量计算是实验设计阶段最关键的量化步骤。样本量过小会导致统计功效不足,无法检测出真实存在的差异;样本量过大会浪费流量资源,延长实验周期。本节将系统讲解样本量计算的核心公式、关键参数权衡以及常用工具。
4.1 样本量计算的核心公式
对于两样本比例检验(最常用的 A/B 测试场景),样本量计算公式基于正态近似推导。每组所需样本量 n 的近似公式为:
n = ( (Z_α/2 + Z_β)² × (p₁(1-p₁) + p₂(1-p₂)) ) / (p₂ - p₁)²
其中:
- Z_α/2:显著性水平 α 对应的双侧临界值(α=0.05 时,Z≈1.96)
- Z_β:功效 1-β 对应的单侧临界值(功效=0.80 时,Z≈0.84)
- p₁:对照组预期转化率
- p₂:实验组预期转化率(p₁ + 最小可检测效应)
公式解读: 分子中的 (Z_α/2 + Z_β)² 代表统计信心与检测能力的综合权重;分母中的 (p₂ - p₁)² 代表效应量的平方,效应量越小,所需样本量呈平方级增长。
4.2 效应量:最小可检测效应
效应量(Effect Size)是样本量计算中最敏感、也最容易被低估的参数。在比例检验中,效应量通常定义为绝对提升:δ = p₂ - p₁。
| 效应量类型 | 定义 | 典型场景 | 样本量影响 |
|---|---|---|---|
| 绝对提升 | p₂ - p₁ | 转化率从 5% → 5.5% | δ 越小,n 越大 |
| 相对提升 | (p₂ - p₁) / p₁ | 转化率相对提升 10% | 基线率越低,所需 n 越大 |
| Cohen's h | 2 × arcsin(√p₂) - 2 × arcsin(√p₁) | 跨基线率比较 | 标准化效应量 |
实践建议: 不要使用"统计显著的最小效应"作为效应量。应基于业务价值判断:多大的提升值得投入工程资源去上线? 通常取业务认为有意义的绝对提升值,而非统计上能检测出的最小值。
4.3 显著性水平与功效的权衡
样本量计算涉及四个相互制约的参数,改变任何一个都会影响其他三个。理解这种权衡关系是实验设计成熟度的标志。
常见陷阱: 许多团队将 α 设为 0.05、功效设为 0.80 后就不再调整。但在高风险决策(如核心业务指标变更)中,应考虑 α=0.01 或功效=0.95;在探索性实验中,可适当放宽至 α=0.10 以降低流量成本。
4.4 常见样本量计算工具
手动计算公式容易出错,业界已有多种成熟工具可供选择。以下对比主流工具的适用场景与特点:
| 工具 | 类型 | 适用场景 | 优势 | 局限 |
|---|---|---|---|---|
| Evan's Awesome A/B Tools | Web 在线 | 比例检验、均值检验 | 交互直观,即时更新 | 不支持复杂设计 |
| Statsmodels (Python) | 代码库 | 自动化流程、批量计算 | 可嵌入管道,可复现 | 需编程基础 |
| pwr 包 (R) | 代码库 | 多种检验类型 | 统计方法全面 | 学习曲线较陡 |
| G*Power | 桌面软件 | 教学、复杂实验设计 | 可视化参数调整 | 不支持批量 |
| Optimizely Sample Size Calculator | Web 在线 | 快速估算 | 产品经理友好 | 仅支持比例检验 |
4.5 Python 代码示例:样本量计算
以下代码使用 statsmodels 库计算比例检验所需样本量,并展示参数变化对样本量的影响:
import numpy as np
from statsmodels.stats.proportion import proportion_effectsize
from statsmodels.stats.power import zt_ind_solve_power
# 设定参数
p1 = 0.05 # 对照组基线转化率 5%
p2 = 0.055 # 实验组预期转化率 5.5%(绝对提升 0.5%)
alpha = 0.05 # 显著性水平
power = 0.80 # 统计功效
# 计算效应量(Cohen's h)
effect_size = proportion_effectsize(p1, p2)
# 计算每组所需样本量
n_per_group = zt_ind_solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
ratio=1.0, # 实验组:对照组 = 1:1
alternative='two-sided'
)
print(f"效应量 (Cohen's h): {effect_size:.4f}")
print(f"每组所需样本量: {int(np.ceil(n_per_group))}")
print(f"总样本量: {int(np.ceil(n_per_group * 2))}")
# 展示不同功效下的样本量变化
print("\n--- 功效 vs 样本量 ---")
for pwr in [0.70, 0.80, 0.90, 0.95]:
n = zt_ind_solve_power(
effect_size=effect_size,
alpha=alpha,
power=pwr,
ratio=1.0,
alternative='two-sided'
)
print(f"功效 {pwr:.2f} → 每组 {int(np.ceil(n))} 人")
输出解读: 基线转化率 5%、绝对提升 0.5%、α=0.05、功效=0.80 时,每组约需 15,800 人。若将功效提升至 0.95,每组需约 26,100 人——增幅达 65%。这提醒我们:不要盲目追求高功效,应结合流量预算和实验周期合理设定。
4.6 样本量计算的常见误区
- 误区一: 用历史数据的最小可检测效应代替业务有意义效应。结果:样本量偏小,实验结论不可靠。
- 误区二: 忽略多重比较校正。同时运行多个实验或分析多个指标时,需调整 α(如 Bonferroni 校正),否则样本量不足。
- 误区三: 假设用户行为独立。同一用户多次访问会产生相关性,需使用"用户级"样本量而非"事件级"样本量。
- 误区四: 不考虑流量稀释。当实验组和对照组流量不均等时(如 80:20),总样本量需求会增加。
最佳实践: 在实验启动前,使用至少两种工具交叉验证样本量计算结果。将样本量上浮 10%-20% 作为安全缓冲,以应对用户流失、数据清洗等不可预见的样本损失。