python案例数据集_python可视化学习实例——肝炎数据集(3)

在前面的文章中,我们对肝炎数据集进行了缺失值填充,同时采用决策树构建等方法进一步地对数据集进行研究。在这个过程中,我们也对数据集的数据结构和基本信息有了一定的了解。今天我们将继续对这个数据集进行研究学习。

主要内容:数据分析、可视化

先和还没有数据的同学分享一下数据:

链接:https://pan.baidu.com/s/15gdftmUHVbkh4dA79eNsjQ​pan.baidu.com

提取码:jmx7

下面开始我们的实例学习之路~

在进行实例操作之前,我们首先要明确我们的研究目的,由于是学习向,因此开始试验前我们先定几个研究方向:

(1)计算数据集中的 治愈/死亡 病例占比

(2)研究数据集中,“年龄”特征对肝炎是否存在影响

一、导入数据,并进行基本的数据预处理

(包括特征名修改,缺失值填充等,这里想了解更多的同学可以看我之前的文章,有详细讲述)侦探L:Pandas与机器学习实例——肝炎数据集(1)​zhuanlan.zhihu.com

import numpy as np

import pandas as pd

from sklearn.ensemble import RandomForestRegressor

df = pd.read_excel(r'C:\Users\Administrator\Desktop\data_feiyan.xlsx',encoding='utf-8')

df.replace('?',np.nan,inplace=True)

df.columns=['是否生还', '年龄', '性别', '类固醇', '抗病毒药','疲惫','不适','厌食','肝大','肝硬化','脾可触','蛛状','腹腔积水','静脉曲张','胆红素'

,'碱性磷酸酯','谷草转氨酶','血蛋白','凝血酶原时间','组织学']

df_mode=['类固醇','疲惫','不适','厌食','肝大','肝硬化','脾可触','蛛状','腹腔积水','静脉曲张']

for i in df_mode:

df.loc[:,i]=df.loc[:,i].fillna(df.loc[:,i].mode()[0])

df_mean=['胆红素','碱性磷酸酯','谷草转氨酶','血蛋白']

for i in df_mean:

df.loc[:,i]=df.loc[:,i].fillna(df.loc[:,i].mean())

df_full=df.drop(labels='凝血酶原时间',axis=1)

df_nan=df.loc[:,'凝血酶原时间']

Ytrain = df_nan[df_nan.notnull()]

Ytest = df_nan[df_nan.isnull()]

Xtrain = df_full.iloc[Ytrain.index]

Xtest = df_full.iloc[Ytest.index]

rfc = RandomForestRegressor(n_estimators=100)

rfc = rfc.fit(Xtrain, Ytrain)

Ypredict = rfc.predict(Xtest)

df_nan[df_nan.isnull()] = Ypredict

查看数据:

df.head()

df.shape

二、开始数据分析工作

先导入我们的绘图库:

from matplotlib import pyplot as plt

%matplotlib inline

import seaborn as sns

sns.set()

1、计算数据集中的 治愈/死亡 病例占比

(在“是否生还”这一列中,1代表死亡病例,2代表治愈病例。)

df_counts=df['是否生还'].replace([1,2],['死亡','治愈']).value_counts()

df_counts

可以看到,在155个患者样本中,治愈123人,病逝32人。

df['是否生还'].replace([1,2],['死亡','治愈']).value_counts(normalize=True)

利用标准化的方式计算出占比。

下面绘制饼状图:

explode = (0, 0.2) # 各类别的偏移半径

color = ['g', 'r']

labels =['治愈','死亡']

plt.pie(df_counts, colors=color, explode=explode,labels=labels,

shadow=True, autopct='%1.1f%%') #设置阴影,偏移度,颜色

# 饼状图呈正圆

plt.axis('equal')

plt.legend()

可以看到,我们的数据集里总共有155个病例。其中,治愈生还率为79.4%,死亡率为20.6%。

2、分析数据集中“年龄”特征与肝炎发病的关系病患者年龄的各项主要数据

