Python数据分析入门
最近,Analysis with Programming加入了Planet Python。作为该网站的首批特约博客,我这里来分享一下如何通过Python来开始数据分析。具体内容如下:
- 数据导入
- 导入本地的或者web端的CSV文件;
- 数据变换;
- 数据统计描述;
- 假设检验
- 单样本t检验;
- 可视化;
- 创建自定义函数。
数据导入
这是很关键的一步,为了后续的分析我们首先需要导入数据。通常来说,数据是CSV格式,就算不是,至少也可以转换成CSV格式。在Python中,我们的操作如下:
1 2 3 4 5 6 7 8 |
|
为了读取本地CSV文件,我们需要pandas这个数据分析库中的相应模块。其中的read_csv函数能够读取本地和web数据。
数据变换
既然在工作空间有了数据,接下来就是数据变换。统计学家和科学家们通常会在这一步移除分析中的非必要数据。我们先看看数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
对R语言程序员来说,上述操作等价于通过print(head(df))来打印数据的前6行,以及通过print(tail(df))来打印数据的后6行。当然Python中,默认打印是5行,而R则是6行。因此R的代码head(df, n = 10),在Python中就是df.head(n = 10),打印数据尾部也是同样道理。
在R语言中,数据列和行的名字通过colnames和rownames来分别进行提取。在Python中,我们则使用columns和index属性来提取,如下:
1 2 3 4 5 6 7 8 9 10 11 |
|
数据转置使用T方法,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
其他变换,例如排序就是用sort属性。现在我们提取特定的某列数据。Python中,可以使用iloc或者ix属性。但是我更喜欢用ix,因为它更稳定一些。假设我们需数据第一列的前5行,我们有:
1 2 3 4 5 6 7 8 9 |
|
顺便提一下,Python的索引是从0开始而非1。为了取出从11到20行的前3列数据,我们有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
上述命令相当于df.ix[10:20, [‘Abra‘, ‘Apayao‘, ‘Benguet‘]]
。
为了舍弃数据中的列,这里是列1(Apayao)和列2(Benguet),我们使用drop属性,如下:
1 2 3 4 5 6 7 8 9 |
|
axis
参数告诉函数到底舍弃列还是行。如果axis
等于0,那么就舍弃行。
统计描述
下一步就是通过describe
属性,对数据的统计特性进行描述:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
假设检验
Python有一个很好的统计推断包。那就是scipy里面的stats。ttest_1samp实现了单样本t检验。因此,如果我们想检验数据Abra列的稻谷产量均值,通过零假设,这里我们假定总体稻谷产量均值为15000,我们有:
1 2 3 4 5 6 7 |
|
返回下述值组成的元祖:
- t : 浮点或数组类型
t统计量 - prob : 浮点或数组类型
two-tailed p-value 双侧概率值
通过上面的输出,看到p值是0.267远大于α等于0.05,因此没有充分的证据说平均稻谷产量不是150000。将这个检验应用到所有的变量,同样假设均值为15000,我们有:
1 2 3 4 5 6 |
|
第一个数组是t统计量,第二个数组则是相应的p值。
可视化
Python中有许多可视化模块,最流行的当属matpalotlib库。稍加提及,我们也可选择bokeh和seaborn模块。之前的博文中,我已经说明了matplotlib库中的盒须图模块功能。
1 2 3 |
|
现在,我们可以用pandas模块中集成R的ggplot主题来美化图表。要使用ggplot,我们只需要在上述代码中多加一行,
1 2 3 |
|
这样我们就得到如下图表:
比matplotlib.pyplot主题简洁太多。但是在本博文中,我更愿意引入seaborn模块,该模块是一个统计数据可视化库。因此我们有:
1 2 3 4 |
|
多性感的盒式图,继续往下看。
1 |
|
1 |
|
1 2 |
|
1 |
|
创建自定义函数
在Python中,我们使用def函数来实现一个自定义函数。例如,如果我们要定义一个两数相加的函数,如下即可:
1 2 3 4 5 6 7 |
|
顺便说一下,Python中的缩进是很重要的。通过缩进来定义函数作用域,就像在R语言中使用大括号{…}一样。这有一个我们之前博文的例子:
- 产生10个正态分布样本,其中和
- 基于95%的置信度,计算 和 ;
- 重复100次; 然后
- 计算出置信区间包含真实均值的百分比
Python中,程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
上述代码读起来很简单,但是循环的时候就很慢了。下面针对上述代码进行了改进,这多亏了 Python专家,看我上篇博文的15条意见吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
更新
那些对于本文ipython notebook版本感兴趣的,请点击这里。这篇文章由Nuttens Claude负责转换成 ipython notebook 。