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

心脏病监测分析

数据来源: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)
agesexcptrestbpscholfbsrestecgthalachexangoldpeakslopecathaltarget
063131452331015002.30011
137121302500118703.50021

列名解释:
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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x37m888E-1585632441322)(output_10_0.png)]

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

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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1GhgxY5U-1585632441323)(output_12_0.png)]

从图中可以看出,女性患病的概率大于男性患病的比例,女性患病的比例达到了快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, '老年人患病比例')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4Y3wJlm-1585632441324)(output_15_1.png)]

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

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

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

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

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, '年龄段')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NpswsevD-1585632441325)(output_19_1.png)]

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

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

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

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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31AAlfz5-1585632441325)(output_23_0.png)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UQCuINaL-1585632441326)(output_25_1.png)]

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

胸痛级别和心脏病的关系

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, '胸痛类型')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1i9h6qig-1585632441327)(output_28_1.png)]

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

  1. 早在2017年的时候平均每天就有10.4个人因为心脏病(冠心病)死亡,其中男性占大多数(1.4:1)所以其实这个数据集是有一定偏差的
  2. 烟草使用、不健康饮食以及缺乏身体活动会增加心脏病发作和中风的危险。
  3. 一周每天至少进行30分钟的身体活动,将有助于防止心脏病发作和中风。
  4. 一天食用至少五份水果和蔬菜,将每天的盐摄入量限制在少于一汤匙,也会有助于预防心脏病发作和中风。
  5. 血压的高低和是否患心脏病也没有很明显的相关性,但是可以做一下血糖指标,可以明显的发现和糖尿病之间的关系,因为本文主要做的心脏病所以这个代码我并没有贴上来
  6. 疼痛的级别确实跟心脏病是有一定联系的
  7. 心率和血压并无线性相关关系,因此不能说明心率越大血压就越高;血压的高低和是否患病也没有很明显的相关性;
  8. 年龄越大患病概率越大;心率越快更容易患心脏病;
  • 33
    点赞
  • 307
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Kaggle是一个数据科学竞赛平台,提供了丰富的数据集和算法库。其中,心脏病数据集是其中一个非常有价值的数据集,它包含了包括心脏病患者在内的患者的生理指标、临床特征等信息。 要下载Kaggle心脏病数据集,首先需要注册Kaggle账号,并确保已经安装好了Kaggle API。接着,可以使用以下命令行指令在终端中下载数据: 1. 打开终端并切换到下载目录,输入以下命令下载Kaggle API并安装: pip install kaggle 2. 使用以下命令行指令获取Kaggle token: kaggle login 3. 登录Kaggle账号后,打开心脏病数据集页面(https://www.kaggle.com/ronitf/heart-disease-uci ),并复制其中的API command 4. 在终端中输入复制的API命令,等待数据集下载完成。 需要注意的是,要下载Kaggle数据集还需要考虑到数据集大小、下载速度等因素,同时还需要详细阅读每一个数据集的使用指引和许可协议,遵循数据集的使用规则。 ### 回答2: Kaggle是一个在机器学习、数据科学领域非常流行的公共数据集分享平台,其中就包含比较全面的多个领域的开源数据集,其中也包括了心脏病数据集。 首先,我们需要创建Kaggle账号,然后进入心脏病数据集页面。在该页面中,可以找到“Data”标签页,点击进入,进而可以看到“Download All”按钮。点击该按钮,便可以开始下载该数据集。下载完成后,可以将其解压缩,并使用Python等编程语言进行数据处理分析。 在使用数据集进行建模之前,建议先进行一些预处理,包括去除缺失值、异常值与重复值、将分类变量转换为虚拟变量等。通过数据处理之后,我们可以进行数据探索,了解数据集的整体情况,如数据分布、特征相关性等。 接下来,我们可以开始进行模型开发,通过训练集对模型进行训练,在测试集上进行验证和评估,选择合适的模型进行优化和调整,最终获得优秀预测结果。 总之,Kaggle心脏病数据集下载并不是十分困难,只需要通过创建账号来进行下载即可,并且该数据集已经可以被广泛使用,提供了非常大的价值和实践意义。 ### 回答3: Kaggle心脏病数据集是一个关于心脏病患者的匿名数据集,该数据集收集了13个不同的医学指标,如年龄、性别、胆固醇水平等,以预测患者是否患有心脏病。对于医学研究领域的学生和研究人员来说,这个数据集是一个非常有价值的资源。 首先,你需要在Kaggle网站上注册一个账号,然后在数据集页面上下载数据集文件。下载完成后,你就可以开始使用该数据集进行数据分析和建模了。 在开始研究之前,最好先了解一下数据集中每个变量的含义和值的范围。这样你就可以更好地理解数据,并作出更准确的分析和模型预测。 在进行数据分析时,你可以使用各种数据可视化工具,如Matplotlib或Plotly,来创建图表和可视化数据集中的各个变量。通过可视化数据,你可以更好地了解数据的特征和分布,并推导出患者是否患有心脏病的相关因素。 一旦你对数据集有了更好的了解,你可以开始使用一些机器学习算法进行建模。一些常见的算法,如逻辑回归、决策树和支持向量机等,可以帮助你建立预测患者是否患有心脏病的模型。 最后,你可以使用评估指标,如准确度、精确度和召回率等,来评估你的模型的性能。通过对模型性能的评估,你可以发现哪些因素对预测影响最大,并对模型进行调整和优化。 总之,Kaggle心脏病数据集是一个非常有价值的资源,可以为医学研究者和学生提供优秀的数据分析和建模实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值