4. 单变量特征分析:描述性统计、分布分析、偏度与峰度对风险的影响
在风险归因模型的特征工程阶段,单变量分析是理解每个特征内在属性的第一步。通过描述性统计、分布形态以及高阶矩(偏度与峰度)的剖析,可以揭示特征对风险行为的潜在解释力,并为后续的数据切分与模型训练提供关键依据。
4.1 描述性统计:快速掌握特征全貌
描述性统计通过集中趋势、离散程度和分布位置三个维度,为每个特征建立量化画像。对于风险特征,以下指标尤为关键:
| 维度 | 指标 | 风险含义 |
|---|---|---|
| 集中趋势 | 均值、中位数、众数 | 均值偏离中位数越大,特征越可能受极端值影响,需警惕异常风险样本 |
| 离散程度 | 标准差、方差、极差 | 标准差过大说明特征波动剧烈,风险敞口不稳定;过小则区分度不足 |
| 分布位置 | 最小值、最大值、四分位数 | 上下四分位距(IQR)可识别离群点,直接关联风险阈值设定 |
实践建议:在风险评分卡或违约预测模型中,优先关注特征的 中位数与 IQR,而非均值与标准差。因为风险数据常含极端值,中位数更稳健。
4.2 分布分析:识别数据生成机制
分布分析通过可视化与统计检验,判断特征是否符合正态分布、对数正态分布或幂律分布。不同分布形态对应不同的风险行为模式:
- 正态分布:常见于标准化后的财务比率(如收入负债比),风险表现相对均匀。
- 右偏分布(长尾在右):如贷款金额、交易次数,少量样本携带极高风险,需做对数变换或分箱。
- 双峰分布:可能隐含两个风险子群体(如优质客户与高风险客户),是特征切分的重要线索。
4.3 偏度与峰度:高阶矩的风险信号
偏度(Skewness)和峰度(Kurtosis)是描述分布形态的高阶统计量,在风险归因中具有独特的预警价值。
4.3.1 偏度:风险偏移的方向
偏度衡量分布不对称的程度与方向:
- 偏度 = 0:对称分布,风险在均值两侧均衡分布。
- 偏度 > 0(右偏):右侧尾部更长,存在少量极高风险样本。常见于“损失金额”、“逾期天数”等特征。
- 偏度 < 0(左偏):左侧尾部更长,存在少量极低风险样本。常见于“信用评分”等高分聚集的特征。
风险归因应用:偏度绝对值 > 1 的特征,通常需要做非线性变换或分箱,否则模型难以捕捉尾部风险。
4.3.2 峰度:极端事件的聚集程度
峰度衡量分布尾部的厚度与峰部的尖锐程度:
| 峰度值(超额峰度) | 分布形态 | 风险含义 |
|---|---|---|
| ≈ 0 | 正态分布(常峰态) | 极端事件发生概率正常,风险可控 |
| > 0(尖峰厚尾) | 尖峰分布 | 极端风险事件频发,尾部风险显著高于正态假设 |
| < 0(低峰薄尾) | 平峰分布 | 极端事件较少,风险分布较为分散 |
关键警示:在信用风险建模中,峰度 > 5 的特征往往意味着存在“黑天鹅”样本。此时不应直接使用原始特征,建议通过 Winsorization(缩尾处理) 或 分位数分箱 来抑制极端值影响。
4.4 偏度与峰度的联合分析框架
将偏度与峰度组合使用,可以形成更完整的风险特征诊断矩阵:
4.5 代码实现:单变量特征分析流水线
以下 Python 代码展示了如何对风险特征进行完整的单变量分析,并输出偏度与峰度的风险诊断结果:
import pandas as pd
import numpy as np
from scipy.stats import skew, kurtosis
def univariate_risk_analysis(df, feature_list):
"""
对风险特征进行单变量分析,输出描述性统计与偏度峰度诊断。
Parameters:
-----------
df : pd.DataFrame
包含特征的数据框
feature_list : list
待分析的特征名称列表
Returns:
--------
pd.DataFrame : 包含统计指标的分析结果表
"""
results = []
for feat in feature_list:
col = df[feat].dropna()
stats = {
'特征名称': feat,
'样本量': len(col),
'均值': round(col.mean(), 4),
'中位数': round(col.median(), 4),
'标准差': round(col.std(), 4),
'偏度': round(skew(col), 4),
'峰度(超额)': round(kurtosis(col, fisher=True), 4),
'最小值': round(col.min(), 4),
'最大值': round(col.max(), 4),
'Q1': round(col.quantile(0.25), 4),
'Q3': round(col.quantile(0.75), 4)
}
# 风险诊断逻辑
abs_skew = abs(stats['偏度'])
excess_kurt = stats['峰度(超额)']
if abs_skew > 1.5 and excess_kurt > 3:
stats['风险等级'] = '高'
stats['处理建议'] = '需对数变换 + 极端值截断'
elif abs_skew > 1.0 or excess_kurt > 2:
stats['风险等级'] = '中'
stats['处理建议'] = '建议分箱或非线性变换'
else:
stats['风险等级'] = '低'
stats['处理建议'] = '可直接使用或轻度标准化'
results.append(stats)
result_df = pd.DataFrame(results)
return result_df
# 使用示例(假设已有特征数据)
# risk_stats = univariate_risk_analysis(data, ['loan_amount', 'age', 'income'])
# print(risk_stats[['特征名称', '偏度', '峰度(超额)', '风险等级', '处理建议']])
4.6 单变量分析在数据切分中的前置作用
完成单变量特征分析后,分析结果将直接影响数据切分策略:
- 偏度高的特征:在训练集/测试集切分时,需使用分层抽样(Stratified Split),确保尾部风险样本在切分后比例一致。
- 峰度高的特征:建议在切分前先做极端值处理,避免极端样本全部落入测试集导致评估失真。
- 双峰分布的特征:可考虑按峰进行预切分,构建子模型分别训练,提升整体归因精度。
核心原则:单变量分析不是终点,而是特征工程与数据切分的“导航仪”。偏度与峰度提供的风险信号,应直接转化为切分策略中的分层变量或排除规则。