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 数据清洗流程

数据清洗是数据预处理中最耗时但最重要的环节。标准清洗流程包含以下五个步骤:

  1. 格式统一:将日期字段统一为YYYY-MM-DD格式,金额字段统一为浮点数,手机号字段统一为字符串并去除空格与特殊字符。
  2. 去重处理:按客户ID+案件ID+时间戳的组合键去除完全重复的记录,保留最新的一条。
  3. 异常值过滤:剔除年龄<18或>100的记录,剔除通话时长<0或>3600秒的记录,剔除还款金额为负值的记录。
  4. 逻辑校验:检查还款日期是否早于放款日期、通话时间是否早于案件分配时间等逻辑矛盾。
  5. 字段衍生:基于原始字段生成清洗后的标准化字段,如将“接通/未接通”二值化为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 数据采集与清洗整体流程

下图展示了从原始数据源到清洗后数据集的完整流程,包含数据采集、格式统一、去重、异常过滤、缺失值处理与最终合并六个阶段:

数据采集与清洗整体流程图 催收系统数据源 客户基本信息表 通话记录表 还款行为表 ① 格式统一:日期、金额、手机号标准化 ② 去重处理:按客户ID+案件ID+时间戳去重 ③ 异常值过滤:年龄、通话时长、还款金额阈值 ④ 缺失值处理:中位数/众数填充、标记-1、生成标志位 ⑤ 多表关联合并 → 清洗后数据集

2.6 数据质量评估指标

清洗完成后,需要通过量化指标评估数据质量。建议在每次清洗后输出以下质量报告:

评估维度 指标名称 计算公式 合格标准
完整性 字段完整率 非空记录数 / 总记录数 × 100% ≥ 95%
一致性 逻辑校验通过率 通过逻辑校验的记录数 / 总记录数 × 100% ≥ 99%
准确性 异常值占比 异常值记录数 / 总记录数 × 100% ≤ 2%
唯一性 重复记录占比 重复记录数 / 总记录数 × 100% ≤ 1%
最佳实践:建议将数据清洗流程封装为可复用的Python函数,每次新增数据源时只需修改字段映射配置。同时,将清洗前后的数据量、缺失率变化等指标记录到日志中,便于后续追溯与审计。