3. 特征工程基础:单变量分析、双变量分析与特征衍生
特征工程是精算建模的核心环节,直接影响坏样本归因的准确性与保费定价的合理性。本节从单变量分析、双变量分析、特征衍生三个层面,系统讲解如何从原始数据中提取有效信息,为后续模型构建奠定基础。
3.1 单变量分析:分布与统计量
单变量分析用于理解每个特征的自身属性,包括数据分布形态、集中趋势、离散程度及异常值情况。精算模型中常见的单变量分析指标如下:
| 分析维度 | 常用指标 | 精算应用场景 |
|---|---|---|
| 集中趋势 | 均值、中位数、众数 | 评估平均赔付金额、典型风险暴露 |
| 离散程度 | 标准差、方差、四分位距 | 衡量风险波动性、定价区间宽度 |
| 分布形态 | 偏度、峰度、直方图 | 判断损失分布是否右偏、是否存在厚尾 |
| 缺失与异常 | 缺失率、箱线图异常点 | 识别数据质量问题、极端索赔案例 |
精算提示: 在保费定价中,连续变量(如年龄、驾龄)通常呈现右偏分布,建议在建模前进行对数变换或Box-Cox变换,以改善模型拟合效果。
以下代码展示了单变量分析的典型实现:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载示例数据
df = pd.read_csv('claim_data.csv')
# 单变量统计量计算
stats = df['claim_amount'].describe()
print(stats)
# 偏度与峰度
skewness = df['claim_amount'].skew()
kurtosis = df['claim_amount'].kurtosis()
print(f'偏度: {skewness:.2f}, 峰度: {kurtosis:.2f}')
# 缺失率检查
missing_rate = df['claim_amount'].isnull().mean()
print(f'缺失率: {missing_rate:.2%}')
3.2 双变量分析:相关性与交叉表
双变量分析用于探索两个特征之间的关系,是识别坏样本归因关键变量的重要手段。精算模型中主要采用以下两种方法:
3.2.1 相关性分析
适用于连续变量对,常用Pearson相关系数和Spearman秩相关系数。Pearson衡量线性关系,Spearman衡量单调关系,对异常值更稳健。
| 相关系数范围 | 相关强度 | 精算含义 |
|---|---|---|
| |r| ≥ 0.7 | 强相关 | 可能存在共线性,需考虑变量筛选或融合 |
| 0.3 ≤ |r| < 0.7 | 中等相关 | 有解释价值,可纳入模型 |
| |r| < 0.3 | 弱相关 | 解释力有限,可考虑剔除 |
3.2.2 交叉表分析
适用于分类变量对,通过列联表展示频数分布,并计算卡方统计量检验独立性。在坏样本归因中,交叉表常用于分析不同风险等级与出险率的关系。
实践要点: 当交叉表单元格期望频数小于5时,卡方检验结果可能不可靠,建议使用Fisher精确检验替代。
# 相关性分析示例
corr_pearson = df['age'].corr(df['claim_frequency'], method='pearson')
corr_spearman = df['age'].corr(df['claim_frequency'], method='spearman')
print(f'Pearson: {corr_pearson:.3f}, Spearman: {corr_spearman:.3f}')
# 交叉表与卡方检验
crosstab = pd.crosstab(df['risk_grade'], df['claim_flag'])
from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(crosstab)
print(f'卡方值: {chi2:.2f}, p值: {p:.4f}')
3.3 特征衍生:比率、交互项与时间窗口聚合
特征衍生是从原始特征中构造新特征的过程,旨在捕捉更复杂的风险模式。精算模型中常用的衍生方法包括:
3.3.1 比率特征
通过两个相关变量的比值构造新特征,常用于归一化处理。例如:
- 赔付率 = 赔付金额 / 已赚保费
- 损失频率 = 出险次数 / 风险暴露数
- 费用率 = 运营费用 / 保费收入
3.3.2 交互项特征
将两个或多个特征的乘积或组合作为新特征,用于捕捉非线性关系。例如:
- 年龄 × 驾龄:年轻且驾龄短的驾驶员风险更高
- 车辆价值 × 行驶里程:高价值高使用率车辆赔付风险更大
注意: 交互项会显著增加特征维度,建议结合业务逻辑有选择地构造,避免过度拟合。一般每个交互项需至少对应100个样本支持。
3.3.3 时间窗口聚合
对时序数据进行滑动窗口统计,提取历史行为模式。常见聚合方式包括:
| 窗口类型 | 聚合函数 | 精算应用 |
|---|---|---|
| 固定窗口(如过去12个月) | 求和、均值、最大值 | 计算年化赔付率、最大单次赔付 |
| 滑动窗口(如最近3/6/12个月) | 均值、标准差、趋势斜率 | 捕捉风险变化趋势、季节性模式 |
| 累计窗口(从保单生效至今) | 累计和、累计均值 | 评估长期风险暴露水平 |
# 特征衍生示例
import pandas as pd
import numpy as np
# 比率特征
df['loss_ratio'] = df['claim_amount'] / df['earned_premium']
# 交互项特征
df['age_driving_interact'] = df['age'] * df['driving_years']
# 时间窗口聚合(过去12个月滚动均值)
df['rolling_claim_mean_12m'] = (
df.groupby('policy_id')['claim_amount']
.transform(lambda x: x.rolling(window=12, min_periods=1).mean())
)
print('衍生特征示例:')
print(df[['loss_ratio', 'age_driving_interact', 'rolling_claim_mean_12m']].head())
精算提示: 特征衍生完成后,务必进行单变量和双变量验证,确保新特征具有合理的分布形态和与目标变量的显著相关性。无效的衍生特征会增加模型复杂度而不提升性能。