4. 数据准备与探索:精算数据集特征工程、缺失值处理、异常值检测与描述性统计分析

在精算模型告警阈值调优项目中,数据质量直接决定阈值的科学性与风控效果。本章聚焦于精算数据集的特征工程、缺失值处理、异常值检测与描述性统计分析,为后续阈值建模奠定坚实的数据基础。

4.1 精算数据集特征工程

特征工程是将原始业务数据转化为模型可用特征的过程。精算数据通常包含保单属性、理赔记录、客户画像等维度,需通过构造、变换与筛选提升特征表达能力。

特征类型 原始字段示例 工程后特征 说明
数值型 保额、保费、已赚保费 对数变换、分箱、比率 降低偏态,增强线性关系
类别型 险种、地区、渠道 独热编码、目标编码 处理高基数类别,避免维度爆炸
时间型 投保日期、出险日期 保单年龄、理赔延迟天数 提取时间衰减与季节性模式
聚合型 历史理赔次数 过去12个月理赔频率 刻画客户风险趋势

特征工程核心原则:特征应具备业务可解释性,避免数据泄露(如使用未来信息构造特征),同时控制特征数量防止过拟合。

4.2 缺失值处理策略

精算数据集中缺失值普遍存在,原因包括录入遗漏、字段不适用、数据源合并丢失等。不同缺失机制需采用不同处理方式。

  • 完全随机缺失(MCAR):缺失与数据本身无关,可直接删除或均值填充。
  • 随机缺失(MAR):缺失与其他观测变量相关,推荐使用回归插补或多重插补。
  • 非随机缺失(MNAR):缺失与未观测值相关,需结合业务逻辑建模处理。
处理方法 适用场景 优点 缺点
删除缺失记录 缺失比例 < 5% 简单快速 损失样本量,可能引入偏倚
均值/中位数填充 数值型,低缺失率 计算成本低 降低方差,扭曲分布
KNN插补 数值型,有相似样本 保留局部结构 对高维数据敏感
多重插补(MICE) 任意类型,MAR假设 保留不确定性 计算复杂度高
模型预测填充 特征间关系明确 精度较高 可能过拟合

实战建议:对精算关键字段(如保额、已赚保费)优先使用多重插补;对业务含义明确的缺失(如“无理赔记录”),可单独编码为“0”或“未知”类别。

4.3 异常值检测方法

异常值会严重扭曲阈值计算与风险评级结果。精算数据中异常值常源于录入错误、极端理赔事件或系统故障。需结合统计方法与业务规则综合判定。

  1. Z-Score 方法:适用于近似正态分布数据,通常以 |Z| > 3 为异常阈值。
  2. IQR 方法:基于四分位距,定义异常为 Q1 - 1.5×IQR 以下或 Q3 + 1.5×IQR 以上。
  3. 孤立森林:适用于高维数据,通过随机划分检测孤立点。
  4. 业务规则过滤:如保额 < 0、理赔金额 > 保额等明显逻辑错误。

注意:异常值不一定是错误值。极端理赔(如巨灾损失)可能是真实风险信号,需结合业务背景决定是否剔除或单独建模。

异常值检测流程与处理决策 原始精算数据集 Z-Score 检测 IQR 检测 孤立森林 业务规则 综合异常标记与业务复核 剔除 / 修正 / 单独建模 保留并标记为极端风险

4.4 描述性统计分析

描述性统计帮助快速掌握数据分布、集中趋势与离散程度,是阈值设定的前置步骤。精算模型常用统计量如下:

统计量 计算公式 / 说明 精算应用场景
均值 μ = Σx / n 平均理赔金额、平均风险评分
中位数 排序后中间值 抗偏态分布,如理赔金额中位数
标准差 σ = √(Σ(x-μ)² / n) 风险波动度量,阈值宽度参考
偏度 Skewness = E[(x-μ)³] / σ³ 判断数据是否左偏/右偏,影响阈值位置
峰度 Kurtosis = E[(x-μ)⁴] / σ⁴ - 3 识别厚尾分布,极端事件频率
分位数 Q1, Q2, Q3, P95, P99 阈值候选点,如P99作为告警上限

阈值调优关键洞察:若数据呈右偏分布(偏度 > 1),均值受极端值影响大,建议以中位数或P90-P95作为阈值基准;若峰度 > 5,需警惕尾部极端事件,阈值应适当放宽以避免频繁误报。

4.5 数据预处理代码示例

以下Python代码展示了缺失值处理、异常值检测与描述性统计的典型实现:

import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest

# 加载精算数据集
df = pd.read_csv('actuarial_data.csv')

# 缺失值处理:对数值型字段使用中位数填充
num_cols = ['premium', 'claim_amount', 'policy_age']
for col in num_cols:
    df[col].fillna(df[col].median(), inplace=True)

# 类别型字段使用众数填充
cat_cols = ['region', 'product_type']
for col in cat_cols:
    df[col].fillna(df[col].mode()[0], inplace=True)

# 异常值检测:IQR方法
Q1 = df['claim_amount'].quantile(0.25)
Q3 = df['claim_amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df['is_outlier_iqr'] = ((df['claim_amount'] < lower_bound) | 
                        (df['claim_amount'] > upper_bound)).astype(int)

# 孤立森林检测
iso_forest = IsolationForest(contamination=0.05, random_state=42)
df['is_outlier_if'] = iso_forest.fit_predict(df[num_cols])
df['is_outlier_if'] = df['is_outlier_if'].apply(lambda x: 1 if x == -1 else 0)

# 描述性统计输出
desc_stats = df[num_cols].describe(percentiles=[0.25, 0.5, 0.75, 0.9, 0.95, 0.99])
print(desc_stats)

# 偏度与峰度
skewness = df[num_cols].skew()
kurtosis = df[num_cols].kurtosis()
print('偏度:\n', skewness)
print('峰度:\n', kurtosis)

代码要点:孤立森林的 contamination 参数需根据业务预期异常比例调整;描述性统计中的 P99 常作为告警阈值初始候选值,后续需结合模型验证优化。

4.6 数据质量报告与可视化

完成数据预处理后,建议生成数据质量报告,包含缺失率、异常率、各字段分布形态等关键指标,便于团队评审与阈值调优决策。

数据质量报告核心指标 缺失率 各字段缺失比例 异常率 异常值占比 分布形态 偏度 / 峰度 阈值候选 P90 / P95 / P99 数据质量报告(PDF / HTML)

通过系统化的数据准备与探索,精算数据集将具备高质量、高可解释性,为后续告警阈值建模与风险控制提供可靠输入。下一阶段将基于清洗后的数据构建阈值优化模型。