數據分析每周挑戰——心衰患者特征數據集

這是一篇關于醫學數據的數據分析,但是這個數據集數據不是很多。

背景描述

本數據集包含了多個與心力衰竭相關的特征,用于分析和預測患者心力衰竭發作的風險。數據集涵蓋了從40歲到95歲不等年齡的患者群體,提供了廣泛的生理和生活方式指標,以幫助研究人員和醫療專業人員更好地理解心衰的潛在風險因素。

每條患者記錄包含以下關鍵信息:

  1. 年齡(Age):記錄患者的年齡,心臟病的風險隨年齡增長而增加。
  2. 貧血(Anaemia):貧血可能影響心臟功能,記錄患者是否患有貧血。
  3. 高血壓(High blood pressure):高血壓是心臟病的主要風險因素之一。
  4. 肌酸激酶(Creatinine phosphokinase, CPK):血液中的CPK水平可以反映心肌損傷。
  5. 糖尿病(Diabetes):糖尿病與心臟病風險增加有關。
  6. 射血分數(Ejection fraction):心臟每次收縮時泵出的血液百分比,是心臟功能的重要指標。
  7. 性別(Sex):性別可能影響心臟病的風險和表現形式。
  8. 血小板(Platelets):血小板水平可能與血液凝固和心臟病風險相關。
  9. 血清肌酐(Serum creatinine):血液中的肌酐水平可以反映腎臟功能,與心臟病風險有關。
  10. 血清鈉(Serum sodium):鈉水平的異常可能與心臟疾病相關。
  11. 吸煙(Smoking):吸煙是心臟病的一個重要可預防風險因素。
  12. 時間(Time):記錄患者的隨訪期,用于觀察長期健康變化。
  13. 死亡事件(death event):記錄患者在隨訪期間是否發生了死亡事件,作為研究的主要結果指標。

數據說明

字段解釋測量單位區間
Age患者的年齡年(Years)[40,…, 95]
Anaemia是否貧血(紅細胞或血紅蛋白減少)布爾值(Boolean)0, 1
High blood pressure患者是否患有高血壓布爾值(Boolean)0, 1
Creatinine phosphokinase, CPK血液中的 CPK (肌酸激酶)水平微克/升(mcg/L)[23,…, 7861]
Diabetes患者是否患有糖尿病布爾值(Boolean)0, 1
Ejection fraction每次心臟收縮時離開心臟的血液百分比百分比(Percentage)[14,…, 80]
Sex性別,女性0或男性1二進制(Binary)0, 1
Platelets血液中的血小板數量千血小板/毫升(kiloplatelets/mL)[25.01,…, 850.00]
Serum creatinine血液中的肌酐水平毫克/分升(mg/dL)[0.50,…, 9.40]
Serum sodium血液中的鈉水平毫摩爾/升(mEq/L)[114,…, 148]
Smoking患者是否吸煙布爾值(Boolean)0, 1
Time隨訪期天(Days)[4,…,285]
DEATH_EVENT患者在隨訪期間是否死亡布爾值(Boolean)0, 1
!pip install lifelines -i https://pypi.tuna.tsinghua.edu.cn/simple/
!pip install imblearn -i https://pypi.tuna.tsinghua.edu.cn/simple/

?這是我們這次用到的一些第三方庫,大家如果沒有安裝,可以在jupyter notebook中直接下載。

一:導入第三方庫

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from lifelines import KaplanMeierFitter,CoxPHFitter
import scipy.stats as stats
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import RandomOverSampler
from sklearn.metrics import classification_report,confusion_matrix,roc_curve,auc
from sklearn.ensemble import RandomForestClassifier
from pylab import mplplt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

?二:讀取數據

data = pd.read_csv("D:/每周挑戰/heart_failure_clinical_records_dataset.csv")
data.head()

三:對數據進行預處理

data = data.rename(columns={'age':'年齡','anaemia':'是否貧血','creatinine_phosphokinase':'血液中的CPK水平','diabetes':'患者是否患有糖尿病','ejection_fraction':'每次心臟收縮時離開心臟的血液百分比','high_blood_pressure':'患者是否患有高血壓','platelets':'血液中的血小板數量','serum_creatinine':'血液中的肌酐水平','serum_sodium':'血液中的鈉水平','sex':'性別(0為男)','smoking':'是否吸煙','time':'隨訪期(day)','DEATH_EVENT':'是否死亡'})
data.head()
# 將標簽修改為中文更好看

?上面這一段可以不寫,如果你喜歡英語可以不加,如果你喜歡漢字,那你可以更改一下。

data.info()  # 從這里可以觀察出應該是沒有缺失值
data.isnull().sum()  # 沒有缺失值
data_ = data.copy()        # 方便我們后期對數據進行建模

