3. 数据采集与预处理:数据源分类、清洗与异常检测

在坏样本归因与Collections Analytics中,数据质量直接决定模型效果与策略有效性。本章聚焦数据采集与预处理的核心环节,涵盖数据源分类、数据清洗、缺失值处理与异常值检测,为后续特征工程与建模奠定基础。

3.1 数据源分类

风控与催收分析的数据源主要分为内部交易数据与外部征信数据两大类。两类数据在时效性、覆盖度、成本与合规要求上存在显著差异。

数据源类别 典型字段 优势 局限
内部交易数据 还款记录、逾期天数、交易金额、账户余额、产品类型、渠道来源 实时性高、成本低、与业务强相关 覆盖范围有限、可能存在样本偏差
外部征信数据 央行征信报告、多头借贷记录、法院执行信息、社保/公积金、运营商数据 覆盖广、客观性强、可补充内部盲区 获取成本高、更新频率低、合规要求严格
实战建议:内部数据优先用于构建短期行为评分与催收响应模型;外部征信数据常用于贷前准入与贷中监控,在坏样本归因中可作为交叉验证的重要参考。
数据源分类与融合架构 内部交易数据 还款记录 · 逾期天数 交易金额 · 账户余额 外部征信数据 央行征信 · 多头借贷 法院执行 · 运营商 数据融合与特征工程 坏样本归因 · 催收策略 · 模型训练 内部数据驱动高频策略,外部数据补充长尾风险识别 两类数据需在合规前提下完成ID-Mapping与时间对齐

3.2 数据清洗

数据清洗是预处理的核心步骤,主要解决格式不一致、重复记录、逻辑错误与噪声数据问题。常见清洗操作包括:

  • 格式标准化:统一日期格式(YYYY-MM-DD)、金额单位(元/分)、手机号/身份证脱敏规则。
  • 去重处理:基于主键(如客户ID+交易流水号)删除完全重复或业务含义重复的记录。
  • 逻辑校验:检查逾期天数与还款日期是否矛盾、交易金额是否超出合理范围。
  • 噪声过滤:剔除明显异常的时间戳(如未来日期)、无效的渠道编码等。
清洗案例:某催收数据集发现约3%的逾期天数字段为负数,经排查为系统时区配置错误导致。清洗后坏样本分布趋于合理,模型AUC提升约0.04。

3.3 缺失值处理

缺失值在风控数据中普遍存在,处理方式需结合缺失机制与业务含义。常用方法如下:

处理方法 适用场景 注意事项
删除缺失记录 缺失比例低(<5%),且随机缺失 可能损失少量样本,需评估对分布的影响
均值/中位数填充 连续型变量,缺失比例中等(5%~20%) 会降低变量方差,可能削弱区分度
众数填充 离散型变量(如渠道、产品类型) 需确认众数具有业务代表性
模型预测填充 缺失比例高(>20%),且变量间相关性较强 计算成本高,需避免过拟合
缺失值单独编码 缺失本身具有业务含义(如“未查询到征信”) 适合作为独立类别参与建模
注意:在坏样本归因场景中,缺失值可能隐含“客户失联”“数据未上报”等风险信号。建议优先采用缺失值单独编码或模型预测填充,避免简单删除导致信息损失。

3.4 异常值检测

异常值检测用于识别数据中偏离正常分布的点,这些点可能代表欺诈、录入错误或极端风险事件。常用检测方法包括:

  • 统计方法:Z-Score(阈值通常设为3)、IQR(四分位距,下界Q1-1.5×IQR,上界Q3+1.5×IQR)。
  • 距离方法:基于KNN或LOF(局部异常因子),适用于高维数据。
  • 业务规则:如单日交易次数超过100笔、逾期天数超过365天等。
异常值检测流程 原始数据输入 统计检测 业务规则校验 异常标记与分类 处理策略决策 异常值需区分“欺诈异常”与“自然极端值”,避免误杀高价值样本 建议结合业务规则与统计方法进行交叉验证

3.5 实战代码示例:缺失值与异常值处理

以下代码展示使用Python进行缺失值填充与异常值检测的典型流程:

import pandas as pd
import numpy as np
from scipy import stats

# 加载数据
df = pd.read_csv('collections_data.csv')

# 缺失值处理:连续变量用中位数填充,离散变量用众数填充
df['逾期天数'].fillna(df['逾期天数'].median(), inplace=True)
df['渠道类型'].fillna(df['渠道类型'].mode()[0], inplace=True)

# 异常值检测:Z-Score方法
z_scores = np.abs(stats.zscore(df['交易金额']))
df['交易金额异常标记'] = (z_scores > 3).astype(int)

# 业务规则检测:逾期天数超过365天标记为极端异常
df['逾期极端标记'] = (df['逾期天数'] > 365).astype(int)

# 输出异常样本统计
print(f"交易金额异常样本数: {df['交易金额异常标记'].sum()}")
print(f"逾期极端样本数: {df['逾期极端标记'].sum()}")
实战要点:异常值标记后不要直接删除,建议先分析异常样本的逾期率、回收率等业务指标,再决定是否剔除或单独建模。在Collections Analytics中,部分“异常”样本恰恰是高价值催收目标。