3、数据探索:金融交易数据集介绍、数据加载与初步探索、缺失值与异常值可视化
数据探索是构建异常交易检测模型的第一步,也是决定模型上限的关键环节。本节将带领你熟悉金融交易数据集的结构,掌握数据加载与初步探索的方法,并通过可视化手段直观识别缺失值与异常值,为后续特征工程与模型训练打下坚实基础。
3.1 金融交易数据集介绍
本课程使用一个模拟真实银行交易场景的公开数据集,包含约 10 万条交易记录,涵盖正常交易与多种类型的异常交易。数据集字段设计贴近生产环境,便于后续部署实战。
| 字段名 | 类型 | 说明 | 示例值 |
|---|---|---|---|
transaction_id |
字符串 | 交易唯一标识 | TXN_00012345 |
timestamp |
时间戳 | 交易发生时间 | 2024-09-15 14:23:11 |
amount |
浮点数 | 交易金额(美元) | 250.75 |
sender_account |
字符串 | 付款方账号 | ACC_998877 |
receiver_account |
字符串 | 收款方账号 | ACC_112233 |
transaction_type |
分类 | 交易类型(转账/支付/提现) | TRANSFER |
sender_balance_before |
浮点数 | 付款方交易前余额 | 5000.00 |
sender_balance_after |
浮点数 | 付款方交易后余额 | 4749.25 |
receiver_balance_before |
浮点数 | 收款方交易前余额 | 1200.00 |
receiver_balance_after |
浮点数 | 收款方交易后余额 | 1450.75 |
is_fraud |
布尔 | 是否为异常交易(标签) | 0 / 1 |
数据集特点:异常交易占比约 2.5%,属于典型的类别不平衡场景。金额字段存在右偏分布,部分异常交易金额集中在 5000 美元以上。时间戳字段可提取小时、星期等周期性特征,对检测夜间异常交易有重要价值。
3.2 数据加载与初步探索
使用 Python 的 Pandas 库加载 CSV 格式的交易数据,并进行初步的结构化探索。以下代码展示了标准的数据加载流程与基础统计信息输出。
import pandas as pd
import numpy as np
# 加载数据集
df = pd.read_csv('transaction_data.csv')
# 查看数据形状与字段信息
print(f"数据集形状: {df.shape}")
print(f"字段列表: {df.columns.tolist()}")
# 查看前5行数据
print(df.head())
# 基础统计描述
print(df.describe(include='all'))
# 检查数据类型与缺失情况
print(df.info())
初步探索的核心任务包括:
- 维度确认:记录总数与字段数量是否符合预期。
- 数据类型检查:确保数值字段为 float/int,分类字段为 object/category,时间字段已转换为 datetime。
- 类别分布:统计
transaction_type与is_fraud的频次,初步了解异常比例。 - 数值范围:观察
amount、sender_balance_before等字段的最小值、最大值与分位数,识别极端值。
关键发现示例:在初步探索中,我们发现
sender_balance_before 字段存在 0 值记录,且这些记录中异常交易占比高达 18%,远高于整体 2.5% 的异常率。这提示余额为 0 的账户发起交易是一个强异常信号。
3.3 缺失值与异常值可视化
可视化是数据探索中最直观的环节。我们使用 Matplotlib 和 Seaborn 绘制缺失值热力图与异常值分布图,帮助快速定位数据质量问题。
3.3.1 缺失值可视化
缺失值会直接影响模型训练效果。通过热力图可以一目了然地看到哪些字段存在缺失,以及缺失的严重程度。
import matplotlib.pyplot as plt
import seaborn as sns
# 计算缺失比例
missing_ratio = df.isnull().sum() / len(df) * 100
missing_df = pd.DataFrame({'字段': missing_ratio.index, '缺失比例(%)': missing_ratio.values})
missing_df = missing_df[missing_df['缺失比例(%)'] > 0]
print(missing_df.sort_values('缺失比例(%)', ascending=False))
# 绘制缺失值热力图
plt.figure(figsize=(12, 6))
sns.heatmap(df.isnull(), cbar=False, cmap='viridis', yticklabels=False)
plt.title('交易数据集缺失值热力图')
plt.xlabel('字段')
plt.ylabel('样本索引')
plt.show()
注意:如果缺失比例超过 50%,该字段通常需要删除或进行高级插补。对于金融交易数据,
receiver_balance_after 字段的缺失可能意味着收款方账户信息不完整,需结合业务逻辑判断处理策略。
3.3.2 异常值可视化
异常值在金融交易中往往对应欺诈行为。通过箱线图和分布图可以快速识别金额、余额等字段中的离群点。
# 绘制金额字段的箱线图
plt.figure(figsize=(10, 5))
sns.boxplot(x=df['amount'])
plt.title('交易金额箱线图(异常值标记)')
plt.xlabel('金额(美元)')
plt.show()
# 按标签分组查看金额分布
plt.figure(figsize=(10, 5))
sns.histplot(data=df, x='amount', hue='is_fraud', bins=50, log_scale=True, alpha=0.6)
plt.title('正常交易 vs 异常交易金额分布(对数尺度)')
plt.xlabel('金额(美元,对数尺度)')
plt.ylabel('频次')
plt.show()
异常值洞察:箱线图显示金额字段存在大量超过 10,000 美元的离群点。进一步分析发现,异常交易中 78% 的金额集中在 5,000 至 15,000 美元区间,而正常交易金额中位数仅为 120 美元。这表明金额异常是欺诈检测的重要特征。
3.4 数据探索总结清单
完成本节内容后,你应该能够独立完成以下数据探索任务。建议将以下清单作为每次数据项目的检查表。
| 任务 | 方法 | 输出 |
|---|---|---|
| 数据加载 | pd.read_csv() |
DataFrame 对象 |
| 基础统计 | df.describe() / df.info() |
数值分布、数据类型、缺失计数 |
| 缺失值检测 | df.isnull().sum() / 热力图 |
缺失字段列表与比例 |
| 异常值检测 | 箱线图 / Z-Score / 孤立森林 | 离群点索引与分布特征 |
| 类别平衡检查 | df['is_fraud'].value_counts() |
正负样本比例 |
| 时间特征提取 | pd.to_datetime() + 小时/星期 |
新增时间维度特征 |
实战建议:在 Jupyter Notebook 中逐块执行上述代码,并尝试修改可视化参数(如箱线图的 whis 参数、直方图的 bins 数量),观察不同设置下异常值的识别效果。将探索过程中发现的异常模式记录在文档中,作为后续特征工程的依据。