4. 统计功效分析:功效函数、样本量对功效的影响、如何计算最小样本量以达到预期功效
在 Champion Challenger 实验中,我们不仅关心“差异是否统计显著”,更关心“当真实差异存在时,我们有多大的概率能检测到它”。这就是统计功效(Statistical Power)的核心问题。本章将深入剖析功效函数、样本量与功效的关系,并给出计算最小样本量的实操方法。
4.1 统计功效的定义与功效函数
统计功效定义为:当备择假设 H₁ 为真时,正确拒绝原假设 H₀ 的概率,即 Power = 1 − β,其中 β 为第二类错误(假阴性)概率。功效函数则描述了功效与效应量(Effect Size)、样本量(n)、显著性水平(α)以及检验类型之间的数学关系。
Power = Φ( |δ| / (σ · √(2/n)) − z_{1−α/2} )
其中 δ = μ₁ − μ₂ 为真实差异,σ 为总体标准差,n 为每组样本量,z 为分位数,Φ 为标准正态累积分布函数。
从功效函数可以看出,功效是四个参数的函数:
| 参数 | 符号 | 对功效的影响方向 | 实验设计中的可操作性 |
|---|---|---|---|
| 效应量 | δ / σ | 效应量越大,功效越高 | 通过业务调研预估最小有意义差异 |
| 样本量 | n | 样本量越大,功效越高 | 主要设计杠杆,可主动调整 |
| 显著性水平 | α | α 越大,功效越高(但假阳性风险上升) | 通常固定为 0.05,不轻易放宽 |
| 检验类型 | 单侧/双侧 | 单侧检验功效更高 | 需有明确方向性假设时才使用 |
4.2 样本量对功效的影响:边际递减效应
样本量是实验设计者最直接的调控工具。但样本量与功效并非线性关系——当样本量较小时,增加样本量对功效的提升非常显著;当样本量达到一定规模后,继续增加样本量带来的功效增益会迅速衰减。这就是“边际递减效应”。
下表展示了在固定效应量(Cohen's d = 0.3)和 α = 0.05(双侧)条件下,样本量变化对功效的具体影响:
| 每组样本量 (n) | 统计功效 (Power) | 功效增量 (ΔPower) | 边际效率 (ΔPower / Δn) |
|---|---|---|---|
| 50 | 0.29 | — | — |
| 100 | 0.52 | +0.23 | 0.0046 |
| 200 | 0.80 | +0.28 | 0.0028 |
| 300 | 0.92 | +0.12 | 0.0012 |
| 500 | 0.99 | +0.07 | 0.0004 |
从表中可以清晰看到:从 n=50 增加到 n=100,功效提升 0.23;而从 n=300 增加到 n=500(增加 200 个样本),功效仅提升 0.07。实验设计的目标是找到“功效曲线肘部”——即达到目标功效(通常 0.8)所需的最小样本量,而不是追求极致功效。
4.3 如何计算最小样本量以达到预期功效
计算最小样本量的标准流程分为四步:
- 确定设计参数: 设定显著性水平 α(通常 0.05)、目标功效 1−β(通常 0.80)、检验类型(单侧/双侧)。
- 定义最小有意义效应量(MDE): 与业务方对齐,确定“值得 Champion 替换 Challenger 的最小提升幅度”。例如,转化率从 5% 提升到 5.3%,即绝对提升 0.3 个百分点,相对提升 6%。
- 预估总体标准差 σ: 使用历史数据或小规模预实验估算。对于二项分布指标(如转化率),σ = √(p(1−p)),其中 p 为基线率。
- 代入公式或使用统计软件求解 n: 对于两独立样本均值检验(或比例检验),可使用以下近似公式:
n = 2 · ( (z_{1−α/2} + z_{1−β}) / (δ / σ) )²
其中 z_{1−α/2} 和 z_{1−β} 为标准正态分位数。
当 α=0.05(双侧),1−β=0.80 时:z_{1−α/2}=1.96,z_{1−β}=0.84,公式简化为:
n ≈ 2 · (2.80 / (δ/σ))² = 15.68 / (δ/σ)²
实际工作中,推荐使用 Python 的 statsmodels 库或 R 的 pwr 包进行精确计算。以下是 Python 代码示例:
import statsmodels.stats.power as smp
# 参数设置
effect_size = 0.3 # Cohen's d = 0.3
alpha = 0.05 # 显著性水平
power = 0.80 # 目标功效
ratio = 1.0 # 对照组与实验组样本量比例
# 计算所需样本量(每组)
n_per_group = smp.tt_ind_solve_power(
effect_size=effect_size,
alpha=alpha,
power=power,
ratio=ratio,
alternative='two-sided'
)
print(f"每组所需最小样本量: {np.ceil(n_per_group)}")
# 输出: 每组所需最小样本量: 176
4.4 实际案例:Champion Challenger 转化率实验
场景: 某电商平台当前 Champion 版本转化率为 5.0%,业务方认为 Challenger 版本至少需要将转化率提升到 5.4%(绝对提升 0.4pp,相对提升 8%)才值得全量上线。设定 α=0.05,目标功效 0.80,采用双侧检验。
计算步骤:
- 效应量: δ = 0.004(绝对差异),σ = √(0.05 × 0.95) ≈ 0.2179,Cohen's h = 0.004 / 0.2179 ≈ 0.0184(比例检验使用 arcsine 转换更精确,此处为近似)。
- 代入公式: n ≈ 15.68 / (0.0184)² ≈ 15.68 / 0.000338 ≈ 46,390(每组)。
- 使用 Python 精确计算(比例检验):
from statsmodels.stats.proportion import proportion_effectsize
from statsmodels.stats.power import zt_ind_solve_power
# 计算效应量 (Cohen's h)
effect_h = proportion_effectsize(prop1=0.054, prop2=0.050, method='arcsin')
print(f"Cohen's h = {effect_h:.4f}")
# 计算所需样本量
n_per_group = zt_ind_solve_power(
effect_size=effect_h,
alpha=0.05,
power=0.80,
ratio=1.0,
alternative='two-sided'
)
print(f"每组所需最小样本量: {np.ceil(n_per_group)}")
# 输出: Cohen's h = 0.0184
# 输出: 每组所需最小样本量: 46390
4.5 常见陷阱与避坑指南
| 陷阱 | 描述 | 正确做法 |
|---|---|---|
| 使用观测效应量代替 MDE | 用历史实验观测到的效应量作为输入,导致样本量被低估 | 始终使用业务定义的“最小有意义效应量” |
| 忽略多重比较校正 | 多个指标同时检验时未调整 α,导致整体假阳性率膨胀 | 使用 Bonferroni 或 FDR 校正,或提高单指标 α 要求 |
| 假设总体标准差已知且固定 | 用点估计代替区间,忽略标准差的不确定性 | 使用保守估计(取标准差上限),或进行敏感性分析 |
| 样本量计算后不做余量预留 | 实验过程中因用户流失、数据异常导致有效样本不足 | 在计算值基础上增加 10%~20% 余量 |