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图

五张表通过主键与外键形成星型或雪花型数据模型。核心关联路径如下:

  1. 客户信息表 ←→ 账户表:通过 customer_id 一对多关联。
  2. 账户表 ←→ 还款计划表:通过 account_id 一对多关联。
  3. 账户表 ←→ 催收记录表:通过 account_id 一对多关联。
  4. 催收记录表 ←→ 通话记录表:通过 record_id 一对一或一对多关联(视业务设计)。
催收核心五表关系ER图 客户信息表 customer_id (PK) name, age, gender credit_score, city 账户表 account_id (PK) customer_id (FK) loan_amount, status 还款计划表 schedule_id (PK) account_id (FK) due_date, actual_pay_date 催收记录表 record_id (PK) account_id (FK) collection_type, result 通话记录表 call_id (PK) record_id (FK) call_duration, status 1 : N 1 : N 1 : N 1 : 1 图例说明: PK = 主键(Primary Key) | FK = 外键(Foreign Key) | 1:N = 一对多关系 | 1:1 = 一对一关系 所有表通过 account_id 或 customer_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语句,系统性地检查每张表的完整性、唯一性和一致性。