2、样本分层概念

2.1 样本分层的目的与意义

在反洗钱数据分析中,样本分层(Stratification)是指将总体样本按照某个或某几个关键特征划分为若干个互不重叠的层(Strata),然后从每个层中独立抽取子样本的过程。其核心目的是:在控制成本的前提下,提升样本对总体的代表性,并降低估计误差。

🎯 分层的主要目的
  • 提高估计精度:层内同质性高、层间异质性大,可显著降低抽样误差。
  • 保证子群体代表性:避免高风险或低风险群体在样本中被遗漏或过度/不足代表。
  • 支持分层分析:可分别对各层进行统计推断,如分别计算高风险层和低风险层的洗钱风险评分均值。
  • 降低抽样成本:对变异小的层可少抽,对变异大的层可多抽,优化资源配置。

2.2 分层抽样 vs 简单随机抽样

简单随机抽样(SRS)是最基础的抽样方法,每个样本被选中的概率相等。但在反洗钱场景中,客户风险分布极度不均衡——高风险客户占比通常不足 5%,若使用 SRS,很可能抽不到足够的高风险样本,导致模型训练数据严重偏斜。分层抽样通过强制保证各层都有样本,有效解决了这一问题。

对比维度 简单随机抽样 (SRS) 分层抽样 (Stratified Sampling)
样本代表性 依赖随机性,小群体易被遗漏 强制覆盖所有层,代表性更强
估计精度 方差较大,尤其当总体分布不均时 层内方差小,总体方差显著降低
对稀有群体的覆盖 差,高风险客户可能抽不到 好,可对高风险层进行过采样
操作复杂度 低,只需随机数生成 中等,需先确定分层变量和层边界
适用场景 总体分布均匀、层间差异小 总体分布偏斜、层间差异大
反洗钱适用性 ❌ 不推荐,易导致样本偏差 ✅ 推荐,尤其适合风险分层场景
💡 关键结论:在反洗钱特征工程中,分层抽样是默认选择。简单随机抽样仅适用于探索性分析或总体极度均匀的测试环境。

2.3 反洗钱场景下分层的重要性

反洗钱数据天然具有高度不平衡和长尾分布特征。以客户风险等级为例,通常呈现“金字塔”结构:

  • 低风险客户:占比约 70%-85%,交易模式简单,异常行为极少。
  • 中风险客户:占比约 10%-25%,需关注但非重点。
  • 高风险客户:占比约 1%-5%,是反洗钱监控的核心对象。

若不进行分层,直接使用 SRS 抽取 10,000 个样本,高风险客户可能只有 100-500 个,远不足以训练稳健的模型。而分层抽样可以:

  1. 对高风险层进行过采样:例如将高风险层的抽样比例提升至 50%,确保模型有足够的高风险样本学习特征。
  2. 对低风险层进行欠采样:减少冗余的低风险样本,降低计算成本。
  3. 保持层内权重可还原:在模型评估时,可通过加权方式还原总体分布,避免评估偏差。
⚠️ 常见误区:分层不是简单按比例分配样本。在反洗钱场景中,通常采用非比例分配(如 Neyman 分配或最优分配),优先保证高风险层的样本量充足。但需注意,非比例分配后必须使用加权估计,否则会得到有偏的总体统计量。
分层抽样 vs 简单随机抽样对比示意图 简单随机抽样 (SRS) 总体客户池 低风险客户 (80%) 中风险客户 (15%) 高风险客户 (5%) 抽取样本 (n=1000) 低风险: 800 | 中风险: 150 | 高风险: 50 ⚠ 高风险样本严重不足 分层抽样 (Stratified) 低风险层 N=80,000 中风险层 N=15,000 高风险层 N=5,000 其他特殊层 N=1,000 分层抽取样本 (n=1000) 低风险层: 300 (按需分配) 中风险层: 300 (按需分配) 高风险层: 350 (过采样) 其他特殊层: 50 ✅ 高风险样本充足,各层均有代表

2.4 反洗钱场景下的典型分层变量

在实际 SQL 实践中,常用的分层变量包括但不限于:

分层变量 分层依据 典型层数 说明
客户风险等级 AML 评级系统输出 3-5 层 最常用,直接对应监管要求
交易金额区间 交易流水统计分位数 4-6 层 大额交易与小额交易行为差异大
客户类型 对公/对私/同业 3 层 不同客户类型洗钱模式不同
地域风险 FATF 高风险国家列表 2-3 层 跨境交易需重点关注
产品类型 存款/理财/贷款/外汇 4-8 层 不同产品洗钱风险差异显著
📌 实践建议:在反洗钱特征样本分层中,客户风险等级是首选分层变量。如果样本量充足,可进一步结合交易金额区间进行交叉分层(如高风险+大额交易层),以更精细地控制样本结构。
反洗钱客户风险分层金字塔结构图 反洗钱客户风险分层金字塔 高风险 1%-5% 中风险 10%-25% 低风险 70%-85% 分层抽样策略 高风险层过采样 | 低风险层欠采样

2.5 分层在 SQL 中的实现思路

在后续章节中,我们将使用 SQL 实现分层抽样。核心思路如下:

  1. 确定分层变量:如 risk_level 字段。
  2. 计算各层样本量:根据预设比例(如高风险层抽取 500 条,中风险层抽取 300 条,低风险层抽取 200 条)。
  3. 为每条记录生成层内随机排序:使用 ROW_NUMBER() OVER (PARTITION BY risk_level ORDER BY RAND())。
  4. 按层内序号筛选:保留序号小于等于该层目标样本量的记录。