4. 探索性数据分析(EDA):单变量分布、缺失值、异常值、相关性矩阵的初步分析

在构建商户风险评分模型之前,必须对原始数据进行彻底的探索性数据分析(EDA)。本章节聚焦于四个核心诊断维度:单变量分布、缺失值、异常值以及相关性矩阵。这些分析将直接指导后续的特征工程与模型选择。

4.1 单变量分布分析

单变量分析用于理解每个特征自身的统计特性,包括集中趋势、离散程度与分布形态。对于连续型变量,重点关注偏度与峰度;对于分类型变量,关注类别频次与占比。

变量类型 核心指标 可视化工具 风险含义
连续型(如交易金额) 均值、中位数、标准差、偏度、峰度 直方图、箱线图、密度图 右偏分布可能暗示高额欺诈交易
分类型(如商户行业) 频数、占比、众数 柱状图、饼图 少数行业集中度高可能带来系统性风险
有序型(如信用等级) 累积百分比、等级分布 条形图、阶梯图 等级分布失衡说明评分卡区分度不足
实操提示: 对于严重偏态分布的特征(偏度 > 2),建议在建模前进行对数变换或Box-Cox变换,以降低极端值对线性模型的影响。

4.2 缺失值诊断与处理策略

缺失值处理不当会引入偏差。首先需要区分缺失机制:完全随机缺失(MCAR)、随机缺失(MAR)与非随机缺失(MNAR)。

  • 缺失率 < 5%: 可直接删除记录,或使用均值/中位数填充(连续变量)、众数填充(分类变量)。
  • 缺失率 5% - 20%: 推荐使用模型预测填充(如KNN、随机森林)或引入“缺失指示变量”。
  • 缺失率 > 20%: 该特征可能信息量不足,建议删除;若业务上必须保留,则需结合专家规则。
避坑指南: 在金融风控场景中,“缺失”本身可能是一种信号。例如,商户未填写注册资本字段,可能暗示其经营不规范。建议为高缺失率特征创建“是否缺失”的二元指示变量,纳入模型训练。

4.3 异常值检测与处理

异常值会扭曲统计量并影响模型泛化能力。在商户风险场景中,异常值往往对应欺诈或极端经营行为。

常用检测方法包括:

  1. Z-Score 方法: 适用于近似正态分布的数据,通常阈值设为 |Z| > 3。
  2. IQR 四分位距法: 适用于偏态分布,定义异常为小于 Q1 - 1.5×IQR 或大于 Q3 + 1.5×IQR。
  3. 孤立森林(Isolation Forest): 基于集成学习的无监督方法,适合高维数据。
处理原则: 不要直接删除异常值。应先通过业务核实:若为数据录入错误则修正;若为真实极端行为(如单笔交易额是正常值的100倍),则保留并单独编码,或进行截尾处理(Winsorization)。

4.4 相关性矩阵初步分析

相关性分析用于识别特征间的线性关联,避免多重共线性,并初步筛选与目标变量(如“是否违约”)强相关的特征。

下图展示了商户风险特征之间的相关性热力图结构,以及特征与目标变量的关联强度排序。

商户风险特征相关性分析框架 商户风险特征相关性分析框架 特征聚类(输入层) • 交易金额(日/周/月) • 交易频次与间隔 • 商户注册时长 • 行业类别编码 • 历史逾期次数 相关性矩阵(计算层) • Pearson / Spearman 系数 • 特征间共线性检测 • 与目标变量关联度 • 热力图可视化 • 阈值筛选(|r| > 0.7) 输出决策(应用层) • 保留强相关特征 • 剔除冗余特征 • 构建交叉特征 • 确定入模变量 • 风险分群依据 说明:相关性矩阵是连接原始特征与模型输入的桥梁,帮助识别冗余与关键驱动因素。 相关性阈值参考标准 |r| ≥ 0.7 :强相关,需考虑剔除或合并(如交易金额与交易笔数) 0.4 ≤ |r| < 0.7 :中等相关,可保留但需关注模型稳定性 |r| < 0.4 :弱相关,通常可安全保留,但需结合业务含义判断

4.5 代码实现:EDA 核心步骤

以下代码展示了使用 Python 进行单变量分布、缺失值、异常值与相关性分析的标准化流程。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
df = pd.read_csv('merchant_risk_data.csv')

# 1. 单变量分布:连续变量摘要
continuous_cols = ['transaction_amount', 'transaction_freq', 'account_age']
print(df[continuous_cols].describe())

# 2. 缺失值诊断
missing_ratio = df.isnull().mean().sort_values(ascending=False)
print("缺失率 > 20% 的特征:", missing_ratio[missing_ratio > 0.2].index.tolist())

# 3. 异常值检测(IQR法)
def detect_outliers_iqr(data, col):
    Q1 = data[col].quantile(0.25)
    Q3 = data[col].quantile(0.75)
    IQR = Q3 - Q1
    lower = Q1 - 1.5 * IQR
    upper = Q3 + 1.5 * IQR
    return data[(data[col] < lower) | (data[col] > upper)]

outliers = detect_outliers_iqr(df, 'transaction_amount')
print(f"交易金额异常值数量:{len(outliers)}")

# 4. 相关性矩阵
corr_matrix = df.corr(method='pearson')
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='coolwarm', 
            linewidths=0.5, cbar_kws={'label': 'Pearson Correlation'})
plt.title('商户风险特征相关性热力图')
plt.tight_layout()
plt.show()

# 输出与目标变量相关性最高的前5个特征
target_corr = corr_matrix['is_default'].abs().sort_values(ascending=False)
print("与目标变量相关性最高的特征:\n", target_corr.head(6))
关键输出解读: 相关性热力图应重点关注深红色(强正相关)与深蓝色(强负相关)区域。若两个特征之间的相关系数绝对值超过0.8,建议仅保留其中一个,或使用PCA进行降维。

4.6 EDA 结果对模型训练的直接影响

完成上述分析后,应形成一份清晰的 EDA 决策清单,直接指导后续步骤:

EDA 发现 对模型训练的影响 推荐操作
特征A与特征B高度相关(r=0.92) 引发多重共线性,导致逻辑回归系数不稳定 剔除其中一个,或使用岭回归(L2正则化)
特征C缺失率高达35% 模型可能忽略该特征,或引入填充偏差 创建缺失指示变量,并用中位数填充
特征D存在大量右偏异常值 线性模型对极端值敏感,影响评分卡刻度 进行对数变换或截尾处理
特征E与目标变量相关性极低(r=0.02) 对预测贡献微弱,增加模型噪声 考虑剔除,或进行特征交互后再评估

通过系统化的 EDA,我们不仅清洗了数据,更建立了对商户风险特征的深刻理解,为后续的评分卡分箱与逻辑回归训练奠定了可靠的数据基础。