3. 数据准备与探索:数据源选择、数据清洗、缺失值处理、异常值检测、描述性统计分析
在信用评分模型(PD模型)开发中,数据质量直接决定模型的上限。本章聚焦于从原始数据到可用建模数据集的完整流程,涵盖数据源选择、数据清洗、缺失值处理、异常值检测及描述性统计分析。每一步都需要严谨的领域知识与统计方法结合,才能为后续特征工程与模型训练打下坚实基础。
3.1 数据源选择
信用评分模型的数据源通常分为内部数据与外部数据两大类。选择数据源时需重点关注:样本代表性、时间跨度、变量覆盖度及数据合规性。
| 数据源类型 | 典型来源 | 关键变量示例 | 注意事项 |
|---|---|---|---|
| 内部数据 | 核心系统、信贷审批系统、催收系统 | 还款记录、逾期天数、授信额度、负债率 | 需确保历史数据完整,避免系统迁移导致断点 |
| 外部数据 | 央行征信、百行征信、第三方数据源 | 征信查询次数、多头借贷、黑名单命中 | 关注数据时效性与合规授权 |
| 衍生数据 | 基于内部/外部数据计算 | 近6个月平均使用率、最大逾期天数 | 需明确衍生逻辑,避免未来信息泄露 |
实践建议: 优先选择与目标客群同分布的历史数据,时间窗口建议覆盖至少一个完整经济周期(如3-5年),以保证模型在不同宏观环境下的稳定性。
3.2 数据清洗
数据清洗是去除噪声、纠正不一致性的关键步骤。常见问题包括:重复记录、格式错误、逻辑矛盾、无效值等。
- 重复记录处理: 基于客户唯一标识(如身份证号、客户ID)去重,保留最新或最完整的一条记录。
- 格式标准化: 统一日期格式(如YYYY-MM-DD)、金额单位(如元)、分类编码(如性别M/F)。
- 逻辑校验: 例如“贷款发放日期”不应晚于“逾期日期”,“年龄”不应为负数或超过120岁。
- 无效值剔除: 如身份证号位数不对、手机号格式错误等,视情况删除或标记。
清洗规则示例(Python伪代码):
# 去除重复记录
df = df.drop_duplicates(subset=['customer_id'], keep='last')
# 日期格式统一
df['loan_date'] = pd.to_datetime(df['loan_date'], format='%Y%m%d')
# 逻辑校验:年龄在18-100岁之间
df = df[(df['age'] >= 18) & (df['age'] <= 100)]
3.3 缺失值处理
缺失值是信用数据中的常见现象,处理不当会导致模型偏差。需先分析缺失机制(MCAR、MAR、MNAR),再选择合适方法。
| 缺失机制 | 含义 | 常见处理方法 |
|---|---|---|
| MCAR(完全随机缺失) | 缺失与数据本身无关 | 直接删除、均值/中位数填充 |
| MAR(随机缺失) | 缺失与其他观测变量相关 | 回归填充、KNN填充、多重插补 |
| MNAR(非随机缺失) | 缺失与缺失值本身相关 | 需结合业务逻辑建模,或单独标记缺失状态 |
在信用评分场景中,对于缺失率超过50%的变量,通常直接剔除;对于缺失率较低的变量,优先使用中位数或众数填充,并保留缺失指示变量作为额外特征。
注意: 切勿在未分析缺失原因的情况下盲目填充。例如,征信查询次数缺失可能意味着客户无征信记录(本身具有信息量),此时应单独编码为“-1”或“无记录”,而非简单填充均值。
3.4 异常值检测
异常值会扭曲统计分布与模型参数,需结合统计方法与业务规则进行识别与处理。
- 统计方法:
- Z-Score法:|Z| > 3 视为异常(适用于近似正态分布)。
- IQR法:超出 Q1 - 1.5×IQR 或 Q3 + 1.5×IQR 视为异常(适用于偏态分布)。
- 箱线图可视化辅助判断。
- 业务规则:
- 年收入为0或负值。
- 年龄小于18岁或大于100岁。
- 负债率超过1000%(明显不合理)。
- 处理策略:
- 截尾(Winsorize):将异常值替换为阈值。
- 删除:仅当确认数据录入错误且样本量充足时。
- 单独编码:将异常值作为独立类别处理。
3.5 描述性统计分析
描述性统计是数据探索的核心环节,帮助分析师快速理解变量分布、集中趋势、离散程度及变量间关系。对于信用评分模型,重点关注以下维度:
- 连续变量: 均值、中位数、标准差、最小值、最大值、偏度、峰度、分位数(尤其是1%、5%、95%、99%)。
- 分类变量: 频数、占比、类别数量、缺失率。
- 目标变量(违约/非违约): 违约率、好/坏样本比例、各变量在好坏样本上的分布差异。
- 相关性分析: 连续变量间的Pearson相关系数,分类变量与目标变量的IV值(信息量)初步计算。
描述性统计输出表示例(Python):
# 连续变量描述统计
df.describe(percentiles=[0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99])
# 分类变量频数统计
df['loan_purpose'].value_counts(normalize=True)
# 按目标变量分组统计
df.groupby('default_flag')['income'].describe()
3.6 数据准备与探索的常见陷阱
| 陷阱 | 后果 | 规避方法 |
|---|---|---|
| 未来信息泄露 | 模型在训练时使用了未来数据,导致过拟合与线上失效 | 严格按时间窗口划分训练/测试集,衍生变量只使用历史数据 |
| 缺失值填充不当 | 引入噪声或掩盖真实模式 | 先分析缺失机制,再选择填充方法,保留缺失指示变量 |
| 异常值直接删除 | 丢失重要信息(如欺诈样本) | 区分“噪声异常”与“信息异常”,后者应单独分析 |
| 忽略样本选择偏差 | 模型无法泛化到实际客群 | 检查训练样本与线上样本的分布一致性(PSI检验) |
最佳实践: 在数据准备阶段建立数据质量报告(Data Quality Report),记录每个变量的缺失率、异常值比例、分布特征及处理方式,确保整个过程可追溯、可复现。