4. 单变量特征分析:描述性统计、分布分析、偏度与峰度对风险的影响

在风险归因模型的特征工程阶段,单变量分析是理解每个特征内在属性的第一步。通过描述性统计、分布形态以及高阶矩(偏度与峰度)的剖析,可以揭示特征对风险行为的潜在解释力,并为后续的数据切分与模型训练提供关键依据。

4.1 描述性统计:快速掌握特征全貌

描述性统计通过集中趋势、离散程度和分布位置三个维度,为每个特征建立量化画像。对于风险特征,以下指标尤为关键:

维度 指标 风险含义
集中趋势 均值、中位数、众数 均值偏离中位数越大,特征越可能受极端值影响,需警惕异常风险样本
离散程度 标准差、方差、极差 标准差过大说明特征波动剧烈,风险敞口不稳定;过小则区分度不足
分布位置 最小值、最大值、四分位数 上下四分位距(IQR)可识别离群点,直接关联风险阈值设定
实践建议:在风险评分卡或违约预测模型中,优先关注特征的 中位数与 IQR,而非均值与标准差。因为风险数据常含极端值,中位数更稳健。

4.2 分布分析:识别数据生成机制

分布分析通过可视化与统计检验,判断特征是否符合正态分布、对数正态分布或幂律分布。不同分布形态对应不同的风险行为模式:

  • 正态分布:常见于标准化后的财务比率(如收入负债比),风险表现相对均匀。
  • 右偏分布(长尾在右):如贷款金额、交易次数,少量样本携带极高风险,需做对数变换或分箱。
  • 双峰分布:可能隐含两个风险子群体(如优质客户与高风险客户),是特征切分的重要线索。
分布形态与风险模式对应关系 正态分布 风险均匀,区分度中等 右偏分布 极端风险集中在右侧尾部 双峰分布 隐含两个风险子群体 分布分析对特征工程的影响 • 正态分布:可直接用于线性模型,无需特殊变换 • 右偏分布:需做对数变换、Box-Cox 或分箱处理 • 双峰分布:建议按峰拆分特征,或引入交互项

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),确保尾部风险样本在切分后比例一致。
  • 峰度高的特征:建议在切分前先做极端值处理,避免极端样本全部落入测试集导致评估失真。
  • 双峰分布的特征:可考虑按峰进行预切分,构建子模型分别训练,提升整体归因精度。
核心原则:单变量分析不是终点,而是特征工程与数据切分的“导航仪”。偏度与峰度提供的风险信号,应直接转化为切分策略中的分层变量或排除规则。