心脏病跟什么有关?数据分析帮你看看

文 / DataCastle
2019-04-23 16:39

众所周知,心脏病已经成为人类健康的三大杀手之一。

随着父母岁数慢慢的变大了,身体也容易不好,身边的老人们在体检的时候,很多都发现了心脏不太好的情况。

因此逗汁儿就去KAGGLE上找了个心脏病的数据集,做探索性数据分析,简单的研究一下心脏病与哪些因素有关。

初步观察数据

这个数据集很小,仅有303行。我们来看一下数据吧~

首先导入相关的库,因为后续还要作图进行分析,我们就按照惯例给肯定需要用的库包括绘图库都导入。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

为了让jupyter里面显示出来图,千万不要忘记加这一行代码:

%matplotlib inline

读取数据,看下前十行:

df =pd.read_csv("E:\heart.csv")
df.head(10)

这里一共显示了14个字段,分别看一下这些字段代表的意思。

age:代表患者年龄,以年为单位。

sex:代表患者性别,1为男性,0为女性。

cp:胸痛类型,具体类型未说明

trestbps:入院前的静息血压,单位为毫米汞柱

chol:患者血清胆固醇含量,单位mg/dl

fbs:患者空腹血糖大于120mg/dl,1为是,0为否

restecg:静态心电图结果

thalach:达到最大的心率值

exang:运动诱发心绞痛,1为是,0为否。

oldspeak:相对于休息来说运动引起的ST段抑制

slope: 运动引起的ST段最高值斜率

ca: 通过荧光检测技术显示出来的主要血管数量(0-3)

thal:1为正常,2为固定缺陷,3为可逆缺陷。

target:0或1为是否患病

下面就看一下数据的主要信息

df.info

可以看到每个字段的数据都非常完整,没有缺失的字段,数据类型也主要以整数型为主,其中一个是浮点型。

在这组数据中,有年龄等相关指标,我们来看看这些指标的平均值,最大最小值等常规统计学数据。

df.describe

我们可以看到,平均年龄在54岁左右,最小的年龄在29岁,最大的年龄在77岁。因此这个数据集中,主要选取的是中老年人。

count数值代表并无空值,这个上面分析的时候也已经看到了~。

下面我们就对这些数据进行一下可视化分析。

相关数据的可视化分析

首先看下热图,整体看一下相关性

plt.figure(figsize=(10,8))
sns.heatmap(df.corr,annot=True,cmap='YlGnBu',fmt='.2f',linewidths=2)

从热图上来看,只有cp,thalach,slope这三个指标与患病的相关性相对偏高,但是并不大。

看下患病人数有多少人,整个数据集中年龄集中在哪个段呢?

df['target'].value_counts
sns.distplot(df['age'],color='Red')

303个数据中,有165个患病者…比例超过了一半。

大多数的人年龄都在40-70岁左右,偏向于中老年。

01 年龄与心脏病

fig,ax=plt.subplots(figsize=(24,6))
plt.subplot(1,3, 1)
age_bins= [20,30,40,50,60,70,80]
df['bin_age']=pd.cut(df['age'],bins=age_bins)
g1=sns.countplot(x='bin_age',data=df,hue='target',palette='plasma')
g1.set_title("Agevs Heart Disease")

大多数的人在45-65左右会经常去进行心脏病的检查,看看是否患有心脏病,也说明大家对于心脏病的还是比较恐惧的,

41-50年龄段的人群患有心脏病的人数较多,而60-70岁的去检查的人中,患病人数相对还会较少。

推测一下,40-50的中年人可能忙于工作等事情,去检查的人可能大多都是感觉身体出现了不适的情况,才去检查,所以患病人数占比较大。

02 性别与心脏病

fig,ax=plt.subplots(figsize=(16,6))
plt.subplot(121)
s1=sns.boxenplot(x='sex',y='age',hue='target',data=df,palette='YlGn')
s1.set_title("Figure 1")

通过箱线图可以看到大多数女性患者年龄在40-70左右,男性患者大多在40-60岁,是否说明老年男性患病的可能性比老年女性患病的可能性小呢?

03 胸痛和心脏病

