2. 数据采集与清洗:催收系统数据源
催收触达模型的核心在于数据质量。本章将系统梳理催收系统涉及的四大数据源,并讲解数据清洗与缺失值处理的标准化流程。只有经过严格清洗的数据,才能为后续特征工程与模型训练提供可靠基础。
2.1 催收系统数据源概览
催收触达模型所需数据主要来源于四个内部系统:催收系统、客户管理系统、通话记录系统与账务系统。各数据源的核心字段与用途如下表所示:
| 数据源 | 核心表/接口 | 关键字段示例 | 模型用途 |
|---|---|---|---|
| 催收系统 | 案件分配表、催收策略表 | 案件ID、催收员ID、分配时间、催收阶段 | 定义样本标签与催收强度 |
| 客户基本信息表 | 客户主表、联系人表 | 年龄、性别、职业、收入、居住城市 | 构建客户画像特征 |
| 通话记录表 | 外呼日志、IVR记录 | 通话时长、接通状态、通话时间、录音ID | 提取触达行为特征 |
| 还款行为表 | 还款流水、逾期明细 | 还款金额、还款日期、逾期天数、剩余本金 | 定义目标变量与还款能力 |
数据源对齐原则:所有数据源必须通过唯一的客户ID或案件ID进行关联。建议在数据采集阶段即建立统一的ID映射表,避免后续多表关联时出现一对多或数据膨胀问题。
2.2 数据源详细说明
2.2.1 客户基本信息表
客户基本信息表是构建客户画像的基础。通常包含以下字段:
- 人口统计学字段:年龄、性别、婚姻状况、学历、职业类别
- 财务信息字段:月收入、收入来源、房产/车辆拥有情况
- 联系信息字段:手机号、家庭电话、紧急联系人、居住地址
- 信用历史字段:征信查询次数、历史逾期次数、信用卡持有数
2.2.2 通话记录表
通话记录表记录了催收员与客户之间的每一次交互,是触达模型最直接的行为数据来源:
- 通话状态:已接通、未接通、忙音、关机、空号、停机
- 通话时长:有效通话时长(秒),通常大于0秒视为有效触达
- 通话时间:精确到秒的通话开始时间,用于分析最佳触达时段
- 通话轮次:同一案件下的第几次外呼,反映催收强度
2.2.3 还款行为表
还款行为表记录了客户在贷后阶段的资金往来情况,直接决定模型的目标变量:
- 还款记录:还款日期、还款金额、还款渠道(线上/线下)
- 逾期信息:当前逾期天数、历史最高逾期天数、逾期阶段(M1/M2/M3+)
- 账务信息:剩余本金、应还总额、罚息金额、减免金额
关键指标:在催收触达模型中,通常将“通话后7天内还款比例”作为核心目标变量。该指标需要将通话记录表与还款行为表按客户ID和时间窗口进行精确关联。
2.3 数据清洗流程
数据清洗是数据预处理中最耗时但最重要的环节。标准清洗流程包含以下五个步骤:
- 格式统一:将日期字段统一为YYYY-MM-DD格式,金额字段统一为浮点数,手机号字段统一为字符串并去除空格与特殊字符。
- 去重处理:按客户ID+案件ID+时间戳的组合键去除完全重复的记录,保留最新的一条。
- 异常值过滤:剔除年龄<18或>100的记录,剔除通话时长<0或>3600秒的记录,剔除还款金额为负值的记录。
- 逻辑校验:检查还款日期是否早于放款日期、通话时间是否早于案件分配时间等逻辑矛盾。
- 字段衍生:基于原始字段生成清洗后的标准化字段,如将“接通/未接通”二值化为1/0。
常见陷阱:通话记录表中经常出现“0秒通话”或“1秒通话”,这些记录通常代表客户未接听或催收员误拨。建议将通话时长小于3秒的记录标记为“无效触达”,而非直接删除,以保留行为模式信息。
2.4 缺失值处理策略
不同数据源的缺失模式差异较大,需要采用差异化的处理策略。下表总结了各数据源常见缺失字段及推荐处理方法:
| 数据源 | 常见缺失字段 | 缺失率范围 | 推荐处理方法 |
|---|---|---|---|
| 客户基本信息表 | 月收入、职业、学历 | 10%~30% | 中位数填充(收入)、众数填充(职业/学历) |
| 通话记录表 | 通话时长(未接通时) | 40%~60% | 标记为-1,作为独立类别处理 |
| 还款行为表 | 还款日期(未还款时) | 20%~50% | 标记为2099-12-31,或单独生成“是否还款”标志位 |
| 催收系统 | 催收员ID(系统异常时) | <5% | 删除该条记录(缺失率低且无填充意义) |
缺失值处理的具体代码实现如下:
import pandas as pd
import numpy as np
# 客户基本信息表:中位数填充收入,众数填充职业
df_customer['income'].fillna(df_customer['income'].median(), inplace=True)
df_customer['occupation'].fillna(df_customer['occupation'].mode()[0], inplace=True)
# 通话记录表:未接通时通话时长为NaN,标记为-1
df_call['call_duration'].fillna(-1, inplace=True)
# 还款行为表:未还款时还款日期为NaT,生成标志位
df_repay['repay_flag'] = np.where(df_repay['repay_date'].isna(), 0, 1)
df_repay['repay_date'].fillna(pd.Timestamp('2099-12-31'), inplace=True)
# 催收系统:缺失率低,直接删除
df_collection.dropna(subset=['collector_id'], inplace=True)
2.5 数据采集与清洗整体流程
下图展示了从原始数据源到清洗后数据集的完整流程,包含数据采集、格式统一、去重、异常过滤、缺失值处理与最终合并六个阶段:
2.6 数据质量评估指标
清洗完成后,需要通过量化指标评估数据质量。建议在每次清洗后输出以下质量报告:
| 评估维度 | 指标名称 | 计算公式 | 合格标准 |
|---|---|---|---|
| 完整性 | 字段完整率 | 非空记录数 / 总记录数 × 100% | ≥ 95% |
| 一致性 | 逻辑校验通过率 | 通过逻辑校验的记录数 / 总记录数 × 100% | ≥ 99% |
| 准确性 | 异常值占比 | 异常值记录数 / 总记录数 × 100% | ≤ 2% |
| 唯一性 | 重复记录占比 | 重复记录数 / 总记录数 × 100% | ≤ 1% |
最佳实践:建议将数据清洗流程封装为可复用的Python函数,每次新增数据源时只需修改字段映射配置。同时,将清洗前后的数据量、缺失率变化等指标记录到日志中,便于后续追溯与审计。