區分連續數據和分類數據。?

for i in data.columns:if set(data[i].unique()) == {0,1}:print(i)
print('-'*50)
for i in data.columns:if set(data[i].unique()) != {0,1}:print(i)   

?四:數據分析繪圖

classify = ['anaemia','high_blood_pressure','diabetes','sex','smoking','DEATH_EVENT']  #  DEATH_EVENT 這個是研究的主要結果指標
numerical = ['age','creatinine_phosphokinase','ejection_fraction','platelets','serum_creatinine','serum_sodium','time']plt.figure(figsize=((16,20)))
for i,col in enumerate(numerical):plt.subplot(4,2,i+1)sns.boxplot(y = data[col])plt.title(f'{col}的箱線圖', fontsize=14)plt.ylabel('數值', fontsize=12)plt.grid(axis='y', linestyle='--', alpha=0.7)plt.tight_layout()
plt.show()

?從箱型圖來看,有些數據有部分異常值,但是,由于缺乏醫學知識,所以這里我們不能對異常值進行處理。

colors = ['#63FF9D', '#C191FF']
plt.figure(figsize=(10,12))
for i,col in enumerate(classify):statistics = data[col].value_counts().reset_index()plt.subplot(3,2,i+1)sns.barplot(x=statistics['index'],y=statistics[col],palette=colors)plt.title(f'{col}的條形圖', fontsize=14)plt.tight_layout()
plt.show()

接下里,我們看時間對于生存率的影響,這里我們就用到了前面安裝的KaplanMeierFitter。

kmf = KaplanMeierFitter()
kmf.fit(durations=data['time'],event_observed=data['DEATH_EVENT'])plt.figure(figsize=(10,8))
kmf.plot_survival_function()
plt.title('Kaplan-Meier 生存曲線', fontsize=14)
plt.xlabel('時間(天)', fontsize=12)
plt.ylabel('生存概率', fontsize=12)plt.show()

隨著時間的推移,生存概率逐漸下降。 在隨訪結束時,生存概率大約為60%。 接下來,我們對特征相關性進行分析。?

corr = data.corr(method="spearman")plt.figure(figsize=(10,8))
sns.heatmap(corr,annot=True,cmap='coolwarm',fmt='.2g')
plt.title("斯皮爾曼相關性矩陣")
plt.show()

顯著相關性:

年齡、射血分數、血清肌酐 血清鈉 和 隨訪期 與死亡事件之間的相關性較強。 射血分數和血清肌酐與死亡事件的相關性尤為顯著,這表明這些變量對死亡事件的預測可能具有重要意義。 弱相關性或無相關性:

貧血、高血壓 與死亡事件有輕微相關性,但不顯著。

肌酸激酶、糖尿病、血小板、性別 和 吸煙 與死亡事件幾乎沒有相關性。

def t_test(fea):group1 = data[data['DEATH_EVENT'] == 0][fea]group2 = data[data['DEATH_EVENT'] == 1][fea]t,p = stats.ttest_ind(group1,group2)return t,p# 對數值變量進行t檢驗
t_test_results = {feature: t_test(feature) for feature in numerical}t_test_df = pd.DataFrame.from_dict(t_test_results,orient='index',columns=['T-Statistic','P-Value'])
t_test_df
T-StatisticP-Value
age-4.5219838.862975e-06
creatinine_phosphokinase-1.0831712.796112e-01
ejection_fraction4.8056282.452897e-06
platelets0.8478683.971942e-01
serum_creatinine-5.3064582.190198e-07
serum_sodium3.4300636.889112e-04
time10.6855639.122223e-23

?

t檢驗是一種統計方法,用于比較兩組數據是否存在顯著差異。該方法基于以下步驟和原理:

建立假設:首先建立零假設(H0),通常表示兩個比較群體間沒有差異,以及備擇假設(H1),即存在差異。

計算t值:計算得到一個t值,這個值反映了樣本均值與假定總體均值之間的差距大小。

確定P值:通過t分布理論,計算出在零假設為真的條件下,觀察到當前t值或更極端情況的概率,即P值。

做出結論:如果P值小于事先設定的顯著性水平(通常為0.05),則拒絕零假設,認為樣本來自的兩個總體之間存在顯著差異;否則,不拒絕零假設。

對于連續數據的特征我們采用t檢驗進行分析,而對于離散數據,我們采用卡方檢驗進行分析

