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 显著性水平与功效的权衡

样本量计算涉及四个相互制约的参数,改变任何一个都会影响其他三个。理解这种权衡关系是实验设计成熟度的标志。

样本量计算四参数权衡关系 样本量 n 显著性水平 α α↓ → n↑(更严格) 统计功效 1-β 功效↑ → n↑(更敏感) 效应量 δ δ↓ → n↑↑(平方增长) 基线转化率 p₁ p₁ 接近 0 或 1 → n↑ 权衡原则:固定任意三个参数,第四个参数被唯一确定。实践中通常固定 α、功效、δ,反推 n。
常见陷阱: 许多团队将 α 设为 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% 作为安全缓冲,以应对用户流失、数据清洗等不可预见的样本损失。