4. 探索性数据分析(EDA):描述性统计、分布可视化、相关性热力图

在异常交易样本切分与模型构建之前,必须对原始数据进行系统性的探索性数据分析(EDA)。本章聚焦于三个核心任务:描述性统计量化数据分布特征、分布可视化揭示变量形态与异常点、相关性热力图识别变量间的线性关联。EDA 是后续特征工程与模型选型的基石,能有效避免“垃圾进、垃圾出”的风险。

4.1 描述性统计:量化数据全貌

描述性统计通过集中趋势、离散程度与分布形态指标,快速建立对每个字段的数值认知。对于异常交易场景,重点关注金额、频次、时间间隔等关键字段的偏度与峰度。

统计指标 含义 异常交易关注点
均值(Mean) 数据集中趋势 若均值远高于中位数,提示右偏分布(存在大额异常)
中位数(Median) 数据排序后的中间值 对极端值不敏感,反映“典型”交易规模
标准差(Std) 数据离散程度 标准差过大说明交易金额波动剧烈,需关注离群点
偏度(Skewness) 分布对称性 偏度 > 1 通常提示存在极端大额交易
峰度(Kurtosis) 分布尾部厚度 峰度 > 3 说明分布具有厚尾特征,异常点集中
缺失率(Missing%) 字段缺失比例 缺失率 > 5% 需评估是否影响模型稳定性
实战要点: 在金融风控场景中,交易金额字段通常呈现“右偏+厚尾”分布。建议先输出描述性统计表,若发现偏度 > 2 或峰度 > 10,则必须进行对数变换或分箱处理,否则模型会过度关注极端值。

4.2 分布可视化:直方图与箱线图

分布可视化将统计指标转化为直观图形。直方图展示变量整体分布形态,箱线图则聚焦于离群点检测与分位数结构。两者结合使用,可快速定位异常交易样本的分布区间。

4.2.1 直方图:分布形态与偏度诊断

直方图通过等宽分箱展示数据频率。在异常交易分析中,直方图能直观呈现“长尾”现象——大部分交易集中在低金额区间,而少数异常交易拖出一条长长的右尾。

import pandas as pd
import matplotlib.pyplot as plt

# 假设 df 包含交易金额字段 'amount'
plt.figure(figsize=(10, 5))
plt.hist(df['amount'], bins=50, color='#3498db', edgecolor='white', alpha=0.7)
plt.axvline(df['amount'].mean(), color='#e74c3c', linestyle='--', linewidth=2, label=f'均值: {df["amount"].mean():.2f}')
plt.axvline(df['amount'].median(), color='#2ecc71', linestyle='-', linewidth=2, label=f'中位数: {df["amount"].median():.2f}')
plt.title('交易金额分布直方图', fontsize=14, color='#2c3e50')
plt.xlabel('交易金额')
plt.ylabel('频次')
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.show()
解读技巧: 若直方图呈现“双峰”形态,说明数据可能来自两个不同的交易群体(如个人转账与商户收款),此时应考虑分层建模或引入分组特征。

4.2.2 箱线图:离群点与分位数结构

箱线图基于五数概括(最小值、Q1、中位数、Q3、最大值),并通过 IQR(四分位距)定义离群点阈值:低于 Q1 - 1.5×IQR 或高于 Q3 + 1.5×IQR 的点被标记为异常。在风控场景中,箱线图是快速筛选极端交易样本的首选工具。

plt.figure(figsize=(8, 5))
box = plt.boxplot(df['amount'], vert=True, patch_artist=True,
                  boxprops=dict(facecolor='#3498db', color='#2980b9'),
                  whiskerprops=dict(color='#7f8c8d'),
                  capprops=dict(color='#7f8c8d'),
                  flierprops=dict(marker='o', markerfacecolor='#e74c3c', markersize=6, linestyle='none'))
plt.title('交易金额箱线图', fontsize=14, color='#2c3e50')
plt.ylabel('交易金额')
plt.grid(axis='y', alpha=0.3)
plt.show()
注意: 箱线图标记的“异常点”是基于统计规则的离群点,不一定是真正的欺诈交易。需要结合业务规则(如单笔超限、短时高频)进行二次筛选,避免误杀正常大额交易。
直方图与箱线图联合分析流程 原始交易数据 直方图分析 箱线图分析 分布特征输出 偏度 / 峰度 / 离群点 分位数 / IQR 阈值 异常样本标记 说明: 直方图揭示整体分布形态(偏度、峰度),箱线图定位具体离群点(IQR 规则)。 两者互补,共同指导异常交易样本的初步筛选与切分策略。

4.3 相关性热力图:变量间线性关联

相关性热力图通过颜色矩阵展示各变量之间的 Pearson 相关系数,取值范围 [-1, 1]。在异常交易场景中,相关性分析有助于发现共线性特征(如交易金额与手续费高度相关)以及潜在的业务关联(如交易频次与账户余额负相关)。

import seaborn as sns
import matplotlib.pyplot as plt

# 选择数值型字段计算相关性矩阵
numeric_cols = ['amount', 'balance_before', 'balance_after', 'frequency_7d', 'amount_avg_30d']
corr_matrix = df[numeric_cols].corr()

plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='RdBu_r', 
            vmin=-1, vmax=1, center=0, linewidths=0.5, 
            cbar_kws={'shrink': 0.8, 'label': 'Pearson 相关系数'})
plt.title('异常交易特征相关性热力图', fontsize=14, color='#2c3e50')
plt.xticks(rotation=45, ha='right')
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()
风控解读规则:
• |r| > 0.8:强相关,需考虑特征冗余,可进行 PCA 或直接剔除其中一个。
• 0.5 < |r| < 0.8:中等相关,保留但需关注模型稳定性。
• |r| < 0.3:弱相关或无关,可能对模型贡献有限,需结合业务判断是否保留。
• 注意:相关性不等于因果性。高相关可能由业务逻辑驱动(如交易金额与手续费),也可能是偶然噪声。
相关性热力图解读框架 相关性矩阵示意 0.92 0.65 -0.48 0.65 0.12 -0.03 -0.48 -0.03 0.78 |r| > 0.8 强相关 0.5 < |r| < 0.8 |r| < 0.3 弱相关 特征冗余,考虑 PCA 或剔除 保留,关注模型稳定性 结合业务判断是否保留 注意:相关性热力图仅反映线性关系,非线性关联(如 U 型关系)需通过散点图或互信息进一步探索。

4.4 EDA 输出清单与切分决策

完成上述 EDA 步骤后,应形成一份结构化的输出清单,直接指导后续的样本切分策略:

  • 字段级报告: 每个数值字段的描述性统计表(均值、中位数、标准差、偏度、峰度、缺失率)。
  • 分布诊断: 直方图与箱线图联合判断是否存在长尾分布、双峰分布或极端离群点。
  • 相关性矩阵: 识别强相关特征对(|r| > 0.8),标记共线性风险。
  • 异常样本初步标记: 基于 IQR 规则或业务阈值,生成候选异常样本列表。
  • 切分建议: 根据分布特征决定是否进行分层抽样、对数变换或异常样本剔除。
切分决策示例: 若交易金额偏度 > 3 且存在大量 IQR 离群点,建议在训练集构建时采用“分层抽样+异常样本过采样”策略,确保模型既能学习正常模式,又能捕捉异常特征。