Advertisement

心脏病预测分析

阅读量:

数据来源:kaggle

编译器:pycharm

心脏疾病多见于人群中的一个类别,在循环系统中是一种较为常见的病症。心血管疾病因其致命性而被称为最严重的公共健康威胁,在全球范围内被视为必须采取早期干预措施的主要原因之一。通过数据挖掘技术识别出其中存在的某种模式,并用于预防心血管疾病的进一步发展。

目录

数据初步分析

导入数据

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

性别和患病的关系

患心脏病随年龄分布图

血压-患病关系

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

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

模型预测

数据预处理

KNN

朴素贝叶斯

决策树

模型评估


导入数据

复制代码
 import pandas as pd

    
 data = pd.read_csv('/Users/cengmeili/Documents/简历/项目资料/python数据分析案例,心脏病预测/heart.csv')
    
 print(data.head())
    
 print(data.info())
    
    
    
    
    代码解读

可以看到数据基本情况的统计:

对医疗数据字段进行介绍
age: 友情卡持人年龄信息
sex: 性别信息(男=1、女=0)
cp: 胸痛类型(1:典型心绞痛;2:非典型性心绞痛;3:非冠状动脉痉挛性疼痛;0:无症状)
trestbps: 静息时的心血管压力水平(以毫米汞柱为单位记录)
chol: 血脂检测结果(mg/dl单位)
fbs: 空腹血糖水平(> 120 mg/dl为异常情况)
restecg: 心电图静息状态下的电活动特征(数值含义同前)
thalach: 心跳频率上限值
exang: 运动诱发的心绞痛发生情况记录
oldpeak: ST段压低幅度变化值
slope: 最高运动ST段下降速率斜率值
ca: 主要冠状动脉病变数量评估结果
thal: 血液系统疾病谱评分结果(正常=1;固定缺陷=2;可逆缺陷=3)
target: 心脏疾病诊断结果(无病=0;有病=1)

对数据进行统计:

复制代码
    print(data.describe())
    
    代码解读

数据初步分析

复制代码
 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)))
    
    
    
    
    代码解读

通过执行能够呈现预期的结果;为了更清晰地展示该信息并便于分析解读,采用了matplotlib+seaborn技术进行可视化

复制代码
 # 设置中文字体

    
 zhfont1 = matplotlib.font_manager.FontProperties(fname="/Users/cengmeili/PycharmProjects/pythonProject4/配置文件/SourceHanSansSC-Bold.otf")
    
  
    
 plt.subplot(1, 2, 1)
    
 a = [138, 165]
    
 explode=(0,0.1)
    
 label1 = ['Not sick','be ill']
    
 plt.pie(a,labels=label1,explode=explode, autopct='%1.1f%%')
    
 plt.title("患病比例",fontproperties=zhfont1)
    
  
    
 plt.subplot(1, 2, 2)
    
 b = [207, 96]
    
 explode=(0,0.1)
    
 label2 = ['man','women']
    
 plt.pie(b,labels=label2,explode=explode, autopct='%1.1f%%')
    
 plt.title("男女患病比例",fontproperties=zhfont1)
    
 plt.show()
    
    
    
    
    代码解读

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

通过图形分析可知,slope与oldpeak之间存在显著的负相关关系(r=0.58)。这表明当slope数值上升时,oldpeak值会随之下降,并且反之亦然。在多个变量中 Target与cp(胸痛)之间的关联最为密切且呈正向关系(r=0.43),紧随其后的是thalach(心率)(r=0.42),最后是slope这一指标(r=0.35)。

性别和患病的关系

复制代码
 gender_dict = data['sex'].value_counts()

    
 plt.figure(figsize=(8, 6))
    
 plt.pie(gender_dict.values, labels=['man', 'women'], autopct="%0.2f%%", explode=(0, 0.05),  \
    
     shadow=False, pctdistance=0.8, \
    
     startangle=90, textprops={'fontsize': 16})
    
 plt.show()
    
    
    
    
    代码解读

可视化解读:从图中可以看出男性的患病率是大于女性的

患心脏病随年龄分布图

复制代码
 zhfont1 = matplotlib.font_manager.FontProperties(fname="/Users/cengmeili/PycharmProjects/pythonProject4/配置文件/SourceHanSansSC-Bold.otf")

    
 pd.crosstab(data.age, data.target).plot(kind="bar", figsize=(25, 8))
    
 plt.title('患病变化随年龄分布图',fontproperties=zhfont1)
    
 plt.xlabel('岁数',fontproperties=zhfont1)
    
 plt.ylabel('人数',fontproperties=zhfont1)
    
 plt.show()
    
    
    
    
    代码解读

血压-患病关系

复制代码
 # 画个提琴图

    
  
    
 sns.violinplot(x=data.target,y=data.trestbps,data=data)
    
  
    
 plt.show()
    
    
    
    
    代码解读

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

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

    
  
    
 plt.xlabel('有无运动引起的心绞痛')
    
  
    
 plt.show()
    
    
    
    
    代码解读

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

复制代码
 plt.figure(figsize=(15, 8))

    
  
    
 sns.swarmplot(x='ca', y='age', hue='target', data=data, size=6)
    
  
    
 plt.xlabel('大血管数量',fontproperties=zhfont1)
    
  
    
 plt.ylabel('年龄',fontproperties=zhfont1)
    
  
    
 plt.show()
    
    
    
    
    代码解读

模型预测

数据预处理

复制代码
 #目标值和特征值

    
 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)
    
  
    
 #特征预处理
    
 cc = StandardScaler()
    
  
    
 #标准化
    
 x_train = cc.fit_transform(x_train)
    
 x_test = cc.transform(x_test)
    
    
    
    
    代码解读

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)
    
    
    
    
    代码解读

朴素贝叶斯

复制代码
 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)
    
    
    
    
    代码解读

决策树

复制代码
 #导入相关库

    
 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)
    
    
    
    
    代码解读

随机森林

复制代码
 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)
    
    
    
    
    代码解读

模型评估

复制代码
 model = ['决策树','knn','朴素贝叶斯','随机森林']

    
 score = [score1, score2, score3, score4]
    
  
    
 plt.figure(figsize = (15, 10))
    
 sns.barplot(x = score, y = model)
    
 plt.show()
    
    
    
    
    代码解读

以下是改写后的文本内容

全部评论 (0)

还没有任何评论哟~