# 卡方檢驗
def chi_square_test(fea1, fea2):contingency_table = pd.crosstab(data[fea1], data[fea2])chi2, p, dof, expected = stats.chi2_contingency(contingency_table)return chi2, pchi_square_results = {}
chi_square_results = {feature: chi_square_test(feature, 'DEATH_EVENT') for feature in classify}chi_square_df = pd.DataFrame.from_dict(chi_square_results,orient='index',columns=['Chi-Square','P-Value'])
chi_square_df
Chi-SquareP-Value
anaemia1.0421753.073161e-01
high_blood_pressure1.5434612.141034e-01
diabetes0.0000001.000000e+00
sex0.0000001.000000e+00
smoking0.0073319.317653e-01
DEATH_EVENT294.4301065.386429e-66

所有分類變量(貧血、糖尿病、高血壓、性別、吸煙)的p值均大于0.05,表明它們與死亡事件無顯著相關性。

最后我們對數據進行建模,這里我們使用隨機森林,由于數據量較少,因此我們采用隨機采樣的方法進行過采樣。

x = data.drop('DEATH_EVENT',axis=1)
y = data['DEATH_EVENT']
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=15) #37分
# 實例化隨機過采樣器
oversampler = RandomOverSampler()# 在訓練集上進行隨機過采樣
x_train, y_train = oversampler.fit_resample(x_train, y_train)rf_clf = RandomForestClassifier(random_state=15)
rf_clf.fit(x_train, y_train)y_pred_rf = rf_clf.predict(x_test)
class_report_rf = classification_report(y_test, y_pred_rf)
print(class_report_rf)
          precision    recall  f1-score   support0       0.84      0.85      0.84        601       0.69      0.67      0.68        30accuracy                           0.79        90macro avg       0.76      0.76      0.76        90
weighted avg       0.79      0.79      0.79        90
cm = confusion_matrix(y_test,y_pred_rf)plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='g', cmap='Blues', xticklabels=['預測值 0', '預測值 1'], yticklabels=['真實值 0', '真實值 1'])
plt.title('混淆矩陣')
plt.show()

feature_importance = rf_clf.feature_importances_
feature = x.columnssort_importance = feature_importance.argsort()
plt.figure(figsize=(10,8))
plt.barh(range(len(sort_importance)), feature_importance[sort_importance],color='#B5FFCD')
plt.yticks(range(len(sort_importance)), [feature[i] for i in sort_importance])
plt.xlabel('特征重要性')
plt.title('特征重要性分析')plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23484.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring事務實現原理

Spring事務的實現原理主要是基于AOP(面向切面編程) 事務的開啟與提交/回滾 開啟事務:當Spring容器中的AOP代理檢測到一個匹配的切點方法被調用時,它會首先開啟一個新的事務或者加入到現有的事務中(這取決于事務傳播行…

【讀腦儀game】

讀腦儀(Brain-Computer Interface,BCI)游戲是一種利用腦電信號來控制游戲的新型交互方式。這類游戲通常需要專業的硬件設備來讀取用戶的腦電信號,并將這些信號轉化為游戲中的控制信號。編寫這樣的游戲代碼涉及到多個方面&#xff…

瀚高數據庫相關設置

瀚高數據庫相關設置 一、配置瀚高數據庫局域網訪問 需要修改兩個文件:postgresql.conf和pg_hba.conf 1)在postgresql.conf中找到下述配置,把listen_addresses前面的注釋去掉,值修改為* # - Connection Settings -#listen_addresse…

IO進程線程(九)線程的同步 進程間通信

文章目錄 一、 線程的同步(一)無名信號量sem1. 定義和初始化2.獲取信號量3.釋放信號量4. 銷毀5. 使用示例 (二)條件變量1. 定義和初始化2. 獲取條件變量3. 釋放條件變量4. 銷毀條件變量 二、進程間通信(一)…

web-上傳項目文件夾到Git遠程倉庫

Git初識 概念:一個免費開源,分布式的代碼版本控制系統,幫助開發團隊維護代碼 作用:記錄代碼內容,切換代碼版本,多人開發時高效合并代碼內容 檢驗成功 打開bash終端(git專用)命令…

12. MySQL 日志

文章目錄 【 1. 日志的基本原理 】【 2. 錯誤日志 Error Log 】2.1 啟動和設置錯誤日志2.2 查看錯誤日志2.3 刪除錯誤日志 【 3. 二進制日志 Binary Log 】3.1 啟動和設置二進制日志3.2 查看二進制日志3.3 刪除二進制文件刪除所有二進制日志刪除小于指定編號的二進制日志刪除創…

【vue3+pinia+uniapp項目問題:使用pinia狀態管理時store的數據更新,模板渲染視圖不能實時更新】

在這里選擇不同的學校后,發現store里面的數據打印出來能更新,但是使用store的數據打印出來并未實時更新且渲染在模板上,必須手動刷新視圖才能更新。 原因是因為使用了解構賦值傳入參數 解決方法 1.使用computed 現在視圖能進行實時更新…

