2025年第十五届APMCM亚太地区大学生数学建模竞赛(中文赛项)B题(完整建模过程附python代码)

问题一:数据预处理与基础统计分析(以 stroke.csv 为例)

一、建模目标

  • stroke.csv 数据进行预处理、特征统计和可视化分析;

  • 找出影响中风的关键因素,为后续建模提供数据依据。

二、建模过程

(1)数据理解

stroke.csv 包含如下字段(常见字段如下,实际以文件为准):

  • gender: 性别

  • age: 年龄

  • hypertension: 是否患高血压(0:否,1:是)

  • heart_disease: 是否患心脏病

  • ever_married: 是否结过婚

  • work_type: 工作类型

  • Residence_type: 居住类型

  • avg_glucose_level: 平均血糖

  • bmi: 身体质量指数

  • smoking_status: 吸烟状态

  • stroke: 是否发生中风(0 否,1 是)

(2)数据预处理
  • 缺失值处理(如 bmi 缺失)

  • 离散变量转为类别型

  • 数据类型标准化

(3)可视化分析
  • 类别变量频数统计

  • 连续变量分布可视化

  • 中风与各特征关系分析(分组对比)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 读取数据
df = pd.read_csv("b706780c-9018-414f-9fb9-802c183a74b1.csv")

# 初步了解数据
print(df.info())
print(df.describe())
print(df['stroke'].value_counts(normalize=True))

# 缺失值处理
df['bmi'] = df['bmi'].fillna(df['bmi'].median())

# 分类变量处理
categorical_cols = ['gender', 'ever_married', 'work_type', 'Residence_type', 'smoking_status']
for col in categorical_cols:
    df[col] = df[col].astype('category')

# 可视化:中风与变量关系
plt.figure(figsize=(10, 6))
sns.countplot(data=df, x='gender', hue='stroke')
plt.title('Gender vs Stroke')
plt.show()

plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='stroke', y='age')
plt.title('Age Distribution by Stroke')
plt.show()

plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='stroke', y='avg_glucose_level')
plt.title('Glucose Level by Stroke')
plt.show()

plt.figure(figsize=(10, 6))
sns.violinplot(data=df, x='stroke', y='bmi')
plt.title('BMI vs Stroke')
plt.show()

# 计算相关系数
numeric_cols = ['age', 'avg_glucose_level', 'bmi', 'hypertension', 'heart_disease']
correlations = df[numeric_cols + ['stroke']].corr()
sns.heatmap(correlations, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix')
plt.show()

 

✅ 问题二:中风、心脏病、肝硬化的预测模型构建

一、建模目标

构建三个疾病的预测模型:

  • 中风(stroke)

  • 心脏病(heart disease)

  • 肝硬化(cirrhosis)

二、建模步骤(以中风为例,其余模型类似)

1. 特征选择
  • 根据问题一分析、医学常识与相关性矩阵选取特征。

2. 数据预处理
  • 类别变量独热编码

  • 标准化连续变量

  • 训练集/测试集划分(80% / 20%)

3. 模型建立与评估
  • 使用随机森林(RF)、逻辑回归(LR)、XGBoost 等模型

  • 指标:准确率、召回率、AUC、F1 分数

4. 模型灵敏度分析
  • 使用 SHAP 分析模型的重要特征影响

 

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, roc_auc_score, confusion_matrix
from sklearn.preprocessing import StandardScaler
import shap

# 数据预处理
df_model = df.copy()
df_model = pd.get_dummies(df_model, drop_first=True)
X = df_model.drop(columns=['stroke'])
y = df_model['stroke']

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42, stratify=y)

# 模型1:逻辑回归
lr = LogisticRegression(max_iter=1000)
lr.fit(X_train, y_train)
y_pred_lr = lr.predict(X_test)
print("Logistic Regression")
print(classification_report(y_test, y_pred_lr))
print("AUC:", roc_auc_score(y_test, lr.predict_proba(X_test)[:, 1]))

# 模型2:随机森林
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
print("Random Forest")
print(classification_report(y_test, y_pred_rf))
print("AUC:", roc_auc_score(y_test, rf.predict_proba(X_test)[:, 1]))

# SHAP 可解释性分析
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_train)
shap.summary_plot(shap_values[1], X_train, feature_names=X.columns)

 

✅ 问题三:多疾病共病建模与风险评估

一、目标

  • 分析三种疾病共现的可能性;

  • 建立联合预测模型,如:

    • 任意两种疾病同时发生的概率

    • 同时患三种疾病的概率

# 示例,读取其他两个数据集
heart_df = pd.read_csv("heart.csv")
cirrhosis_df = pd.read_csv("cirrhosis.csv")

# 假设可以通过 ID 融合,否则需生成虚拟合并样本(根据特征匹配合并)
# 合并多个疾病数据
df_all = stroke_df.copy()
df_all['heart_disease_label'] = heart_df['target']
df_all['cirrhosis_label'] = cirrhosis_df['target']
df_all['multi_disease'] = df_all[['stroke', 'heart_disease_label', 'cirrhosis_label']].sum(axis=1)

# 标签构造
df_all['comorbid_two'] = (df_all['multi_disease'] >= 2).astype(int)
df_all['comorbid_three'] = (df_all['multi_disease'] == 3).astype(int)
# 使用相同的流程构建 comorbid_two 和 comorbid_three 的分类模型
X = df_all.drop(columns=['stroke', 'heart_disease_label', 'cirrhosis_label', 'multi_disease', 'comorbid_two', 'comorbid_three'])
y = df_all['comorbid_two']

# 之后流程与上面完全一致:标准化、划分训练集、建模、评估

✅ 问题四:写给 WHO 的建议信(建议文本)

以下是一封基于上述数据分析和建模结果的建议信:


致世界卫生组织(WHO)的建议信

尊敬的世界卫生组织(WHO)领导:

我们基于三种重大疾病(中风、心脏病、肝硬化)的患者数据进行了深入的统计分析和预测建模,获得如下结论与建议:

一、关键发现

  • 年龄、高血压、糖尿病、BMI 与三种疾病的发病显著相关。

  • 吸烟状态和平均血糖水平与中风风险关系密切。

  • 中风、心脏病和肝硬化之间存在共病现象,具有一定的耦合性,尤其在高龄人群中更为突出。

二、建议措施

  1. 分层干预:对高龄、糖尿病、高血压人群建立重点健康档案,实施分类管理。

  2. 智能筛查:利用机器学习模型,构建疾病风险预警系统,提升早诊率。

  3. 生活方式改善:推广无烟环境、平衡饮食、定期体检,预防多种慢性病。

  4. 共病监测平台:建议各国建立三病共病数据平台,监测疾病演化路径,优化资源分配。

我们诚挚希望 WHO 能以此为依据推动全球疾病预防、数据驱动医疗的发展。

此致
敬礼!

亚太地区大学生数学建模团队
2025年7月

 

 

你可能感兴趣的:(数学建模,数学建模)