数据分析每周挑战——心衰患者特征数据集

这是一篇关于医学数据的数据分析,但是这个数据集数据不是很多。

背景描述

本数据集包含了多个与心力衰竭相关的特征,用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从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.mzph.cn/web/23484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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…

查看远程桌面端口,查看服务器的远程桌面端口的方法

如果你正在寻找一种方法来检查服务器的远程桌面端口,那么请务必按照以下步骤操作,以确保准确且安全地获取所需信息。这不仅是一个技术问题,更是一个关于效率和安全性的重要议题。 首先,你需要明确,远程桌面端口通常是…

【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(迭代版本)

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…

单元测试AIR原则:提升代码质量的秘密武器

文章目录 引言一、AIR原则1. Automatic(自动化)2. Independent(独立性)3. Repeatable(可重复性) 二、Automatic(自动化)三、Independent(独立性)四、Repeatab…

【MySQL】sql语句之表操作(上)

序言 在上一篇的数据库操作的内容中,学习了两种属性和常用的七种操作,学习是循序渐进的,库的操作学完了,就要开始学习表的操作了,而表可与数据强相关,比如DDL,即数据定义语言,DML&am…

DVWA-XSS(Stored)

Low 观察后端代码,对输入进行了一些过滤和转义。trim(string,charlist) 函数用于移除字符串两侧的空白字符或其他预定义字符,charlist 参数可以规定从字符串中删除哪些字符。stripslashes() 函数用于删除反斜杠。mysqli_real_escape_string() 函数用于对…

【实战】kafka3.X kraft模式集群搭建

文章目录 前言kafka2.0与3.x对比准备工作JDK安装kafka安装服务器增加hosts 修改Kraft协议配置文件格式化存储目录 启动集群停止集群测试Kafka集群创建topic查看topic列表查看消息详情生产消息消费消息查看消费者组查看消费者组列表 前言 相信很多同学都用过Kafka2.0吧&#xf…