在您阅读这篇文章之前,您需要先了解以下内容:
如果您使用Python相关的技术进行机器学习,那么这篇文章很适合您。这篇文章即是介绍pandas这个python库在数据分析方面的应用。
在这篇文章中,您将会学习到pandas的一些使用技巧。通过这些技巧,您可以更加简便快速地处理数据,同时也会提高您对数据的理解。
数据分析即是从您的数据中发掘并解决问题。
作为一名机器学习从业者,也许您并没有真正理解您所从事的领域,那么您需要一个这方面的专家随时在身边,但通常来说这不太可能。
当您将通过分析标准机器学习数据集,接受咨询或参与机器学习竞赛时,这些方法也同样适用。
您需要通过数据发掘更有价值的问题,或者您需要更好地了解您拥有的数据时,您可以通过汇总和可视化您的数据来做到这一点。
Pandas这个Python库是专为数据分析设计的,使用它你可以快速地对数据进行处理。如果你用过R语言或其他技术进行过数据分析,那么你会感觉pandas的使用简单而熟悉。
通常Pandas似乎仅被用于数据预处理,但其实它也是非常优秀的数据分析工具,其在statsmodels包中提供了各类标准统计方法的封装,并且在matplotlib中提供了相应的绘图方法。
首先,我们需要一个数据集,这个数据集将被用于练习使用pandas进行数据分析。
UIC机器学习知识库提供了大量不同标准的机器学习数据集,您可以通过在这些数据集上进行的练习来学习和应用机器学习。其中我最喜欢的一个数据集是印第安人糖尿病数据集。
该数据集通过秘鲁印第安女性的医疗记录数据展示了糖尿病的发病情况。您可以在这里了解有关此数据集的更多信息,这里可以下载该数据集的CSV文件pima-indians-diabetes.data。
首先,我们将从理解我们所使用的数据集组成开始。
首先将CSV文件中的数据作为DataFrame(pandas所生成的数据结构)加载到内存中,并且在加载时设置每一列的名称:
import pandas as pd
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pd.read_csv('pima-indians-diabetes.data', names=names)
在这里可以了解更多的有关pandas读取和输出功能的使用和read_csv方法的更多信息。
我们现在可以看看数据的整体情况:
可以直接通过print来查看前60行数据
print(data)
我们可以看到,所有的数据都是numeric类型的,而最后一列的类别(class)值即是我们要预测的因变量。
在数据转换结束时,我们可以看到数据框本身的描述为768行和9列,所以现在我们已经了解了我们的数据的整体情况。
接下来,我们可以通过查看汇总统计来了解数据集每个属性的分布情况。
print(data.describe())
这将显示我们data frame中各个属性的详细信息表,具体来说包含:数量,平均数,标准差,最小值,最大值,排序后位于25%的值、位于50%的值(中位数)以及位于75%的值。
通过查看这些统计数据,我们可以注意到一些有趣的信息:如平均怀孕次数为3.8次、最小年龄为21岁、有些人的体重指数为0,但这是显然是不可能的,因此某些属性值应标记为缺失。
可以在这里详细了解对DataFrame的描述操作。
图表更能说明数据集各属性的分布及相互之间的关系。
然而,重要的是要花时间先查看统计数据,每次查看以不同方式统计的数据时,您都注意到数据不同的特征,并可能对问题有更多样的见解。
Pandas使用matplotlib来创建图表,matplotlib也提供了很多方便的功能,您可以在这里了解Pandas更多关于数据可视化的知识。
第一个易于审查的特征是各属性的分布。
我们可以通过箱线图(boxplot)来了解每个属性的分布:
import matplotlib.pyplot as plt
pd.options.display.mpl_style = 'default'
data.boxplot()
上面这段代码将绘制图形的样式(通过matplotlib)更改为默认样式,这样图像显示效果更好:
我们可以看到,在上图中test属性有很多异常值。同样也可以看到,plas属性似乎有一个相对均匀的正态分布。我们还可以通过将各值进行离散化处理,处理后可以将各“容器(bucket)”中属性的频率作为直方图(hist)来查看:
data.hist()
这可以让您注意各属性有趣的分布特征,例如pres和skin等属性近似于正态分布:
您可以在这里查看关于boxplot方法和hist方法的更多信息。
下一个要探讨的重要内容是各属性的分类聚合。
其中一种方法是对每个各属性在数据上的特征进行分类,并对每一分类的进行不同的标记。您可以生成属性的直方图矩阵和按class分类后每一类值的直方图矩阵,如下所示:
data.groupby('class').hist()
数据按class属性分组,然后为每个组中的属性创建直方图矩阵,结果是两个图像:
这有助于指出诸如plas属性的class之间的分布差异。
您可以更好地比较同一图表上每个类的属性值
data.groupby('class').plas.hist(alpha=0.4)
这个数据按class属性分组,并且仅绘制了plas属性的直方图,其中红色的分类值为0,蓝色的分类值为1。如图你可以看到一个类似正态分布的图形,这个用法会有助于区分每一类。
您可以在这里阅读DataFrame上有关groupby函数的更多信息。
最后要探讨的重要关系是属性之间的关系。
我们可以通过查看每对属性的交互分布来回顾属性之间的关系:
from pandas.tools.plotting import scatter_matrix
scatter_matrix(data, alpha=0.2, figsize=(6, 6), diagonal='kde')
这使用一个构造函数来创建属性与属性之间的散点图矩阵。每个属性将对其自身绘制的对角线显示该属性的核密度估计:
这是一个强大的功能,从中可以得出很多有关数据分析的启发。例如,我们可以看到age属性与preg之间可能存在的相关性,以及skin属性与mass属性之间的可能存在的关系。
在这篇文章中我们已经涵盖了使用pandas进行数据分析的很多地方。
首先,我们着眼于如何快速而简便地载入CSV格式的数据,并使用汇总统计来描述它。
接下来,我们研究使用了各种不同的方法来进行数据可视化,通过可视化图标我们发掘了数据中的更多有趣的信息,并且研究了数据在箱线图和直方图中的分布。之后我们研究了与属性与分类的关系及分布,最后讨论了成对属性的散点图中各属性之间的关系。