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 样本量计算流程

下图展示了从参数设定到最终样本量确定的完整流程:

样本量计算流程 确定预期效应量 δ 设定显著性水平 α 设定统计功效 1−β 估计总体标准差 σ 计算每组样本量 n 检查可行性 / 调整参数 不满足则调整参数 参数来源建议 δ:业务最小可检测差异 σ:历史商户风险数据 α:默认 0.05 1−β:默认 0.80

4.4 商户分层抽样策略

商户群体通常具有高度异质性——大型商户与小微商户的风险特征差异显著。直接进行简单随机抽样会导致组内变异过大,降低统计功效。分层抽样是解决该问题的核心策略。

4.4.1 分层变量选择

选择分层变量时应遵循以下原则:

  • 与风险指标高度相关:如商户交易量、历史逾期率、行业类别、经营年限。
  • 层内同质、层间异质:同一层内商户风险特征相似,不同层之间差异明显。
  • 分层变量可观测且稳定:使用实验前可获取的静态或准静态数据。
分层变量 分层示例 适用场景
月交易量 低(<100笔)、中(100~1000笔)、高(>1000笔) 欺诈率、退款率实验
历史风险等级 低风险、中风险、高风险 风控策略调整实验
行业类别 零售、餐饮、服务、虚拟商品 通用风险实验
商户注册时长 新商户(<6月)、成熟商户(≥6月) 新商户风控实验

4.4.2 分层抽样流程

下图展示了商户分层抽样的完整步骤:

商户分层抽样流程 商户总体 按分层变量划分层 层1:低交易量 层2:中交易量 层3:高交易量 层内随机抽样 层内随机抽样 层内随机抽样 合并为实验样本 分层抽样优势 ✓ 降低组内变异 ✓ 提高统计功效 ✓ 保证各层代表性

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 网站
重要提醒:样本量计算基于假设——效应量、标准差、分层变量选择均依赖历史数据或业务判断。在实验开始前,建议进行敏感性分析:在合理范围内调整参数,观察样本量变化幅度。如果样本量对某个参数特别敏感,应优先确保该参数的估计准确性。