3. 数据采集与EDA:使用Pandas读取信贷数据集
数据是模型构建的基石。本章将带领你使用 Pandas 完成信贷数据的采集、加载与初步探索性分析(EDA)。通过系统化的数据概览、缺失值与异常值诊断,为后续的额度模型与评分卡开发奠定坚实的数据基础。
3.1 数据采集与加载
信贷数据集通常以 CSV、Excel 或数据库形式存储。我们以最常见的 CSV 格式为例,使用 pandas.read_csv() 完成加载。
import pandas as pd
import numpy as np
# 加载信贷数据集
df = pd.read_csv('credit_data.csv', encoding='utf-8')
print(f"数据集形状: {df.shape}")
print(f"列名列表: {df.columns.tolist()}")
💡 加载要点:
- 使用
encoding='utf-8'避免中文乱码;若仍乱码可尝试'gbk'或'latin1'。 - 使用
dtype参数预定义列类型,可加速加载并减少后续类型转换。 - 大数据集可配合
nrows参数先抽样预览结构。
3.2 数据概览:info() 与 describe()
加载完成后,立即使用 info() 和 describe() 获取数据全貌。
3.2.1 info() — 数据结构诊断
df.info()
info() 输出每列的非空计数、数据类型及内存占用,是发现缺失值与类型错误的“第一道防线”。
| 列名 | 非空计数 | 数据类型 | 潜在问题 |
|---|---|---|---|
| loan_amount | 10000 | float64 | 正常 |
| age | 9850 | float64 | 缺失150条 |
| income | 10000 | object | 应为数值型,需转换 |
| default_flag | 10000 | int64 | 正常 |
3.2.2 describe() — 统计量概览
df.describe().T # 转置便于查看
describe() 输出数值列的均值、标准差、分位数等,可快速识别异常值范围。
🔍 关键检查点:
- 均值 vs 中位数:若差距过大,提示数据偏态或存在极端值。
- 最小值/最大值:检查是否出现不合理数值(如年龄为0或200)。
- 标准差:标准差为0的列可能是常量,对模型无贡献。
3.3 缺失值初步探索
缺失值处理是信贷建模的关键步骤。使用以下方法系统诊断缺失情况。
# 缺失值数量与比例
missing_count = df.isnull().sum()
missing_ratio = df.isnull().mean() * 100
# 合并为DataFrame
missing_df = pd.DataFrame({
'缺失数量': missing_count,
'缺失比例(%)': missing_ratio.round(2)
})
missing_df = missing_df[missing_df['缺失数量'] > 0].sort_values('缺失比例(%)', ascending=False)
print(missing_df)
| 列名 | 缺失数量 | 缺失比例(%) | 处理建议 |
|---|---|---|---|
| employment_length | 1200 | 12.00 | 中位填充或建模预测 |
| age | 150 | 1.50 | 均值/中位填充 |
| credit_score | 50 | 0.50 | 删除或模型填充 |
⚠️ 缺失值处理原则:
- 缺失比例 < 1%:可直接删除对应行。
- 缺失比例 1%–20%:使用均值、中位数或模型预测填充。
- 缺失比例 > 20%:需评估该特征是否保留,或使用更复杂的插值方法。
- 信贷场景中,切勿直接删除含缺失值的样本,可能导致样本选择偏差。
3.4 异常值初步探索
异常值会严重扭曲模型参数。使用箱线图与IQR法则进行初步筛查。
# IQR法检测异常值
def detect_outliers_iqr(series):
Q1 = series.quantile(0.25)
Q3 = series.quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = series[(series < lower_bound) | (series > upper_bound)]
return outliers, lower_bound, upper_bound
# 示例:检测贷款金额异常值
outliers, lb, ub = detect_outliers_iqr(df['loan_amount'])
print(f"贷款金额异常值数量: {len(outliers)}")
print(f"正常范围: [{lb:.2f}, {ub:.2f}]")
| 特征 | 异常值数量 | 异常比例(%) | 可能原因 |
|---|---|---|---|
| loan_amount | 85 | 0.85 | 高净值客户大额贷款 |
| age | 12 | 0.12 | 录入错误(如年龄>100) |
| income | 230 | 2.30 | 收入极端高或低 |
📌 异常值处理策略:
- 业务合理性判断:年龄 > 100 或 < 18 应视为错误值。
- 截尾处理:对极端值进行上下限截尾(Winsorize)。
- 分箱处理:将连续变量离散化,降低异常值影响。
- 保留分析:信贷场景中,部分“异常值”可能代表高风险客户,需单独分析。
3.5 EDA流程总览
以下SVG图展示了从数据加载到初步清洗的完整EDA流程,帮助你建立全局视角。
3.6 实战要点总结
- 先看info,再看describe:info() 揭示结构问题,describe() 揭示分布问题。
- 缺失值可视化:使用
missingno库的matrix()和heatmap()可直观展示缺失模式。 - 异常值需结合业务:信贷场景中,高收入客户的大额贷款可能不是“异常”,而是业务常态。
- 记录EDA日志:每次处理操作都应在代码中注释或记录,确保模型可复现。
✅ 本节核心交付物:
- 数据加载与类型修正后的干净DataFrame。
- 缺失值报告(含比例与处理建议)。
- 异常值检测结果(含IQR边界与异常数量)。
- EDA流程记录文档(为后续特征工程提供依据)。