4. 死亡率数据来源与清洗
生命表构建的第一步不是建模,而是回答一个更基础的问题:死亡数据从哪里来,能不能用,怎么用。死亡率建模的质量上限,在数据进入模型之前就已经被决定了。本节围绕三类主流数据来源展开,讲清它们的口径差异、质量风险与清洗流程,并给出可落地的处理规范。
一、核心原理:三类数据来源的本质差异
死亡率数据的本质是「暴露量」与「死亡事件数」的配对。不同来源的差异,本质上是分母口径和分子完整性的差异。
- 人口普查数据:以全国或地区常住人口为分母,覆盖广、样本大,但普查十年一次,存在回忆误差、年龄申报堆积(age heaping)和漏报。适合构建国民生命表,但时效性差。
- 保险数据:以承保人群为分母,死亡理赔为分子。数据质量高、字段完整、可细分险种与核保等级,但存在选择性偏差——投保人群通常比一般人群更健康,即「逆选择」与「核保筛选」叠加。
- 死亡登记数据:以公安、卫健、民政的死亡登记为来源,事件记录完整、时间精确,但分母需要依赖人口统计推算,且存在漏登、迟报、死因编码错误。
核心判断:没有一种来源是「全对」的。专业做法是多源交叉验证,用普查校准分母,用死亡登记补全事件,用保险数据做精细化建模。
二、方法流程:从原始数据到可用暴露-死亡对
清洗不是简单删空值,而是一条有顺序的流水线。推荐按以下六步执行:
- 口径对齐:统一年龄分组(如0-4,5-9…或单岁组)、统一时间窗口(日历年/保单年)、统一地域编码。
- 去重与匹配:死亡登记与人口库按身份证号或姓名+出生日期匹配,剔除重复死亡记录。
- 异常值识别:年龄超过120岁、死亡日期早于出生日期、暴露量为零却有死亡事件等。
- 缺失值处理:年龄缺失用出生日期回推;性别缺失按分布插补或标记为未知层。
- 年龄平滑:对5岁组做移动平均或Whipple指数修正,缓解年龄堆积。
- 暴露量计算:按人年(person-year)计算,而非简单人数,避免年中人口误差。
下面是一段典型的暴露量与死亡率计算代码,注意exposure必须按人年累计:
import pandas as pd
# 假设 df 含: id, birth_date, death_date, entry_date, exit_date, age_group
df['entry_date'] = pd.to_datetime(df['entry_date'])
df['exit_date'] = pd.to_datetime(df['exit_date'])
df['death_date'] = pd.to_datetime(df['death_date'])
# 计算暴露人年
df['exposure'] = (df['exit_date'] - df['entry_date']).dt.days / 365.25
# 标记死亡事件
df['is_death'] = df['death_date'].notna().astype(int)
# 按年龄组汇总
agg = df.groupby('age_group').agg(
deaths=('is_death', 'sum'),
exposure=('exposure', 'sum')
).reset_index()
# 中心死亡率 mx
agg['mx'] = agg['deaths'] / agg['exposure']
print(agg.head())
三、数据质量处理:一张清单看清风险点
下表汇总了三类来源的典型质量问题与对应处理策略,建议作为数据验收的检查清单使用。
| 数据来源 | 典型质量问题 | 影响 | 处理策略 |
|---|---|---|---|
| 人口普查 | 年龄申报堆积、漏报 | 分母失真,死亡率偏低 | Whipple指数修正、平滑 |
| 保险数据 | 选择性偏差、退保截断 | 死亡率系统性偏低 | 分层建模、退保作为删失 |
| 死亡登记 | 漏登、迟报、死因错编 | 分子不完整,死亡率偏低 | 多源比对、捕获-再捕获估计 |
| 跨源合并 | 口径不一致、重复记录 | 暴露与事件错配 | 统一编码、去重匹配 |
四、案例与场景:一次保险数据清洗复盘
某寿险公司构建经验生命表时,发现60岁以上男性死亡率明显低于行业水平。排查后发现三个问题:一是退保人群未作为删失处理,导致暴露量被高估;二是理赔数据存在3个月以上迟报,近期死亡事件缺失;三是年龄字段存在整岁堆积,60、65、70岁人数异常集中。
处理方式:将退保日期作为退出时点计算人年;对迟报数据设置观察截止日并做尾部调整;对年龄做单岁展开与平滑。修正后,死亡率曲线与行业基准的偏离从-18%收敛到-4%以内。
经验法则:清洗阶段每发现一个系统性偏差,都要问一句「它会让死亡率偏高还是偏低」。方向判断比数值修正更重要。
五、常见误区与复盘要点
- 误区一:用人数代替人年。 年中人口法在人口稳定时可用,但保险数据必须用人年。
- 误区二:忽略删失。 退保、满期、观察期结束都是删失,不是死亡,不能计入分子。
- 误区三:直接合并多源数据。 不同来源口径不同,必须先对齐再合并,否则暴露与事件错配。
- 误区四:过度清洗。 把异常值一律删除,可能删掉真实的极端死亡事件,导致死亡率低估。
清洗日志必须留痕:每一步删了多少条、改了多少条、依据是什么。没有日志的清洗,等于没有清洗。
数据来源决定建模的边界,清洗质量决定结论的可信度。把口径对齐、删失处理、人年计算和日志留痕这四件事做扎实,后续的死亡率模型才有稳固的地基。