心脏病监测数据可视化分析

文章目录

    • 一、内容简介
    • 二、数据基础
    • 三、数据分析
      • 统计患病人数与患心脏病比率
      • [2、 性别与患心脏病的关系](#2、 性别与患心脏病的关系)
      • [3、 年龄与患心脏病的关系](#3、 年龄与患心脏病的关系)
      • [4、 心率-年龄-患心脏病的关系](#4、 心率-年龄-患心脏病的关系)
      • [5、 心率-血压-患心脏病的关系](#5、 心率-血压-患心脏病的关系)
      • [6、 胸痛级别与患心脏病的关系](#6、 胸痛级别与患心脏病的关系)
      • [7、 血清胆固醇的含量与心脏病的关联](#7、 血清胆固醇的含量与心脏病的关联)
      • [8、 ST段斜率和心脏病的关系](#8、 ST段斜率和心脏病的关系)
    • 总结

一、内容简介

心脏是维持全身血液循环的最重要器官。由于现代人不正确的饮食和运动习惯等因素,心脏病患者人数逐年上升,心脏病已经成为威胁人类生命的十大疾病之一,除了老年人,中青年也成为心脏病猝死的高危人群。年轻人的心脏病突发往往没有明显先兆,突然发作时很危险,心脏病的病因很多,有时很难判断一个人是否患有心脏病。

心脏病的危害极大,威胁人类的生命。根据数据显示,心血管病死亡是中国人排名第一的死亡原因。在全世界,每年有1700万人死于心脏病,每3例因病死亡者中,就有1例是心脏病患者。在本次研究中,负责分析导致患者的心脏病的病因,并探索各个变量的影响程度。

二、数据基础

本次研究数据集来源于kaggle网站的Heart Disease数据集,有如下信息变量:303个受试者(行:Sample);14列变量属性(列:Feature)。

变量属性包括:年龄、性别、胸痛经历、静息血压、胆固醇、空腹血糖、静息心电图、最大心率、运动引起的 ST 压低、峰值运动ST段的斜率、运动诱发的心绞痛、主要供血血管的数量、地中海贫血、心脏病。

相关库

1\] pandas库 pandas是专门为处理表格和混杂数据设计的,专注于清理数据。具备对应其功能的数据结构DataFrame,Series,集成时间序列功能,提供丰富的数学运算和操作,灵活处理缺失数据。 \[2\] matplotlib库 matplotlib 是一个Python的2D绘图库。通过 matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。通过学习Matplotlib,可让数据可视化,更直观的真实给用户。使数据更加客观、更具有说服力。 Matplotlib是Python的库,又是开发中常用的库。 \[3\] numpy库 NumPy 是一个 Python 包。它代表 "Numeric Python"。它是一个由多维数组对象和用于处理数组的例程集合组成的库。Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 #### 数据处理 数据预处理是数据建模前的重要环节,他直接决定了后期所有数据工作的质量和价值输出。从数据预处理的主要内容看,包括数据清洗、转换、规约、聚合、抽样等。 ```matlab #读取'heartdisease.csv'文件 dt=pd.read_csv('heartdisease.csv') #查看数据总数 print(len(dt)) #查看数据的维度 print("数据的维度",dt.shape) ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3ec8068328ac4094a5126c12872138ce.png) 根据运行结果可以看出:Heart Disease数据集有303个观察值和14个变量。 接下来查看数据集列属性名、是否存在数据缺失的情况以及数据类型: ```matlab # 查看数据集列属性名 dt.columns #查看是否存在数据缺失的情况 print(dt.info()) #查看数据类型 print(dt.dtypes) ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e667ae5fcf9343e6a8a447da5e2aea13.png)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ecf197189b9545899ba148c24f66f813.png) 根据数据预处理可以得知: 数据完整性:文件无缺失值,基础数据质量较好。 异常数据处理:医学数据中的异常数据具有研究价值,需重点关注。 数据规模与参考性:共 303 条数据,具备一定参考价值,但因样本量有限,结论不可过度推广、以偏概全。 ### 三、数据分析 #### 统计患病人数与患心脏病比率 ```matlab countNoDisease = len(dt[dt.target == 0]) countHaveDisease = len(dt[dt.target == 1]) countfemale = len(dt[dt.sex == 0]) countmale = len(dt[dt.sex == 1]) print(f'没患病人数:{countNoDisease }',end=' ,') print("没有得心脏病比率: {:.2f}%".format((countNoDisease / (len(dt.target))*100))) print(f'有患病人数:{countHaveDisease }',end=' ,') print("患有心脏病比率: {:.2f}%".format((countHaveDisease / (len(dt.target))*100))) print(f'女性人数:{countfemale }',end=' ,') print("女性比例: {:.2f}%".format((countfemale / (len(dt.sex))*100))) print(f'男性人数:{countmale }',end=' ,') print("男性比例: {:.2f}%".format((countmale / (len(dt.sex))*100))) ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3c69bfc258534df3ab51fb4d68e15ea3.png) #### 2、 性别与患心脏病的关系 从比例看出患病和没患病的人差不多,接下来用饼图对所有的受试者进行观察,查看他们的性别比例。 ```matlab import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False gender_dict=dt['sex'].value_counts() colors = ['tomato', 'lightskyblue'] plt.figure(figsize=(8, 6)) plt.pie(gender_dict.values,labels=['男','女'],autopct="%0.2f%%",explode = (0,0.05),colors=colors, \ shadow=False, pctdistance=0.8,\ startangle=90, textprops={'fontsize': 16}) plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b633c74f30ac40e79c26ec4e956c26bd.png) 通过图可知,从图中可以看出男性的患病率是大于女性的,但是也只是对于这个数据而言,我们可以将这个作为一个特征值去进行下面的特征分析。接下来,分别看一下男女的患病和未患病的比例。 ```matlab pd.crosstab(dt.sex,dt.target).plot(kind="bar",figsize=(10,6),color=['tomato', 'lightskyblue' ]) plt.title('各性别下患病图示') plt.xlabel('性别 (0 = 女性, 1 = 男性)') plt.xticks(rotation=0) plt.legend(["未患病", "患有心脏病"]) plt.ylabel('人数') plt.grid() plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ffc2d2c088374ac0b40946c3adeb96d8.png) 在这个数据集中,男性多于女性一倍,分别207和96人;患病患者稍微多余未患病患者,患病165,138人通过图与统计可以计算得到,女性患病的概率大于男性患病的比例,男性患病率44.9%,女性患病率75%。**因此根据这个数据集可以得到第一个结论女性患心脏病的概率可能大于男性。** #### 3、 年龄与患心脏病的关系 ```matlab fig,axes = plt.subplots(2, 2, figsize=(14, 14)) age_dist['target'] = age_dist['target'].astype(str) # 将目标列转换为字符串类型 # 绘制年龄段的计数图 pd.crosstab(age_dist.age_range,age_dist.target).plot(kind="bar",figsize=(10,6),color=['tomato', 'lightskyblue' ],ax=axes[0, 0]) axes[0, 0].set_xlabel("年龄段") axes[0, 0].set_ylabel("数量") axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=0) # 绘制青年人患病比例饼图 youth = age_dist[age_dist['age_range'] == '青年']['target'].value_counts() youth.plot(kind='pie', autopct='%.2f%%', colors=['tomato', 'lightskyblue'], ax=axes[0, 1]) axes[0, 1].set_title("青年人患病比例") # 绘制中年人患病比例饼图 middle_age.plot(kind='pie', autopct='%.2f%%', colors=['tomato', 'lightskyblue'], ax=axes[1, 0]) axes[1, 0].set_title("中年人患病比例") # 绘制老年人患病比例饼图 old_age = age_dist[age_dist['age_range'] == '老年']['target'].value_counts() old_age.plot(kind='pie', autopct='%.2f%%', colors=['tomato', 'lightskyblue'], ax=axes[1, 1]) axes[1, 1].set_title("老年人患病比例") plt.tight_layout() plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d2864e3baed548fca51d398c8803e32a.png) 通过三个饼图,可以减少柱状图的弊端,柱状图只能表示出来各个年龄段人数的多少,只能看出中年人患病的人比较大,但是我们更多的想要知道是不是年龄越大患病的概率就越大,因此需要更加直观的进行分析。通过对于饼图的分析,蓝色部分可以看出,**年龄越大确实患病概率就越大了。** #### 4、 心率-年龄-患心脏病的关系 除了年龄以外,心率也是心脏病的关键指标,是否年龄越大心率就会越大呢?可利用散点图进行绘制。 散点图是一种通过在二维平面上绘制数据点来展示两个变量之间关系的图表,广泛用于检测相关性、发现异常值、识别数据聚类、分析趋势、比较多个变量以及验证模型。它可以帮助我们更加直观地了解数据分布和潜在模式。 ```matlab # 数据处理 dt['age_range'] = pd.cut(dt['age'], bins=[0, 18, 40, 66, 200], include_lowest=True, right=False, labels=['儿童', '青年', '中年', '老年']) # 绘制swarmplot fig, ax = plt.subplots(figsize=(8, 6)) colors = {0: 'skyblue', 1: 'salmon'} for idx, val in dt.iterrows(): color = colors[val['target']] ax.scatter(val['age_range'], val['thalach'], c=color) # 设置标签和标题 ax.set_xlabel("年龄段") ax.set_ylabel("最大心率") plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/38fbc56c826646d6a86b8df56f5902ad.png) 其中,蓝色代表未患病,橙色代表患病。从图中可以发现,青年人的心率\>中年人\>老年人,所以心率的趋势是随着年龄的增长而不断的降低的,但是可以发现,在同一个年龄段内,患病的人普遍比为患病的人心率更高,初步判断心率越快其实更容易患心脏病的假设。 #### 5、 心率-血压-患心脏病的关系 通过观察散点图上数据点的分布情况,我们可以推断出心率---血压---心脏病之间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b8ce5a8decc84a368adf622841b798c9.png) 从图中可以看出,心率和血压并无线性相关关系,因此不能说明心率越大血压就越高,那么是否是血压越高,患心脏病的概率也就越大呢? ```matlab plt.figure() plt.subplot(1,2,1) plt.scatter(dt['target'], dt['trestbps']) plt.xlabel("是否患病") plt.ylabel("血压") plt.xticks([0, 1]) plt.subplot(1,2,2) plt.bar(0, dt[dt['target']==0]['trestbps'].mean(),color="#8DE0FF") plt.bar(1, dt[dt['target']==1]['trestbps'].mean(),color="#FFA773") plt.xlabel("是否患病") plt.ylabel("血压(平均值)") # 设置 x 轴刻度 plt.xticks([0, 1]) plt.tight_layout() plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/46949b6c50454c9ea2673b43f69a85cd.png) 从图中也可以看出,其实血压的高低和是否患病也没有很明显的相关性,但未患病的血压相对患病较高。 #### 6、 胸痛级别与患心脏病的关系 ```matlab fig, ax = plt.subplots(1, 2, figsize=(14, 5)) cp_target_counts = dt.groupby(['cp', 'target']).size().unstack(fill_value=0) cp_target_counts.plot(kind='bar', stacked=True, ax=ax[0], color=['#8DE0FF', '#FFA773']) ax[0].set_xlabel("胸痛类型") ax[0].set_ylabel("计数") ax[0].legend(["未患病", "患病"], title="是否患病") cp_counts = dt['cp'].value_counts() colors = plt.cm.Blues(np.linspace(0.3, 0.7, len(cp_counts))) ax[1].pie(cp_counts, labels=cp_counts.index, autopct='%1.1f%%', explode=[0.05, 0, 0, 0], shadow=True, colors=colors) ax[1].set_title("胸痛类型") plt.tight_layout() plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/88ff874ea3394e0ba5a102eef12ead95.png) 从图中可以看出未患病的人主要是0类疼痛,但是患者主要是1\~3类疼痛。说明疼痛的级别确实跟心脏病是有一定联系的,但是具体的还需要根据现实情况来进行分析。 #### 7、 血清胆固醇的含量与心脏病的关联 ```matlab # 创建胆固醇分箱 cho_bins = [100, 150, 200, 250, 300, 350, 400, 450] dt['bin_chol'] = pd.cut(dt['cholesterol'], bins=cho_bins) bin_chol_target_counts = dt.groupby(['bin_chol', 'target']).size().unstack(fill_value=0) fig, ax = plt.subplots(figsize=(12, 6)) bin_chol_target_counts.plot(kind='bar', stacked=True, ax=ax, color=['#8DE0FF', '#FFA773']) ax.set_title("Cholesterol vs Heart Disease") ax.set_xlabel("胆固醇分箱") ax.set_ylabel("计数") ax.legend(["未患病", "患病"], title="是否患病") plt.xticks(rotation=0) plt.tight_layout() plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5a4bba4505e1492dbfadb9c3bd2ae724.png) 通过图可知,血清胆固醇含量在201-250之间心脏病患病人数较多,而高于250后心脏病患病人数反而下降。 #### 8、 ST段斜率和心脏病的关系 运动心电图试验是目前应用最为广泛的诊断冠心病的无创检测手段之一。但是传统ST 段指标诊断冠心病的敏感性和特异性均较低,限制了运动试验的应用。近年来,运动试验中心率调整的 **ST段下移(ST/HR斜率)**、心率恢复环等日益引起学者们的重视。 心肌缺血与心率的变化密切相关,而心肌缺血在心电图上又表现为ST段的相应改变。也就是说,冠心病患者运动试验心率轻度增加所导致的相应ST段压低(ST/HR斜率大),比心率较快时发生同等程度的ST段压低(ST/HR斜率小),更能反映心肌缺血的严重程度。 slope值代表运动后ST段的斜率,心电图中,如果**ST段异常变大**说明心脏可能出现了心肌缺血的问题。 ```matlab # 计算每个 ST 段斜率下不同目标(target)值的计数 st_slope_target_counts = dt.groupby(['st_slope', 'target']).size().unstack(fill_value=0) fig, ax = plt.subplots(figsize=(12, 6)) bar_width = 0.35 index = np.arange(len(st_slope_target_counts)) p1 = ax.bar(index, st_slope_target_counts[0], bar_width, label='未患病', color='green',alpha=0.6) p2 = ax.bar(index + bar_width, st_slope_target_counts[1], bar_width, label='患病', color='blue',alpha=0.6) ax.set_title('Slope of the Peak Exercise ST Segment') ax.set_xlabel('ST 段斜率') ax.set_ylabel('计数') ax.set_xticks(index + bar_width / 2) ax.set_xticklabels(st_slope_target_counts.index) ax.legend(title='是否患病') plt.tight_layout() plt.show() ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0b9cb682835a4caa837c4a4d97831f3b.png) 运动后ST段的斜率上升的人群患心脏病的可能性比较大。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b9ce871d87d548ca8788b3d5e5cbaa29.png) 在三个ST段斜率改变组中,心脏病患者的最大心率均相对健康人群最大心率值高。 ### 总结 1、 分析结果 本次研究由kaggle网站的Heart Disease 数据集,将年龄、性别、胸痛经历、静息血压、胆固醇、空腹血糖、静息心电图、最大心率、运动诱发的心绞痛、运动引起的ST压低、峰值运动ST段的斜率、地中海贫血共12项为自变量,而将是否患有心脏病作为因变量进行数据可视化分析。 结果发现以下几点: (1) 性别等影响因素都会增加心脏病的患病率; (2) 跟以往的研究相同:发现了胸痛、最大心率、运动性心绞痛3个对心脏病患病率有影响的新影响因素; (3) 血压的高低和是否患心脏病也没有很明显的相关性,但是可以做一下血糖指标,观察心脏病和糖尿病之间的关系; (4) 心率和血压并无线性相关关系,因此不能说明心率越大血压就越高; (5) 血压的高低和是否患病也没有很明显的相关性; (6) 年龄越大患病概率越大; (7) 疼痛的级别确实跟心脏病是有一定联系的; (8) 心率越快更容易患心脏病。 2 总结和建议 (1) 胸痛可行对策 胸痛在资料中分为典型心绞痛、非典型性心绞痛、非心绞痛、无症状4种类型,而胸痛对心脏病的患病率产生显著的正向影响关系,即为重要的影响因素。 (2) 运动性心绞痛可行对策 运动性心绞痛是运动后出现心绞痛的情况。这一情况说明,患者在运动过后会出现心绞痛的情况需要重视,尽快就医进行诊断。减少激烈运动,进行其他安全、舒缓的运动来锻炼身体例如:慢走、散步等休闲方式。 (3) 性别可行对策 性别也是对心脏病的影响因素。提倡科学、健康的饮食和生活方式,进行安全、舒缓的运动进行锻炼,提高自身的健康水平。 (4) 建议 从以上的分析结论可知:**运动引起心绞痛与最大心率这两个影响因素共同出现会增加心脏病的患病几率**。患者要重视运动引起心绞痛的情况和心率变化。避免两者共同出现在患者身体的情况。注意应当减少激烈运动并进行其他安全、舒缓的运动来锻炼身体并且减少心脏的负担以降低最大心率的增长。

相关推荐
Allen_LVyingbo1 天前
人工智能赋能传统医疗设施设备改造:路径、挑战与未来展望
信息可视化·健康医疗·ai编程·安全架构
zzywxc7871 天前
AI工具应用全解析:智能编码、数据标注与模型训练的协同实践
人工智能·算法·信息可视化·自动化·ai编程
matrixmind13 天前
Nivo 用React打造精美数据可视化的开源利器
其他·react.js·信息可视化·开源
西贝爱学习3 天前
IMDb Top 950 Movies Dataset (2025) 数据集【IMDb 前950电影数据集】
信息可视化·数据集
bmcyzs4 天前
【展厅多媒体】解析VR虚拟驾驶实现多场景自由切换
经验分享·科技·信息可视化·软件构建·vr·设计规范
Lululaurel4 天前
从静态图表到交互叙事:数据可视化的新范式与实现
python·信息可视化·数据分析·matplotlib·数据可视化
计育韬5 天前
计育韬:基于AI的数据可视化设计入门工作流
人工智能·信息可视化·新媒体运营·微信公众平台
深空数字孪生5 天前
AIGC重构数据可视化:你是进化中的“驯兽师”还是被替代的“画图工”?
信息可视化·数字孪生·数据看板·生产看板
两只程序猿5 天前
数据可视化 | 热力图Heatmap绘制Python代码 相关性矩阵学术可视化
python·信息可视化·矩阵