2. 赔付率数据采集与清洗:数据源识别、质量检查与标准化
赔付率精算模型的可靠性,首先取决于底层数据的质量。本章聚焦于数据采集与清洗环节,系统讲解如何识别三大核心数据源、执行数据质量检查、处理异常值,并完成数据标准化,为后续模型调优奠定坚实基础。
2.1 数据源识别:承保、理赔、财务
赔付率计算涉及三个独立但相互关联的数据系统。精算师必须理解每个数据源的结构、字段含义与更新频率,才能正确拼接数据。
| 数据源 | 核心表/视图 | 关键字段 | 更新频率 |
|---|---|---|---|
| 承保系统 | 保单主表、批单表、险种表 | 保单号、起保/终保日期、险种代码、保费、保额、免赔额 | 实时/日终 |
| 理赔系统 | 立案表、赔付明细表、结案表 | 报案号、立案日期、出险日期、赔付金额、未决赔款准备金、结案标志 | 实时/日终 |
| 财务系统 | 总账、分保账、准备金台账 | 会计期间、已赚保费、已发生赔款、分保摊回、IBNR | 月结/季结 |
关键对齐点: 承保与理赔数据通过“保单号”关联,财务数据通过“会计期间+险种代码”与承保数据聚合。务必确认三套系统的“保单号”编码规则一致,否则需建立映射表。
2.2 数据质量检查:六维评估框架
在清洗之前,必须对原始数据进行系统性质量评估。建议采用以下六个维度逐项检查:
- 完整性: 检查关键字段(保单号、保费、赔付金额)是否存在空值或缺失。缺失率超过5%的字段需标记并追溯原因。
- 准确性: 验证数值字段是否在合理范围内。例如:保费不应为负数,赔付金额不应超过保额。
- 一致性: 跨系统比对同一字段。例如:承保系统的“保费”与财务系统的“已赚保费”在相同会计期间内应逻辑一致。
- 时效性: 检查数据时间戳是否在预期窗口内。理赔数据滞后超过30天需特别关注。
- 唯一性: 检查主键(如保单号+险种代码)是否存在重复记录。重复记录需去重或合并。
- 规范性: 检查分类字段(如险种代码、赔付原因码)是否遵循统一编码标准。不一致的编码需映射为标准值。
实操建议: 建立数据质量看板,将六维检查结果以红/黄/绿指示灯形式呈现。红灯项(如缺失率>10%)必须修复后才能进入模型训练。
2.3 异常值处理:识别与修正策略
赔付率数据中的异常值会严重扭曲模型参数。常见的异常值类型及处理方法如下:
| 异常类型 | 识别方法 | 处理策略 |
|---|---|---|
| 极端赔付(如单笔赔付>保额10倍) | Z-score > 3 或 IQR 上界外 | 核实是否为巨灾或系统错误;若为真实巨灾,保留但标记;若为错误,修正或剔除 |
| 负保费/负赔付 | 数值 < 0 | 追溯财务冲正记录;若为退保或追偿,保留负值并添加业务类型标签 |
| 日期逻辑错误(如出险日期早于起保日期) | 业务规则校验 | 优先以立案日期为准修正;无法修正则剔除该记录 |
| 重复立案(同一事故多次立案) | 保单号+出险日期+事故描述模糊匹配 | 合并赔付金额,保留最早立案记录 |
注意: 异常值处理必须保留审计轨迹。每次修正或剔除操作,都应在数据集中增加“数据质量标志”字段,记录原始值、修正值、修正原因与操作人。
2.4 数据标准化:统一口径与格式
标准化是数据清洗的最后一步,确保来自不同系统的数据在口径、单位、格式上完全一致,才能输入精算模型。
- 时间口径标准化: 统一使用“事故年”或“保单年”作为赔付率计算的时间基准。所有日期字段转换为 YYYY-MM-DD 格式。
- 金额单位标准化: 所有货币字段统一为“元”,保留两位小数。分保摊回金额需单独列示,不混入直接赔付。
- 分类编码标准化: 建立险种代码、渠道代码、赔付原因码的映射表,将各系统编码统一为精算模型内部编码。
- 缺失值填充: 对于少量缺失的连续型字段(如保额),使用同险种中位数填充;分类字段缺失时,填充“未知”并单独标记。
2.5 数据清洗脚本示例(Python)
以下代码片段展示了赔付率数据清洗的核心步骤,包括缺失值检查、异常值过滤与日期标准化:
import pandas as pd
import numpy as np
# 加载承保与理赔数据
df_uw = pd.read_csv('underwriting.csv')
df_cl = pd.read_csv('claims.csv')
# 合并数据
df = pd.merge(df_uw, df_cl, on='policy_id', how='left')
# 1. 完整性检查
missing_rate = df.isnull().mean()
print('字段缺失率:\n', missing_rate[missing_rate > 0])
# 2. 异常值处理:剔除赔付金额为负且非追偿的记录
df = df[~((df['claim_amount'] < 0) & (df['claim_type'] != 'recovery'))]
# 3. 日期标准化:统一为YYYY-MM-DD
df['accident_date'] = pd.to_datetime(df['accident_date']).dt.strftime('%Y-%m-%d')
df['report_date'] = pd.to_datetime(df['report_date']).dt.strftime('%Y-%m-%d')
# 4. 金额单位标准化:转换为元
df['premium'] = df['premium'] / 100 # 假设原始单位为分
df['claim_amount'] = df['claim_amount'] / 100
# 5. 输出清洗后数据
df.to_csv('cleaned_data.csv', index=False)
print('数据清洗完成,共保留 {} 条记录'.format(len(df)))
精算师提示: 上述脚本仅为示例。实际生产中,建议将清洗逻辑封装为可复用的ETL函数,并加入日志记录模块,每次运行自动生成数据质量报告。