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()
注意: 箱线图标记的“异常点”是基于统计规则的离群点,不一定是真正的欺诈交易。需要结合业务规则(如单笔超限、短时高频)进行二次筛选,避免误杀正常大额交易。
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:弱相关或无关,可能对模型贡献有限,需结合业务判断是否保留。
• 注意:相关性不等于因果性。高相关可能由业务逻辑驱动(如交易金额与手续费),也可能是偶然噪声。
• |r| > 0.8:强相关,需考虑特征冗余,可进行 PCA 或直接剔除其中一个。
• 0.5 < |r| < 0.8:中等相关,保留但需关注模型稳定性。
• |r| < 0.3:弱相关或无关,可能对模型贡献有限,需结合业务判断是否保留。
• 注意:相关性不等于因果性。高相关可能由业务逻辑驱动(如交易金额与手续费),也可能是偶然噪声。
4.4 EDA 输出清单与切分决策
完成上述 EDA 步骤后,应形成一份结构化的输出清单,直接指导后续的样本切分策略:
- 字段级报告: 每个数值字段的描述性统计表(均值、中位数、标准差、偏度、峰度、缺失率)。
- 分布诊断: 直方图与箱线图联合判断是否存在长尾分布、双峰分布或极端离群点。
- 相关性矩阵: 识别强相关特征对(|r| > 0.8),标记共线性风险。
- 异常样本初步标记: 基于 IQR 规则或业务阈值,生成候选异常样本列表。
- 切分建议: 根据分布特征决定是否进行分层抽样、对数变换或异常样本剔除。
切分决策示例: 若交易金额偏度 > 3 且存在大量 IQR 离群点,建议在训练集构建时采用“分层抽样+异常样本过采样”策略,确保模型既能学习正常模式,又能捕捉异常特征。