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个月”和“历史全部”。不同窗口的统计量可以组合使用,形成更丰富的特征体系。
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元区间”比具体数值更直观。
在下一章中,我们将详细介绍等距分箱、等频分箱、卡方分箱和决策树分箱的具体实现方法,以及如何评估分箱效果。