4. 数据准备与探索

在非寿险费率因子分层与相对风险定价的整个建模链条中,数据准备与探索往往占据60%以上的工作量,却直接决定后续分层是否合理、相对风险系数是否可信。本节围绕数据来源、清洗、缺失值、异常值与分布探索五个环节,建立一套可复用的数据准备流程。

一、核心原理:数据质量决定风险刻画的精度

费率因子分层的本质,是把保单群体按风险特征切分为若干同质组,并估计每组相对基准组的风险水平。若原始数据存在重复保单、错误保额、缺失车型或极端赔付,分层边界会被扭曲,相对风险系数出现系统性偏差。因此数据准备的目标不是“把数据变干净”这么简单,而是保证风险暴露、赔付金额、因子取值三者在同一张保单记录上保持逻辑一致。

数据准备的四项基本原则:
1. 可追溯:每条清洗规则都要记录来源与影响行数;
2. 可复现:清洗脚本版本化,避免手工修改;
3. 业务可解释:异常值判定需结合承保与理赔规则;
4. 分层可用:因子取值需具备足够样本量与稳定分布。

二、数据来源与整合

非寿险定价数据通常来自多个系统:核心承保系统提供保单、标的、因子字段;理赔系统提供赔案、赔付金额与进展状态;再保与财务系统提供摊回与费用数据;外部数据包括车型库、地区风险等级、气象或地理编码。整合时以保单号+标的序号为主键,以事故日期为时间轴,构建“保单—赔案—因子”三表关联。

数据域典型字段常见问题处理要点
保单信息保单号、起止日期、保额、保费日期重叠、保额为零按保单期拆分暴露期
标的因子车型、车龄、使用性质、地区编码不统一、缺失映射标准码表
赔案信息赔案号、事故日期、赔付金额重复报案、零结案去重并区分已决未决
外部数据车型风险等级、地区编码版本过期按事故期匹配版本

三、数据清洗与缺失值处理

清洗顺序建议为:去重 → 格式标准化 → 逻辑校验 → 缺失值处理 → 异常值识别。逻辑校验包括:保单起期不得晚于止期、事故日期须落在保险期间内、赔付金额不得为负、车龄不得为负且不超过合理上限。

缺失值处理需区分三类机制:完全随机缺失、随机缺失、非随机缺失。对于因子字段,若缺失比例低于5%,可用众数或分组中位数填补;若介于5%~20%,建议增设“未知”分层,把缺失本身作为一种风险信号;若超过20%,应评估该因子是否值得进入模型。对于赔付金额缺失,不可简单填零,应结合是否已决、是否零结案判断。

# 示例:缺失值分层标记
df['vehicle_age_missing'] = df['vehicle_age'].isna().astype(int)
df['vehicle_age_filled'] = df.groupby('usage_type')['vehicle_age'] \
    .transform(lambda s: s.fillna(s.median()))
# 缺失比例统计
missing_rate = df.isna().mean().sort_values(ascending=False)
print(missing_rate.head(10))
提示:把“缺失”转化为显式分层变量,往往比强行填补更能保留风险信息,尤其在核保信息不全的业务线中。

四、异常值识别与因子分布探索

异常值识别应结合统计规则与业务规则。统计上可用箱线图、Z分数、分位数截断;业务上需识别保额异常高、赔付远超保额、车龄极端、地区编码错误等。对于赔付金额,建议采用赔付率而非绝对金额进行异常判定,因为大保额保单的绝对赔付天然更高。

# 示例:基于分位数的异常值标记
q1, q3 = df['loss_ratio'].quantile([0.25, 0.75])
iqr = q3 - q1
lower, upper = q1 - 1.5*iqr, q3 + 1.5*iqr
df['loss_ratio_outlier'] = ((df['loss_ratio'] < lower) |
                            (df['loss_ratio'] > upper)).astype(int)
print(df['loss_ratio_outlier'].mean())

因子分布探索的目标是判断分层是否必要、边界是否合理。常用方法包括:直方图观察连续因子分布、柱状图观察类别因子集中度、分组赔付率曲线观察风险单调性、热力图观察两因子交互。若某因子各层级赔付率差异很小,说明该因子区分度弱;若某层级样本量过少,应合并相邻层级。

数据准备与因子分布探索路径 多源数据整合 保单·赔案·外部 清洗与校验 去重·逻辑·格式 缺失值处理 填补·未知分层 异常值识别 统计+业务规则 因子分布探索:车龄分层赔付率示意 0-2年 0.62 3-5年 0.78 6-8年 0.95 9-12年 1.12 12年以上 1.30 相对赔付率随车龄上升,分层边界可设在3年、6年、9年

五、案例场景:车险车龄因子分层

某车险业务线拟对“车龄”进行分层定价。原始数据包含12万条保单,车龄字段缺失率8%,赔付率存在少量极端值。处理步骤:先按保单号去重,剔除保额为0的记录;对车龄缺失增设“未知”层;用分位数法标记赔付率异常并单独复核;绘制车龄分组赔付率柱状图。结果显示,车龄与赔付率呈单调上升关系,0~2年相对赔付率0.62,12年以上达1.30,说明车龄具备明显区分度,可划分为五层。

误区复盘:
1. 直接用均值填补车龄,导致高龄车风险被低估;
2. 把零结案直接删除,造成赔付率虚高;
3. 异常值一律删除,忽略大额赔案的真实风险信息;
4. 分层过细导致某些层级样本不足,相对风险系数波动剧烈。

完成数据准备与探索后,应输出一份数据质量报告,记录各因子缺失率、异常率、分层样本量与赔付率分布,作为后续因子分层与相对风险定价的输入依据。