分享一個 .Net core Console 項目使用 SqlSugar 的詳細例子

前言 SqlSugar 是一款老牌的 .NET 開源 ORM 框架,性能高,功能全面,使用簡單,支持 .NET FrameWork、.NET Core3.1、.NET5、.NET6、.NET7、.NET8、.NET9 等版本,線上論壇非常活躍,今天給大伙分享一個 .Net c…

查看遠程桌面端口,查看服務器的遠程桌面端口的方法

如果你正在尋找一種方法來檢查服務器的遠程桌面端口,那么請務必按照以下步驟操作,以確保準確且安全地獲取所需信息。這不僅是一個技術問題,更是一個關于效率和安全性的重要議題。 首先,你需要明確,遠程桌面端口通常是…

回溯算法之遞增子數列

題目: 給你一個整數數組 nums ,找出并返回所有該數組中不同的遞增子序列,遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。 數組中可能含有重復元素,如出現兩個整數相等,也可以視作遞增序列的一種特殊情…

【數據結構與算法 | 二叉樹篇】二叉樹的前中后序遍歷(迭代版本)

1. 前言 前文我們實現了二叉樹前中后三種遍歷方式的遞歸版本,非常簡單. 接下來我們來實現一下其迭代版本. 2. 二叉樹的前序遍歷 (1). 題 給你二叉樹的根節點 root ,返回它節點值的 前序 遍歷。 示例 1: 輸入:root [1,null,2…

語音技能云云接入通用平臺

Cloud-to-Cloud(云云接入) 前言 項目地址:https://github.com/LeYunone/cloud-to-cloud 配置說明:https://leyunone.com/github-project/voice-cloud-cloud-config.html 注:學習測試以及使用請拉取 master 分支,release 是開發…

python pip 安裝

如果您不確定pip的安裝路徑,可以通過以下命令來查詢: pip show pip 這個命令會顯示pip的詳細信息,其中包括pip安裝的路徑。如果您想修改pip的默認安裝路徑,可以使用pip的"--target"參數指定目標路徑,例如&a…

8.7k Star!Khoj:你的AI第二大腦、開源RAG Cop??ilot、平替 MS Copilot與ChatGPT

原文鏈接:(更好排版、視頻播放、社群交流、最新AI開源項目、AI工具分享都在這個公眾號!) 8.7k Star!Khoj:你的AI第二大腦、開源RAG Cop??ilot、平替 MS Copilot與ChatGPT 🌟你的AI第二大腦。…

zynq-7015啟動分析及裸機BootLoader編寫(未完待續)

使用lwip-tcp遠程對QSPI進行更新、QSPI FLASH啟動 W25Q128資料: W25Q128JV datasheet(1/78 Pages) WINBOND | 3V 128M-bit serial flash memory with dual/quad spi (alldatasheet.com) UG585資料: Zynq 7000 SoC Technical Reference Manual-UG585 翻譯…

【ARFoundation自學05】人臉追蹤(AR Face manager)實現

1. 修改攝像機朝向渲染方式-選中user 這個方式就會調用前置攝像頭 2 創建 AR Session、XR Origin,然后在XR Origin上面添加組件 注意:XR Origin 老版本仍然叫 AR Session Origin 接下來在XR Origin上面添加AR Face Manager組件,如下圖&am…

劇本殺市場仍在快速發展,劇本殺小程序成為了新的機遇

近年來,劇本殺一直是年輕人的娛樂游戲方式之一,劇本殺行業呈現出了井噴式發展的形勢,成為了當下爆火的娛樂方式。目前,劇本殺行業擁有了完善的劇本資源和呈現方式,發展前景非常大。 根據當下的數據顯示,劇…

NextJs 實現自定義點火操作

NextJs 實現自定義點火操作 前言實現自定義點火 前言 我希望在Nextjs 啟動的時候,能夠自定義實現一些項目的初始化邏輯,也可以說是一些點火操作,比如資源的加載,數據的初始化等操作。 實現自定義點火 我們可以在根目錄下創建一…

Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)

文章目錄 Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41)1.開機動畫的啟動過程概述2.為什么設置了屬性之后就會播放? Android 開機動畫的啟動過程BootAnimation(基于Android10.0.0-r41) 1.開機動畫的啟動過程概述 下面就是BootAnimation的重要部…

移動app測試重要性體現在哪些方面?專業app測試報告獲取

移動app測試是指對手機應用進行各種測試和評估的過程,以確保應用的功能、性能和用戶體驗達到要求。在現代社會中,移動應用已經成為人們日常生活的一部分。無論是社交娛樂、購物支付還是工作學習,移動應用都發揮著不可替代的作用。因此&#x…