日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
數(shù)據(jù)分析實(shí)戰(zhàn):利用Python對(duì)心臟病數(shù)據(jù)集進(jìn)行分析

 我們都很害怕生病,但感冒發(fā)燒這種從小到大的疾病我們已經(jīng)麻木了,因?yàn)橐恍瞧谒蜁?huì)好,但是隨著長(zhǎng)大,各種發(fā)炎、三高、心臟病、冠心病響應(yīng)而生。

心臟病作為一種發(fā)作起來讓人看了就覺得恐怖的疾病,每年不知道奪走多少生命。而那些患病健在的人們也必須在自己后續(xù)的生命里割舍太多東西,以防止心臟病發(fā)作。

沒有得病的時(shí)候,我們永遠(yuǎn)覺得它離自己很遠(yuǎn)。我對(duì)心臟病的認(rèn)知就是這樣,我不知道它患病的原因,也不知哪些原因會(huì)引起心臟病。而患病后如何保持正常生活等等,一概不知。

今天在kaggle上看到一個(gè)心臟病數(shù)據(jù)(數(shù)據(jù)集下載地址和源碼見文末),那么借此深入分析一下。

數(shù)據(jù)集讀取與簡(jiǎn)單描述

首先導(dǎo)入library和設(shè)置好超參數(shù),方便后續(xù)分析。

 
 
 
 
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns

通過對(duì)數(shù)據(jù)集讀取和描述可以得到這兩個(gè)表格:

可以看到有303行14列數(shù)據(jù),每列的標(biāo)題是age、sex、cp、……、target。他們就像每次去醫(yī)院的化驗(yàn)單,非專業(yè)人士很多都不認(rèn)識(shí)。所以利用官方的解釋翻譯后含義如下:

  • age: 該朋友的年齡
  • sex: 該朋友的性別 (1 = 男性, 0 = 女性)
  • cp: 經(jīng)歷過的胸痛類型(值1:典型心絞痛,值2:非典型性心絞痛,值3:非心絞痛,值4:無癥狀)
  • trestbps: 該朋友的靜息血壓(入院時(shí)的毫米汞柱)
  • chol: 該朋友的膽固醇測(cè)量值,單位 :mg/dl
  • fbs: 人的空腹血糖(> 120 mg/dl,1=真;0=假)
  • restecg: 靜息心電圖測(cè)量(0=正常,1=患有ST-T波異常,2=根據(jù)Estes的標(biāo)準(zhǔn)顯示可能或確定的左心室肥大)
  • thalach: 這朋友達(dá)到的最大心率
  • exang: 運(yùn)動(dòng)引起的心絞痛(1=有過;0=沒有)
  • oldpeak: ST抑制,由運(yùn)動(dòng)引起的相對(duì)于休息引起的(“ ST”與ECG圖上的位置有關(guān)。這塊比較專業(yè),可以點(diǎn)這個(gè)看一個(gè)解讀)
  • slope: 最高運(yùn)動(dòng)ST段的斜率(值1:上坡,值2:平坦,值3:下坡)
  • ca: 螢光顯色的主要血管數(shù)目(0-4)
  • thal: 一種稱為地中海貧血的血液疾病(3=正常;6=固定缺陷;7=可逆缺陷)
  • target: 心臟病(0=否,1=是)

所以這些信息里都是患病或者健康者的一些身體指標(biāo),并沒有和他是否抽煙、是否熬夜、是否遺傳、是否作息規(guī)律那些東西,因此找不到指導(dǎo)現(xiàn)在我們生活的點(diǎn),比如說明要戒煙戒酒那些東西。

順手送上一篇知乎鏈接 此外上邊只是我通過原版數(shù)據(jù)集給的解讀翻譯的,如有出錯(cuò)誤,歡迎糾正

拿到一套數(shù)據(jù)首先是要看看這個(gè)數(shù)據(jù)大概面貌~

男女比例

先看看患病比率,男女比例這些常規(guī)的

 
 
 
 
  1. countNoDisease = len(data[data.target == 0])
  2. countHaveDisease = len(data[data.target == 1])
  3. countfemale = len(data[data.sex == 0])
  4. countmale = len(data[data.sex == 1])
  5. print(f'沒患病人數(shù):{countNoDisease }',end=' ,')
  6. print("沒有得心臟病比率: {:.2f}%".format((countNoDisease / (len(data.target))*100)))
  7. print(f'有患病人數(shù):{countHaveDisease }',end=' ,')
  8. print("患有心臟病比率: {:.2f}%".format((countHaveDisease / (len(data.target))*100)))
  9. print(f'女性人數(shù):{countfemale }',end=' ,')
  10. print("女性比例: {:.2f}%".format((countfemale / (len(data.sex))*100)))
  11. print(f'男性人數(shù):{countmale }',end=' ,')
  12. print("男性比例: {:.2f}%".format((countmale   / (len(data.sex))*100)))

