3. 催收数据表结构解析:客户信息表、账户表、还款计划表、催收记录表、通话记录表的字段与关系
催收特征工程的第一步,是深入理解底层数据表的结构与关联关系。催收系统通常围绕“客户-账户-还款-催收-通话”五张核心表构建数据模型。本章将逐一解析每张表的字段含义、主键与外键,以及表之间的连接路径,为后续SQL特征筛选打下坚实基础。
3.1 五张核心表概览
下表列出了催收数据仓库中最常见的五张表及其核心定位:
| 表名 | 英文名(示例) | 核心定位 | 粒度 |
|---|---|---|---|
| 客户信息表 | customer_info | 客户身份、人口统计、信用评分 | 每个客户一条记录 |
| 账户表 | account_info | 贷款合同、额度、余额、状态 | 每个账户一条记录 |
| 还款计划表 | repayment_schedule | 每期应还金额、应还日、实还日 | 每期还款计划一条记录 |
| 催收记录表 | collection_record | 催收动作、催收员、结果、承诺 | 每次催收动作一条记录 |
| 通话记录表 | call_record | 通话时间、时长、接通状态、录音 | 每次通话一条记录 |
实战提示:在实际生产环境中,表名可能带有业务前缀或分区后缀(如
ods_collection_record_di),但核心字段结构基本一致。建议先通过 DESCRIBE table_name; 或 SHOW COLUMNS FROM table_name; 确认字段名后再编写特征SQL。
3.2 客户信息表(customer_info)
客户信息表是催收分析的起点,记录了客户的基础属性。常用字段包括:
- customer_id(主键):客户唯一标识,通常为字符串或整数。
- name:客户姓名。
- id_number:身份证号(脱敏或加密存储)。
- gender:性别(M/F)。
- age:年龄或出生日期。
- education:教育程度(高中/大专/本科/硕士等)。
- marital_status:婚姻状况(已婚/未婚/离异)。
- income_level:收入等级或月收入区间。
- city / province:居住城市/省份。
- credit_score:内部信用评分或外部征信评分。
- register_date:注册日期。
- customer_status:客户状态(正常/黑名单/注销)。
特征价值:客户信息表常用于生成“人口统计特征”(如年龄分段、收入等级)和“信用画像特征”(如信用评分区间),是催收策略分层的基础。
3.3 账户表(account_info)
账户表记录每笔贷款合同的核心信息,是连接客户与还款计划的桥梁。关键字段:
- account_id(主键):账户唯一标识。
- customer_id(外键):关联客户信息表。
- product_type:产品类型(如现金贷/消费分期/抵押贷)。
- loan_amount:贷款本金。
- interest_rate:年化利率。
- loan_term:贷款期数(如3期/6期/12期)。
- disburse_date:放款日期。
- due_date:到期日期。
- overdue_days:当前逾期天数。
- overdue_amount:当前逾期金额。
- total_balance:剩余应还总额(本金+利息+罚息)。
- account_status:账户状态(正常/逾期/核销/结清)。
注意:账户表与客户表是一对多关系——一个客户可能拥有多个账户(多笔贷款)。在特征聚合时,务必按
customer_id 分组,避免重复计算。
3.4 还款计划表(repayment_schedule)
还款计划表记录每期应还明细,是计算逾期天数、逾期期数、还款行为特征的核心数据源。字段结构:
- schedule_id(主键):还款计划唯一标识。
- account_id(外键):关联账户表。
- period:期数序号(第1期、第2期……)。
- due_date:应还日期。
- principal_due:应还本金。
- interest_due:应还利息。
- total_due:应还总额(本金+利息)。
- actual_pay_date:实际还款日期(NULL表示未还)。
- actual_pay_amount:实际还款金额。
- overdue_flag:是否逾期(0/1)。
- overdue_days:该期实际逾期天数。
实战技巧:通过
actual_pay_date 与 due_date 的差值,可以精确计算每期逾期天数。利用 overdue_flag 可以快速统计“历史逾期期数”和“连续逾期期数”等强预测力特征。
3.5 催收记录表(collection_record)
催收记录表存储每一次催收动作的详细信息,是生成“催收强度”、“催收响应”、“承诺还款”等行为特征的核心表。字段包括:
- record_id(主键):催收记录唯一标识。
- account_id(外键):关联账户表。
- collector_id:催收员ID。
- collection_time:催收时间(精确到秒)。
- collection_type:催收方式(电话/短信/上门/信函/法务)。
- collection_result:催收结果(接通/无人接听/拒接/承诺还款/投诉等)。
- promise_pay_date:承诺还款日期(如有)。
- promise_pay_amount:承诺还款金额(如有)。
- remark:催收备注文本。
特征价值:催收记录表可以衍生出“近7天催收次数”、“平均催收间隔”、“承诺还款兑现率”、“不同催收方式的效果”等关键特征,直接用于催收策略优化。
3.6 通话记录表(call_record)
通话记录表专门记录电话催收的通话详情,与催收记录表通过 record_id 或 account_id + collection_time 关联。字段结构:
- call_id(主键):通话唯一标识。
- record_id(外键):关联催收记录表。
- caller_number:催收员号码(脱敏)。
- callee_number:客户号码(脱敏)。
- call_start_time:通话开始时间。
- call_end_time:通话结束时间。
- call_duration:通话时长(秒)。
- call_status:通话状态(接通/未接通/忙音/关机/空号)。
- ring_duration:振铃时长(秒)。
- recording_url:录音文件路径(脱敏)。
注意:并非所有催收记录都有对应的通话记录(如短信催收、上门催收)。在关联时建议使用
LEFT JOIN,并注意 call_status 字段的枚举值清洗。
3.7 五表关系与ER图
五张表通过主键与外键形成星型或雪花型数据模型。核心关联路径如下:
- 客户信息表 ←→ 账户表:通过
customer_id一对多关联。 - 账户表 ←→ 还款计划表:通过
account_id一对多关联。 - 账户表 ←→ 催收记录表:通过
account_id一对多关联。 - 催收记录表 ←→ 通话记录表:通过
record_id一对一或一对多关联(视业务设计)。
3.8 表关联SQL实战示例
以下SQL展示了如何将五张表关联起来,提取一个客户维度的催收特征宽表:
SELECT
c.customer_id,
a.account_id,
a.loan_amount,
a.overdue_days,
a.overdue_amount,
COUNT(DISTINCT rs.schedule_id) AS total_installments,
SUM(CASE WHEN rs.overdue_flag = 1 THEN 1 ELSE 0 END) AS overdue_installments,
COUNT(DISTINCT cr.record_id) AS total_collection_actions,
COUNT(DISTINCT CASE WHEN cr.collection_result = '接通' THEN cr.record_id END) AS connected_calls,
COUNT(DISTINCT cl.call_id) AS total_calls,
AVG(cl.call_duration) AS avg_call_duration_sec
FROM customer_info c
LEFT JOIN account_info a ON c.customer_id = a.customer_id
LEFT JOIN repayment_schedule rs ON a.account_id = rs.account_id
LEFT JOIN collection_record cr ON a.account_id = cr.account_id
LEFT JOIN call_record cl ON cr.record_id = cl.record_id
WHERE a.account_status IN ('逾期', '正常')
GROUP BY c.customer_id, a.account_id, a.loan_amount, a.overdue_days, a.overdue_amount;
SQL要点:
- 使用
LEFT JOIN确保主表数据不丢失,即使某些表无匹配记录。 - 聚合函数配合
CASE WHEN实现条件计数,是特征筛选的常用技巧。 - 建议先在小数据集上验证关联逻辑,避免笛卡尔积导致性能问题。
3.9 常见数据质量问题与处理建议
| 问题类型 | 具体表现 | 处理建议 |
|---|---|---|
| 字段缺失 | 客户信息表中 income_level 为NULL |
使用中位数填充或单独标记“未知”类别 |
| 重复记录 | 催收记录表中同一催收动作被重复录入 | 按 record_id 去重,或按时间+催收员去重 |
| 时间戳异常 | 通话结束时间早于开始时间 | 过滤或标记为无效记录,计算时长时取绝对值 |
| 外键断裂 | 还款计划表中的 account_id 在账户表中不存在 |
使用 LEFT JOIN 并检查NULL,定期数据质量监控 |
| 枚举值不一致 | 催收结果字段出现“接通”、“已接通”、“接听”等不同写法 | 建立标准枚举映射表,统一清洗为标准化值 |
核心原则:在特征筛选之前,务必完成数据质量探查(Profiling)。建议使用
SELECT COUNT(*), COUNT(DISTINCT ...), SUM(CASE WHEN ... IS NULL THEN 1 ELSE 0 END) 等SQL语句,系统性地检查每张表的完整性、唯一性和一致性。