3. 催收核心数据表结构解析:字段含义与关联关系
在催收特征工程中,理解底层数据表的结构是构建有效特征的前提。本章将深入解析催收系统中五张核心表:案件表、客户表、通话记录表、还款计划表和催收员操作表。我们将逐一拆解每张表的字段含义、业务逻辑以及表与表之间的关联关系,为后续的SQL特征提取打下坚实基础。
学习提示: 本章不涉及复杂的SQL代码,重点在于建立对数据模型的全局认知。建议读者在阅读时,对照自己实际工作中的数据字典进行印证,效果更佳。
3.1 五表全景图:核心实体与关系
催收业务的数据模型围绕“案件”这一核心实体展开。一个案件对应一笔逾期债务,关联一个客户、多条通话记录、一份还款计划以及一系列催收员操作记录。下图展示了五张表之间的核心关联关系。
核心关联逻辑: 案件表是催收数据模型的“中枢神经”。所有其他表(通话记录、还款计划、催收员操作)都通过
case_id 外键与案件表关联。客户表则通过 customer_id 与案件表关联,体现“一个客户可能有多笔逾期案件”的业务现实。
3.2 案件表 (case_info):催收的“主档案”
案件表是催收系统的核心,每一条记录代表一个独立的逾期案件。它记录了案件从产生到结案的全生命周期信息。
| 字段名 | 数据类型 | 字段含义 | 业务说明 |
|---|---|---|---|
case_id |
STRING | 案件唯一标识 | 主键,全局唯一 |
customer_id |
STRING | 客户ID | 关联客户表的外键 |
product_type |
STRING | 产品类型 | 如:现金贷、消费分期、信用卡 |
loan_amount |
DECIMAL | 借款金额 | 案件初始本金 |
overdue_days |
INT | 逾期天数 | 截至当前日期的逾期时长 |
overdue_amount |
DECIMAL | 逾期总金额 | 本金+利息+罚息+滞纳金 |
case_status |
STRING | 案件状态 | 如:催收中、已结清、核销、委外 |
assign_collector |
STRING | 当前催收员 | 负责该案件的催收员ID |
create_time |
DATETIME | 案件创建时间 | 逾期发生的日期 |
close_time |
DATETIME | 案件关闭时间 | 结清或核销的日期 |
注意:
overdue_days 通常是动态计算的字段,在数据仓库中可能以快照形式存储。在特征工程中,我们常使用 DATEDIFF(CURRENT_DATE, create_time) 来实时计算逾期天数,以确保特征的时效性。
3.3 客户表 (customer):债务人的“画像”
客户表存储债务人的静态信息和历史行为数据。一个客户可能拥有多个案件,因此客户表与案件表是“一对多”关系。
| 字段名 | 数据类型 | 字段含义 | 业务说明 |
|---|---|---|---|
customer_id |
STRING | 客户唯一标识 | 主键 |
name |
STRING | 客户姓名 | 脱敏处理 |
id_number |
STRING | 身份证号 | 脱敏处理 |
phone |
STRING | 手机号码 | 主要联系方式 |
age |
INT | 年龄 | 计算特征:年龄段 |
gender |
STRING | 性别 | M/F |
city |
STRING | 所在城市 | 可用于地域风险分析 |
income_level |
STRING | 收入等级 | 如:高、中、低 |
credit_score |
INT | 征信评分 | 外部征信机构提供 |
register_time |
DATETIME | 注册时间 | 客户首次注册日期 |
特征工程切入点: 客户表中的
age、city、income_level 等字段可直接作为基础特征。更高级的特征可以通过聚合客户的历史案件行为来生成,例如“该客户历史逾期次数”、“历史最大逾期天数”等。
3.4 通话记录表 (call_log):催收过程的“痕迹”
通话记录表记录了催收员与债务人(或联系人)之间的每一次通话详情。它是构建“催收强度”和“触达率”特征的核心数据源。
| 字段名 | 数据类型 | 字段含义 | 业务说明 |
|---|---|---|---|
call_id |
STRING | 通话记录唯一标识 | 主键 |
case_id |
STRING | 关联案件ID | 外键,关联案件表 |
caller |
STRING | 主叫方 | 催收员ID或系统外呼号码 |
callee |
STRING | 被叫方 | 债务人/联系人电话号码 |
call_type |
STRING | 通话类型 | 如:外呼、呼入、三方通话 |
call_result |
STRING | 通话结果 | 如:接通、无人接听、关机、空号、忙线 |
talk_duration |
INT | 通话时长(秒) | 仅接通时有值 |
call_start_time |
DATETIME | 通话开始时间 | 精确到秒 |
contact_relation |
STRING | 联系人关系 | 如:本人、配偶、父母、朋友 |
关键特征衍生: 基于通话记录表,可以衍生出大量高频特征,例如:
- 催收频次: 每日/每周/每月的总通话次数。
- 接通率: 接通次数 / 总通话次数。
- 平均通话时长: 总通话时长 / 接通次数。
- 有效通话占比: 通话时长超过30秒的通话占比。
- 联系人多维度: 是否联系到本人、联系到本人的次数等。
3.5 还款计划表 (repay_plan):债务的“时间轴”
还款计划表记录了每笔案件的还款计划明细,包括每期应还金额、应还日期、实际还款情况等。它是判断债务人还款意愿和还款能力的重要依据。
| 字段名 | 数据类型 | 字段含义 | 业务说明 |
|---|---|---|---|
plan_id |
STRING | 还款计划唯一标识 | 主键 |
case_id |
STRING | 关联案件ID | 外键 |
period_num |
INT | 期数序号 | 第1期、第2期... |
due_date |
DATE | 应还日期 | 该期计划的最后还款日 |
due_amount |
DECIMAL | 应还金额 | 该期应还本金+利息 |
actual_pay_date |
DATE | 实际还款日期 | NULL表示未还 |
actual_pay_amount |
DECIMAL | 实际还款金额 | 部分还款时小于应还金额 |
pay_status |
STRING | 还款状态 | 如:未还、部分还款、已还清、逾期 |
注意: 在特征工程中,
due_date 与 actual_pay_date 的差值可以计算出“还款延迟天数”。对于多期案件,可以通过分析历史各期的还款行为(如是否经常逾期、是否部分还款)来构建“还款意愿”特征。
3.6 催收员操作表 (action_log):催收动作的“日志”
催收员操作表记录了催收员在案件上执行的所有操作,包括电话外呼、发送短信、标记催收结果、申请减免、发起委外等。它是分析催收员行为模式和案件处理效率的关键数据源。
| 字段名 | 数据类型 | 字段含义 | 业务说明 |
|---|---|---|---|
action_id |
STRING | 操作记录唯一标识 | 主键 |
case_id |
STRING | 关联案件ID | 外键 |
collector_id |
STRING | 催收员ID | 执行操作的催收员 |
action_type |
STRING | 操作类型 | 如:外呼、发送短信、标记承诺还款、申请减免、提交委外 |
action_result |
STRING | 操作结果 | 如:成功、失败、待确认 |
action_content |
TEXT | 操作内容/备注 | 催收员填写的备注信息 |
action_time |
DATETIME | 操作时间 | 精确到秒 |
contact_type |
STRING | 联系类型 | 如:电话、短信、微信、上门 |
特征工程切入点: 催收员操作表可以用于构建“催收员效率”特征,例如:
- 操作频次: 每日/每周的操作次数。
- 操作多样性: 使用的操作类型数量。
- 承诺还款率: 标记“承诺还款”的次数占比。
- 案件处理速度: 从案件分配到首次操作的时间间隔。
3.7 表关联关系总结:SQL JOIN 的“地图”
理解表之间的关联关系,是编写正确SQL查询的前提。下表总结了五张表之间的主要关联路径。
| 主表 | 关联表 | 关联键 | 关联类型 | 业务含义 |
|---|---|---|---|---|
case_info |
customer |
customer_id |
LEFT JOIN | 获取案件对应的客户信息 |
case_info |
call_log |
case_id |
LEFT JOIN | 获取案件的所有通话记录 |
case_info |
repay_plan |
case_id |
LEFT JOIN | 获取案件的还款计划明细 |
case_info |
action_log |
case_id |
LEFT JOIN | 获取案件的催收员操作记录 |
call_log |
action_log |
case_id + call_start_time ≈ action_time |
LEFT JOIN | 将通话记录与催收员操作关联(时间近似匹配) |
SQL 实战提示: 在后续章节中,我们将大量使用
LEFT JOIN 将案件表作为驱动表,关联其他子表进行特征聚合。例如:SELECT
c.case_id,
c.overdue_days,
COUNT(cl.call_id) AS total_calls,
AVG(cl.talk_duration) AS avg_talk_duration
FROM case_info c
LEFT JOIN call_log cl ON c.case_id = cl.case_id
GROUP BY c.case_id, c.overdue_days;