第2章 数据准备:先搞清楚你手里有啥牌

做评分卡模型,数据就是弹药。很多人一上来就调包、跑算法,结果跑完才发现数据一堆坑——说白了,白费功夫。我个人的习惯是,拿到数据集先花半天时间摸清它的底细。这一章我们就来干这件事。

2.1 获取信贷数据集

课程用的数据集是 Kaggle 上的经典案例——Give Me Some Credit。这是一个二元分类问题,预测借款人未来两年内是否会经历严重财务困境(拖欠 90 天以上或更糟)。

下载方式: Kaggle 搜 "Give Me Some Credit" 就能找到。文件只有一个 cs-training.csv,大约 15 万条样本,12 个字段。如果网速慢,我提前帮你备了一份百度云链接(见课程附件)。

加载数据很简单,Pandas 一行搞定:

import pandas as pd

df = pd.read_csv('cs-training.csv')
print(df.head())

2.2 字段解释

字段一共 12 个,不过有些名字起得挺绕。我帮你翻译成人话,顺便标出我踩过的坑:

字段名 中文含义 注意
SeriousDlqin2yrs 目标变量:是否违约(0/1) 正样本比例不到 7%,严重不平衡
RevolvingUtilizationOfUnsecuredLines 信用卡及个人信贷额度使用率 容易有极端值,有些人超过 1(额度不够刷爆了)
age 借款人年龄(岁) 有小于 18 岁或大于 100 岁的异常值,我直接过滤掉了
NumberOfTime30-59DaysPastDueNotWorse 过去 2 年逾期 30-59 天的次数 最大值 98?明显是异常,这个字段坑很多
DebtRatio 每月债务支出 / 月收入 有人 Debt Ratio 几千?多半是收入为0
MonthlyIncome 月收入 缺失严重,约 30% 空值
NumberOfOpenCreditLinesAndLoans 开放信贷及贷款笔数 范围正常,但可以做分箱
NumberOfTimes90DaysLate 逾期 90 天以上的次数 同样有异常值 98
NumberRealEstateLoansOrLines 房贷笔数 有人 32 笔?太离谱了
NumberOfTime60-89DaysPastDueNotWorse 逾期 60-89 天的次数 同上异常模式
NumberOfDependents 家属人数 缺失不多,可以填 0
我曾经遇到一个项目: 对 NumberOfTime30-59DaysPastDueNotWorse 没做处理,直接丢进模型,结果评分卡分档全乱套。后来发现这列存在 98 这种异常值,其实是数据录入错误或特殊标记。一定要先查分布!

2.3 数据初步探索

拿到数据别急着建模,先跑几个基础检查。我习惯用 .info() 和 .describe() 快速扫一眼。

# 数据规模、类型、缺失情况
df.info()

# 数值统计概览
df.describe().T

从 .info() 你能看到:

  • 总样本 150,000 条
  • 缺失字段:MonthlyIncome(约 30% 空)、NumberOfDependents(少量)
  • 所有字段除目标变量外都是 float64 或 int64,没有 object 类型,省了编码步骤

.describe() 则暴露了更多问题。你看 RevolvingUtilizationOfUnsecuredLines 的最大值是 507?这显然是异常。还有 age 的最小值 0?不可能有 0 岁的借款人。这些数据必须清洗。

核心发现:
  • 目标变量严重不平衡(正样本仅 6.7%)
  • 多个字段存在异常极大值(98、507、3298 等)
  • 月收入缺失 20% 以上,不能直接丢掉

2.4 缺失值检查

缺失值处理是评分卡建模的必修课。我一般先用热力图可视化缺失情况,不过这一节我们先看数字。

miss = df.isnull().sum()
miss_pct = miss / len(df) * 100
miss_df = pd.DataFrame({'缺失数': miss, '缺失率%': miss_pct})
print(miss_df[miss_df['缺失数'] > 0])

结果一目了然:MonthlyIncome 缺失 29,731 条,占比 19.8%;NumberOfDependents 缺失 1,924 条,占比 1.3%。

缺失率低于 5% 的可以用众数或中位数填补,但这里是 20%。怎么办?

  • 直接删除会损失大量样本(尤其正样本本来就少)
  • 用中位数填补?可能会扭曲收入分布
  • 我常用的方案:先对收入做对数变换,再用回归模型预测缺失值,或者用 KNN 填补

具体怎么做我们放在数据清洗章节细讲。现在你只需要知道:缺失值不是洪水猛兽,但一定要排查清楚。

一个小技巧: 检查缺失值的时候顺带看一眼缺失模式。比如 MonthlyIncome 缺失是否与 DebtRatio 异常有关?我见过很多案例,收入缺失的人往往债务比例也畸形。这能帮你决策填补策略。
数据探索与缺失值检查流程 加载数据集 字段解释与含义 info / describe 缺失值检查 记录问题列表 说明: 1. 加载后先理解每个字段的业务含义,避免盲目建模 2. info() 和 describe() 快速发现数据类型、异常值和缺失情况 3. 记录下所有可疑字段,为后续清洗提供清单