3. 数据准备
在保单继续率建模中,数据准备往往决定模型上限。继续率建模的目标通常是预测“某张保单在观察窗口内是否继续有效”,因此数据必须同时具备时间维度、状态维度与解释变量维度。本节围绕数据来源、数据清洗、数据探索三个环节,给出可落地的操作框架。
一、核心原理:继续率建模的数据结构
继续率建模的数据不是一张简单的宽表,而是由保单主表、缴费表、理赔表、渠道表、产品表等多源数据拼接而成。其核心结构可理解为:
- 观察点:每张保单在某个时间点被判定为“继续”或“失效/退保”。
- 观察窗口:如13个月继续率、25个月继续率,窗口不同,标签定义不同。
- 特征时间窗:只能用观察点之前的信息,避免未来信息泄露。
- 标签:二分类(继续/不继续),也可做多分类(继续、退保、失效、理赔终止)。
关键原则:任何特征的计算截止时间必须早于标签观察点,否则模型会“偷看未来”,导致线上效果大幅下降。
二、数据来源:多源整合与口径统一
继续率建模常见数据来源包括:
| 数据域 | 典型字段 | 用途 |
|---|---|---|
| 保单主表 | 保单号、承保日期、保费、缴费年期、险种 | 基础标识与产品特征 |
| 缴费记录 | 缴费日期、缴费金额、缴费方式、逾期天数 | 缴费行为特征 |
| 客户信息 | 年龄、性别、地区、职业 | 客户画像特征 |
| 渠道与代理人 | 渠道代码、代理人编号、职级 | 渠道质量特征 |
| 服务与理赔 | 保全次数、理赔金额、投诉记录 | 服务交互特征 |
整合时建议以保单号+观察点为主键,采用左连接方式保留所有待评估保单。对于多源时间字段,统一转换为日期类型,并明确“承保日、生效日、缴费日、观察日”的口径差异。
三、数据清洗:从原始表到建模宽表
清洗流程可归纳为以下步骤:
- 去重:按保单号+观察点去重,保留最新状态。
- 缺失值处理:数值型用中位数或分组均值填充;类别型单独设“未知”类别。
- 异常值处理:如年龄>100、保费为负、缴费日期早于承保日期,需修正或剔除。
- 标签生成:根据观察窗口判定继续状态,注意退保、失效、理赔终止的区分。
- 特征衍生:如缴费逾期次数、最近一次缴费距观察点天数、保单年龄等。
# 示例:标签生成与特征时间窗控制
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。这说明数据准备不是“跑通即可”,而是需要反复校验口径与时间边界。
建议在数据准备阶段就建立数据字典与特征血缘表,记录每个字段的来源、计算逻辑、时间窗口与责任人,便于后续模型迭代与审计。