上邊代碼得到的答案如下,乍看上去男的多于女的,但前提是這個(gè)數(shù)據(jù)只是這個(gè)300人的樣本展示,不代表全人類

沒患病人數(shù):138 ,沒有得心臟病比率: 45.54%

有患病人數(shù):165 ,患有心臟病比率: 54.46%

女性人數(shù):96 ,女性比例: 31.68%

男性人數(shù):207 ,男性比例: 68.32%

除了用餅圖看這個(gè)面貌,還可以同時(shí)看一下

 
 
 
 
  1. fig, ax =plt.subplots(1,3)  #2個(gè)子區(qū)域
  2. fig.set_size_inches(w=15,h=5)   # 設(shè)置畫布大小
  3. sns.countplot(x="sex", data=data,ax=ax[0])
  4. plt.xlabel("性別 (0 = female, 1= male)")
  5. sns.countplot(x="target", data=data,ax=ax[1])
  6. plt.xlabel("是否患病 (0 = 未患病, 1= 患病)")
  7. sns.swarmplot(x='sex',y='age',hue='target',data=data,ax=ax[2])
  8. plt.xlabel("性別 (0 = female, 1= male)")
  9. plt.show()

從這三聯(lián)圖可以看到男性1多余女性0,患病target1多于未患病0,在年齡分布提琴圖里可以看到女性患者比例多于男性患者比例。

其中比列詳細(xì)拆解一下,見下方代碼和圖示:

 
 
 
 
  1. pd.crosstab(data.sex,data.target).plot(kind="bar",figsize=(15,6),color=['#30A9DE','#EFDC05' ])
  2. plt.title('各性別下患病圖示')
  3. plt.xlabel('性別 (0 = 女性, 1 = 男性)')
  4. plt.xticks(rotation=0)
  5. plt.legend(["未患病", "患有心臟病"])
  6. plt.ylabel('人數(shù)')
  7. plt.show()

可以看到這個(gè)數(shù)據(jù)集中女性患者數(shù)是健康數(shù)的3倍多。留下一個(gè)疑問,心臟病女性更容易得嘛?百度了一下,發(fā)現(xiàn)這個(gè)問題提問的人不少,但沒有具體很科學(xué)的回答。google也同樣如此。可能要找到這個(gè)答案需要再去找一找文獻(xiàn),但不是本文目的,因此沒有去尋找這個(gè)真實(shí)比例。

在這個(gè)數(shù)據(jù)集中,男性多于女性一倍,分別207和96人;患病患者稍微多余未患病患者,患病165,138人。因?yàn)槟挲g可能是連續(xù)的,因此在第三幅圖做年齡、性別、患病關(guān)系圖,單從顏色觀察可發(fā)現(xiàn)在這個(gè)數(shù)據(jù)集中,女性患病率大于男性。通過第四圖和統(tǒng)計(jì)可以計(jì)算得到,男性患病率44.9% ,女性患病率75%。

需要注意,本文得到的患病率只是這個(gè)數(shù)據(jù)集的。

年齡和患病關(guān)系

通過以下代碼來看一看:隨著年齡增長(zhǎng)患病比率有沒有變化

(現(xiàn)在寫這個(gè)文章的時(shí)候我才想到,可能即使有變化也沒有意義,還是樣本有限,如果這個(gè)樣本空間覆蓋再提升1000倍才能說明一些問題吧——即年齡和患有心臟病的關(guān)系)

 
 
 
 
  1. pd.crosstab(data.age,data.target).plot(kind="bar",figsize=(25,8))
  2. plt.title('患病變化隨年齡分布圖')
  3. plt.xlabel('歲數(shù)')
  4. plt.ylabel('比率')
  5. plt.savefig('heartDiseaseAndAges.png')
  6. plt.show()

輸出的圖像如下:就這張圖來說37-54歲患病人數(shù)多于未患病人數(shù),年齡再繼續(xù)升高后有沒有這個(gè)規(guī)律了,在70+歲后患病人數(shù)又增加,這條僅能作為數(shù)據(jù)展示,不能作為結(jié)論。

