3. 数据准备与探索
在非寿险GLM纯保费定价项目中,数据准备与探索往往占据整个项目60%以上的工作量。模型再精妙,如果输入数据存在缺失、异常或口径不一致,最终费率因子也会失真。本章围绕数据来源、清洗、缺失值与异常值处理、描述性统计、可视化探索和变量分布分析六个环节,构建一条从原始保单到可建模数据集的完整链路。
一、核心原理:为什么数据准备决定定价上限
纯保费定价的目标是估计 E[Loss] = Frequency × Severity,其中频率与案均赔款分别服从泊松/负二项与伽马/对数正态分布。GLM对数据有明确假设:自变量取值需稳定、因变量需满足指数族分布、曝光量需作为权重或偏移项。若原始数据中混入未决赔案、重复保单、极端大额赔款或缺失的车辆使用性质,模型系数会被严重扭曲。
数据准备的核心原则可归纳为三点:口径一致(承保口径与理赔口径对齐)、可追溯(每一步清洗都留痕)、业务可解释(异常值处理需经核保/理赔确认,而非机械删除)。
关键公式:纯保费 = 赔付总额 / 风险暴露量。因此数据准备必须同时保证“分子”(赔款)与“分母”(暴露量)的准确性,任何一侧出错都会直接传导至费率。
二、方法流程:六步数据工程链路
下图展示了从多源数据到建模宽表的完整数据流,包含数据来源、清洗、缺失值、异常值、描述统计与可视化探索六个环节,并标注了每一步的关键产出。
三、数据来源与清洗实操
非寿险定价数据通常来自三个系统:核心承保系统(保单、批单、标的)、理赔系统(报案、立案、赔付、未决)和再保/财务系统(分出、摊回)。整合时需以保单号+险别+起保日期为主键,构建“保单-赔案”一对多关系。
清洗阶段重点处理四类问题:重复保单、批单追溯、币种与金额单位、时间口径。以下Python片段展示典型清洗步骤:
import pandas as pd
import numpy as np
# 1. 读取承保与理赔数据
policy = pd.read_csv("policy.csv", parse_dates=["start_date", "end_date"])
claim = pd.read_csv("claim.csv", parse_dates=["accident_date", "report_date"])
# 2. 去重:同一保单号+险别+起保日期仅保留最新批单
policy = policy.sort_values("batch_no").drop_duplicates(
subset=["policy_no", "coverage", "start_date"], keep="last")
# 3. 口径对齐:仅保留事故日期在保单有效期内的赔案
claim = claim.merge(policy[["policy_no", "start_date", "end_date"]], on="policy_no")
claim = claim[(claim["accident_date"] >= claim["start_date"]) &
(claim["accident_date"] <= claim["end_date"])]
# 4. 暴露量计算:以年为单位
policy["exposure"] = (policy["end_date"] - policy["start_date"]).dt.days / 365.0
建议在清洗后立即生成数据质量报告:记录每步删除的行数、原因和占比。若某一步删除超过5%的样本,需回溯业务原因,避免系统性偏差。
四、缺失值与异常值处理
缺失值处理需区分三类机制:完全随机缺失(MCAR)、随机缺失(MAR)和非随机缺失(MNAR)。定价场景中,车辆使用性质、驾驶员年龄、行驶区域等字段常出现缺失。处理策略如下表:
| 缺失类型 | 典型字段 | 处理策略 | 风险提示 |
|---|---|---|---|
| MCAR | 随机漏录的性别 | 删除或众数填补 | 样本量损失小 |
| MAR | 高龄驾驶员未填职业 | 模型插补/分组填补 | 需验证插补后分布 |
| MNAR | 高赔付案件未填事故原因 | 单独设“未知”类别 | 不可直接删除 |
| 结构性缺失 | 未出险保单无赔款金额 | 补零并保留 | 零膨胀需专门建模 |
异常值方面,赔款金额常呈右偏长尾。建议先用箱线图与分位数识别,再结合业务判断:对明显录入错误(如赔款为负、年龄为200)直接修正;对真实大额赔案采用缩尾(Winsorize)或截断(Capping),例如将案均赔款限制在99.5%分位数以内,并在模型中引入大额赔案指示变量。
切勿对赔款金额做对数变换后直接删除原始极值。GLM的伽马分布本身可容纳长尾,过度截断会低估尾部风险,导致纯保费不足。
五、描述性统计与可视化探索
描述性统计应覆盖三个维度:集中趋势(均值、中位数)、离散程度(标准差、变异系数)、分布形态(偏度、峰度)。对频率数据,重点看零赔付占比;对案均赔款,重点看右偏程度。
可视化探索建议按以下顺序推进:
- 直方图与核密度图:观察因变量分布,判断是否需要对数变换。
- 箱线图:按险别、区域、车龄分组,识别组间差异与离群点。
- 热力图:查看自变量之间的相关性,避免多重共线性。
- 散点图与趋势线:观察连续变量(如车龄、保额)与纯保费的非线性关系。
例如,若发现“车龄”与“案均赔款”呈U型关系,则GLM中不应只放线性项,而应加入车龄的二次项或分段因子。
六、变量分布分析与建模衔接
变量分布分析直接决定GLM的分布族与连接函数选择。频率模型通常用泊松或负二项;案均赔款模型常用伽马或逆高斯。若直方图显示因变量严重右偏且方差随均值增大,伽马分布是合理起点。
对自变量,需检查:类别变量各水平的样本量是否充足(建议每水平至少30条记录)、连续变量是否需分箱、是否存在稀疏类别需合并。完成分布分析后,应输出一份“变量字典”,记录每个变量的类型、分布特征、处理方式和预期入模形式。
数据准备与探索的终点不是“数据干净”,而是“数据可解释、可建模、可复现”。只有每一步清洗和变换都有业务依据和代码留痕,后续GLM系数才能被核保和精算团队信任。
至此,原始保单与赔案数据已转化为结构清晰、质量可控的建模宽表。下一阶段即可基于该数据集开展GLM频率模型与案均赔款模型的拟合与诊断。