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 字段的缺失可能意味着收款方账户信息不完整,需结合业务逻辑判断处理策略。
缺失值处理决策流程 检测缺失字段与比例 缺失比例 > 50%? 删除该字段 均值/中位数/模型插补 生成完整训练数据集

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 美元。这表明金额异常是欺诈检测的重要特征。
异常值检测与处理策略 箱线图(IQR 方法) Z-Score 标准化检测 孤立森林(Isolation Forest) 截尾处理(Capping) 对数变换(Log Transform) 保留为特征(标记异常) 根据业务场景选择处理方式,避免信息丢失

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 数量),观察不同设置下异常值的识别效果。将探索过程中发现的异常模式记录在文档中,作为后续特征工程的依据。