胸痛和心脏病在刚才的热图上看,相关性相对于其他因素来说是比较大的,那我们具体看一下。

fig,ax=plt.subplots(figsize=(24,6))
plt.subplot(131)
x1=sns.countplot(x='cp',data=df,hue='target',palette='spring')
x1.set_title('Chestpain type')

从图上可以看出,胸痛2型患有心脏病的概率最大。胸痛和不胸痛来看,胸痛的时候患有心脏病的概率大。

看一下年龄和胸痛有没有关系?

fig,ax=plt.subplots(figsize=(16,6))
sns.pointplot(x='age',y='cp',data=df,color='Lime',hue='target')
plt.title('Age vs Cp')

从这里看心脏病患者都具有较高的cp值,但是在45-49这段比较反常。

04 血清胆固醇的含量与心脏病

下面分析一下血清胆固醇的含量与心脏病的关联,从导致疾病的机理来看,长期的高血脂会造成血管内皮损伤,血管通透性增加等情况出现,增大了患有心血管疾病的可能性。

fig,ax=plt.subplots(figsize=(24,6))
plt.subplot(1,3, 2)
cho_bins= [100,150,200,250,300,350,400,450]
df['bin_chol']=pd.cut(df['chol'],bins=cho_bins)
g2=sns.countplot(x='bin_chol',data=df,hue='target',palette='plasma')
g2.set_title("Cholestoralvs Heart Disease")

血清胆固醇含量在201-250之间心脏病患病人数较多,而高于250后心脏病患病人数反而下降。

05 心率与心脏病

fig,ax=plt.subplots(figsize=(24,6))
plt.subplot(1, 3, 3)
thal_bins = [60,80,100,120,140,160,180,200,220]
df['bin_thalach']=pd.cut(df['thalach'], bins=thal_bins)
g3=sns.countplot(x='bin_thalach',data=df,hue='target',palette='plasma')
g3.set_title("Thalach vs Heart Disease")

从最大心率可以看出,最大心率在140-180之间的人,患有心脏病的风险最高。

年龄和最大心率有没有啥相关性呢?

fig,ax=plt.subplots(figsize=(16,6))
sns.lineplot(y='thalach',x='age',data=df,hue="target",style='target',palette='magma',markers=True,dashes=False,err_style="bars", ci=68)
plt.title('Agevs Thalach')

从这个图可以看出来,每个年龄段患有心脏病的患者,最大心率都相对较高。随着年龄的增大,最大心率会下降,这可能和年龄增加,身体机能下降有关。

06 thal字段数据

根据所给信息 thal字段有 3 7 9 三个数值分别代表正常,固定缺陷,可逆缺陷,但是thal数值中并未出现这三个值,反之有0,1,2,3四种值。这让我感觉很疑惑。可能是数据源提供的信息出现些问题?

但是根据thal的图来看thal值为2的患有心脏病的概率最高。

我们看一下男性患者和女性患者和thal值有什么相关性没。

sns.pointplot(x='sex',y='thal',data=df,hue='target',markers=["o","x"],linestyles=["-","--"],capsize=.2,palette='coolwarm')

不管是男性还是女性,未患病的thal值均较高。而患病者中,男性的thal值会比女性的thal值高。

slope值代表运动后ST段的斜率,心电图中,如果ST段异常变大说明心脏可能出现了心肌缺血的问题,先看下slope值和患病有什么关系。

fig,ax=plt.subplots(figsize=(24,6))
plt.subplot(133)
x3=sns.countplot(x='slope',data=df,hue='target',palette='spring')
x3.set_title('slopeof the peak exercise ST segment')

可以看到slope值为2的人群患心脏病的可能性比较大。

看下运动后ST段的斜率和相对于休息时候ST段抑制有没有什么相关性

我们可以看到随着slope值的减小,oldpeak值也逐渐减小,并且我们可以发现心脏病患者的oldpeak值均相对健康人群oldpeak值低。

好了,我们分析了年龄、cp、thalach、slope这四个字段以及它们和别的字段结合与患病的相关性。

本文参考了kaggle上大神的代码~和分析思路~云感谢大佬们~

推荐阅读: