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流程,帮助你建立全局视角。

信贷数据EDA流程总览 信贷数据EDA流程总览 1. 数据加载 2. 数据概览 (info/describe) 3. 缺失值探索 4. 异常值探索 5. 初步清洗决策 📊 核心产出 缺失矩阵 · 异常值报告 · 类型修正

3.6 实战要点总结

  • 先看info,再看describe:info() 揭示结构问题,describe() 揭示分布问题。
  • 缺失值可视化:使用 missingno 库的 matrix() 和 heatmap() 可直观展示缺失模式。
  • 异常值需结合业务:信贷场景中,高收入客户的大额贷款可能不是“异常”,而是业务常态。
  • 记录EDA日志:每次处理操作都应在代码中注释或记录,确保模型可复现。
✅ 本节核心交付物:
  1. 数据加载与类型修正后的干净DataFrame。
  2. 缺失值报告(含比例与处理建议)。
  3. 异常值检测结果(含IQR边界与异常数量)。
  4. EDA流程记录文档(为后续特征工程提供依据)。