3. 数据准备与清洗:原始保单数据获取、数据质量检查、缺失值处理、异常值识别与处理
在保险精算坏样本归因分析中,数据准备与清洗是决定模型成败的基石。原始保单数据通常来自核心承保系统、理赔系统及第三方数据源,存在格式不统一、字段缺失、逻辑冲突等问题。本节将系统讲解从数据获取到清洗完成的完整流程,确保后续归因分析建立在高质量的数据基础之上。
3.1 原始保单数据获取与字段概览
数据获取阶段需要明确数据源、提取范围及关键字段。典型的保单数据表结构如下:
| 字段类别 | 字段名称 | 数据类型 | 说明 |
|---|---|---|---|
| 保单标识 | policy_id | string | 唯一保单号 |
| 时间信息 | effective_date, expire_date | date | 起保/终保日期 |
| 被保险人信息 | age, gender, occupation_code | int / string | 年龄、性别、职业代码 |
| 产品信息 | product_code, coverage_amount | string / float | 产品代码、保额 |
| 财务信息 | premium, commission_rate | float | 保费、佣金率 |
| 理赔标签 | claim_flag, claim_amount | int / float | 是否出险、赔付金额 |
实践要点:数据提取时建议增加
data_source 字段标记来源系统,便于后续溯源。同时保留原始数据快照,避免清洗过程不可逆。
3.2 数据质量检查
数据质量检查是清洗前的必要步骤,主要从完整性、准确性、一致性、唯一性和时效性五个维度展开。以下为检查清单:
- 完整性检查:统计各字段缺失率,重点关注
claim_flag、premium、effective_date等核心字段。 - 准确性检查:验证数值范围(如年龄 0-120、保费 > 0)、日期逻辑(起保日 < 终保日)。
- 一致性检查:同一保单在不同系统中的
policy_id是否一致,产品代码是否匹配产品表。 - 唯一性检查:检查
policy_id是否有重复记录,重复时需按时间戳或业务规则去重。 - 时效性检查:确认数据提取时间窗口是否覆盖完整保单周期,避免截断偏差。
质量检查脚本示例(Python):
import pandas as pd
# 加载原始保单数据
df = pd.read_csv('raw_policy_data.csv')
# 完整性检查
missing_report = df.isnull().sum()
missing_rate = missing_report / len(df)
# 准确性检查:保费必须大于0
invalid_premium = df[df['premium'] <= 0]
# 一致性检查:日期逻辑
date_error = df[df['effective_date'] >= df['expire_date']]
# 输出质量报告
print("字段缺失率:\n", missing_rate[missing_rate > 0])
print("异常保费记录数:", len(invalid_premium))
print("日期逻辑错误记录数:", len(date_error))
3.3 缺失值处理
缺失值处理策略需结合字段重要性、缺失机制(MCAR/MAR/MNAR)及业务含义。常用方法如下:
| 缺失字段类型 | 推荐方法 | 适用场景 |
|---|---|---|
| 连续型(如保费、保额) | 中位数填充 / 分组均值填充 | 数据分布偏态时优先中位数 |
| 分类型(如职业代码) | 众数填充 / “未知”类别 | 类别较少且缺失率 < 5% |
| 时间型(如起保日期) | 前向填充 / 业务规则推算 | 时间序列数据或关联字段可推算 |
| 标签型(如理赔标识) | 模型预测填充 / 删除记录 | 缺失率低且为关键分析字段 |
注意:当缺失率超过 60% 时,建议删除该字段而非填充,避免引入大量噪声。对于坏样本归因任务,
claim_flag 缺失记录应优先排查是否为数据漏传,而非直接填充。
3.4 异常值识别与处理
异常值识别是坏样本归因的关键环节,因为异常值可能直接指向欺诈、录入错误或特殊风险事件。常用识别方法包括:
- 统计方法:Z-Score(|Z| > 3)、IQR(Q1 - 1.5*IQR 或 Q3 + 1.5*IQR)。
- 业务规则:保费低于 0、保额超过产品上限、年龄超过 100 岁等。
- 模型方法:孤立森林(Isolation Forest)、LOF(Local Outlier Factor)。
处理策略需区分异常类型:
| 异常类型 | 示例 | 处理方式 |
|---|---|---|
| 录入错误 | 年龄 200 岁 | 修正为合理值或删除 |
| 业务合理异常 | 高额保单保费极高 | 保留并标记为特殊类别 |
| 欺诈嫌疑 | 短期内多次理赔 | 保留并进入坏样本候选集 |
归因视角:在坏样本归因中,异常值不应简单删除。建议增加
is_outlier 标记字段,保留异常记录用于后续欺诈检测或风险模式挖掘。
3.5 数据清洗流程总览
以下 SVG 图展示了从原始数据到清洗后数据的完整流程,包含质量检查、缺失处理、异常识别三大核心模块:
3.6 清洗结果验证与输出
清洗完成后,需输出以下交付物以确保可追溯性:
- 清洗后数据集:包含所有原始字段及新增标记字段(如
missing_flag、outlier_flag)。 - 数据质量报告:记录清洗前后各字段的缺失率、异常率、去重率等指标。
- 清洗日志:记录每一步操作的参数、影响记录数及处理依据。
清洗验证脚本示例:
# 清洗前后对比
before = df_raw.shape[0]
after = df_clean.shape[0]
print(f"清洗前记录数: {before}, 清洗后记录数: {after}")
print(f"删除/修正记录数: {before - after}")
# 检查关键字段分布变化
print("保费分布对比:")
print(df_raw['premium'].describe())
print(df_clean['premium'].describe())
通过以上步骤,原始保单数据将被转化为高质量、可追溯的分析就绪数据集,为后续坏样本归因建模奠定坚实基础。