4. 样本量计算:如何根据预期效应量、显著性水平和统计功效计算所需样本量,以及商户分层抽样策略
在商户风险实验中,样本量不足会导致统计功效过低,无法检测到真实存在的风险差异;样本量过大则浪费资源、延长实验周期。本章系统讲解样本量计算的核心参数与方法,并给出面向商户分层结构的抽样策略。
4.1 样本量计算的核心参数
样本量计算依赖四个关键参数,它们之间的数学关系决定了所需的最小样本量:
| 参数 | 符号 | 定义 | 典型取值 |
|---|---|---|---|
| 预期效应量 | δ 或 Cohen's d | 实验组与对照组之间期望检测到的最小差异(标准化或原始尺度) | 0.2(小)、0.5(中)、0.8(大) |
| 显著性水平 | α | 犯第一类错误(假阳性)的概率 | 0.05(常用)、0.01(严格) |
| 统计功效 | 1 − β | 正确拒绝原假设的概率,即检测到真实效应的能力 | 0.80(最低可接受)、0.90(推荐) |
| 总体标准差 | σ | 商户风险指标(如逾期率、欺诈率)的变异程度 | 根据历史数据估计 |
关键原则:效应量越小、α 越严格、功效要求越高、总体变异越大,所需样本量越大。在商户风险实验中,效应量通常取 0.3~0.5(中等效应),功效取 0.80 或 0.90。
4.2 样本量计算公式与代码实现
对于两独立样本均值比较(最常见的商户实验场景),每组所需样本量公式为:
n = 2 * ( (Z_α/2 + Z_β)² * σ² ) / δ²
其中 Z_α/2 和 Z_β 分别为标准正态分布下对应 α/2 和 β 的分位数。以下 Python 代码可直接用于计算:
import scipy.stats as stats
import math
def sample_size_two_groups(effect_size, alpha=0.05, power=0.80):
"""
计算两独立样本均值比较所需每组样本量
:param effect_size: 标准化效应量 (Cohen's d)
:param alpha: 显著性水平
:param power: 统计功效
:return: 每组所需样本量(向上取整)
"""
z_alpha = stats.norm.ppf(1 - alpha / 2)
z_beta = stats.norm.ppf(power)
n = 2 * ((z_alpha + z_beta) ** 2) / (effect_size ** 2)
return math.ceil(n)
# 示例:中等效应量 0.5,α=0.05,功效=0.80
print(sample_size_two_groups(0.5)) # 输出: 64
# 示例:小效应量 0.3,α=0.05,功效=0.90
print(sample_size_two_groups(0.3, power=0.90)) # 输出: 235
实用建议:在商户风险实验中,建议先使用历史数据估算 σ,再根据业务可接受的最小风险差异确定 δ。如果计算出的样本量超过可用商户总数,可考虑增大效应量(接受更大的检测差异)或降低功效至 0.80。
4.3 样本量计算流程
下图展示了从参数设定到最终样本量确定的完整流程:
4.4 商户分层抽样策略
商户群体通常具有高度异质性——大型商户与小微商户的风险特征差异显著。直接进行简单随机抽样会导致组内变异过大,降低统计功效。分层抽样是解决该问题的核心策略。
4.4.1 分层变量选择
选择分层变量时应遵循以下原则:
- 与风险指标高度相关:如商户交易量、历史逾期率、行业类别、经营年限。
- 层内同质、层间异质:同一层内商户风险特征相似,不同层之间差异明显。
- 分层变量可观测且稳定:使用实验前可获取的静态或准静态数据。
| 分层变量 | 分层示例 | 适用场景 |
|---|---|---|
| 月交易量 | 低(<100笔)、中(100~1000笔)、高(>1000笔) | 欺诈率、退款率实验 |
| 历史风险等级 | 低风险、中风险、高风险 | 风控策略调整实验 |
| 行业类别 | 零售、餐饮、服务、虚拟商品 | 通用风险实验 |
| 商户注册时长 | 新商户(<6月)、成熟商户(≥6月) | 新商户风控实验 |
4.4.2 分层抽样流程
下图展示了商户分层抽样的完整步骤:
4.4.3 层内样本量分配方法
确定分层后,需要将总样本量分配到各层。常用三种分配策略:
| 分配方法 | 分配原则 | 适用条件 | 公式 |
|---|---|---|---|
| 比例分配 | 各层样本量与该层商户数成正比 | 各层标准差相近时 | nh = n × (Nh / N) |
| 最优分配 | 各层样本量与该层商户数及标准差成正比 | 各层标准差差异较大时 | nh = n × (Nhσh) / Σ(Nhσh) |
| 等额分配 | 各层分配相同样本量 | 各层商户数相近或关注最小层代表性 | nh = n / H |
常见陷阱:在商户风险实验中,不要忽略“零风险层”(如历史无逾期商户)。如果该层商户数极大但风险事件极少,比例分配会导致大量样本浪费在几乎不会产生风险事件的商户上。此时建议使用最优分配,或对低风险层进行降采样。
4.5 综合案例:商户风险实验样本量规划
假设某支付平台计划测试新的风控规则对欺诈率的影响,商户总体共 50,000 户,按月交易量分为三层:
- 低交易量层:30,000 户,欺诈率标准差 σ₁ = 0.02
- 中交易量层:15,000 户,欺诈率标准差 σ₂ = 0.04
- 高交易量层:5,000 户,欺诈率标准差 σ₃ = 0.06
实验要求:检测效应量 δ = 0.01(绝对差异),α = 0.05,功效 = 0.80。
步骤1:计算总样本量
使用 Cohen's d 标准化效应量。由于各层标准差不同,采用加权平均标准差:
σ_pooled = sqrt( (30000*0.02² + 15000*0.04² + 5000*0.06²) / 50000 )
= sqrt( (12 + 24 + 18) / 50000 )
= sqrt(54 / 50000)
≈ 0.0329
Cohen's d = δ / σ_pooled = 0.01 / 0.0329 ≈ 0.304
# 使用之前定义的函数
n_total = sample_size_two_groups(0.304, alpha=0.05, power=0.80)
print(n_total) # 每组约 170 户,两组共 340 户
步骤2:按最优分配计算各层样本量
# 计算各层权重
N = [30000, 15000, 5000]
sigma = [0.02, 0.04, 0.06]
n_per_group = 170 # 每组总样本量
# 计算 N_h * sigma_h
weighted = [N[i] * sigma[i] for i in range(3)]
total_weighted = sum(weighted)
# 各层样本量
n_layer = [round(n_per_group * w / total_weighted) for w in weighted]
print(n_layer) # 输出示例: [46, 61, 63]
# 验证
print(sum(n_layer)) # 应接近 170
步骤3:检查与调整
高交易量层仅 5,000 户,但分配了 63 户样本(占该层 1.26%),可行。低交易量层分配 46 户(占该层 0.15%),需确保该层内实验组与对照组随机化充分。
实操建议:在商户风险实验中,建议为每个分层至少分配 30 户(实验组+对照组合计),以保证中心极限定理适用。如果某层商户数极少(如 <100 户),可考虑将该层合并到相邻层,或对该层进行全量实验。
4.6 样本量计算工具与注意事项
除手动计算外,常用工具包括:
- Python:statsmodels.stats.power 模块中的 TTestIndPower 类
- R:pwr 包中的 pwr.t.test 函数
- 在线计算器:如 ClinCalc、Power and Sample Size 网站
重要提醒:样本量计算基于假设——效应量、标准差、分层变量选择均依赖历史数据或业务判断。在实验开始前,建议进行敏感性分析:在合理范围内调整参数,观察样本量变化幅度。如果样本量对某个参数特别敏感,应优先确保该参数的估计准确性。