python数据分析案例,心脏病预测

心脏病是一类比较常见的循环系统疾病。它作为全球第一大杀手,是我们不得不提前防御的疾病。我从kaggle上下载了一份心脏病数据集,利用python找出一些规律,看下哪些特征对于确诊心脏病影响比较大,从而提醒我们注意平时的生活规律。

导入数据集

import pandas as pd

data = pd.read_csv('heart.csv')

data.head()

我们可以看到以下数据:

python数据分析案例,心脏病预测

下面对字段进行介绍:

age: 该朋友的年龄
sex: 该朋友的性别 (1 = 男性, 0 = 女性)
cp: 经历过的胸痛类型(值1:典型心绞痛,值2:非典型性心绞痛,值3:非心绞痛,值0:无症状)
trestbps: 该朋友的静息血压(入院时的毫米汞柱)
chol: 该朋友的胆固醇测量值,单位 :mg/dl
fbs: 人的空腹血糖(> 120 mg/dl,1=真;0=假)
restecg: 静息心电图测量(0=正常,1=患有ST-T波异常,2=根据Estes的标准显示可能或确定的左心室肥大)
thalach: 这朋友达到的最大心率
exang: 运动引起的心绞痛(1=有过;0=没有)
oldpeak: ST抑制,由运动引起的相对于休息引起的
slope: 最高运动ST段的斜率(值0:上坡,值1:平坦,值2:下坡)
ca: 萤光显色的主要血管数目(0-4)
thal: 一种称为地中海贫血的血液疾病(1=正常;2=固定缺陷;3=可逆缺陷)
target: 心脏病(0=否,1=是)

这份数据集里面记录的都是生理的特征及指标,我们可以根据这些特征,来反向关注生活习惯。比如胆固醇,蛋黄、猪肝都是引起胆固醇过高的食物。

下面就是数据预处理步骤了

首先对数据进行一个描述

data.info()

python数据分析案例,心脏病预测

通过描述我们发现数据并没有缺失,因此我们不需要做缺失值处理。每个字段有303个数据。

对数据进行一个统计描述:

data.describe()

python数据分析案例,心脏病预测

数据分析

我们对患病、未患病,男性、女性占比进行了一个分析:

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

python数据分析案例,心脏病预测

得出患心脏病的人数为138,未患心脏病人数为165,女性人数为96,男性人数为207,为了看得更加直观,我画了两个饼图,使用的是matplotlib+seaborn。

import matplotlib.pyplot as plt

import seaborn as sns

%matplotlib inline

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

#创建一个画布
fig = plt.figure(figsize=(6,6))

a = [138, 165]
b = [207, 96]

label1 = ['没患病人数','患病人数']
label2 = ['男性','女性']

#间隔
explode=(0,0.1)

#颜色
colors = ['#6c5ce7','#81ecec']

plt.pie(a,labels=label1, explode=explode ,colors=colors, autopct='%1.1f%%',shadow=False,startangle=150)
plt.show()

python数据分析案例,心脏病预测
fig = plt.figure(figsize=(6,6))

plt.pie(b,labels=label2,explode=explode ,colors=colors, autopct='%1.1f%%',shadow=False,startangle=150)

plt.show()

python数据分析案例,心脏病预测

心脏病数据各字段的相关性

plt.figure(figsize = (12,10))

sns.heatmap(data.corr(), annot =True)

plt.show()

python数据分析案例,心脏病预测

从上面的图形中我们可以发现,slope与oldpeak呈高度负相关(0.58)。这意味着如果坡度值增加,旧峰值将减少,反之亦然。Target与cp(胸痛)呈正相关最高,为0.43,其次是thalach(心率),为0.42,然后是slope(最高运动ST段的斜率),为0.35.

查看各个字段的数据分布情况

data.hist(figsize=(20,16))

plt.show()

python数据分析案例,心脏病预测

观察上面图形,我们发现年龄分布主要在40~70岁之间。。。

患心脏病随年龄分布图

pd.crosstab(data.age,data.target).plot(kind="bar",figsize=(25,8))

plt.title('患病变化随年龄分布图')

plt.xlabel('岁数')

plt.ylabel('人数')

plt.show()

python数据分析案例,心脏病预测

其他字段与患心脏病分布图

plt.figure(figsize=(20,15))

sns.set_theme(style='dark')

plt.subplot(3,3,1)
sns.countplot(data=data,x='sex',hue='target')

plt.subplot(3,3,2)
sns.countplot(data=data,x='cp',hue='target')

plt.subplot(3,3,3)
sns.countplot(data=data,x='fbs',hue='target')

plt.subplot(3,3,4)
sns.countplot(data=data,x='restecg',hue='target')

plt.subplot(3,3,5)
sns.countplot(data=data,x='exang',hue='target')

plt.subplot(3,3,6)
sns.countplot(data=data,x='slope',hue='target')