數(shù)據(jù)集中還有很多維度可以組合分析,下邊開始進(jìn)行組合式探索分析

年齡-心率-患病三者關(guān)系

在這個(gè)數(shù)據(jù)集中,心率的詞是‘thalach’,所以看年齡、心率、是否患病的關(guān)系。

 
 
 
 
  1. # 散點(diǎn)圖
  2. plt.scatter(x=data.age[data.target==1], y=data.thalach[(data.target==1)], c="red")
  3. plt.scatter(x=data.age[data.target==0], y=data.thalach[(data.target==0)], c='#41D3BD')
  4. plt.legend(["患病", "未患病"])
  5. plt.xlabel("年齡")
  6. plt.ylabel("最大心率")
  7. plt.show()
  8. # 再畫個(gè)提琴圖
  9. sns.violinplot(x=data.target,y=data.trestbps,data=data)
  10. plt.show()

看到30歲心跳200那個(gè)點(diǎn),嚇我一跳,如果心臟病不是病,那200這個(gè)速度太讓人膜拜了。

可以看到的是心跳速度患病的大概集中在140-200bpm之間。這個(gè)數(shù)據(jù)比未患病的人普遍高一些,從提琴圖上也可以看到這個(gè)值分布比健康人高一些且更集中。

年齡和血壓(trestbps)分布關(guān)系大家都知道體檢的時(shí)候血壓是常規(guī)測(cè)試項(xiàng)目,那么我想血壓和年齡有什么關(guān)系嗎?有沒有心臟病和年齡有關(guān)系嗎?

來做個(gè)圖看一下。并嘗試用不同的顏色區(qū)分。

 
 
 
 
  1. plt.scatter(x=data.age[data.target==1], y=data.trestbps[data.target==1], c="#FFA773")
  2. plt.scatter(x=data.age[data.target==0], y=data.trestbps[data.target==0], c="#8DE0FF")
  3. plt.legend(["患病",'未患病'])
  4. plt.xlabel("年齡")
  5. plt.ylabel("血壓")
  6. plt.show()

看上去隨著年齡增長(zhǎng),血壓更飄了?從這個(gè)結(jié)果可以看到的是,靜息血壓患病人和未患病的人在血壓方面都是均勻分布的,隨著年齡增長(zhǎng)也沒有明顯的分層變化。所以并不能直接從靜息血壓很好的判斷出是否患心臟病。

那么血壓與其他什么有關(guān)呢?

比如心率?好,來看看。

血壓(trestbps)和心率(thalach)關(guān)系

血壓、心率這兩個(gè)都來自于心臟的動(dòng)能,相當(dāng)于發(fā)動(dòng)機(jī)力量和發(fā)動(dòng)機(jī)轉(zhuǎn)速。我猜這倆有點(diǎn)關(guān)系,一起看看

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

現(xiàn)實(shí)情況是,這個(gè)樣本集中,除了能顯示出患病新率高這個(gè)已有結(jié)果外,血壓和心率沒有相關(guān)性。

胸痛類型和心臟病、血壓三者關(guān)系

表中有個(gè)數(shù)據(jù)是胸痛類型四個(gè),分別是0123,他們和心臟病有關(guān)系嗎,作圖看看。

此外這塊我要說的是,我上邊的翻譯是1 典型、2非典型、3非心絞痛、4無癥狀。

但是數(shù)據(jù)集中是0123 ,我再kaggle里看了很多人的作品,沒有合理解釋這個(gè)的,所以這個(gè)數(shù)據(jù)我只可視化展示,不分析。

 
 
 
 
  1. sns.swarmplot(x='target',y='trestbps',hue='cp',data=data, size=6)
  2. plt.xlabel('是否患病')
  3. plt.show()

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

結(jié)論是:從上圖可以看到的是0類疼痛的人在非患病群體中占大多數(shù),而在患病群體中,123三種胸痛的人占了大部分。

運(yùn)動(dòng)引起的心絞痛與患病、心率關(guān)系

承接胸痛類型,運(yùn)動(dòng)引起心絞痛與是否患病有沒有關(guān)系呢?與心率有沒有關(guān)系呢?作圖看一下

PS:運(yùn)動(dòng)引起心絞痛(exang: 1=有過;0=沒有)

 
 
 
 
  1. sns.swarmplot(x='exang',y='thalach',hue='target',data=data, size=6)
  2. plt.xlabel('有沒有過運(yùn)動(dòng)引起心絞痛')
  3. plt.ylabel('最大心率')
  4. plt.show()

