去年整理移动硬盘里的旧代码时,我翻到一份早年做的人均预期寿命分析项目,数据是从公开渠道下载的WHO面板数据,代码写得比较青涩,但整个“数据清洗—探索性分析—建模—时间趋势解读”的链路相当完整。我用现在的思路重新跑了一遍,顺便把踩过的坑都记了下来。这篇文章就是一个完整的复盘:基于Python和数据挖掘方法,分析人均预期寿命的变化情况,重点放在怎么从原始表格数据里得到可解释、可信赖的结论,而不是机械地堆模型分数。
如果你是刚学Python数据分析、准备做课程设计,或者想用公开数据练手数据挖掘全流程,这篇应该能给你省不少事。文章不会只贴代码,我会把每个环节“为什么这么做”也讲清楚,毕竟这个项目真正的难度不在跑通代码,而在特征处理和数据理解。
1. 从“想分析寿命”到选定公开数据:项目目标、数据集与第一次翻车
1.1 项目诉求与数据来源
这个项目的目标很直白:分析人均预期寿命的变化趋势,同时找出哪些可量化的指标与寿命高低关系最密切。很多人一听到“变化”两个字就想着做时间序列预测,但真实的数据挖掘流程里,第一步永远是搞清楚数据形态。
我用的是Kaggle上常见的“Life Expectancy Data”数据集,来源是WHO的年度统计,内含193个国家和地区在2000年到2015年间的健康与经济指标。一条记录代表“某个国家在某一年”的观测,总计2938行、22列,这个结构和很多医疗健康类面板数据很像:有连续特征(成人死亡率、BMI、GDP、教育年限),也有一段时期不太变化的分组变量(国家、年份、国家类型)。
下载之后马上发现一个问题:数据列名包含空格,比如 Life expectancy、Adult Mortality、percentage expenditure,如果直接 df["Life expectancy"] 也能用,但后续一旦写循环或者做特征列表,空格就是定时炸弹。我习惯在加载时直接用 str.strip().replace(" ", "_") 统一列名,后面所有代码都能省心不少。
1.2 环境准备用到的核心库
项目本身不需要重型环境,我用的是 Python 3.9 + pandas + numpy + matplotlib + seaborn + scikit-learn。如果你的机器上还没有这些库,只需要在终端中执行下面这组安装命令:
bash复制pip install pandas numpy matplotlib seaborn scikit-learn
如果下载速度慢,可以加 -i https://pypi.tuna.tsinghua.edu.cn/simple 切换镜像源。这个项目没有用深度学习框架,原因是后文会讲到,几十个特征的面板数据用随机森林、梯度提升这类模型就足够,不需要引入复杂工具链。
数据加载和结构检查的代码如下:
python复制import pandas as pd
import numpy as np
df = pd.read_csv("Life Expectancy Data.csv")
df.columns = [c.strip().replace(" ", "_") for c in df.columns]
print(df.shape)
print(df.dtypes)
print(df.isnull().sum().sort_values(ascending=False))
第一次跑 isnull().sum() 时,我愣了一下:Life_expectancy 这个预测目标本身居然也有缺失行。原因是数据集里某些国家的某些年份没统计到寿命值,另外还有少量记录其实不是国家维度,而是“全球总体”和“区域汇总”之类的行。做单国家分析时必须把这些行剔掉,否则一个“全球平
