2. 单变量基础统计衍生:均值、方差、最大值、最小值、缺失率、唯一值个数等统计量的计算与意义

在风控建模中,原始变量往往不能直接反映借款人的风险特征。单变量基础统计衍生是最简单、最常用的特征工程方法,通过对单个变量的分布、集中趋势、离散程度、缺失情况和唯一性进行统计,生成新的风险解释维度。这些衍生变量能够有效捕捉原始数据中的异常波动、数据质量和分布形态,为后续分箱和模型训练提供高质量输入。

2.1 核心统计量定义与风控意义

下表列出了风控建模中最常用的6个单变量基础统计量,以及它们在信用风险场景下的具体含义。

统计量 数学定义 风控意义 典型应用场景
均值 (Mean) \(\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i\) 反映变量中心趋势,高均值可能对应高风险群体 近6个月平均消费金额、平均逾期天数
方差 (Variance) \(\sigma^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i-\bar{x})^2\) 衡量变量波动性,高方差代表行为不稳定、风险高 收入波动性、消费金额离散程度
最大值 (Max) \(\max(x_1, x_2, ..., x_n)\) 捕捉极端行为,峰值异常可能预示欺诈或违约 单笔最大借款金额、历史最长逾期天数
最小值 (Min) \(\min(x_1, x_2, ..., x_n)\) 反映底线行为,过低值可能表示资金链断裂 账户最低余额、最小还款金额
缺失率 (Missing Rate) \(\frac{\text{缺失数量}}{\text{总样本数}} \times 100\%\) 衡量数据质量,高缺失率变量可能信息量低或存在选择性填报 职业信息缺失率、联系人电话缺失率
唯一值个数 (Unique Count) \(\text{len(set}(x_1, x_2, ..., x_n))\) 判断变量区分度,唯一值过少或过多均需处理 设备ID唯一性、IP地址重复次数
关键提示: 在风控场景中,方差和缺失率往往比均值更具风险区分能力。例如,收入方差大的借款人,其还款能力波动性更高,违约概率通常也更高;而缺失率异常高的变量,可能暗示借款人刻意隐瞒信息,需警惕欺诈风险。

2.2 统计量衍生流程与计算逻辑

单变量基础统计衍生的核心流程分为三步:分组聚合 → 统计计算 → 特征拼接。通常以客户ID或时间窗口为分组键,对原始变量进行聚合统计。

实践建议: 在金融风控中,最常用的分组窗口为“近3个月”、“近6个月”、“近12个月”和“历史全部”。不同窗口的统计量可以组合使用,形成更丰富的特征体系。
单变量统计衍生流程图 原始变量表 步骤1:分组聚合 按客户ID / 时间窗口分组 步骤2:统计计算 均值 | 方差 | 最大值 | 最小值 | 缺失率 | 唯一值个数 (可同时计算多个统计量) 步骤3:特征拼接 衍生特征合并回主表

2.3 Python 代码实现

以下代码演示了如何使用 pandas 对风控数据集进行单变量统计衍生。假设我们有一个包含客户历史交易记录的数据表 df_trans,需要按客户ID分组计算统计量。

import pandas as pd
import numpy as np

# 示例数据:客户历史交易记录
df_trans = pd.DataFrame({
    'customer_id': ['A001', 'A001', 'A001', 'A002', 'A002', 'A003'],
    'transaction_date': ['2024-01-05', '2024-02-10', '2024-03-15',
                         '2024-01-20', '2024-02-25', '2024-03-01'],
    'amount': [5000, 8000, 3000, 12000, 7000, np.nan],
    'overdue_days': [0, 5, 0, 15, 0, np.nan]
})

# 单变量统计衍生函数
def generate_univariate_stats(df, group_col, value_cols):
    """
    对指定列进行单变量统计衍生
    参数:
        df: 原始数据框
        group_col: 分组列名(如客户ID)
        value_cols: 需要衍生的数值列列表
    返回:
        衍生特征数据框
    """
    agg_dict = {}
    for col in value_cols:
        agg_dict[f'{col}_mean'] = (col, 'mean')
        agg_dict[f'{col}_var'] = (col, 'var')
        agg_dict[f'{col}_max'] = (col, 'max')
        agg_dict[f'{col}_min'] = (col, 'min')
        agg_dict[f'{col}_missing_rate'] = (col, lambda x: x.isna().mean())
        agg_dict[f'{col}_unique'] = (col, 'nunique')

    df_stats = df.groupby(group_col).agg(**agg_dict).reset_index()
    return df_stats

# 执行衍生
df_features = generate_univariate_stats(
    df_trans,
    group_col='customer_id',
    value_cols=['amount', 'overdue_days']
)

print(df_features)
注意: 在计算方差时,如果分组内样本量过小(如只有1条记录),方差会为0或NaN。建议在衍生前过滤掉样本量小于3的分组,或使用 min_periods 参数控制最小样本量。

2.4 统计量选择策略与避坑指南

在实际风控项目中,并非所有统计量都适用于每个变量。以下策略可以帮助你做出合理选择:

  • 连续型变量(如金额、天数): 优先计算均值、方差、最大值、最小值,缺失率作为辅助。
  • 离散型变量(如设备类型、城市): 优先计算唯一值个数、缺失率,均值/方差无实际意义。
  • 二值变量(如是否逾期): 均值等价于比率(如逾期率),方差可反映稳定性。
  • 高缺失率变量(缺失率 > 80%): 建议直接剔除,或仅保留缺失率本身作为特征。
  • 唯一值个数过多(如设备ID): 需结合频次统计,避免维度爆炸。

2.5 统计量衍生后的数据质量检查

衍生完成后,必须对新增特征进行质量检查,确保其可用性。下表列出了常见的检查项和处理建议:

检查项 正常范围 异常情况 处理建议
缺失率 0% ~ 5% > 50% 剔除该特征或使用缺失指示变量
方差 > 0 = 0(常数特征) 剔除,无区分能力
唯一值个数 ≥ 分组数的10% = 1 或 = 分组数 过少则剔除,过多则考虑降维
均值与中位数差异 差异 < 20% 差异 > 50% 存在极端值,考虑截尾或对数变换
进阶技巧: 在风控建模中,可以将多个窗口的统计量进行交叉组合。例如,“近3个月消费均值 / 近12个月消费均值”可以衡量近期消费趋势的变化,比单一均值更具风险解释力。这种组合衍生是后续章节“多变量交叉衍生”的基础。

2.6 统计量衍生与分箱的衔接

单变量统计衍生完成后,生成的连续型特征通常需要经过分箱(Binning)处理,才能输入逻辑回归等线性模型。分箱的作用包括:

  • 将连续变量离散化,增强模型对非线性关系的拟合能力。
  • 降低异常值和极端值的影响,提升模型稳定性。
  • 便于业务解释,如“近6个月平均消费金额在5000-10000元区间”比具体数值更直观。

在下一章中,我们将详细介绍等距分箱、等频分箱、卡方分箱和决策树分箱的具体实现方法,以及如何评估分箱效果。

统计衍生 → 分箱 → 建模 数据流 原始变量 金额、天数、类别 统计衍生 均值、方差、缺失率 分箱处理 等频/卡方/决策树 模型训练 逻辑回归 / XGBoost 说明: 统计衍生生成连续特征 → 分箱转换为离散特征 → 模型使用WOE编码 分箱是连接统计衍生与模型训练的关键桥梁