资讯动态

数据挖掘实战:全球人均预期寿命影响因素分析与预测模型

发布时间:2026/9/9 10:11:40 来源:尧图企业网站定制
1. 项目概述与整体设计思路先说说我为啥会碰这个题目。大家如果关注过我以前写的东西应该知道我平时比较喜欢拿公开数据集做各种实战分析因为这类数据干净、来源明确、字段丰富特别适合练手数据挖掘的完整流程。这次选的“人均预期寿命变化分析”就是这样一个典型题目原始数据来自世界卫生组织WHO和世界银行公开数据集涵盖了全球193个国家从2000年到2015年的健康与经济指标总共接近3000条记录。这个题目对于学习和复现数据挖掘流程来说确实很合适。预期寿命这个指标本身很有意思它不是一个孤立数字而是跟一个国家的医疗水平、经济状况、教育程度、生活习惯等一堆因素纠缠在一起。我们希望通过数据挖掘的手段把这些因素跟预期寿命之间的关联找出来并且用可以解释的方式呈现给读者。换句话说这个项目解决的不仅仅是“预期寿命怎么变化”这一个浅层问题更重要的是“什么在驱动这种变化”以及“我们能不能建一个模型去预测它”。从技术栈角度讲这个项目几乎是Python数据挖掘的标准套餐pandas做数据清洗和聚合matplotlib和seaborn做可视化探索statsmodels做统计建模scikit-learn做机器学习建模。整个流程覆盖了数据挖掘的完整闭环数据获取→数据清洗→探索性分析→特征工程→建模→评估→结果解读。对刚开始学Python数据分析的朋友来说这么一套组合拳打下来基本上能把常用的库都过一遍而且每一步都有明确的输出物不会出现学了半天不知道学了啥的情况。2. 数据准备与环境配置实操2.1 原始数据字段结构与含义动手之前得先摸清楚手上的数据长什么样。这份预期寿命数据集包含以下核心字段每个字段我都标注了实际含义和类型方便后面写代码时心里有数字段名字段含义数据类型备注Country国家名称字符串共193个国家Year年份整数2000-2015Status发展状态字符串Developed / DevelopingLife expectancy预期寿命浮点数因变量核心预测目标Adult Mortality成人死亡率浮点数每千人infant deaths婴儿死亡数整数每千活产Alcohol人均酒精消费量浮点数升/年percentage expenditure卫生支出占比浮点数占GDP百分比Hepatitis B乙肝免疫覆盖率浮点数百分比Measles麻疹发病率整数每千人BMI平均BMI浮点数体质量指数under-five deaths五岁以下儿童死亡数整数每千活产Polio脊髓灰质炎免疫覆盖率浮点数百分比Total expenditure总支出占比浮点数占GDP百分比Diphtheria白喉免疫覆盖率浮点数百分比HIV/AIDS艾滋病死亡率浮点数每千人GDP国内生产总值浮点数美元Population人口数浮点数人thinness 1-19 years儿童消瘦率浮点数百分比thinness 5-9 years儿童消瘦率浮点数百分比Income composition of resources资源收入构成指数浮点数0-1之间Schooling受教育年限浮点数年这些字段就是我们的原始素材。注意看里面既有连续型数值比如GDP、BMI也有离散型数值比如婴儿死亡数还有类别型变量Status的开发/发展中状态。不同类型的数据在后面处理时要区别对待这就是为什么说数据挖掘第一步是摸清数据结构而不是急着写模型。2.2 环境推荐与依赖安装这个项目用到的Python库都是数据挖掘领域最常用的几个。我建议直接用Anaconda发行版它自带conda包管理器可以避免不少环境配置的坑。如果你更习惯用原生Python也可以用pip一个个装但我个人还是推荐conda因为numpy、pandas、scikit-learn这些库之间存在版本依赖关系conda会自动帮我们解决依赖冲突问题。conda create -n lifespan python3.9 conda activate lifespan conda install pandas numpy matplotlib seaborn scikit-learn statsmodels jupyter notebook如果是pip党对应命令是pip install pandas numpy matplotlib seaborn scikit-learn statsmodels jupyter这里我特别说一句Python 3.7以下的老版本不建议再用因为新版的pandas和scikit-learn都放弃了对旧版本的支持会出现一堆莫名其妙的报错。如果你电脑上有多个Python版本建议用python -m venv建虚拟环境隔离避免把系统环境搞乱。我记得自己第一次跑这个项目就是因为conda和pip混用导致numpy版本冲突光是修环境就花了一个下午。数据加载这一步很简单import pandas as pd import numpy as np df pd.read_csv(life_expectancy.csv) print(df.shape) print(df.info()) print(df.head())拿到数据后先看一眼基本信息确认有没有读对、有多少行多少列、每列是什么数据类型。通常这一步就会发现一些问题比如年份被读成了字符串、某些列有大量空值等等。别急着往下跑先停下来把问题记录清楚后面清洗的时候才知道要处理哪些地方。3. 数据清洗与预处理细节3.1 缺失值处理的策略选择数据清洗是整个项目里最花时间、也最容易出问题的一步。原始数据集的缺失情况比想象中严重尤其是Hepatitis B、BMI、Total expenditure这几个字段缺失比例超过10%。如果不处理后面做回归分析时样本量会大幅缩水直接影响模型稳定性。我处理缺失值的策略是分组中位数填充。为什么要用中位数而不是均值因为均值对离群值敏感而预期寿命数据里的卫生支出、GDP这些指标存在明显的长尾分布少数发达国家数值极高直接拉高了均值用均值填充会让发展中国家的数据被高估。相比之下中位数对离群值不敏感更适合这类经济医疗数据。# 按国家分组填充缺失值 df[Hepatitis B] df[Hepatitis B].fillna(df.groupby(Country)[Hepatitis B].transform(median)) df[BMI] df[BMI].fillna(df.groupby(Country)[BMI].transform(median)) df[Total expenditure] df[Total expenditure].fillna(df.groupby(Country)[Total expenditure].transform(median))注意这里有一个细节分组填充用的是transform(median)而不是apply(median)。transform会返回与原DataFrame相同索引的序列可以直接赋值给原列apply会返回分组后的聚合结果如果用apply就直接报错或者改变数据结构了。这个坑我踩过一次当时找了半天错误最后发现是transform和apply的返回逻辑搞混了。对于GDP这个字段缺失值也不少。GDP在不同国家之间量级差异极大直接用中位数填充会产生较大的失真。我的做法是先用ffill和bfill按国家内部的时间顺序填充实在填不上的再退而求其次用该国的中位数兜底。df[GDP] df.groupby(Country)[GDP].fillna(methodffill).fillna(methodbfill) df[GDP] df[GDP].fillna(df.groupby(Country)[GDP].transform(median))之所以这样处理是因为GDP是一个随时间缓慢变化的指标用前后年份的数值推算当年的值精度远高于用全样本中位数代替。3.2 离群值识别与处理离群值这个事要谨慎再谨慎。我见过不少初学者一上来就用Z-score把所谓的“离群值”全部干掉结果模型反而变差了。原因是对于经济医疗类指标高值不一定就是错误比如卢森堡的人均GDP就是比大部分国家高出好几个数量级这是真实情况不是数据录错了。正确的做法是先可视化看看离群值到底长什么样再决定怎么处理。我用的方法是箱线图加IQR四分位距法则识别异常点然后逐个确认Q1 df[Alcohol].quantile(0.25) Q3 df[Alcohol].quantile(0.75) IQR Q3 - Q1 outliers df[(df[Alcohol] Q1 - 1.5 * IQR) | (df[Alcohol] Q3 1.5 * IQR)] print(outliers[[Country, Year, Alcohol]].head(10))跑完发现酒精消费量的离群值主要集中在少数几个欧洲国家这些国家的饮酒文化确实特殊数据本身没问题。这种情况下我的原则是保留数据不删不改最多在建模时用稳健回归或者数据变换来削弱它们的影响。如果某个离群值明显是录入错误比如年份写成9999、预期寿命写成个位数才考虑删除。3.3 特征编码与数据标准化Status这个字段是文本类型的“Developed”和“Developing”建模前必须转成数值。我用的是pd.get_dummies做独热编码这样不会给类别强加大小顺序df pd.get_dummies(df, columns[Status], drop_firstTrue, dtypeint)注意到我用的是dtypeint而不是默认的bool类型这样转出来的0/1可以直接参与后面相关系数矩阵的计算。很多教程不会提这个参数但实际处理时就会发现如果不指定dtype生成的列是bool型后续做相关分析时结果会有些奇怪。标准化这一步要特别注意训练集和测试集的一致性。如果用scikit-learn的StandardScaler一定要先fit在训练集上再用同一个scaler去transform测试集绝对不能在整个数据集上直接标准化再划分训练测试集这会造成数据泄露data leakage。数据泄露的实际后果就是模型在测试集上的表现虚高你以为模型很好但一到真实数据就崩了。from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler X df.drop([Life expectancy, Country, Year], axis1) y df[Life expectancy] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)4. 探索性数据分析与可视化洞察4.1 全球预期寿命时间趋势数据清洗完之后先别急着建模。探索性数据分析EDA这个环节能让数据说话帮我们建立对数据的直觉。我记得自己第一次画预期寿命随时间变化的折线图时发现了一个很有意思的现象全球平均预期寿命并不是平滑上升的2000年到2003年之间出现过明显波动2005年之后才进入稳定增长轨道。绘图代码很简单但图里的信息量很大import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize(12, 6)) sns.lineplot(datadf, xYear, yLife expectancy, estimatormean, errorbar(ci, 95)) plt.title(Global Average Life Expectancy Trend (2000-2015)) plt.xlabel(Year) plt.ylabel(Life Expectancy (years)) plt.show()把数据按照Status拆分后会看到更清晰的对比发达国家预期寿命稳定在75-80岁区间曲线相对平缓发展中国家从60岁附近起步虽然整体水平低但增速明显更快。这说明全球预期寿命的差距在缩小发展中国家正在快速追赶。这个发现为后面建模时把Status作为重要特征提供了依据——它确实对预期寿命有系统性的影响。4.2 核心变量相关性矩阵分析相关性矩阵是EDA阶段最能出干货的输出。我用seaborn的heatmap画了一张包含所有数值变量两两相关系数的热力图一眼就能看出哪些变量跟预期寿命关系最紧密corr_matrix df.corr(numeric_onlyTrue) plt.figure(figsize(16, 12)) sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapRdBu_r, center0) plt.show()从相关系数看与预期寿命正相关最强的几个变量是Schooling受教育年限r≈0.75、Income composition of resources资源收入构成指数r≈0.72、BMIr≈0.55。负相关最强的几个是Adult Mortality成人死亡率r≈-0.84、HIV/AIDSr≈-0.65、infant deathsr≈-0.62。这些相关系数告诉我们一个很直白的道理预期寿命不是由某个单一因素决定的它同时受教育、经济、医疗、传染病防控等多方面因素共同影响。而且像成人死亡率、婴儿死亡率这些负相关指标本质上反映的是医疗体系的整体水平。不过这里要小心一点相关系数高不等于因果关系。举个典型的例子BMI跟预期寿命呈中等正相关但这不代表“让人变胖就能长寿”。合理的解释应该是在经济发展水平较高的国家居民营养状况普遍良好BMI处于健康偏上区间这些国家同时具备更好的医疗和生活条件所以预期寿命高。BMI本身可能是结果不是原因。4.3 发展中国家与发达国家的特征差异除了看全局趋势我习惯把数据按照Status拆开比较往往能捞出不少有意思的信息。用分组箱线图对比两类国家在各个关键指标上的差异plt.figure(figsize(14, 6)) plt.subplot(1, 2, 1) sns.boxplot(datadf, xStatus, yLife expectancy) plt.title(Life Expectancy by Status) plt.subplot(1, 2, 2) sns.boxplot(datadf, xStatus, ySchooling) plt.title(Schooling by Status) plt.show()发达国家预期寿命的中位数在79岁左右发展中国家只有67岁左右差距接近12年。受教育年限的中位数差异也很明显发达国家平均接近16年发展中国家只有10年左右。这两个图放在一起看教育对寿命的潜在影响就变得更加具体了。当然还是那句老话相关不等于因果但这种规模的数据差异足够引起我们后续建模时的重视。5. 特征工程与模型构建5.1 多重共线性检测与特征筛选建模前有一道必做的工序是检测多重共线性。多元线性回归假设自变量之间不能高度相关否则系数的标准误会被急剧放大导致你无法判断哪个变量真正起作用。我用的检测方法是VIF方差膨胀因子经验法则是VIF超过10就需要警惕超过5结合具体场景考虑是否处理。from statsmodels.stats.outliers_influence import variance_inflation_factor X_vif X.copy() # 为截距项添加一列1 X_vif.insert(0, const, 1) vif_data pd.DataFrame() vif_data[Variable] X_vif.columns vif_data[VIF] [variance_inflation_factor(X_vif.values, i) for i in range(X_vif.shape[1])] print(vif_data.sort_values(VIF, ascendingFalse))实测下来Adult Mortality、infant deaths、under-five deaths这三个变量之间的VIF值高得吓人都超过15了。原因也好理解这三个指标都是反映人口死亡状况的本质上是同一个底层现象的不同度量方式放在一起属于重复信息。我的处理办法是只保留Adult Mortality因为它与预期寿命的相关系数绝对值最大预测力最强同时把infant deaths和under-five deaths合并成一个特征child_mortality_rate取两者的均值既降了维度又保留了信息。5.2 多元线性回归模型构建与评估第一版模型我用statsmodels的OLS普通最小二乘法来做因为statsmodels输出的结果表格里包含系数p值、置信区间、R-squared等一大堆统计指标对理解模型背后每个特征的显著性和影响方向非常有帮助。线性回归的数学形式很简单就是一个线性组合$$LifeExpectancy \beta_0 \beta_1 \cdot X_1 \beta_2 \cdot X_2 ... \beta_n \cdot X_n$$import statsmodels.api as sm X_train_sm sm.add_constant(X_train) model sm.OLS(y_train, X_train_sm).fit() print(model.summary())模型输出的R-squared在0.86左右意思是说这十几个特征能够解释预期寿命变异的86%左右。对于一个社会经济类的预测问题来说这个解释力已经相当好了。从系数p值来看Schooling、Adult Mortality、HIV/AIDS、Income composition of resources、Hepatitis B这几个变量在统计上非常显著p0.001而Population、GDP、Alcohol这些变量p值不显著对模型贡献有限。这里有个细节值得单独说一下GDP不显著并不奇怪。虽然直觉上“国家越有钱人民越长寿”但GDP的效果可能已经被其他变量间接捕捉了。比如GDP高的国家通常教育投入多Schooling高、医疗支出多percentage expenditure高、疫苗覆盖率高Polio、Diphtheria高这些变量已经在模型中存在了GDP的增量信息自然就变少。这不是说GDP不重要而是它的影响被其他更直接的因素吸收了。5.3 随机森林回归与特征重要性对比线性模型有一个天然短板它假设自变量和因变量之间是线性关系。但真实世界里很多因素对预期寿命的影响是非线性的比如疫苗接种率在低水平时提升能显著降低死亡率但当覆盖率超过90%以后再提升带来的收益就非常有限了。为了捕捉这种非线性关系我用随机森林回归做了对比实验。from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score rf_model RandomForestRegressor(n_estimators300, max_depth10, random_state42) rf_model.fit(X_train_scaled, y_train) y_pred_rf rf_model.predict(X_test_scaled) print(R2:, r2_score(y_test, y_pred_rf)) print(RMSE:, np.sqrt(mean_squared_error(y_test, y_pred_rf))) importance_df pd.DataFrame({ Feature: X.columns, Importance: rf_model.feature_importances_ }).sort_values(Importance, ascendingFalse) print(importance_df.head(10))随机森林的R-squared在0.93左右RMSE约2.1年明显优于线性模型的R²0.86。这个差距说明特征和预期寿命之间的关系确实存在非线性成分随机森林能捕捉到这些复杂模式。特征重要性的排序跟线性模型的显著性结论大体一致但也有有趣的区别。随机森林认为Adult Mortality、HIV/AIDS、Schooling、Income composition of resources是最重要的四个特征。有意思的是随机森林给GDP的权重比线性模型高说明GDP对预期寿命的影响可能是条件性的——在低收入阶段GDP的增长对寿命提升效果显著但到了高收入阶段GDP的边际效应递减。这种阈值效应线性模型根本拟合不出来只有树模型能捕捉到。5.4 模型泛化能力评估模型建好了不能只看训练集表现我在测试集上做了完整评估。为了保证评估结果不受样本划分方式的影响我用5折交叉验证做了多次验证from sklearn.model_selection import cross_val_score cv_scores cross_val_score(rf_model, X_train_scaled, y_train, cv5, scoringr2) print(CV R2 mean: {:.3f}.format(cv_scores.mean())) print(CV R2 std: {:.3f}.format(cv_scores.std()))5折交叉验证的R²均值约0.91标准差0.02说明模型的表现稳定没有出现过拟合的迹象。之前我见过一些项目训练集R²高达0.98一到测试集就掉到0.6这种就是典型的过拟合——模型把训练集里的噪声都背下来了根本没法泛化。我调参的时候特别注意控制树深度和最小叶子节点数把max_depth限制在10层以内这能有效防止树长得太深而记住太多噪声。6. 结果解读与应用价值分析6.1 关键发现教育是寿命的隐形推手从模型结果来看单一特征里对预期寿命影响最大的不是医疗投入也不是经济总量而是平均受教育年限。受教育年限每增加1年预期寿命大约提升0.6-0.8岁这个数量级在人口健康层面是非常可观的。怎么理解这个结果教育学、公共卫生领域的研究早就发现教育程度高的人通常有更好的健康意识更倾向于接受预防性医疗、关注合理膳食、远离吸烟酗酒等风险行为。同时教育水平高的社会往往拥有更好的公共卫生基础设施和更科学的医疗资源配置。所以教育对寿命的提升不是直接“拉长生命”而是通过改善个人行为和群体健康环境间接实现的。数据挖掘帮我们把这条隐含路径用数字呈现了出来。6.2 公共卫生政策层面的启示如果把模型结果反向落地可以给公共卫生决策提供一些参考。比如模型显示HIV/AIDS死亡率是拖累预期寿命的重要因素且它的影响在发展中国家尤为突出。这说明在艾滋病高发地区加强抗病毒治疗的普及率、提升预防知识覆盖率可以显著延长居民预期寿命。疫苗覆盖率白喉、乙肝、脊髓灰质炎对预期寿命的正向影响也明显意味着持续扩大免疫覆盖面是性价比很高的公共卫生干预手段。这里我要提醒一句数据挖掘结论可以用于辅助决策但不能单凭一个模型就拍板政策。现实中政策制定要考虑预算约束、文化接受度、政治可行性等一大堆模型里没有的变量。数据挖掘的价值在于缩小不确定性范围、提供量化依据而不是替代人的判断。6.3 从模型到业务落地的三个关键限制第一个限制是数据粒度。这份数据集是国家级别的年度聚合数据也就是说我们只能看到“一个国家的平均值”看不到国内不同地区、不同收入群体之间的差异。而实际上一国内部的健康不平等往往比国与国之间更严重。如果能把数据下沉到省/州级别模型的价值会大很多。第二个限制是时间维度。2000-2015年的数据是历史快照而医疗技术、疾病谱、人口结构都在变化。2019年底开始的新冠疫情对全球预期寿命造成了显著冲击这段历史数据里完全没有覆盖。如果要用这个模型预测现在的预期寿命需要补充近几年的数据重新训练。第三个限制是因果推断的边界。回归模型和随机森林都只能证明“相关关系”和“预测能力”不能证明因果关系。教育年限和预期寿命的相关性很强但可能存在我们没观测到的混杂变量比如文化传统、社会稳定度同时影响着两者。如果想做更严谨的因果推断需要引入工具变量、自然实验等更高级的计量方法这是数据挖掘之外的另一套方法论体系了。7. 常见报错与排查经验记录7.1 中文显示与编码问题这个项目涉及不少可视化工作最常碰到的问题是图表里的中文乱码。matplotlib默认字体不支持中文直接写中文标签会变成一堆方块。解决办法是显式指定支持中文的字体plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] False第二行axes.unicode_minusFalse是必须的不然坐标轴上的负号会显示成乱码方块。这个细节很容易被忽略我第一次画相关性热力图时负号显示成了奇怪的字符查了半天才发现是这个参数的问题。如果是读取CSV文件时出现UnicodeDecodeError多半是文件编码不是UTF-8。我建议读文件时显式指定encodinglatin1或者encodinggbk具体哪个取决于数据来源。用pd.read_csv(life_expectancy.csv, encodinglatin1)通常能兼容大多数国际数据集。7.2 statsmodels版本差异导致的报错statsmodels库更新得比较频繁不同版本的API有一些差异。比如sm.OLS在较新版本中对输入数据的要求更严格如果你传进去的X包含缺失值或非数值类型会直接抛ValueError。我的经验是进模型前先做一次pd.to_numeric()强制类型转换把所有的列都转成float64避免因为数据类型问题报错。另一个版本相关的坑是add_constant的行为。较新版本的statsmodels默认不修改原始数据返回的是一个复制加常数列的新DataFrame所以如果后续还要使用原始X不用担心被污染。7.3 随机森林训练过程中的内存问题当数据集行数不多不到3000行的时候随机森林的训练不会出现内存问题。但如果你把n_estimators设置成1000以上训练时间会明显变长。我的建议是先跑一个小的100棵树看看基准效果再逐步增加树的数量。加入n_jobs-1参数可以让所有CPU核心并行训练速度提升明显。还有一点随机森林的random_state一定要固定下来不然每次跑出来的特征重要性排序都不太一样。虽然整体排名趋势一致但具体的数值会有波动复现实验结果就变得困难。7.4 数据泄露的隐蔽陷阱这是我最想强调的一个问题。很多人在做数据预处理时习惯先对整个数据集做标准化、填补缺失值然后再划分训练集和测试集。这在实践中是一个重大错误因为测试集的信息在训练阶段就被“偷看”了。举个具体的例子如果你用全体数据的均值去填补测试集里的缺失值这些均值本身就是训练阶段不该接触到的“未来信息”。模型在测试集上的表现会虚高你以为的模型能力存在水分。正确的顺序是先划分训练集和测试集再在训练集上计算填充值、标准化参数然后用这些参数去处理测试集。对于标准化就是刚才代码里展示的fit_transform和transform分离的写法。这个坑我早期也踩过导致模型上线后表现大幅缩水后来学乖了才明白问题的根源在此。8. 项目经验总结与后续扩展方向做完整套流程之后我最大的感受是数据挖掘项目中真正难的往往不是模型本身而是前面那些琐碎的数据处理和特征工程工作。这个项目里模型的R²从线性回归的0.86提升到随机森林的0.93靠的不是换个更复杂的算法而是把缺失值处理策略、特征筛选、离群值判断这些基础环节做扎实了。对于后续想深入扩展的朋友我建议可以从三个方向继续一是时间序列维度。目前模型把2000-2015年所有年份的数据混合在一起建模相当于把面板数据当横截面数据用了。更严谨的做法是拆成年份单独看每一年模型的参数变化分析特征重要性的时间演化趋势。也可以用ARIMA或Prophet这类时间序列模型对重点国家比如中国、印度做未来5-10年的预期寿命预测。二是地理区域维度。数据集里的发展中国家横跨亚洲、非洲、南美洲这些地区的健康挑战差异巨大。可以按大洲拆开分别建模对比各区域的特征重要性差异比如非洲模型里HIV/AIDS的影响权重可能远高于亚洲模型。这种区域性对比的结论会比全局模型更有政策参考价值。三是模型可解释性。随机森林虽然预测精度高但解释性弱于线性模型。想兼顾精度和可解释性可以试试SHAPSHapley Additive exPlanations工具它能算出每个样本中每个特征对预测结果的贡献值把随机森林变成一个“黑箱但有解释”的模型。我用SHAP做过这个项目的后续分析画出来的SHAP summary plot非常直观地展示了各个特征的影响方向和强度分布比单纯靠feature_importance矩阵更有说服力。最后说一下复现这个项目的注意事项。整个代码量不大按照上面的顺序一步步跑就行。但有一点我得提醒大家公开数据集在不同网站上流传的版本不完全一样如果你下载到的数据集列名或者行数跟我说的对不上别慌先看看df.info()的输出对照字段含义表确认一下数据处理逻辑是一样的。真正理解了每一步在做什么换成任何数据集都能灵活应对。这也正是做数据挖掘项目最大的收获——不是学会某个库的某个函数而是建立一套“拿到数据就知道该从哪里下手”的问题解决框架。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价