资源行业动态探索性数据分析实例

探索性数据分析实例

2019-10-16 | |  223 |   0

原标题:探索性数据分析实例      来源:AI研习社     

链接:https://www.yanxishe.com/TextTranslation/1919


什么是探索性数据分析


探索性数据分析(EDA)是一种分析数据集并总结出主要特征的方法,经常会用到数据可视化。它比正常的模型或假设的测试任务更有助于我们理解数据。


使用多种数据探索性分析方法是一个好主意,而且他们也可以用来做数据对比。探索性数据分析的目标是在引入机器学习算法之前充分的了解数据。另一个好处是,可能你已经选定了一些特征变量准备用来做机器学习,EDA能帮你确定应该选哪些维度的变量。

1562743046939227.png


为什么使用探索性数据分析


有些数据科学家急着开始进入机器学习的阶段,而完全跳过了EDA处理,或者简单做一下。这种错误的做法有很多潜在的缺陷。比如生成了不准确的模型、生成的模型准确但是用了错误的数据、没有准备正确的变量类型、使用资源的效率不高等。因为可能你是在生成模型之后才意识到数据是不对的,或者有异常值,或者有缺失数据,或者有些数据前后矛盾。


这篇文章中,我们用到了哈伯曼癌症幸存者数据集,使用python演示探索性数据分析的方法。你可以从Kaggle上下载这个数据集:

https://www.kaggle.com/gilsousa/habermans-survival-data-set


EDA在哈伯曼癌症幸存者数据集上的表现


1、了解数据集

    标题:哈德曼幸存者数据

    描述:数据集包括了1958年到1970年间,芝加哥大学的Billings医院主导的一项研究的所有病例。这些病例是那些经历过乳癌手术并且存活下来的病人的。

    属性信息:

    患者做手术的时候的年龄(数值型)

    患者做手术的年份(年份-1900,数值型)

    检查出来的阳性腋窝结(positive axillary nodes)的数量(数值型)

    生存状态(类别属性):

    1 = 患者活了五年或更长

    2 = 患者在五年内死亡

2、导入库并加载文件

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

#reading the csv file
haber = pd.read_csv(“haberman_dataset.csv”)


3、查看了解数据

#Prints the first 5 entries from the csv file
haber.head()

    输出:

5d4154d175af2.png

#prints the number of rows and number of columns
haber.shape

输出:(306,  4)


观察:

1、CSV文件包括306行和4列

#printing the columns
haber.columns

    输出:Index([‘age’, ‘year’, ‘nodes’, ‘status’], dtype=’object’)

print(haber.info())
#brief info about the dataset

    输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 306 entries, 0 to 305
Data columns (total 4 columns):
age       306 non-null int64
year      306 non-null int64
nodes     306 non-null int64
status    306 non-null int64
dtypes: int64(4)
memory usage: 9.6 KB

    观察:

    1、在这个数据集中没有缺失的值

    2、所有的列都是整数数据类型

    3、状态的数据类型是整型,它必须被转换成一种明确(categorical)的数据类型

    4、在状态列,值1应该被映射为“yes”,那意味着病人活下来了或者获得更久。值2应该被映射为“no”,那意味着病人在五年内去世。

haber[‘status’] = haber[‘status’].map({1:’Yes’, 2:’No’})
haber.head()
#mapping the values of 1 and 2 to yes and no respectively and #printing the first 5 records from the dataset.

    输出:

5d415722e6de6.png

观察:

    1、Count:每列的值的总数量展示在各自的列中

    2、Mean:每列的平均值展示在各自的列中

    3、Std:每列值的标准差(Standard Deviation)展示在各自的列中

    4、Min:列中的最小值

    5、25%:给出第25百分位数

    6、50%:给出第50百分位数

    7、75%:给出第75百分位数

    8、Max:列中的最大值

haber[“status”].value_counts()
#gives each count of the status type

    输出:

Yes 225
No 81
Name: status, dtype: int64

