心脏病监测分析

数据来源:kaggle

数据获取方式:

关注公众号:YOLO的学习进阶日常
回复:心脏病

为什么想做这个分析案例?

心脏病已经成为人类健康的三大杀手之一,为找到心脏病的病因,特此参考了一些公众号推文和知乎,kaggle这些平台的文章来做一个关于心脏病的分析。本文只涉及数据分析,数据处理和可视化,没有机器学习和深度学习,适合初学者的案例练手,大佬就不用过多参考这篇推文了。

import pandas as pd
import warnings
import seaborn as sns
sns.axes_style("dark")
warnings.filterwarnings('ignore')
data=pd.read_csv("heart.csv",engine='python',sep=',')
data.head(2)
age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal target
0 63 1 3 145 233 1 0 150 0 2.3 0 0 1 1
1 37 1 2 130 250 0 1 187 0 3.5 0 0 2 1

列名解释:
age:年龄
sex:性别(1=男,0=女)
cp:疼痛类型(0=典型心绞痛;1=非典型心绞痛;2=非心绞痛;3=没有症状)
trestbps:静息血压(解释:静息心率指在清醒、不活动的安静状态下,每分钟心跳的次数。
静息血压就是在此状态下的测量血压)
chol:胆固醇
fbs: 人的空腹血糖(> 120 mg/dl=1; 0=假)解释:空腹血糖(饭前/餐前血糖): 80 - 130mg/dL. 餐后2小时血糖: 80 - 160mg/dL.
restecg:心电图(0=正常,1=患有ST-T波异常,2=根据Estes的标准显示可能或确定的左心室肥大,严重的情况)
thalach:最大的心率
exang:运动引起的心绞痛(1=是;0=不是)
oldpeak:相对于休息来说运动引起的ST段抑制 解释:(http://heart.dxy.cn/article/143557)
slope:运动高峰的心电图(1=上坡,2=平坦,3=下坡)
ca: 萤光显色的主要血管数目(0-4)荧光显色主要是跟糖尿病有一些关系
thal: 一种称为地中海贫血的血液疾病(3=正常; 6=固定缺陷; 7=可逆缺陷)
target: 心脏病(0=否,1=是)

医学知识科普时间:

  1. 地中海贫血:https://zh.wikipedia.org/wiki/%E5%9C%B0%E4%B8%AD%E6%B5%B7%E8%B2%A7%E8%A1%80
    地中海贫血(Thalassemias):又称珠蛋白生成障碍性贫血,海洋性贫血症,简称地贫,是遗传性血液疾病,会造成血红蛋白合成障碍,其症状可依不同分型而有所不同,程度可能从无症状到严重。通常地中海贫血伴随典型的贫血症状,即红血球细胞水平低下。
  2. 如何通俗易懂的看懂心电图:https://zhuanlan.zhihu.com/p/40666359
  3. 心率:指正常人安静状态下每分钟心跳的次数,也叫安静心率,一般为60~100次/分,可因年龄、性别或其他生理因素产生个体差异。一般来说,年龄越小,心率越快,老年人心跳比年轻人慢,女性的心率比同龄男性快,这些都是正常的生理现象。安静状态下,成人正常心率为60~100次/分钟,理想心率应为55~70次/分钟

数据初探

data.info()

没有缺失值,医学数据的异常数据值得研究因此接下来,查看数据的各个指标,这个只有304个数据因此只能有一点点的参考价值,不能以偏概全。
因为是针对心脏病进行研究,来看一下有多少人患病有多少人没患病

countNoDisease = len(data[data.target == 0])
countHaveDisease = len(data[data.target == 1])
print(f'没患病人数:{countNoDisease }',end=' ,')
print("没有得心脏病比率: {:.2f}%".format((countNoDisease / (len(data.target))*100)))
print(f'有患病人数:{countHaveDisease }',end=' ,')
print("患有心脏病比率: {:.2f}%".format((countHaveDisease / (len(data.target))*100)))
没患病人数:138 ,没有得心脏病比率: 45.54%
有患病人数:165 ,患有心脏病比率: 54.46%

性别和患病的关系

从比例看出患病和没患病的人差不多,接下来用饼图看一下他们的性别比例

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
gender_dict=data['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()

从图中可以看出男性的患病率是大于女性的,但是也只是对于这个数据而言,我们可以将这个作为一个特征值去进行下面的特征分析。先分别看一下男女的患病和为患病的比例

pd.crosstab(data.sex,data.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.show()

从图中可以看出,女性患病的概率大于男性患病的比例,女性患病的比例达到了快75%,男性患病比例只有45%
因此根据这个数据集可以得到第一个结论 女性患心脏病的概率大于男性

年龄和患病的关系

fig,axes=plt.subplots(2,2,figsize=(8,8))
age_dist=data[['age','target']]
age_dist['age_range']=pd.cut(age_dist['age'],bins=[0,18,40,66,200],include_lowest=True,right=False,\labels=['儿童','青年','中年','老年'])
sns.countplot(x='age_range',hue='target',data=age_dist,ax=axes[0,0],palette="Set2")
axes[0,0].set_xlabel("年龄段")youth=age_dist[age_dist['age_range']=='青年']['target'].value_counts()
axes[0,1].pie(youth,labels=['正常','患病'],autopct='%.2f%%',colors = ['tomato', 'lightskyblue'])
axes[0,1].set_title("青年人患病比例")youth=age_dist[age_dist['age_range']=='中年']['target'].value_counts()
axes[1,0].pie(youth,labels=['正常','患病'],autopct='%.2f%%',colors = ['tomato', 'lightskyblue'])
axes[1,0].set_title("中年人患病比例")youth=age_dist[age_dist['age_range']=='老年']['target'].value_counts()
axes[1,1].pie(youth,labels=['正常','患病'],autopct='%.2f%%',colors = ['tomato', 'lightskyblue'])
axes[1,1].set_title("老年人患病比例")
Text(0.5, 1.0, '老年人患病比例')

为什么我要做三个饼图呢?

因为柱状图只能表示出来各个年龄段人数的多少,只能看出中年人患病的人比较大,但是我们更多的想要知道是不是年龄越大患病的概率就越大,因此需要更加直观的进行分析。通过对于饼图的分析,蓝色部分可以看出,年龄越大确实患病概率就越大了

心率-年龄-心脏病的关系

除了年龄以外,心率也是心脏病的关键指标,是否年龄越大心率就会越大呢?可以通过小提琴图来分析

data['age_range']=pd.cut(data['age'],bins=[0,18,40,66,200],include_lowest=True,right=False,\labels=['儿童','青年','中年','老年'])
ax=sns.swarmplot(x='age_range',y='thalach',data=data,hue='target')
ax.set_xlabel("年龄段")
Text(0.5, 0, '年龄段')

从图中可以发现,青年人的心率>中年人>老年人 所以心率的趋势是随着年龄的增长而不断的降低的,但是可以发现,在同一个年龄段内,患病的人普遍比为患病的人心率更高,所以证实了心率越快其实更容易患心脏病的假设。

心率—血压—心脏病之间的关系

很多人都以为心率越大血压也越大,下面用散点图来看一下

plt.scatter(x=data.thalach[data.target==1], y=data.trestbps[data.target==1], c="#FFA773")
plt.scatter(x=data.thalach[data.target==0], y=data.trestbps[data.target==0], c="#8DE0FF")
plt.legend(["患病",'未患病'])
plt.xlabel("心率")
plt.ylabel("血压")
plt.show()

从图中可以看出,心率和血压并无线性相关关系,因此不能说明心率越大血压就越高,那么是否是血压越高,患心脏病的概率也就越大呢?

ax=sns.swarmplot(x='target',y='trestbps',data=data)
ax.set_xlabel("是否患病")
ax.set_ylabel("血压")
Text(0, 0.5, '血压')

从图中也可以看出,其实血压的高低和是否患病也没有很明显的相关性,接下来看一下胸痛级别和心脏病的关系。

胸痛级别和心脏病的关系

fig,ax=plt.subplots(1,2,figsize=(14,5))
sns.countplot(x='cp',data=data,hue='target',palette='Set2',ax=ax[0])
ax[0].set_xlabel("胸痛类型")
data.cp.value_counts().plot.pie(ax=ax[1],autopct='%1.1f%%',explode=[0.05,0,0,0],shadow=True, cmap='Blues')
ax[1].set_title("胸痛类型")
Text(0.5, 1.0, '胸痛类型')

从图中可以看出未患病的人主要是0类疼痛,但是患者主要是1~3类疼痛。说明疼痛的级别确实跟心脏病是有一定联系的,但是具体的还需要根据现实情况来进行分析。后续还有很多的研究大家可以自己发挥一下想象和假设,我做这个案例就是为了方便我以后自己做可视化的时候好直接复制粘贴的代码(我有点懒…
总结如下:

  1. 早在2017年的时候平均每天就有10.4个人因为心脏病(冠心病)死亡,其中男性占大多数(1.4:1)所以其实这个数据集是有一定偏差的
  2. 烟草使用、不健康饮食以及缺乏身体活动会增加心脏病发作和中风的危险。
  3. 一周每天至少进行30分钟的身体活动,将有助于防止心脏病发作和中风。
  4. 一天食用至少五份水果和蔬菜,将每天的盐摄入量限制在少于一汤匙,也会有助于预防心脏病发作和中风。
  5. 血压的高低和是否患心脏病也没有很明显的相关性,但是可以做一下血糖指标,可以明显的发现和糖尿病之间的关系,因为本文主要做的心脏病所以这个代码我并没有贴上来
  6. 疼痛的级别确实跟心脏病是有一定联系的
  7. 心率和血压并无线性相关关系,因此不能说明心率越大血压就越高;血压的高低和是否患病也没有很明显的相关性;
  8. 年龄越大患病概率越大;心率越快更容易患心脏病;

kaggle心脏病监测分析案例(数据分析+数据可视化)适合入门新手相关推荐

  1. kaggle心脏病监测分析案例(数据分析+数据可视化)适合入门新手心脏病监测分析

    心脏病监测分析 数据来源:kaggle 数据获取方式: 关注公众号:YOLO的学习进阶日常 回复:心脏病 为什么想做这个分析案例? 心脏病已经成为人类健康的三大杀手之一,为找到心脏病的病因,特此参考了 ...

  2. Tableau数据分析数据可视化分析平台

    Tableau数据分析&数据可视化分析平台 ​ 本文章内涉及的资源包以及素材均来自于互联网,仅供大家用来交流学习与研究使用,努力提升自己的一篇文章.各类安装包以及素材版权归属原版权方所有,版权 ...

  3. Python爬虫+数据分析+数据可视化(分析《雪中悍刀行》弹幕)

    Python爬虫+数据分析+数据可视化(分析<雪中悍刀行>弹幕) 哔哔一下 爬虫部分 代码部分 效果展示 数据可视化 代码展示 效果展示 视频讲解 福利环节 哔哔一下 雪中悍刀行兄弟们都看 ...

  4. 高级转录组分析和R数据可视化第11期(报名线上课还可免费参加线下课2020.6)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程和转录组的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下课 ...

  5. 高级转录组分析和R数据可视化第11期(课程推迟,可先报名,时间另行告知)

    封面来源:https://www.zhihu.com/question/304747766 常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,是大部分CNS必备的技术,以后 ...

  6. 高级转录组分析和R数据可视化(2020.2,课程推迟,可先报名,时间另行告知)

    封面来源:https://www.zhihu.com/question/304747766 常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,是大部分CNS必备的技术,以后 ...

  7. 这是入门生信,学习生信分析思路和数据可视化的首选?

    封面来源:https://www.zhihu.com/question/304747766 常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,是大部分CNS必备的技术,以后 ...

  8. 高级转录组分析和R数据可视化专题研讨会(2019.12)

    常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,是大部分CNS必备的技术,以后应该就如做个PCR一样常见.而且分析思路简洁清晰,是入门生信,学习生信分析思路和数据可视化的 ...

  9. 转录组分析_高级转录组分析和R数据可视化

    封面来源:https://www.zhihu.com/question/304747766 常规转录组是我们最常接触到的一种高通量测序数据类型,其实验方法成熟,花费较低,是大部分CNS必备的技术,以后 ...

最新文章

  1. android 加载器loader详解
  2. linux查找nginx目录,Linux下查看nginx安装目录
  3. 记一次Jquery获取值的典型错误
  4. (四)使用Jenkins工作流链接MLOps管道
  5. python ssl socket_Python使用Socket(Https)Post登录百度的实现代码
  6. python笑傲江湖统计字数_基於Python的tf-idf算法实现:以《笑傲江湖》为例
  7. 有些生意很偏门,也有一定门槛,但是效益非常好
  8. c++读取和写入TXT文件的整理 1
  9. 为什么会有ResNet? Why ResNet?
  10. python处理pdf文件_python处理操作pdf全攻略
  11. GAGE EON采集卡
  12. 微信小程序登陆踩坑记录
  13. 手机与电脑大文件无线传输方案
  14. 心理学与生活 -人格与动机
  15. Pelles C 五光十色中的一抹经典
  16. mysql删除与另外一张表有交集的表的记录
  17. 计算机打印步骤,如何将打印机连接到计算机将打印机连接到计算机的步骤[图形教程]...
  18. 首屏加载从11s到1s,详解前端性能优化
  19. Eclipse Android LogCat有时候显示不出输出的原因
  20. python3 paramiko 远程执行 ssh 命令、上传文件、下载文件

热门文章

  1. 蓝牙耳机买什么牌子好?高品质平价蓝牙耳机推荐
  2. 2021年企业网络安全7个危险迹象
  3. Java基础——2、基本语法(下)—程序流程控制
  4. 盒子模型详细讲解(图码交融)
  5. html把盒子置于盒子页面底部,HTML盒子模型.ppt
  6. Windows Phone理解和运用ItemTemplate、ContentTemplate和DataTemplate
  7. EBS 打印机——IX Library 介绍
  8. 服务器bios修改uefi,服务器bios设置uefi
  9. 未来产业最新动向及趋势展望
  10. Carsim转向系统配置