2. 数据探索与预处理:数据源介绍、质量检查与清洗标准化

在精算建模中,数据质量直接决定模型的上限。本章将系统梳理精算模型所需的数据源类型、数据质量检查的核心维度,以及标准化的清洗与预处理流程。通过本环节,确保后续坏样本归因与保费定价建模建立在可靠、一致的数据基础之上。

2.1 数据源介绍

精算建模通常需要融合三类数据源:保单数据、理赔数据和外部数据。下表总结了各数据源的核心字段与典型用途:

数据源类型 核心字段示例 典型用途
保单数据 保单号、投保人年龄、性别、车型、保额、保险期限、缴费方式 风险因子识别、费率因子分析、保单组合画像
理赔数据 理赔号、出险时间、结案时间、赔付金额、事故类型、责任比例 坏样本定义、赔付频率/强度建模、损失分布拟合
外部数据 地区GDP、人口密度、天气指数、信用评分、车辆零整比 宏观风险调整、地域差异化定价、补充风险维度
实践提示:在数据源整合阶段,建议以保单号+时间窗口作为主键进行关联。理赔数据通常存在“一单多赔”的情况,需提前确认聚合粒度(按保单 vs 按出险次数)。

2.2 数据质量检查

数据质量检查是预处理的核心环节,主要围绕缺失值、异常值和重复值三个维度展开。以下为检查清单与处理策略:

检查维度 常见问题 检测方法 处理策略
缺失值 年龄、性别、地区代码为空 isnull() / 缺失率统计 删除(缺失率>50%)、均值/中位数填充、模型预测填充
异常值 赔付金额为负、年龄>120、保额异常高 箱线图、Z-score、业务规则阈值 截尾处理、分箱、标记为单独类别
重复值 同一理赔号出现多次、保单信息完全重复 duplicated() / 主键唯一性校验 保留最新记录、去重、核查数据源逻辑
注意:异常值不一定是错误值。例如,高端车型的保额可能远高于普通车型,直接删除会丢失重要风险信息。建议先结合业务逻辑判断,再决定处理方式。

2.3 数据清洗与标准化流程

数据清洗与标准化是一个系统化工程,通常遵循以下步骤:

  1. 字段格式统一:日期格式统一为 YYYY-MM-DD,字符串去除前后空格,分类变量统一编码(如性别:M/F → 0/1)。
  2. 缺失值处理:按变量类型和缺失率选择填充策略,连续变量常用中位数,分类变量常用众数或“未知”类别。
  3. 异常值识别与处理:基于业务规则和统计方法(如 IQR 法则)标记异常点,进行截尾或单独编码。
  4. 重复值去重:按主键去重,保留时间戳最新的记录。
  5. 数据标准化/归一化:对连续型特征(如年龄、保额)进行 Z-score 标准化或 Min-Max 缩放,消除量纲影响。
  6. 数据关联与整合:将保单、理赔、外部数据按主键关联,形成宽表用于建模。
关键产出:清洗后的数据应满足:无重复主键、缺失率可控(通常 <5%)、异常值已标记或处理、所有字段格式一致、连续变量已完成标准化。
数据清洗与标准化流程 数据清洗与标准化流程 原始数据 字段格式统一 缺失值处理 异常值识别与处理 标准化与数据整合

2.4 数据预处理代码示例

以下为 Python 环境下典型的数据清洗与标准化代码片段:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

# 1. 加载数据
df_policy = pd.read_csv('policy_data.csv')
df_claim = pd.read_csv('claim_data.csv')

# 2. 字段格式统一
df_policy['policy_date'] = pd.to_datetime(df_policy['policy_date'])
df_policy['gender'] = df_policy['gender'].str.strip().map({'M': 0, 'F': 1})

# 3. 缺失值处理
df_policy['age'].fillna(df_policy['age'].median(), inplace=True)
df_policy['region'].fillna('Unknown', inplace=True)

# 4. 异常值处理(IQR 法则)
Q1 = df_policy['sum_insured'].quantile(0.25)
Q3 = df_policy['sum_insured'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df_policy = df_policy[(df_policy['sum_insured'] >= lower_bound) & 
                      (df_policy['sum_insured'] <= upper_bound)]

# 5. 重复值去重
df_policy.drop_duplicates(subset='policy_id', keep='last', inplace=True)

# 6. 标准化连续变量
scaler = StandardScaler()
df_policy[['age', 'sum_insured']] = scaler.fit_transform(df_policy[['age', 'sum_insured']])

# 7. 数据关联
df_merged = pd.merge(df_policy, df_claim, on='policy_id', how='left')
print(f"清洗后数据维度: {df_merged.shape}")
代码说明:上述代码展示了从原始数据到清洗后宽表的完整流程。实际项目中,建议将清洗逻辑封装为函数,便于复用和版本管理。

2.5 数据预处理常见陷阱

  • 陷阱一:对分类变量直接进行标准化——分类变量应进行独热编码或标签编码,而非标准化。
  • 陷阱二:在缺失值填充前未分析缺失模式——随机缺失(MAR)与非随机缺失(MNAR)的处理策略不同。
  • 陷阱三:异常值处理一刀切——建议先标记异常值,分析其业务含义后再决定是否删除或调整。
  • 陷阱四:数据关联时忽略时间窗口——理赔数据通常发生在保单生效后,关联时需确保时间逻辑正确。
总结:数据探索与预处理是精算建模的基石。通过系统化的数据源梳理、质量检查、清洗与标准化,能够显著提升后续坏样本归因与保费定价模型的稳定性和可解释性。建议在每次建模迭代前,均执行标准化的数据预处理流程,并记录每一步的转换细节。