观察:

    1、函数 value_counts()  表示了每个类有多少个数据点被展示出来了。这里,它表示了有多少例病人存活下来了和有多少例并没有存活下来。

    2、总共306例病人,225例病人存活,81例病人没有。

    3、数据集并不均衡。

status_yes = haber[haber[‘status’]==’Yes’]
status_yes.describe()
#status_yes dataframe stores all the records where status is yes

 输出:

5d4159d9e326c.png


status_no = haber[haber[‘status’]==’No’]
status_no.describe()
#status_no dataframe stores all the records where status is no

5d415a05c0eb1.png

观察:

    1、平均年龄和患者做手术的平均年份在这两类里面非常相近,但是平均结节的数量在这两类里面却相差了大概5个单位。

    2、幸存患者的结节数量要小于那些未幸存的患者的数量。


4、单变量分析


单变量分析的主要目的是描述、总结、寻找单一特征的模式。


4.2 概率密度函数

概率密度函数是用来计算变量取某一个值的概率大小。

下图柱状图的高度表示了数据点在相应分组中所占的百分比。

sns.FacetGrid(haber,hue=’status’,height = 5)
.map(sns.distplot,”age”)
. add_legend();
plt.show()


输出:

1562743044759794.png

年龄变量的概率密度函数


观察:

1、两种分类的柱状图重叠是可以看出来的,它可以告诉我们生存几率与患者的年龄无关;

2、尽管我们能够看到年龄在30-40岁之间更有可能生存下来,40-60岁之间生存几率较小,年龄在60-75岁之间有着相同的生存几率;

3、但是,这并不是我们最后的结论,我们没办法仅仅通过年龄这一个因素就能够决定患者的生存几率;

sns.FacetGrid(haber,hue=’status’,height = 5)
.map(sns.distplot,”year”)
. add_legend();
plt.show()

输出:

1562743044237649.png

观察:

1、先看看重叠部分,这张图仅仅告诉我们有多少手术是成功的,多少手术是失败的,这并不能成为一个因素作为决定患者的生存几率;

2、但是,我们能够观察到1960年到1965年,有很多不成功的手术;

sns.FacetGrid(haber,hue=’status’,height = 5)
.map(sns.distplot,”nodes”)
. add_legend();
plt.show()

输出:

1562743045114675.png

观察:

1、没有阳性腋窝结或者只有一个的生存几率更大,如果数量超过25将生存几率非常小。


4.2、累计分布函数


累计分布函数是至变量取小于等于x值的概率。

ounts1, bin_edges1 = np.histogram(status_yes['nodes'], bins=10, density = True)
pdf1 = counts1/(sum(counts1))
print(pdf1);
print(bin_edges1)
cdf1 = np.cumsum(pdf1)
plt.plot(bin_edges1[1:], pdf1)
plt.plot(bin_edges1[1:], cdf1, label = 'Yes')
plt.xlabel('nodes')

print("***********************************************************")
counts2, bin_edges2 = np.histogram(status_no['nodes'], bins=10, density = True)
pdf2 = counts2/(sum(counts2))
print(pdf2);
print(bin_edges2)
cdf2 = np.cumsum(pdf2)
plt.plot(bin_edges2[1:], pdf2)
plt.plot(bin_edges2[1:], cdf2, label = 'No')
plt.xlabel('nodes')

plt.legend()
plt.show()


输出:

[0.83555556 0.08 0.02222222 0.02666667 0.01777778 0.00444444 0.00888889 0. 0. 0.00444444][ 0. 4.6 9.2 13.8 18.4 23. 27.6 32.2 36.8 41.4 46. ] *************************************************************[0.56790123 0.14814815 0.13580247 0.04938272 0.07407407 0. 0.01234568 0. 0. 0.01234568][ 0. 5.2 10.4 15.6 20.8 26. 31.2 36.4 41.6 46.8 52. ]

1562743045383505.png

观察:

1、有阳性结0-4.6个的的患者,83.55%生存下来。


4.3 箱型图和小提琴图


箱型图是从四分数从低到高的延伸,中间一条线是中位数。上下延伸的细线是显示数据的范围。异常值指的就是超出数值范围的点。

