一、引言 在全球疾病谱中,心脏病始终占据着高发病、高致死率的“沉重席位”。随着医疗信息化推进,海量临床数据积累为疾病研究提供新契机。本文基于真实医疗数据集,以Python为工具,完整呈现心脏病数据分析与分类模型构建全流程——从数据清洗、特征洞察,到多模型训练评估,为医疗领域数据驱动诊断提供可落地的实践参考,助力挖掘数据背后的疾病诊疗价值。 二、数据准备:开启医疗数据探索之旅 (一)环境与库配置 导入数据分析核心库,涵盖数据处理( pandas / numpy )、可视化( matplotlib )、机器学习( scikit-learn / xgboost )工具,同时解决中文显示、警告屏蔽等基础问题,搭建稳定分析环境: python import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, confusion_matrix, roc_curve, auc from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from xgboost import XGBClassifier import warnings warnings.filterwarnings('ignore') plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False (二)数据读取与初览 读取医疗数据集 Medicaldataset.csv ,通过 head() 快速预览数据结构,识别关键字段(如 Age 年龄、 Result 诊断结果等 ),明确特征维度与目标变量( positive / negative 标识患病状态 ): python data = pd.read_csv('Medicaldataset.csv') print("数据集前5行:") print(data.head()) 三、数据预处理:为分析与建模筑牢根基 (一)数据质量核验 利用 info() 查看数据完整性与类型分布,确认无缺失值、数据类型适配( int64 / float64 / object ),保障分析流程顺畅: python print("数据基本信息:") data.info() (二)重复与异常值处理 - 重复值清理:通过 duplicated().sum() 排查重复记录, drop_duplicates() 确保数据唯一性: python print(f"重复值数量:{data.duplicated().sum()}") data = data.drop_duplicates() - 异常值检测与修正:绘制箱线图识别心率、血压等特征的极端异常值,结合医疗常识删除不合理记录(如心率>1000 ),修正舒张压>收缩压的逻辑错误,让数据贴合实际诊疗场景: python # 箱线图可视化异常(以心率为例) plt.figure(figsize=(8, 6)) plt.boxplot(data['Heart rate']) plt.title('心率箱线图(异常值检测)') plt.ylabel('心率值') plt.show() # 异常值过滤 data = data[data['Heart rate'] = 50] data = data[data['Diastolic blood pressure'] data['Systolic blood pressure']] data.loc[wrong_bp.index, ['Systolic blood pressure', 'Diastolic blood pressure']] = data.loc[wrong_bp.index, ['Diastolic blood pressure', 'Systolic blood pressure']].values 四、数据分析与可视化:挖掘疾病潜在规律 (一)描述性统计:勾勒数据轮廓 通过 describe().T 获取各特征的均值、标准差、最值等统计量,把握患者年龄、心率、血压等指标的整体分布特征,为后续分析提供基础参考: python print("数据描述性统计:") print(data.describe().T) (二)单特征分布:洞察个体特征规律 以年龄、性别为例,绘制核密度图+直方图、饼图,多维呈现数据分布。年龄核密度图揭示分布形态,直方图量化区间人数;性别饼图直观展现男女占比,助力理解患者群体基线特征: python # 年龄分布可视化 plt.figure(figsize=(12, 5)) plt.subplot(1, 2, 1) data['Age'].plot(kind='kde', color='r', label='核密度') data['Age'].plot(kind='hist', bins=10, alpha=0.3, label='直方图') plt.title('患者年龄分布') plt.xlabel('年龄') plt.ylabel('密度/数量') plt.legend() # 性别分布可视化(饼图) plt.subplot(1, 2, 2) gender_counts = data['Gender'].value_counts() plt.pie(gender_counts, labels=['男', '女'], autopct='%1.1f%%', startangle=90) plt.title('患者性别分布') plt.axis('equal') plt.show() (三)特征与诊断关联:探寻疾病影响因素 通过箱线图、分组统计分析年龄、心率、 CK-MB (肌酸激酶同工酶 )等特征与诊断结果( positive 患病/ negative 未患病 )的关联。箱线图对比患病与未患病群体的特征分布差异,分组统计量化特征对诊断结果的影响,挖掘潜在疾病标识: python # 年龄与诊断结果关联(箱线图) positive_age = data[data['Result'] == 'positive']['Age'] negative_age = data[data['Result'] == 'negative']['Age'] plt.figure(figsize=(8, 6)) plt.boxplot([positive_age, negative_age], labels=['患病', '未患病']) plt.title('年龄与心脏病诊断结果关联') plt.ylabel('年龄') plt.show() # CK-MB与诊断结果关联(分组均值) ckmb_mean = data.groupby('Result')['CK-MB'].mean() print("CK-MB均值(按诊断结果分组):") print(ckmb_mean) 五、分类模型构建:从数据到智能诊断 (一)数据转换与划分 将目标变量 Result 转换为二值化标签( positive →1, negative →0 ),筛选关键特征(如 Age / Gender / CK-MB / Troponin ),对连续特征标准化处理,按8:2比例划分训练集与测试集,为模型训练做准备: python # 目标变量二值化 data['Result_Binary'] = (data['Result'] == 'positive').astype(int) # 特征与标签定义 features = ['Age', 'Gender', 'CK-MB', 'Troponin'] X = data[features] y = data['Result_Binary'] # 连续特征标准化 scaler = StandardScaler() X[['Age', 'CK-MB', 'Troponin']] = scaler.fit_transform(X[['Age', 'CK-MB', 'Troponin']]) # 数据集划分 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y) (二)模型评估函数封装 定义通用评估函数 evaluate_model ,集成模型训练、预测、分类报告输出、混淆矩阵绘制与ROC曲线可视化,实现多模型统一评估,提升分析效率: python def evaluate_model(model, model_name, X_train, X_test, y_train, y_test): #