死亡病例年龄的各项主要数据

病患者的年龄分布

死亡病例的年龄分布

(1)病患者年龄的各项主要数据:

df_age=df['年龄'].agg(['min','max','mean'])

df_age

可以看到,在数据集中,年龄最小的患者仅7岁,最大的为78岁,平均年龄为41岁。

(2)死亡病例年龄的各项主要数据:

df_age_dead = df[df['是否生还']==1]['年龄'].agg(['min','max','mean'])

df_age_dead

在死亡病例中,年龄最小的为30岁,最大的为70岁,平均年龄为47岁。

(3)病患者的年龄分布:

首先,使用 drop_duplicates()+nunique(),统计病患者的年龄具体有多少个不重复的值:

也就是说,病患者的年龄有49个不重复的值。

下面,我们利用上述得到的信息,作出病患者的年龄分布曲线。

import matplotlib

myfont = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')

plt.figure(figsize=(8,6),dpi=80,num=4)

x=range(1,50)

df_age=df['年龄'].sort_values().drop_duplicates()

plt.title('病患者的年龄分布曲线',FontProperties=myfont,fontsize=15)

plt.plot(x,df_age,color='yellow')

plt.ylabel('各个年龄值',FontProperties=myfont,fontsize=15)

plt.show()

可以看到,病患者的年龄分散在在20-70岁这个年龄段,且分布较为均匀。

下一步统计一下各个年龄段的患病人数:

在这里我们总共划分了四个年龄段,分别是:婴幼/少年/青少年时期:18岁以下

青年时期:18岁~45岁

中年时期:46~69岁

老年时期:70岁以上

接着,按照我们划分的年龄段,对数据进行划分:

a=0;b=0;c=0;d=0;

for i in df['年龄']:

if(i<18):

a+=1

elif(i>=18 and i<=45):

b+=1

elif (i>=46 and i<=69):

c+=1

else:

d+=1

print("婴/幼/少年患病:{}".format(a))

print("青年患病人数:{}".format(b))

print("中年患病人数:{}".format(c))

print("老年患病人数:{}".format(d))

接着绘制成饼图:

df_age_divi=[a,b,c,d]

df_age1=pd.Series(df_age_divi,index=['婴/幼/少年患病','青年患病人数','中年患病人数','老年患病人数'])

labels=['婴/幼/少年患病','青年患病人数','中年患病人数','老年患病人数']

plt.figure(figsize=(8,6),dpi=80,num=4)

explode = (0, 0.2, 0.1,0) # 各类别的偏移半径

color = ['g', 'r','b','y']

plt.pie(df_age1, colors=color, explode=explode,labels=labels,

shadow=True, autopct='%1.1f%%') #设置阴影,偏移度,颜色

# 饼状图呈正圆

plt.axis('equal')

plt.legend()

plt.show()

从上图可以看到,在我们的数据集中,中、青年患者占了绝大部分。

(4)死亡病例的年龄分布

df_dead = df[df['是否生还']==1]['年龄']

a1=0;b1=0;c1=0;d1=0;

for i in df_dead:

if(i<18):

a1+=1

elif(i>=18 and i<=45):

b1+=1

elif (i>=46 and i<=69):

c1+=1

else:

d1+=1

df_age_divi1=[a1,b1,c1,d1]

df_age2=pd.Series(df_age_divi1,index=['婴/幼/少年','青年','中年','老年'])

查看死亡病例的年龄分布:

print("婴/幼/少年:{}".format(a1))

print("青年 :{}".format(b1))

print("中年 :{}".format(c1))

print("老年 :{}".format(d1))

绘制水平柱形图:

index=['婴/幼/少年','青年','中年','老年']

plt.xlabel('人数')

plt.barh(index,df_age2,color="#87CEFA")

进一步分析可知,

青年患者的治愈率约为:85%

中年患者的治愈率约为:68%

可以看到,在我们的数据集中,青年患者的治愈率明显高于中年患者(其他两个年龄段的数据量太少,因此不做分析)

以上便是的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值