4. 数据准备与清洗:数据源选择、数据质量检查、缺失值处理、异常值检测

在保险精算风险暴露归因分析中,数据准备与清洗是决定模型成败的基石。原始理赔数据通常包含大量噪声、缺失字段和异常记录,直接建模会导致归因偏差。本节将系统讲解从数据源选择到异常值检测的完整流程。

4.1 数据源选择与评估

精算分析的数据源通常来自内部核心系统与外部补充数据。选择数据源时需评估其覆盖度、时效性和一致性。

数据源类型 典型来源 关键字段示例 评估要点
内部承保数据 保单管理系统 保单号、生效日、保额、费率因子 完整性、历史回溯长度
理赔核心数据 理赔处理系统 出险日、报案日、赔付金额、结案状态 结案率、延迟报告周期
财务对账数据 总账系统 已决赔款、未决赔款准备金 与理赔系统一致性
外部风险数据 气象局、交管部门 台风等级、事故地点、天气指数 数据粒度、更新频率
精算实践提示: 优先选择与精算年度对账口径一致的数据源。若内部数据覆盖不足,可引入外部风险因子作为补充变量,但需注意数据粒度匹配问题。

4.2 数据质量检查框架

数据质量检查应覆盖完整性、准确性、一致性和时效性四个维度。以下为车险理赔数据质量检查的典型流程:

  1. 完整性检查:统计各字段空值率,重点检查关键标识字段(保单号、理赔号)和金额字段。
  2. 准确性检查:验证数值字段的合理范围(如赔付金额 > 0),枚举字段的合法值(如事故类型代码)。
  3. 一致性检查:跨系统比对(如理赔系统与财务系统的赔付总额是否一致),逻辑关系校验(如出险日期应早于报案日期)。
  4. 时效性检查:检查数据提取时间与业务发生时间的延迟天数,识别是否存在大量未结案记录。
质量检查示例(Python伪代码):
# 完整性检查
null_rate = df.isnull().mean()
print("字段空值率:\n", null_rate[null_rate > 0])

# 准确性检查 - 赔付金额范围
invalid_amount = df[(df['claim_amount'] <= 0) | (df['claim_amount'] > 1e7)]
print(f"异常赔付金额记录数:{len(invalid_amount)}")

# 一致性检查 - 日期逻辑
date_error = df[df['accident_date'] > df['report_date']]
print(f"出险日晚于报案日的记录数:{len(date_error)}")

4.3 缺失值处理策略

缺失值处理需结合缺失机制(MCAR/MAR/MNAR)和业务含义。精算场景下,不同字段的缺失处理方式差异显著:

字段类型 缺失率范围 推荐处理方式 精算注意事项
关键标识字段 < 1% 删除记录或人工补录 缺失可能导致无法关联保单
金额字段 1% - 5% 中位数填充或模型预测 避免使用均值(受极端值影响)
分类字段 5% - 20% 众数填充或单独编码为“未知” 保留缺失类别可能蕴含风险信息
时间字段 < 3% 根据关联记录推算 如出险日缺失可用报案日减去平均延迟
高缺失率字段 > 50% 删除字段或构造缺失指示变量 评估字段对归因模型的重要性
避坑提醒: 在精算风险暴露归因中,不要对“是否出险”或“赔付状态”等目标相关字段进行填充,否则会引入信息泄漏。此类记录应直接剔除或单独标记。

4.4 异常值检测方法

异常值检测是识别坏样本归因的关键步骤。保险数据中的异常值通常表现为:赔付金额极端高、理赔频率异常集中、风险暴露时间异常短等。

4.4.1 单变量异常检测

  • Z-Score 方法:适用于近似正态分布的连续变量,通常以 |Z| > 3 为阈值。
  • IQR 方法:适用于偏态分布,以 Q1 - 1.5×IQR 和 Q3 + 1.5×IQR 为边界。
  • 业务规则法:如车险赔付金额超过保额 120% 视为异常。

4.4.2 多变量异常检测

  • 孤立森林(Isolation Forest):适合高维数据,通过随机分割快速隔离异常点。
  • LOF(局部异常因子):基于局部密度,适合识别局部离群点。
  • 聚类方法(如DBSCAN):将不属于任何簇的点标记为异常。
异常检测代码片段(Python):
from sklearn.ensemble import IsolationForest

# 选择特征列(赔付金额、风险暴露天数、保单年龄)
features = df[['claim_amount', 'exposure_days', 'policy_age']]

# 训练孤立森林模型
iso_forest = IsolationForest(contamination=0.05, random_state=42)
df['anomaly_flag'] = iso_forest.fit_predict(features)

# 标记异常记录(-1为异常,1为正常)
anomalies = df[df['anomaly_flag'] == -1]
print(f"检测到异常记录数:{len(anomalies)}")

4.5 数据清洗与异常处理流程

以下 SVG 图展示了从原始数据到可用分析数据集的完整清洗流程:

数据准备与清洗流程图 原始多源数据 数据质量检查(4维度) 缺失值处理 异常值检测 填充 / 删除 / 标记 标记 / 修正 / 剔除 清洗后分析数据集 数据源评估

4.6 清洗后数据验证

数据清洗完成后,需进行最终验证以确保分析基础可靠:

  • 分布对比:清洗前后关键变量的分布形态是否发生显著偏移。
  • 总量校验:清洗后的总赔付金额、总保单数是否与财务对账数据一致。
  • 逻辑校验:日期逻辑、金额逻辑、关联逻辑是否全部通过。
  • 样本量评估:清洗后剩余样本量是否满足归因分析的统计功效要求。
精算提示: 建议保留清洗日志,记录每一步删除/填充/标记的记录数量和原因。这不仅便于审计追溯,也为后续模型迭代提供数据版本控制依据。