中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣利用Python對心臟病數據集進行分析

發布時間:2021-10-28 17:53:56 來源:億速云 閱讀:235 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關怎樣利用Python對心臟病數據集進行分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

我們都很害怕生病,但感冒發燒這種從小到大的疾病我們已經麻木了,因為一星期他就會好,但是隨著長大,各種發炎、三高、心臟病、冠心病響應而生。

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

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

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

數據集讀取與簡單描述

首先導入library和設置好超參數,方便后續分析。

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

通過對數據集讀取和描述可以得到這兩個表格:

怎樣利用Python對心臟病數據集進行分析

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

  • age: 該朋友的年齡

  • sex: 該朋友的性別 (1 = 男性, 0 = 女性)

  • cp: 經歷過的胸痛類型(值1:典型心絞痛,值2:非典型性心絞痛,值3:非心絞痛,值4:無癥狀)

  • trestbps: 該朋友的靜息血壓(入院時的毫米汞柱)

  • chol: 該朋友的膽固醇測量值,單位 :mg/dl

  • fbs: 人的空腹血糖(> 120 mg/dl,1=真;0=假)

  • restecg: 靜息心電圖測量(0=正常,1=患有ST-T波異常,2=根據Estes的標準顯示可能或確定的左心室肥大)

  • thalach: 這朋友達到的最大心率

  • exang: 運動引起的心絞痛(1=有過;0=沒有)

  • oldpeak: ST抑制,由運動引起的相對于休息引起的(“ ST”與ECG圖上的位置有關。這塊比較專業,可以點這個看一個解讀)

  • slope: 最高運動ST段的斜率(值1:上坡,值2:平坦,值3:下坡)

  • ca: 螢光顯色的主要血管數目(0-4)

  • thal: 一種稱為地中海貧血的血液疾病(3=正常;6=固定缺陷;7=可逆缺陷)

  • target: 心臟病(0=否,1=是)

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

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

拿到一套數據首先是要看看這個數據大概面貌~

男女比例

先看看患病比率,男女比例這些常規的

countNoDisease = len(data[data.target == 0]) countHaveDisease = len(data[data.target == 1]) countfemale = len(data[data.sex == 0]) countmale = len(data[data.sex == 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))) print(f'女性人數:{countfemale }',end=' ,') print("女性比例: {:.2f}%".format((countfemale / (len(data.sex))*100))) print(f'男性人數:{countmale }',end=' ,') print("男性比例: {:.2f}%".format((countmale   / (len(data.sex))*100)))

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

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

有患病人數:165 ,患有心臟病比率: 54.46%

女性人數:96 ,女性比例: 31.68%

男性人數:207 ,男性比例: 68.32%

怎樣利用Python對心臟病數據集進行分析

除了用餅圖看這個面貌,還可以同時看一下

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

怎樣利用Python對心臟病數據集進行分析

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

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

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

怎樣利用Python對心臟病數據集進行分析

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

在這個數據集中,男性多于女性一倍,分別207和96人;患病患者稍微多余未患病患者,患病165,138人。因為年齡可能是連續的,因此在第三幅圖做年齡、性別、患病關系圖,單從顏色觀察可發現在這個數據集中,女性患病率大于男性。通過第四圖和統計可以計算得到,男性患病率44.9%  ,女性患病率75%。

需要注意,本文得到的患病率只是這個數據集的。

年齡和患病關系

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

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

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

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


怎樣利用Python對心臟病數據集進行分析

數據集中還有很多維度可以組合分析,下邊開始進行組合式探索分析

年齡-心率-患病三者關系

在這個數據集中,心率的詞是‘thalach’,所以看年齡、心率、是否患病的關系。

# 散點圖 plt.scatter(x=data.age[data.target==1], y=data.thalach[(data.target==1)], c="red") plt.scatter(x=data.age[data.target==0], y=data.thalach[(data.target==0)], c='#41D3BD') plt.legend(["患病", "未患病"]) plt.xlabel("年齡") plt.ylabel("最大心率") plt.show() # 再畫個提琴圖 sns.violinplot(x=data.target,y=data.trestbps,data=data) plt.show()

