3. 数据准备

在保单继续率建模中,数据准备往往决定模型上限。继续率建模的目标通常是预测“某张保单在观察窗口内是否继续有效”,因此数据必须同时具备时间维度、状态维度与解释变量维度。本节围绕数据来源、数据清洗、数据探索三个环节,给出可落地的操作框架。

一、核心原理:继续率建模的数据结构

继续率建模的数据不是一张简单的宽表,而是由保单主表、缴费表、理赔表、渠道表、产品表等多源数据拼接而成。其核心结构可理解为:

  • 观察点:每张保单在某个时间点被判定为“继续”或“失效/退保”。
  • 观察窗口:如13个月继续率、25个月继续率,窗口不同,标签定义不同。
  • 特征时间窗:只能用观察点之前的信息,避免未来信息泄露。
  • 标签:二分类(继续/不继续),也可做多分类(继续、退保、失效、理赔终止)。
关键原则:任何特征的计算截止时间必须早于标签观察点,否则模型会“偷看未来”,导致线上效果大幅下降。

二、数据来源:多源整合与口径统一

继续率建模常见数据来源包括:

数据域典型字段用途
保单主表保单号、承保日期、保费、缴费年期、险种基础标识与产品特征
缴费记录缴费日期、缴费金额、缴费方式、逾期天数缴费行为特征
客户信息年龄、性别、地区、职业客户画像特征
渠道与代理人渠道代码、代理人编号、职级渠道质量特征
服务与理赔保全次数、理赔金额、投诉记录服务交互特征

整合时建议以保单号+观察点为主键,采用左连接方式保留所有待评估保单。对于多源时间字段,统一转换为日期类型,并明确“承保日、生效日、缴费日、观察日”的口径差异。

三、数据清洗:从原始表到建模宽表

清洗流程可归纳为以下步骤:

  1. 去重:按保单号+观察点去重,保留最新状态。
  2. 缺失值处理:数值型用中位数或分组均值填充;类别型单独设“未知”类别。
  3. 异常值处理:如年龄>100、保费为负、缴费日期早于承保日期,需修正或剔除。
  4. 标签生成:根据观察窗口判定继续状态,注意退保、失效、理赔终止的区分。
  5. 特征衍生:如缴费逾期次数、最近一次缴费距观察点天数、保单年龄等。
# 示例:标签生成与特征时间窗控制
import pandas as pd

df['observe_date'] = df['issue_date'] + pd.DateOffset(months=13)
df['is_persist'] = (df['last_pay_date'] >= df['observe_date']).astype(int)

# 特征只能用观察点之前的数据
df['days_since_last_pay'] = (df['observe_date'] - df['last_pay_date']).dt.days
df.loc[df['last_pay_date'] > df['observe_date'], 'days_since_last_pay'] = -1
常见误区:用全量数据计算均值填充缺失值,会把未来信息带入训练集。正确做法是按时间切分后,仅用训练集统计量填充。

四、数据探索:分布、相关性与时间趋势

探索阶段重点回答三个问题:标签是否平衡、特征是否有区分度、时间上是否稳定。

  • 标签分布:继续率通常在70%~95%,需关注类别不平衡。
  • 单变量分析:数值型看分位数与分布,类别型看继续率差异。
  • 相关性分析:避免高度共线特征,如保费与保额。
  • 时间稳定性:按月统计继续率,观察是否存在季节性波动。
继续率建模数据准备:来源→清洗→探索 数据来源 保单主表 / 缴费记录 客户 / 渠道 / 理赔 数据清洗 去重 / 缺失 / 异常 标签生成 / 特征衍生 数据探索 分布 / 相关性 时间趋势 / 稳定性 关键检查清单 ① 观察点是否统一? ② 特征是否早于观察点? ③ 标签是否区分退保/失效? ④ 缺失值是否按时间切分填充? ⑤ 类别型是否设“未知”? ⑥ 是否检查月度继续率波动? ⑦ 是否保留保单号用于回溯? ⑧ 是否记录数据版本与生成时间?

五、案例与复盘:一次继续率建模的数据准备

某寿险公司做13个月继续率建模,初期AUC仅0.62。复盘发现:

  • 缴费记录中“最近缴费日期”直接用了全量最新值,导致未来信息泄露。
  • 缺失值用全量均值填充,训练集与测试集分布不一致。
  • 标签未区分“退保”与“失效”,把两类合并为“不继续”,噪声较大。

修正后:按观察点截断特征、按时间切分填充、标签拆分为多分类,AUC提升至0.78。这说明数据准备不是“跑通即可”,而是需要反复校验口径与时间边界。

建议在数据准备阶段就建立数据字典与特征血缘表,记录每个字段的来源、计算逻辑、时间窗口与责任人,便于后续模型迭代与审计。