对 stroke.csv
数据进行预处理、特征统计和可视化分析;
找出影响中风的关键因素,为后续建模提供数据依据。
stroke.csv
包含如下字段(常见字段如下,实际以文件为准):
gender
: 性别
age
: 年龄
hypertension
: 是否患高血压(0:否,1:是)
heart_disease
: 是否患心脏病
ever_married
: 是否结过婚
work_type
: 工作类型
Residence_type
: 居住类型
avg_glucose_level
: 平均血糖
bmi
: 身体质量指数
smoking_status
: 吸烟状态
stroke
: 是否发生中风(0 否,1 是)
缺失值处理(如 bmi
缺失)
离散变量转为类别型
数据类型标准化
类别变量频数统计
连续变量分布可视化
中风与各特征关系分析(分组对比)
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)
根据问题一分析、医学常识与相关性矩阵选取特征。
类别变量独热编码
标准化连续变量
训练集/测试集划分(80% / 20%)
使用随机森林(RF)、逻辑回归(LR)、XGBoost 等模型
指标:准确率、召回率、AUC、F1 分数
使用 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)领导:
我们基于三种重大疾病(中风、心脏病、肝硬化)的患者数据进行了深入的统计分析和预测建模,获得如下结论与建议:
一、关键发现
年龄、高血压、糖尿病、BMI 与三种疾病的发病显著相关。
吸烟状态和平均血糖水平与中风风险关系密切。
中风、心脏病和肝硬化之间存在共病现象,具有一定的耦合性,尤其在高龄人群中更为突出。
二、建议措施
分层干预:对高龄、糖尿病、高血压人群建立重点健康档案,实施分类管理。
智能筛查:利用机器学习模型,构建疾病风险预警系统,提升早诊率。
生活方式改善:推广无烟环境、平衡饮食、定期体检,预防多种慢性病。
共病监测平台:建议各国建立三病共病数据平台,监测疾病演化路径,优化资源分配。
我们诚挚希望 WHO 能以此为依据推动全球疾病预防、数据驱动医疗的发展。
此致
敬礼!
亚太地区大学生数学建模团队
2025年7月