怎樣利用Python對心臟病數據集進行分析


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

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

年齡和血壓(trestbps)分布關系大家都知道體檢的時候血壓是常規測試項目,那么我想血壓和年齡有什么關系嗎?有沒有心臟病和年齡有關系嗎?

來做個圖看一下。并嘗試用不同的顏色區分。

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

怎樣利用Python對心臟病數據集進行分析

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

那么血壓與其他什么有關呢?

比如心率?好,來看看。

血壓(trestbps)和心率(thalach)關系

血壓、心率這兩個都來自于心臟的動能,相當于發動機力量和發動機轉速。我猜這倆有點關系,一起看看

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

怎樣利用Python對心臟病數據集進行分析

現實情況是,這個樣本集中,除了能顯示出患病新率高這個已有結果外,血壓和心率沒有相關性。

胸痛類型和心臟病、血壓三者關系

表中有個數據是胸痛類型四個,分別是0123,他們和心臟病有關系嗎,作圖看看。

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

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

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

怎樣利用Python對心臟病數據集進行分析

fig,ax=plt.subplots(1,2,figsize=(14,5)) sns.countplot(x='cp',data=data,hue='target',palette='Set3',ax=ax[0]) ax[0].set_xlabel("胸痛類型") 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') ax[1].set_title("胸痛類型")

怎樣利用Python對心臟病數據集進行分析

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

運動引起的心絞痛與患病、心率關系

承接胸痛類型,運動引起心絞痛與是否患病有沒有關系呢?與心率有沒有關系呢?作圖看一下

PS:運動引起心絞痛(exang: 1=有過;0=沒有)

sns.swarmplot(x='exang',y='thalach',hue='target',data=data, size=6) plt.xlabel('有沒有過運動引起心絞痛') plt.ylabel('最大心率') plt.show()

怎樣利用Python對心臟病數據集進行分析

得到的這個圖像很有意思!

雖然最大心率是入院時候測的,但是在沒有運動引起心絞痛的人中,最大心率集中度比較高,在160-180之間,而他們都患有心臟病。

我推測是:他們有心臟病,運動就難受,所以就不運動,所以根本不會有“運動時產生胸痛”這種問題。

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

大血管數量(ca)和血壓(trestbps)、患病關系

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

怎樣利用Python對心臟病數據集進行分析

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

怎樣利用Python對心臟病數據集進行分析

這個血管數量指銀光顯色。具體醫學含義沒搜到,所以不分析。只是為0的和患病有很大的相關性

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

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

膽固醇側面反映了血脂,那么下邊生成一下膽固醇、年齡、患病三者關系散點圖。為了區分,這次我又換了個顏色。

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

怎樣利用Python對心臟病數據集進行分析

怎樣利用Python對心臟病數據集進行分析


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

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

相關性分析

分析了很多,那么哪些和患病相關的,而數據間又有啥關系呢?做個圖看看,顏色越綠越相關,越紅越負相關

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

怎樣利用Python對心臟病數據集進行分析

圖像很好看對不對,只看最后一行,是否患病和cp、thalach、slope正相關,和exang、oldpeak、ca、thal等負相關。

分析了心臟病數據集中的部分內容,14列其實有非常多的組合方式去分析。此外本文沒有用到模型,只是數據可視化的方式進行簡要分析。

關于怎樣利用Python對心臟病數據集進行分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江阴市| 宣汉县| 武胜县| 华安县| 龙门县| 开平市| 昭觉县| 阿坝县| 广丰县| 兰考县| 广德县| 江城| 思南县| 新余市| 辽源市| 崇文区| 和林格尔县| 乌拉特后旗| 如东县| 游戏| 万载县| 灵丘县| 文山县| 乌拉特后旗| 大渡口区| 陈巴尔虎旗| 柘城县| 香格里拉县| 景谷| 东城区| 乌拉特前旗| 江陵县| 聊城市| 神农架林区| 双桥区| 巴东县| 邮箱| 墨竹工卡县| 秀山| 丰都县| 饶平县|