如何处理人口数据中的数位输入错误(附异常值检测实践)
人口数据数位输入错误的处理方案
针对世界银行195个国家15年人口数据中出现的数位输入错误(如少输入一位数导致数据为真实值的1/10),在已通过对数转换+Z-score识别出异常值的基础上,可采用以下实用处理方案:
一、定向修正10倍量级异常
这类错误的典型特征是异常值为真实值的1/10,可通过趋势验证后直接修正:
- 先验证异常值乘以10后,是否符合该国人口的增长逻辑(比如与前后年份的增长率处于合理区间,通常人口年增长率在0%-3%)
- 符合条件则直接将异常值替换为原值×10
示例代码:
# 遍历识别出的异常值,验证后修正 for idx, row in outliers.iterrows(): corrected = row['Population'] * 10 # 获取前后年份数据用于趋势验证 prev_pop = afg_data.at[idx-1, 'Population'] if idx > 0 else None next_pop = afg_data.at[idx+1, 'Population'] if idx < len(afg_data)-1 else None # 验证增长率是否在合理范围(这里设为0%-5%,可根据地区调整) valid = False if prev_pop: growth_rate = (corrected - prev_pop) / prev_pop valid = 0 <= growth_rate <= 0.05 if next_pop and not valid: growth_rate = (next_pop - corrected) / corrected valid = 0 <= growth_rate <= 0.05 if valid: afg_data.at[idx, 'Population'] = corrected
二、上下文插值补充
若无法确定是否为10倍错误(比如异常值不符合×10后的趋势),可利用相邻年份数据插值:
- 线性插值:适合人口增长平稳的时期
- 指数插值:更贴合人口自然增长的指数趋势
示例代码:
# 先将异常值设为NaN,再进行指数插值 afg_data.loc[outliers.index, 'Population'] = np.nan afg_data['Population'] = afg_data['Population'].interpolate(method='index')
三、参考组均值修正
如果某国连续多年数据异常,或无相邻有效数据,可参考同属性组(如同一地区、同一收入水平)的同期人口增长率,结合该国已知的基准数据计算修正值:
- 计算同组国家的平均年增长率
- 用该国前一个有效年份的数据,乘以(1+平均增长率)得到修正值
四、事后验证机制
- 可视化校验:绘制修正后的人口增长折线图,确认趋势连续无突兀波动
- 增长率校验:计算所有年份的人口增长率,过滤超出合理范围(如<-1%或>5%)的数值,再次核查
内容的提问来源于stack exchange,提问作者Yugang1
相关产品推荐
相关产品推荐