得到的這個(gè)圖像很有意思!

雖然最大心率是入院時(shí)候測(cè)的,但是在沒有運(yùn)動(dòng)引起心絞痛的人中,最大心率集中度比較高,在160-180之間,而他們都患有心臟病。

我推測(cè)是:他們有心臟病,運(yùn)動(dòng)就難受,所以就不運(yùn)動(dòng),所以根本不會(huì)有“運(yùn)動(dòng)時(shí)產(chǎn)生胸痛”這種問題。

而在運(yùn)動(dòng)中產(chǎn)生胸痛的人中(右邊為1的)他們有很多產(chǎn)生過胸痛,這種人心率比較高,在120-150之間集中著,而其中很多人并沒有心臟病,只是心率比較高。

大血管數(shù)量(ca)和血壓(trestbps)、患病關(guān)系

 
 
 
 
  1. plt.figure(figsize=(15,5))
  2. sns.swarmplot(y='trestbps',data=data,x='ca',hue='target',palette='RdBu_r',size=7)
  3. plt.xlabel('大血管數(shù)量')
  4. plt.ylabel('靜息血壓')
  5. plt.show()

 
 
 
 
  1. plt.figure(figsize=(15,5))
  2. sns.catplot(x="ca", y="age", hue="target", kind="swarm", data=data, palette='RdBu_r')
  3. plt.xlabel('大血管顯色數(shù)量')
  4. plt.ylabel('年齡'

這個(gè)血管數(shù)量指銀光顯色。具體醫(yī)學(xué)含義沒搜到,所以不分析。只是為0的和患病有很大的相關(guān)性

年齡(age)和膽固醇(chol)關(guān)系

在我初高中的時(shí)候,我媽媽告訴我說,每天雞蛋黃不要超過兩個(gè),不然會(huì)引起膽固醇高,那時(shí)候身體健康,從來不信這些話。我后來上大學(xué)了連每天一個(gè)都沒保證住,但我記住了這句話,所以看到膽固醇三個(gè)字會(huì)想起這個(gè)家庭教育哈哈。

膽固醇側(cè)面反映了血脂,那么下邊生成一下膽固醇、年齡、患病三者關(guān)系散點(diǎn)圖。為了區(qū)分,這次我又換了個(gè)顏色。

 
 
 
 
  1. plt.scatter(x=data.age[data.target==1], y=data.chol[data.target==1], c="orange")
  2. plt.scatter(x=data.age[data.target==0], y=data.chol[data.target==0], c="green")
  3. plt.legend(["患病",'未患病'])
  4. plt.xlabel("年齡")
  5. plt.ylabel("膽固醇")
  6. plt.show()
  7. # 箱型圖
  8. sns.boxplot(x=data.target,y=data.chol,data=data)

在這個(gè)樣本集中,患病者和非患病者膽固醇含量分布沒有明顯的分層現(xiàn)象,箱型圖顯示結(jié)果是合理上下限是一樣的,只是25%、50%、75%三條線患病的人稍微稍微低一些。

結(jié)論就是膽固醇并不能直接反映有沒有心臟病這件事。

相關(guān)性分析

分析了很多,那么哪些和患病相關(guān)的,而數(shù)據(jù)間又有啥關(guān)系呢?做個(gè)圖看看,顏色越綠越相關(guān),越紅越負(fù)相關(guān)

 
 
 
 
  1. plt.figure(figsize=(15,10))
  2. ax= sns.heatmap(data.corr(),cmap=plt.cm.RdYlBu_r , annot=True ,fmt='.2f')
  3. a,b =ax.get_ylim()
  4. ax.set_ylim(a+0.5,b-0.5)

圖像很好看對(duì)不對(duì),只看最后一行,是否患病和cp、thalach、slope正相關(guān),和exang、oldpeak、ca、thal等負(fù)相關(guān)。

本篇分析了心臟病數(shù)據(jù)集中的部分內(nèi)容,14列其實(shí)有非常多的組合方式去分析。此外本文沒有用到模型,只是數(shù)據(jù)可視化的方式進(jìn)行簡(jiǎn)要分析。

本文中由于圖片過大,在手機(jī)瀏覽可能看不清楚,故開源了代碼,歡迎大家自己動(dòng)手可視化試試。


名稱欄目:數(shù)據(jù)分析實(shí)戰(zhàn):利用Python對(duì)心臟病數(shù)據(jù)集進(jìn)行分析
轉(zhuǎn)載注明:http://www.5511xx.com/article/dpsigcp.html