3. 数据探索与理解

在保险理赔Severity(损失金额)预测项目中,数据探索与理解是决定后续建模上限的关键环节。很多团队急于套用XGBoost或LightGBM,却忽略了字段语义、目标分布和脏数据形态,最终模型离线指标尚可、上线后赔付预测偏差巨大。本节围绕三件事展开:字段解析、目标变量分布诊断、缺失值与异常值初步识别,并给出可直接复用的探索流程与代码骨架。

一、核心原理:为什么Severity预测必须先做分布与字段体检

理赔Severity通常指单次事故的赔付金额,具有三个典型统计特征:右偏重尾、零膨胀或低值聚集、多峰混合。右偏意味着少数大额理赔主导了均值,若直接以MSE训练,模型会被极端值牵引;零膨胀意味着大量小额或零赔付案件与真正的大额案件混在一起,需要区分“是否赔付”与“赔多少”两个子问题。字段解析则决定了特征工程的方向:哪些字段是事故发生时可知的(如车型、地区、天气),哪些是事后才产生的(如定损金额、维修工时),后者若误入特征会造成标签泄漏。

核心判断:Severity建模的第一步不是调参,而是确认目标变量的分布形态与字段的时间可用性。分布决定损失函数与变换方式,字段可用性决定特征集合的合法性。

二、方法流程:从字段清单到分布诊断的四步法

  1. 字段分类:按业务含义将字段分为保单信息、车辆信息、事故信息、人员信息、理赔流程信息五类,并标注每个字段的“事故时可知/事后可知”。
  2. 目标变量统计:计算均值、中位数、分位数、偏度、峰度,绘制直方图与对数直方图,判断是否需要log变换。
  3. 缺失值画像:统计缺失率、缺失模式(随机缺失/系统性缺失),区分“业务上不存在”与“数据未采集”。
  4. 异常值初筛:用IQR、分位数截断、业务规则三重方式识别异常,但暂不删除,先标记待复核。

下面是一段可直接运行的探索代码骨架,覆盖字段类型统计、目标分布与缺失值概览:

import pandas as pd
import numpy as np

df = pd.read_csv("claims_severity.csv")

# 1. 字段类型与缺失概览
field_profile = pd.DataFrame({
    "dtype": df.dtypes,
    "missing_rate": df.isna().mean().round(4),
    "n_unique": df.nunique()
})
print(field_profile.sort_values("missing_rate", ascending=False).head(20))

# 2. 目标变量分布诊断
target = df["severity_amount"]
print("mean=%.2f median=%.2f skew=%.2f kurt=%.2f" % (
    target.mean(), target.median(), target.skew(), target.kurt()))
print(target.quantile([0.5, 0.9, 0.95, 0.99, 0.999]))

# 3. 对数变换后的分布对比
log_target = np.log1p(target)
print("log skew=%.2f" % log_target.skew())

# 4. 缺失模式:按事故类型分组看缺失率
print(df.groupby("accident_type")["repair_hours"].apply(
    lambda s: s.isna().mean()).round(3))

三、可视化:理赔数据探索的关键对象关系

下图把本节最值得看清的对象放在同一张图中:左侧是字段按“事故时可知/事后可知”的划分,中间是目标变量的右偏分布与log变换后的近似对称分布对比,右侧是缺失值与异常值的初步识别路径。它帮助你在动手建模前建立一张“数据体检地图”。

理赔Severity数据探索地图 字段可用性划分 事故时可知 车型 / 地区 / 天气 / 驾龄 事后可知(慎用) 定损金额 / 维修工时 / 赔付 标签泄漏风险 事后字段入特征 → 离线虚高 上线后无法获取 → 预测失效 目标变量分布诊断 原始 severity_amount(右偏) 少数大额理赔拉长右尾 log1p 变换后(近似对称) 偏度下降,适合MSE/分位数损失 建议:log变换 + 分位数损失双轨验证 关注P95/P99分位而非仅看均值 缺失值与异常值初筛 缺失率分层 <5% 可填充 / 5%-30% 需建模 / >30% 慎用 缺失模式 随机缺失 vs 系统性缺失(按险种分组) 异常值三重识别 IQR / 分位数截断 / 业务规则 先标记,不删除,待业务复核

四、案例/场景:一次车险Severity探索的真实复盘

某车险团队拿到12万条理赔记录,初始字段48个。第一轮探索发现:severity_amount均值8600元、中位数3200元、偏度4.7,P99达到68000元。直接训练MSE模型后,验证集MAE为4100元,但大额案件预测普遍偏低30%以上。复盘发现三个问题:其一,repair_hours缺失率42%,且缺失集中在“快速理赔”通道,属于系统性缺失,简单均值填充引入了偏差;其二,total_loss_flag(全损标志)与severity高度相关,但该字段在事故报案时不可知,属于事后字段,误入特征导致离线AUC虚高;其三,存在severity为负数的记录17条,经查为冲正数据,需单独处理而非当作异常删除。

调整后,团队采用log1p变换目标、将缺失率高于30%的事后字段移出特征集、对负数记录标记为“冲正”并单独建模,验证集MAE降至2900元,大额案件预测偏差收敛到12%以内。

五、误区与复盘:数据探索阶段最常见的五个坑

误区表现后果纠正方式
只看均值不看分位数均值被大额理赔拉高模型对小额案件高估同时输出P50/P90/P99
事后字段入特征定损金额、维修工时参与训练标签泄漏,上线失效建立字段可用性清单
缺失值一律均值填充系统性缺失被掩盖引入偏差,低估风险按业务分组看缺失模式
异常值直接删除负数、极大值被丢弃丢失冲正、全损等真实业务先标记,业务复核后再处理
忽略零膨胀零赔付与小额赔付混在一起分布多峰,模型难以拟合拆分“是否赔付”与“赔多少”
特别提醒:在保险理赔场景中,“异常值”往往不是错误数据,而是真实业务中的特殊案件(全损、人伤、诉讼、冲正)。直接删除会系统性低估尾部风险,而尾部风险恰恰是Severity预测最需要覆盖的部分。
实操建议:在探索阶段就建立一份“字段字典”,记录每个字段的业务含义、事故时是否可知、缺失率、异常处理策略。这份字典将直接决定后续特征工程与模型监控的基线,避免反复返工。

完成本节的数据探索后,你应当能够回答三个问题:目标变量是否需要变换、哪些字段可以合法入模、缺失与异常应如何标记而非粗暴处理。这三个答案,将直接决定第4章特征工程的方向与第5章模型选择的损失函数设计。