PythonSPSS数学建模实战慢性病影响因素全流程分析指南数学建模竞赛中数据分析类题目往往让初学者望而生畏。面对海量调查数据和复杂的影响因素如何从原始数据中提炼出有价值的结论本文将带你用Python和SPSS这对黄金组合完整走通慢性病影响因素分析的全流程。1. 环境准备与数据初探工欲善其事必先利其器。我们需要配置好分析环境并初步了解数据特征。1.1 工具安装与配置推荐使用Anaconda创建独立的Python环境conda create -n chronic_disease python3.8 conda activate chronic_disease pip install pandas scikit-learn matplotlib seaborn statsmodels对于SPSS部分建议使用SPSS Statistics 25版本其Python插件能实现与Jupyter Notebook的无缝交互。1.2 数据加载与概览首先用Python读取Excel数据并快速了解数据结构import pandas as pd # 加载数据 data pd.read_excel(慢性病调查数据.xlsx, sheet_nameSheet1) # 查看数据概况 print(f数据维度{data.shape}) print(\n前5行数据) print(data.head()) # 检查缺失值 print(\n各列缺失值统计) print(data.isnull().sum())典型输出可能显示数据维度(2000, 230) 前5行数据 ID 年龄 性别 婚姻状况 ... 血压值 血糖值 BMI 0 1 45 2 1 ... 132 5.8 23.1 1 2 38 1 1 ... 128 5.2 21.8 ... 各列缺失值统计 ID 0 年龄 5 性别 3 ... 血压值 12 血糖值 18 BMI 7 dtype: int641.3 数据字典构建面对200列的调查数据建议先整理数据字典变量名类型说明取值范围年龄数值受访者年龄18-80性别分类1男, 2女1-2婚姻状况分类1未婚, 2已婚...1-4............Q15数值每周运动次数0-7BMI数值身体质量指数15-352. 数据清洗与特征工程原始数据往往存在各种质量问题需要进行系统化处理。2.1 缺失值处理策略根据数据特性选择适当的缺失值填补方法from sklearn.impute import SimpleImputer # 数值型变量用中位数填补 num_cols [年龄, BMI, 血压值] num_imputer SimpleImputer(strategymedian) data[num_cols] num_imputer.fit_transform(data[num_cols]) # 分类变量用众数填补 cat_cols [性别, 婚姻状况] cat_imputer SimpleImputer(strategymost_frequent) data[cat_cols] cat_imputer.fit_transform(data[cat_cols]) # 复杂问卷题目采用多重插补 import statsmodels.api as sm data[血糖值] sm.imputation.mice(data[[年龄,BMI,血压值,血糖值]]).imputed_data2.2 异常值检测与处理使用箱线图和Z-score方法识别异常值import matplotlib.pyplot as plt import numpy as np plt.figure(figsize(10,6)) data[[年龄,BMI,血压值]].boxplot() plt.title(关键数值变量分布检查) plt.show() # Z-score方法 from scipy import stats z_scores stats.zscore(data[[BMI,血压值]]) abs_z_scores np.abs(z_scores) filtered_entries (abs_z_scores 3).all(axis1) data data[filtered_entries]2.3 特征构造与转换基于原始变量构造更有意义的特征# 构造饮食多样性指数 food_cols [谷物摄入,蔬菜摄入,水果摄入,肉类摄入] data[饮食多样性] data[food_cols].gt(0).sum(axis1) # 活动水平分级 def activity_level(row): if row[运动次数] 5 and row[运动时长] 30: return 高 elif row[运动次数] 3: return 中 else: return 低 data[活动水平] data.apply(activity_level, axis1) # 虚拟变量转换 data pd.get_dummies(data, columns[性别,婚姻状况,活动水平])3. 探索性分析与可视化在建模前通过可视化手段深入理解数据特征。3.1 单变量分布分析使用直方图和密度图查看关键变量分布import seaborn as sns plt.figure(figsize(12,8)) sns.histplot(data[年龄], kdeTrue, bins20) plt.title(受访者年龄分布) plt.xlabel(年龄) plt.ylabel(频数) plt.show()3.2 双变量关系探索分析饮食习惯与慢性病指标的关联# 血压与饮食多样性的关系 plt.figure(figsize(10,6)) sns.scatterplot(x饮食多样性, y血压值, hue性别_1, sizeBMI, datadata) plt.title(血压值与饮食多样性关系) plt.show() # 使用SPSS进行更复杂的交叉分析 python BEGIN PROGRAM PYTHON. import spss spss.Submit( CROSSTABS /TABLES活动水平 BY 高血压 BY 性别 /FORMATAVALUE TABLES /CELLSCOUNT ROW COLUMN /COUNT ROUND CELL. ) END PROGRAM.3.3 相关性热力图生成变量间相关系数矩阵corr_matrix data[[年龄,BMI,血压值,血糖值, 饮食多样性,运动次数]].corr() plt.figure(figsize(10,8)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0) plt.title(变量间相关系数矩阵) plt.show()4. 统计建模与机器学习结合传统统计方法和机器学习算法进行深入分析。4.1 逻辑回归分析使用SPSS进行影响因素筛选BEGIN PROGRAM PYTHON. spss.Submit( LOGISTIC REGRESSION VARIABLES 高血压 /METHODENTER 年龄 BMI 性别 /METHODFORWARD 饮食多样性 活动水平_高 活动水平_中 /CONTRAST (性别)Indicator /PRINTCI(95) /CRITERIAPIN(0.05) POUT(0.10) ITERATE(20) CUT(0.5). ) END PROGRAM.4.2 随机森林特征重要性用Python评估各因素对糖尿病的影响程度from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split X data[[年龄,BMI,血压值,饮食多样性,运动次数,性别_1]] y data[糖尿病] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) rf RandomForestClassifier(n_estimators100) rf.fit(X_train, y_train) # 特征重要性 importances pd.DataFrame({ 特征: X.columns, 重要性: rf.feature_importances_ }).sort_values(重要性, ascendingFalse) plt.figure(figsize(10,6)) sns.barplot(x重要性, y特征, dataimportances) plt.title(糖尿病预测特征重要性) plt.show()4.3 聚类分析与人群细分使用K-means对居民进行健康画像from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 选择聚类特征 cluster_features data[[BMI,血压值,血糖值,饮食多样性,运动次数]] scaler StandardScaler() scaled_features scaler.fit_transform(cluster_features) # 确定最佳K值 inertia [] for k in range(2, 8): kmeans KMeans(n_clustersk, random_state42) kmeans.fit(scaled_features) inertia.append(kmeans.inertia_) plt.plot(range(2,8), inertia, markero) plt.xlabel(聚类数量) plt.ylabel(SSE) plt.title(肘部法则确定最佳K值) plt.show() # 最终聚类 kmeans KMeans(n_clusters4, random_state42) data[健康类别] kmeans.fit_predict(scaled_features) # 分析各类别特征 cluster_profiles data.groupby(健康类别).mean() print(cluster_profiles[[BMI,血压值,血糖值]])5. 结果解读与建议生成基于分析结果为不同人群提供个性化建议。5.1 高风险人群特征分析识别高血压高风险人群的特征high_risk data[data[高血压]1].describe() low_risk data[data[高血压]0].describe() risk_comparison pd.concat([high_risk.T, low_risk.T], keys[高风险,低风险], axis1) print(risk_comparison[[mean]].loc[[年龄,BMI,饮食多样性,运动次数]])5.2 健康建议模板根据聚类结果生成建议def generate_advice(row): advice [] if row[健康类别] 0: advice.append(您的BMI偏高建议减少高热量食物摄入) advice.append(每周增加2-3次有氧运动) elif row[健康类别] 1: advice.append(您的饮食多样性不足建议增加蔬菜水果种类) # 其他类别建议... return ; .join(advice) data[健康建议] data.apply(generate_advice, axis1)5.3 可视化报告生成使用Matplotlib创建综合报告fig, axes plt.subplots(2, 2, figsize(15,12)) # 健康类别分布 sns.countplot(x健康类别, datadata, axaxes[0,0]) axes[0,0].set_title(人群健康类别分布) # 各类别BMI比较 sns.boxplot(x健康类别, yBMI, datadata, axaxes[0,1]) axes[0,1].set_title(各类别BMI分布) # 血压与年龄关系 sns.scatterplot(x年龄, y血压值, hue健康类别, datadata, axaxes[1,0]) axes[1,0].set_title(血压与年龄关系) # 饮食多样性比较 sns.barplot(x健康类别, y饮食多样性, datadata, axaxes[1,1]) axes[1,1].set_title(各类别饮食多样性比较) plt.tight_layout() plt.savefig(健康分析报告.png, dpi300)
用Python+SPSS搞定数学建模A题:从数据清洗到慢性病影响因素分析全流程
PythonSPSS数学建模实战慢性病影响因素全流程分析指南数学建模竞赛中数据分析类题目往往让初学者望而生畏。面对海量调查数据和复杂的影响因素如何从原始数据中提炼出有价值的结论本文将带你用Python和SPSS这对黄金组合完整走通慢性病影响因素分析的全流程。1. 环境准备与数据初探工欲善其事必先利其器。我们需要配置好分析环境并初步了解数据特征。1.1 工具安装与配置推荐使用Anaconda创建独立的Python环境conda create -n chronic_disease python3.8 conda activate chronic_disease pip install pandas scikit-learn matplotlib seaborn statsmodels对于SPSS部分建议使用SPSS Statistics 25版本其Python插件能实现与Jupyter Notebook的无缝交互。1.2 数据加载与概览首先用Python读取Excel数据并快速了解数据结构import pandas as pd # 加载数据 data pd.read_excel(慢性病调查数据.xlsx, sheet_nameSheet1) # 查看数据概况 print(f数据维度{data.shape}) print(\n前5行数据) print(data.head()) # 检查缺失值 print(\n各列缺失值统计) print(data.isnull().sum())典型输出可能显示数据维度(2000, 230) 前5行数据 ID 年龄 性别 婚姻状况 ... 血压值 血糖值 BMI 0 1 45 2 1 ... 132 5.8 23.1 1 2 38 1 1 ... 128 5.2 21.8 ... 各列缺失值统计 ID 0 年龄 5 性别 3 ... 血压值 12 血糖值 18 BMI 7 dtype: int641.3 数据字典构建面对200列的调查数据建议先整理数据字典变量名类型说明取值范围年龄数值受访者年龄18-80性别分类1男, 2女1-2婚姻状况分类1未婚, 2已婚...1-4............Q15数值每周运动次数0-7BMI数值身体质量指数15-352. 数据清洗与特征工程原始数据往往存在各种质量问题需要进行系统化处理。2.1 缺失值处理策略根据数据特性选择适当的缺失值填补方法from sklearn.impute import SimpleImputer # 数值型变量用中位数填补 num_cols [年龄, BMI, 血压值] num_imputer SimpleImputer(strategymedian) data[num_cols] num_imputer.fit_transform(data[num_cols]) # 分类变量用众数填补 cat_cols [性别, 婚姻状况] cat_imputer SimpleImputer(strategymost_frequent) data[cat_cols] cat_imputer.fit_transform(data[cat_cols]) # 复杂问卷题目采用多重插补 import statsmodels.api as sm data[血糖值] sm.imputation.mice(data[[年龄,BMI,血压值,血糖值]]).imputed_data2.2 异常值检测与处理使用箱线图和Z-score方法识别异常值import matplotlib.pyplot as plt import numpy as np plt.figure(figsize(10,6)) data[[年龄,BMI,血压值]].boxplot() plt.title(关键数值变量分布检查) plt.show() # Z-score方法 from scipy import stats z_scores stats.zscore(data[[BMI,血压值]]) abs_z_scores np.abs(z_scores) filtered_entries (abs_z_scores 3).all(axis1) data data[filtered_entries]2.3 特征构造与转换基于原始变量构造更有意义的特征# 构造饮食多样性指数 food_cols [谷物摄入,蔬菜摄入,水果摄入,肉类摄入] data[饮食多样性] data[food_cols].gt(0).sum(axis1) # 活动水平分级 def activity_level(row): if row[运动次数] 5 and row[运动时长] 30: return 高 elif row[运动次数] 3: return 中 else: return 低 data[活动水平] data.apply(activity_level, axis1) # 虚拟变量转换 data pd.get_dummies(data, columns[性别,婚姻状况,活动水平])3. 探索性分析与可视化在建模前通过可视化手段深入理解数据特征。3.1 单变量分布分析使用直方图和密度图查看关键变量分布import seaborn as sns plt.figure(figsize(12,8)) sns.histplot(data[年龄], kdeTrue, bins20) plt.title(受访者年龄分布) plt.xlabel(年龄) plt.ylabel(频数) plt.show()3.2 双变量关系探索分析饮食习惯与慢性病指标的关联# 血压与饮食多样性的关系 plt.figure(figsize(10,6)) sns.scatterplot(x饮食多样性, y血压值, hue性别_1, sizeBMI, datadata) plt.title(血压值与饮食多样性关系) plt.show() # 使用SPSS进行更复杂的交叉分析 python BEGIN PROGRAM PYTHON. import spss spss.Submit( CROSSTABS /TABLES活动水平 BY 高血压 BY 性别 /FORMATAVALUE TABLES /CELLSCOUNT ROW COLUMN /COUNT ROUND CELL. ) END PROGRAM.3.3 相关性热力图生成变量间相关系数矩阵corr_matrix data[[年龄,BMI,血压值,血糖值, 饮食多样性,运动次数]].corr() plt.figure(figsize(10,8)) sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0) plt.title(变量间相关系数矩阵) plt.show()4. 统计建模与机器学习结合传统统计方法和机器学习算法进行深入分析。4.1 逻辑回归分析使用SPSS进行影响因素筛选BEGIN PROGRAM PYTHON. spss.Submit( LOGISTIC REGRESSION VARIABLES 高血压 /METHODENTER 年龄 BMI 性别 /METHODFORWARD 饮食多样性 活动水平_高 活动水平_中 /CONTRAST (性别)Indicator /PRINTCI(95) /CRITERIAPIN(0.05) POUT(0.10) ITERATE(20) CUT(0.5). ) END PROGRAM.4.2 随机森林特征重要性用Python评估各因素对糖尿病的影响程度from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split X data[[年龄,BMI,血压值,饮食多样性,运动次数,性别_1]] y data[糖尿病] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) rf RandomForestClassifier(n_estimators100) rf.fit(X_train, y_train) # 特征重要性 importances pd.DataFrame({ 特征: X.columns, 重要性: rf.feature_importances_ }).sort_values(重要性, ascendingFalse) plt.figure(figsize(10,6)) sns.barplot(x重要性, y特征, dataimportances) plt.title(糖尿病预测特征重要性) plt.show()4.3 聚类分析与人群细分使用K-means对居民进行健康画像from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler # 选择聚类特征 cluster_features data[[BMI,血压值,血糖值,饮食多样性,运动次数]] scaler StandardScaler() scaled_features scaler.fit_transform(cluster_features) # 确定最佳K值 inertia [] for k in range(2, 8): kmeans KMeans(n_clustersk, random_state42) kmeans.fit(scaled_features) inertia.append(kmeans.inertia_) plt.plot(range(2,8), inertia, markero) plt.xlabel(聚类数量) plt.ylabel(SSE) plt.title(肘部法则确定最佳K值) plt.show() # 最终聚类 kmeans KMeans(n_clusters4, random_state42) data[健康类别] kmeans.fit_predict(scaled_features) # 分析各类别特征 cluster_profiles data.groupby(健康类别).mean() print(cluster_profiles[[BMI,血压值,血糖值]])5. 结果解读与建议生成基于分析结果为不同人群提供个性化建议。5.1 高风险人群特征分析识别高血压高风险人群的特征high_risk data[data[高血压]1].describe() low_risk data[data[高血压]0].describe() risk_comparison pd.concat([high_risk.T, low_risk.T], keys[高风险,低风险], axis1) print(risk_comparison[[mean]].loc[[年龄,BMI,饮食多样性,运动次数]])5.2 健康建议模板根据聚类结果生成建议def generate_advice(row): advice [] if row[健康类别] 0: advice.append(您的BMI偏高建议减少高热量食物摄入) advice.append(每周增加2-3次有氧运动) elif row[健康类别] 1: advice.append(您的饮食多样性不足建议增加蔬菜水果种类) # 其他类别建议... return ; .join(advice) data[健康建议] data.apply(generate_advice, axis1)5.3 可视化报告生成使用Matplotlib创建综合报告fig, axes plt.subplots(2, 2, figsize(15,12)) # 健康类别分布 sns.countplot(x健康类别, datadata, axaxes[0,0]) axes[0,0].set_title(人群健康类别分布) # 各类别BMI比较 sns.boxplot(x健康类别, yBMI, datadata, axaxes[0,1]) axes[0,1].set_title(各类别BMI分布) # 血压与年龄关系 sns.scatterplot(x年龄, y血压值, hue健康类别, datadata, axaxes[1,0]) axes[1,0].set_title(血压与年龄关系) # 饮食多样性比较 sns.barplot(x健康类别, y饮食多样性, datadata, axaxes[1,1]) axes[1,1].set_title(各类别饮食多样性比较) plt.tight_layout() plt.savefig(健康分析报告.png, dpi300)