plt.subplot(3,3,7)
sns.countplot(data=data,x='ca',hue='target')

plt.subplot(3,3,8)
sns.countplot(data=data,x='thal',hue='target')

plt.show()

python数据分析案例,心脏病预测

年龄-心率-患病三者关系

散点图

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='blue')

plt.legend(["患病", "未患病"])

plt.xlabel("年龄")

plt.ylabel("最大心率")

plt.show()

python数据分析案例,心脏病预测

血压-患病关系

画个提琴图

sns.violinplot(x=data.target,y=data.trestbps,data=data)

plt.show()

python数据分析案例,心脏病预测

运动引起的心绞痛-心率-患病关系

sns.swarmplot(x='exang', y='thalach', hue='target', data=data, size=6)

plt.xlabel('有无运动引起的心绞痛')

plt.show()

python数据分析案例,心脏病预测

大血管数量ca-血压trestbps-患病关系

plt.figure(figsize=(15,7))

sns.swarmplot(x='ca', y='trestbps', hue='target', data=data, size=5)

plt.xlabel('大血管数量')

plt.ylabel('血压')

plt.show()

python数据分析案例,心脏病预测

大血管数量ca-年龄age-患病关系

plt.figure(figsize=(15,8))

sns.swarmplot(x='ca', y='age', hue='target', data=data, size=6)

plt.xlabel('大血管数量')

plt.ylabel('年龄')

plt.show()

python数据分析案例,心脏病预测

年龄age-胆固醇chol-患病关系

plt.figure(figsize=(10,5))

plt.scatter(x=data.age[data.target==1], y=data.chol[data.target==1], c="blue")

plt.scatter(x=data.age[data.target==0], y=data.chol[data.target==0], c="orange")

plt.legend(["患病",'未患病'])

plt.xlabel('年龄')

plt.ylabel('胆固醇')

plt.show()

python数据分析案例,心脏病预测

以上就是数据分析过程

接下来将用机器学习算法建立模型进行预测

模型预测

#目标值和特征值
x = data.drop(['target'], axis=1)
y = data['target']

#导入库
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

#划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=20)

#特征预处理
sc = StandardScaler()

#标准化
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)

决策树

#导入相关库
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

classifier = DecisionTreeClassifier(criterion="gini") #CART算法
classifier.fit(x_train,y_train.ravel())

y_pred1 = classifier.predict(x_test)

计算准确率
score1 = classifier.score(x_test, y_test)
print("准确率为:\n", score1)

#查看精确率、召回率、F1-score
report1 = classification_report(y_test, y_pred1, labels=[0,1], target_names=['Not sick','sick'])
print(report1)

python数据分析案例,心脏病预测

KNN

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=2)
knn.fit(x_train, y_train)
y_pred2 = knn.predict(x_test)

#计算准确率
score2 = knn.score(x_test, y_test)
print("准确率为:", score2)

#查看精确率、召回率、F1-score
report2 = classification_report(y_test, y_pred2, labels=[0,1], target_names=['Not sick','sick'])
print(report2)

python数据分析案例,心脏病预测

朴素贝叶斯

from sklearn.naive_bayes import GaussianNB

bayesmodel = GaussianNB()
bayesmodel.fit(x_train, y_train)
y_pred3 = bayesmodel.predict(x_test)

计算准确率
score3 = bayesmodel.score(x_test, y_test)
print("准确率为:\n", score3)

#查看精确率、召回率、F1-score
report3 = classification_report(y_test, y_pred3, labels=[0,1], target_names=['Not sick','sick'])
print(report3)

python数据分析案例,心脏病预测

随机森林

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=200)
rfc.fit(x_train, y_train)
y_pred4 = rfc.predict(x_test)

计算准确率
score4 = rfc.score(x_test, y_test)
print("准确率为:\n", score4)

#查看精确率、召回率、F1-score
report4 = classification_report(y_test, y_pred4, labels=[0,1], target_names=['Not sick','sick'])
print(report4)

python数据分析案例,心脏病预测

比较模型好坏

model = ['决策树','knn','朴素贝叶斯','随机森林']
score = [score1, score2, score3, score4]

plt.figure(figsize = (15, 10))
sns.barplot(x = score, y = model)
plt.show()

python数据分析案例,心脏病预测

以上就是我做的一些数据分析,由于数据只有303条,数据量比较少,所以不能根据以上分析就一概而论,必须要经过大量的数据才能具有代表性。大家可以在后面的模型建立、划分数据集以及数据标准化处理时,调一下参数,可能模型的准确率会更高一点。

谢谢大家观看!希望能跟大家一起学习数据分析!

Original: https://blog.csdn.net/m0_46457745/article/details/118499409
Author: 星之鱼
Title: python数据分析案例,心脏病预测

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/696093/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球