3. 数据采集与清洗:催收系统数据源与质量治理
催收触达优化的起点是高质量、全链路的数据。本章聚焦于催收系统数据源的采集范围、数据质量检查方法、缺失值处理策略以及异常值检测与修复技术。只有经过严格清洗的数据,才能为后续特征工程提供可靠基础。
3.1 催收系统数据源全景(贷前/贷中/贷后)
催收特征工程所需的数据横跨信贷全生命周期。根据数据产生的时间节点和业务归属,可划分为三大数据域:
| 数据域 | 典型数据源 | 关键字段示例 | 采集频率 |
|---|---|---|---|
| 贷前数据 | 申请系统、征信报告、反欺诈平台 | 申请人基本信息、收入负债比、征信查询次数、多头借贷数 | 申请时点一次性采集 |
| 贷中数据 | 账务系统、交易流水、行为监控 | 还款记录、额度使用率、消费行为标签、设备指纹 | 每日/实时增量同步 |
| 贷后数据 | 催收系统、通话记录、短信平台、外访系统 | 逾期天数、承诺还款金额、接通率、失联状态、投诉记录 | 每日批量 + 实时事件 |
实战要点:贷前数据是静态画像,贷中数据反映实时行为,贷后数据是催收策略的直接反馈。三者必须通过统一的
loan_id 和 user_id 进行关联,否则特征工程将出现严重的数据断层。
下图展示了催收数据源在信贷全生命周期中的位置与流转关系:
3.2 数据质量检查
数据质量是特征工程的生命线。在催收场景中,数据质量问题通常表现为以下四类:
- 完整性缺失:关键字段(如逾期天数、联系电话)存在空值,导致策略无法执行。
- 准确性偏差:字段值超出合理范围(如逾期天数为 -5 天),或与业务逻辑矛盾。
- 一致性冲突:同一笔贷款在账务系统和催收系统中的逾期天数不一致。
- 时效性滞后:贷后催收记录未及时同步,导致特征滞后于当前状态。
质量检查清单(每日必检):
- 检查
loan_id主键唯一性,去重后记录数是否与账务系统一致。 - 检查数值字段(如逾期本金、逾期天数)的分布范围,识别负值或异常大值。
- 检查类别字段(如催收阶段、案件状态)的取值是否在枚举范围内。
- 检查时间字段(如最后还款日、最后催收时间)是否在合理时间窗口内。
- 检查跨系统关联字段(如
user_id)的匹配率,低于 95% 需告警。
3.3 缺失值处理
催收数据中的缺失值处理需要结合业务含义,不能简单使用统计填充。以下是针对不同字段类型的处理策略:
| 字段类型 | 典型字段 | 缺失含义 | 推荐处理方式 |
|---|---|---|---|
| 数值型(连续) | 收入、负债总额 | 用户未提供或系统未采集 | 中位数填充 / 模型预测填充 / 单独标记缺失指示变量 |
| 数值型(离散) | 历史催收次数、承诺还款次数 | 无历史行为 | 填充为 0,并增加 has_history 标记 |
| 类别型 | 职业类型、居住城市 | 信息缺失 | 填充为 "未知" 类别,保留缺失信息 |
| 时间型 | 最后联系时间、承诺还款日期 | 从未联系或无承诺 | 填充为默认值(如 1970-01-01)或空值标记 |
| 文本型 | 催收备注、通话摘要 | 未记录 | 填充为空字符串,并增加 has_note 标记 |
避坑指南:不要对催收场景中的“缺失”做无脑均值填充。例如,
承诺还款金额 缺失意味着用户从未做出承诺,填充为均值会严重扭曲模型对“承诺行为”的识别能力。建议优先使用 缺失指示变量 配合业务含义填充。
3.4 异常值检测与处理
催收数据中的异常值通常由系统故障、数据录入错误或极端业务场景引起。常用的检测方法包括:
- 统计阈值法:基于 3σ 原则或 IQR(四分位距)识别离群点。
- 业务规则法:根据业务常识设定硬性阈值(如逾期天数不能超过合同期限)。
- 聚类检测法:使用 DBSCAN 或孤立森林识别异常模式。
- 时序异常检测:针对时间序列字段(如每日通话次数),检测突增或突降。
下图展示了异常值检测与处理的完整流程:
处理异常值时,建议遵循以下优先级:
- 业务规则优先:凡是违反业务常识的异常值(如逾期天数 < 0),直接修正或剔除。
- 统计方法辅助:对无明显业务边界的字段,使用 IQR 或 3σ 识别离群点。
- 保留异常信息:对于无法确认是否错误的异常值,可增加
is_outlier标记,让模型自行学习其影响。 - 记录清洗日志:每次清洗操作必须记录原始值、清洗规则、清洗后值,便于回溯审计。
代码示例:异常值检测与标记(Python 伪代码)
import pandas as pd
import numpy as np
def detect_outliers_iqr(df, column, multiplier=1.5):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - multiplier * IQR
upper_bound = Q3 + multiplier * IQR
return (df[column] < lower_bound) | (df[column] > upper_bound)
# 应用示例:对逾期天数进行异常检测
df['overdue_days_outlier'] = detect_outliers_iqr(df, 'overdue_days')
# 业务规则:逾期天数不能为负
df.loc[df['overdue_days'] < 0, 'overdue_days'] = 0
df.loc[df['overdue_days'] < 0, 'overdue_days_corrected'] = True
通过系统化的数据采集与清洗,催收特征工程才能建立在可靠的数据基础之上。下一阶段将基于清洗后的数据,进行特征构建与衍生。