4. 评分卡开发流程:样本定义、观察期与表现期设定、数据清洗与缺失值处理

催收评分卡(Collection Scorecard)的开发并非一蹴而就,其核心在于构建一个能够准确预测逾期客户未来还款概率的统计模型。本章将深入剖析开发流程中的前三个关键环节:样本定义(好/坏客户界定)、时间窗口设定(观察期与表现期)以及数据预处理(清洗与缺失值处理)。这些步骤是评分卡稳定性和区分度的基石。

4.1 样本定义:好客户与坏客户的界定

在催收场景中,“好”与“坏”的定义直接决定了模型的学习目标。不同于信贷审批中的违约定义,催收评分卡更关注回收率与回收时效。我们需要根据业务策略,明确区分“有效还款”与“无效承诺”。

4.1.1 核心定义标准

通常,我们基于表现期内的最终还款状态来定义好坏客户。以下为行业通用标准:

客户类型 定义标准(表现期内) 业务含义 示例(逾期30天账户)
好客户 (Good) 账户结清或还款至正常状态(如M0) 具备还款意愿和能力,催收可触达 逾期30天后,在第45天全额还款
坏客户 (Bad) 账户持续恶化或进入核销/法诉阶段 还款意愿低或丧失还款能力 逾期30天后,持续逾期至M3+且无还款
不确定 (Indeterminate) 表现期结束时仍处于逾期状态但未达坏标准 状态模糊,通常从建模样本中剔除 逾期30天后,在第90天仅还部分款项
策略提示: 在催收早期(如M1),坏客户的定义可适当放宽(如逾期超过90天),以增加样本量;在催收后期(如M3+),坏客户应严格定义为“无任何还款动作”或“失联”。

4.1.2 样本定义的业务考量

  • 账龄 (Vintage) 一致性: 确保好/坏客户来自相同的放款时间窗口,避免因宏观经济周期不同导致模型偏差。
  • 催收策略干扰: 如果某个客户因为被强力催收而还款,他可能本质上是“坏”的,但被策略干预成了“好”。建模时需考虑剔除受极端策略影响的样本,或引入策略变量。
  • 样本比例: 催收场景中坏客户比例通常较高(相比审批)。建议好坏比例控制在 1:1 到 3:1 之间,若坏样本过少,可考虑下采样或调整权重。

4.2 观察期与表现期设定

评分卡模型需要明确两个时间窗口:观察期(用于提取特征)和表现期(用于定义好坏标签)。两者的设定直接影响模型的预测能力与稳定性。

4.2.1 时间窗口概念

观察期与表现期时间轴示意图 观察期 (Observation) 提取特征变量 (如:过去6个月还款行为) 时间轴 表现期 (Performance) 定义好坏标签 (如:观察期后3个月是否还款) T0 放款日 T1 观察期结束 T2 表现期结束 关键原则:观察期与表现期不能重叠,且表现期长度需覆盖足够多的还款事件

4.2.2 窗口长度设定建议

参数 推荐长度 选择依据
观察期 6 ~ 12 个月 需包含足够的历史还款行为、催收接触记录;过短则特征不稳定,过长则样本量减少
表现期 3 ~ 6 个月 需覆盖从逾期到核销的完整周期;M1账户建议3个月,M3+账户建议6个月
表现期起点 观察期结束日 确保特征与标签在时间上严格分离,避免未来信息泄露
常见陷阱: 表现期过短(如1个月)会导致大量“不确定”样本,且无法区分“暂时性逾期”与“永久性坏账”;表现期过长(如12个月)则样本时效性差,模型无法反映近期催收策略的变化。

4.3 数据清洗与缺失值处理

原始数据通常包含噪声、异常值和缺失值。数据清洗的目标是提升数据质量,确保模型能够学习到真实的业务规律,而非数据录入错误。

4.3.1 数据清洗流程

  1. 去重: 检查并移除重复的客户ID或订单记录,通常以申请编号或合同号为主键。
  2. 异常值处理: 识别并处理不合逻辑的数据。例如:年龄为负数、联系次数超过1000次/天、逾期天数大于账龄等。
  3. 格式统一: 将日期、金额、电话号码等字段转换为标准格式,便于后续特征工程。
  4. 逻辑校验: 检查字段间的逻辑一致性。例如:还款日期应大于放款日期,逾期金额应小于总欠款额。

4.3.2 缺失值处理策略

缺失值在催收数据中非常常见(如:客户不接电话导致“最近联系时间”为空)。处理方式需结合业务含义:

缺失类型 常见字段 推荐处理方式 业务解释
完全随机缺失 客户收入、职业 中位数/众数填充,或单独作为“未知”类别 缺失与客户好坏无关,填充不影响模型
随机缺失 最近一次联系时长 模型预测填充(如KNN、回归) 缺失可能与其他变量(如催收次数)相关
非随机缺失 承诺还款日期 单独编码为“无承诺”或-1 缺失本身具有信息量:未承诺还款的客户更可能变坏
实战技巧: 对于催收评分卡,建议将“缺失”作为一个独立的分箱(Bin)处理。例如,对于“最近一次通话结果”字段,缺失值可以单独作为一个类别“未接通”,这往往是一个强预测变量。

4.3.3 数据清洗代码示例

import pandas as pd
import numpy as np

# 加载原始数据
df = pd.read_csv('collection_data.csv')

# 1. 去重
df = df.drop_duplicates(subset=['contract_id'])

# 2. 异常值处理:逾期天数不能大于账龄
df = df[df['overdue_days'] <= df['loan_age_days']]

# 3. 缺失值处理:对“承诺还款金额”字段,缺失填充为-1
df['promise_amount'] = df['promise_amount'].fillna(-1)

# 4. 对“最近联系结果”字段,缺失填充为“未知”
df['contact_result'] = df['contact_result'].fillna('未知')

# 5. 数值型字段缺失,使用中位数填充
df['call_duration'] = df['call_duration'].fillna(df['call_duration'].median())

print(f"清洗后数据量: {len(df)} 条")
print(f"缺失值统计:\n{df.isnull().sum()}")

4.4 本章小结

样本定义、时间窗口设定与数据清洗是评分卡开发的“地基”。一个清晰、一致且符合业务逻辑的样本定义,能够确保模型学习到正确的目标;合理的观察期与表现期设定,能够平衡特征稳定性与标签可靠性;而彻底的数据清洗与缺失值处理,则能避免模型被噪声误导。完成这三步后,我们才能进入下一阶段:特征工程与变量筛选。