小提琴图融合了箱型图以及概率密度函数。

sns.boxplot(x='status',y='age',data=haber)
plt.show()

sns.boxplot(x='status',y='year',data=haber)
plt.show()

sns.boxplot(x='status',y='nodes',data=haber)
plt.show()

1562743045910457.jpg

sns.violinplot(x=”status”,y=”age”,data = haber,height = 10)
plt.show()

sns.violinplot(x=”status”,y=”year”,data = haber,height = 10)
plt.show()

sns.violinplot(x=”status”,y=”nodes”,data = haber,height = 10)
plt.show()

输出:

1562743045961113.jpg

观察:

1、超过一个阳性节点的患者生存几率很小;

2、大部分生存下来的患者都没有阳性节点。没有阳性节点的患者手术五年内手术后死亡几率很小,因此没有阳性节点也不能说就一定能够保证存活;

3、对比显示,在1965年手术的患者,多数没有活过5年;

4、对比显示,在45-65分组多数患者死亡,年龄作为一个单独因素不是一个重要特征在决定患者生存方面;

5、箱型图和小提琴图在年龄和手术年份上有着相似的结果,阳性节点的箱型图和小提琴几乎没有可对比的地方,但是重叠依然存在,因为设定一个阈值来对两类患者分类是困难的。


5、二元变量分析


5.1 散点图

散点图是二维数据可视化,用点来展示从两个不同变量获取的值。一个沿着x轴进行画图,一个沿着y轴。

sns.set_style(“whitegrid”)
sns.FacetGrid(haber, hue = “status” , height = 6)
.map(plt.scatter,”age”,”year”)
.add_legend()
plt.show()

输出

1562743046782338.png

观察:

1、有0个阳性节点的患者更有可能生存,与年龄无关;

2、超过25个阳性节点的患者几乎无法生存;

3、患者年龄超过50并且超过10个阳性节点,几乎无法生存;


5.2 散点图矩阵

这个函数会创建一个坐标轴矩阵,数据中的每个变量都会通过x和y轴来展示,对角线上的图是不同的变量分布图。

sns.set_style(“whitegrid”)
sns.pairplot(haber, hue=”status”, height = 5)
plt.show()

1571247985959979.png

观察:

1、这张图画的是手术年份和阳性结,对比效果还不错。我


6、等高线分析


6.1、等高线图

等高线图或者两个变量的等值函数,是一条有着恒定值的函数凸显,它是三维图形的交叉区域。

sns.set_style(“whitegrid”)
sns.pairplot(haber, hue=”status”, height = 5)
plt.show()

输出:

1562743047782408.png

观察:

1、从1960年到1964年,45岁到55岁的患者,很多都做了手术;


结论

1、患者的年龄和手术年份都不能决定患者的生存几率,但是小于35岁的患者有着更高的生存几率;

2、生存几率与阳性腋窝节点个数是呈负相关的,但是我们也可以看到没有阳性腋窝节点的患者也并不可以一直安全生存;

3、当数据不平衡的时候,基于所给的特征对一个新的患者生存状态分类是一个困难的任务。


发起:唐里 校对:酱番梨 审核:唐里

参与翻译(3人):黄闯、水中的没文化、david95

英文原文:Exploratory Data Analysis: Haberman’s Cancer Survival Dataset

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:2019全球智能驾驶峰会

下一篇:Jupyter Notebooks中的动态交互控制

用户评价
全部评价

热门资源

  • 国内人才报告:机...

    近日,BOSS 直聘职业科学实验室 &BOSS 直聘研究院...

  • AI使物联网更智能...

    看到微软对物联网和人工智能的结合感兴趣是一个明...

  • 推荐一批学习自然...

    这里推荐一批学习自然语言处理相关的书籍,当然,...

  • 安防智能化大势下...

    大部分传统安防设备不仅拍摄视野有限,而且无法事...

  • 20亿创业基金、10...

    近日,杭州举办了建设国家新一代人工智能创新发展...