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 图展示了从原始数据到清洗后数据的完整流程,包含质量检查、缺失处理、异常识别三大核心模块:

数据清洗流程总览 数据清洗与预处理流程 原始保单数据 数据质量检查 完整性 · 准确性 · 一致性 · 唯一性 · 时效性 通过? 是 否 缺失值处理 中位数/众数/模型填充 异常值识别 Z-Score / IQR / 孤立森林 清洗后数据集 输出:清洗报告 + 标记字段 + 归因分析就绪数据

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())

通过以上步骤,原始保单数据将被转化为高质量、可追溯的分析就绪数据集,为后续坏样本归因建模奠定坚实基础。