随着电子病历、可穿戴设备、公共卫生监测系统的快速普及,医疗健康领域已经进入大数据时代。通过对海量医疗数据的清洗、分析和建模,可实现疾病风险预测、辅助临床决策、公共卫生事件预警、个性化诊疗方案推荐等多重价值,是当前医疗数字化转型的核心方向之一。
本文以常见的2型糖尿病风险预测场景为例,提供一套可复用的大数据医疗健康数据分析代码框架,覆盖数据预处理、探索性分析、模型训练、效果评估全流程,同时说明医疗数据分析的特殊注意事项。
## 一、前置依赖准备
医疗数据普遍存在类别不平衡、特征维度多的特点,且对模型可解释性要求较高,需先安装对应工具库:
“`bash
pip install pandas numpy scikit-learn seaborn matplotlib imbalanced-learn shap
“`
## 二、全流程代码实现
示例基于UCI公开糖尿病数据集,特征包含怀孕次数、空腹血糖、血压、皮褶厚度、胰岛素水平、BMI、糖尿病谱系功能、年龄,标签为是否患有糖尿病,无隐私风险。
### 1. 数据加载与预处理
医疗数据预处理是核心环节,直接影响模型效果,重点处理敏感信息、缺失值、异常值三类问题:
“`python
import pandas as pd
import numpy as np
# 1.1 加载数据集
data = pd.read_csv(“diabetes.csv”)
# 1.2 敏感信息脱敏(若使用院内私有数据,需强制删除姓名、身份证号、手机号等可识别字段)
# data = data.drop(columns=[“patient_id”, “id_card”, “name”])
# 1.3 缺失值处理:数值型特征用中位数填充(避免极端值影响),分类型特征用众数填充
numeric_cols = data.select_dtypes(include=[np.number]).columns.tolist()
categorical_cols = data.select_dtypes(exclude=[np.number]).columns.tolist()
for col in numeric_cols:
data[col] = data[col].fillna(data[col].median())
for col in categorical_cols:
data[col] = data[col].fillna(data[col].mode()[0])
# 1.4 异常值过滤:对生命体征类特征采用3σ原则剔除异常值
vital_cols = [“Glucose”, “BloodPressure”, “SkinThickness”, “Insulin”, “BMI”]
for col in vital_cols:
mean = data[col].mean()
std = data[col].std()
data = data[(data[col] >= mean – 3*std) & (data[col] <= mean + 3*std)]
```
### 2. 探索性数据分析(EDA)
挖掘数据内在规律,为特征工程和业务解读提供依据:
```python
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 2.1 患病/健康人群年龄分布对比
sns.histplot(data=data, x="Age", hue="Outcome", kde=True, bins=20)
plt.title("不同年龄层糖尿病患病分布")
plt.show()
# 2.2 特征相关性热力图,筛选与患病相关性高的指标
corr = data.corr()
sns.heatmap(corr, annot=True, cmap="RdBu_r", fmt=".2f")
plt.title("特征相关性热力图")
plt.show()
# 2.3 血糖水平与患病的交叉分析
sns.boxplot(data=data, x="Outcome", y="Glucose")
plt.title("血糖水平与糖尿病患病关系")
plt.show()
```
### 3. 疾病风险预测模型训练
医疗场景阳性样本占比通常较低,需优先解决类别不平衡问题,同时选择可解释性强的模型:
```python
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from imblearn.over_sampling import SMOTE
from sklearn.metrics import classification_report, roc_auc_score
# 3.1 划分特征与标签
X = data.drop(columns=["Outcome"])
y = data["Outcome"] # 标签:1=患病,0=健康
# 3.2 划分训练集与测试集,按标签分层抽样保证分布一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 3.3 SMOTE过采样解决类别不平衡问题
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
# 3.4 训练随机森林模型(树模型可解释性强,适合医疗场景)
model = RandomForestClassifier(n_estimators=200, random_state=42)
model.fit(X_train_smote, y_train_smote)
# 3.5 模型预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
```
### 4. 模型评估与可解释性分析
医疗场景需重点关注召回率(降低漏诊风险),同时明确模型判断依据:
```python
import shap
# 4.1 输出模型效果指标
print(classification_report(y_test, y_pred))
print(f"ROC-AUC分数:{roc_auc_score(y_test, y_pred_proba):.2f}")
# 4.2 绘制特征重要性,明确模型判断核心依据
feature_importance = pd.DataFrame({
"特征": X.columns,
"重要性": model.feature_importances_
}).sort_values(by="重要性", ascending=False)
sns.barplot(data=feature_importance, x="重要性", y="特征")
plt.title("糖尿病风险预测特征重要性")
plt.show()
# 4.3 SHAP值分析单样本预测依据,可用于临床辅助决策参考
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values[1], X_test, plot_type="bar")
```
## 三、医疗数据分析特殊注意事项
1. **合规性优先**:所有数据处理必须符合《个人信息保护法》《医疗卫生机构网络安全管理办法》等法规要求,严格执行数据脱敏、数据授权流程,严禁泄露患者隐私。
2. **数据质量校验**:医疗数据来源复杂,不同医疗机构的检验标准、数据录入规范存在差异,分析前需完成数据标准化、标注校验,避免因数据偏差导致模型错误。
3. **可解释性要求**:医疗场景禁止使用不可解释的黑箱模型,需明确给出模型预测的核心依据,方便临床医生核验,降低医疗风险。
4. **避免人群偏倚**:模型训练需覆盖不同地域、不同年龄、不同经济水平的人群,避免因训练样本单一导致的算法歧视,保障模型公平性。
上述代码框架可灵活适配不同医疗分析场景,替换为对应的慢病数据集、传染病监测数据集后,仅需调整特征工程和模型参数即可完成对应分析任务。随着医疗大数据治理体系的不断完善,大数据分析技术将在提升诊疗效率、降低医疗成本、改善患者预后等方面发挥越来越重要的作用。
本文由AI大模型(Doubao-Seed-1.6)结合行业知识与创新视角深度思考后创作。