您的位置:首页 > 编程语言 > Python开发

【R和Python对比】数据导入和初步整理

2017-07-11 11:03 120 查看
现在为止,大概用半年的时间了解R,包括基础的数据清洗和处理、统计分布、ggplot的画图、机器学习建模以及R的爬虫。可以说到现在为止,R已经成了数据分析不可或缺的工具,并且确实提高了效率和扩展了数据分析的广度。然而正如从小白的excel到excel函数到vba到R的进化一样,尽管电脑的12G内存可以处理千万级数据,正如excel和R的比较:excel只能处理统计性数据,但是R除了可以直接处理数据以外,还可以爬取数据,建模等一系列工作,并且可以修改本地的文件等等,但是还不够,因为python的扩展性更强,可以囊括爬虫、网络后台、数据科学、作图(好像一直是python的弱项?)等一系列功能。

扫过一眼《利用python进行数据分析》,里面讲的应用pandas和numpy包进行数据处理和清洗,但是怎么也看不进去,究其原因是这本书不太适合我;如果我没有学过R,这本书是一本非常好的入门教材,然而对于学习过其他语言的(SPSS/SAS/R)的人来说,基本上有一套数据分析的思路和流程,反而类比来看效果会更好;未来希望可以对比着研究R和python的关系和语法区别,希望三个月内,python可以用的像R一样熟练。

简单来说,数据分析步骤就是:

提取–清洗–探索–挖掘

先说提取数据,这部分主要针对研究的方面,进行数据的提取,提取包含从服务器中进行数据的初步提取,也就是SQL的提取;或者从网络上提取,也就是R的curl或py的scrapy;如果单机版玩家,拿到的数据就是自己推给自己的csv文件,也就有了数据分析的基础。

数据清洗:数据清洗这块是数据分析软件的强项,也是最难的地方之一;数据有不同维度,需要通过各种方式进行整合,判断;需要增添数据,或者去除异常值,或者从数据中提取少量进行分割

数据探索:数据探索是拿到这个数据最后想形成什么样预设结论,方法包括描述性统计、探索性画图找规律,做一些简单的假设检验等等,这块属于浅尝辄止:通过广撒网,确定几个深入研究的方向

最后就是数据挖掘,通过探索判定几个方向,后续可以利用各类建模的方式进行后续数据的预测和分析,或者继续探索数据异常的原因。

接下来就可以通过这些类比R和python了。

先说操作环境,R的Rstudio会对应python的pycharm,二者风格类似,可以无缝切换。

R一般会使用下面这两个函数进行包的安装和载入:

install.package('')
library()


由于我比较懒,一般都是到pycharm搜索包,然后直接安装,原生python可以用pip进行获取,然后载入包,比如pandas

from pandas import Series,DataFrame
import pandas as pd
import numpy as np


import函数=R的library,但是R有个缺点,很多包的函数相同的时候,会有一些函数被mask,也就是失效;而python这点算是个优点,比如:

import pandas as pd


以后很多pandas中的函数,都需要加上一个pd.xxx;除非在开头直接导入函数,比如导入了series和dataframe函数,可以不用前缀直接使用。

之前的R中的iris数据集我存到了csv文件中,需要读取,R中有

read.csv()


而python和这个类似:

import csv
iris=pd.read_csv('D:\\python study\\iris.csv')


read_csv函数前面就加了个pd前缀。

那么我们就导入了数据,但是查看数据的时候,我们不可能看数据的全集,太大了,需要看一下头几条,R中是

head(iris)


py中对应:

iris.head()


比如输入iris.head(),默认显示五条数据:

iris.head()
Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa


如果想多显示点,可以设定参数:

iris.head(10)
Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  s
4000
etosa
5           5.4          3.9           1.7          0.4  setosa
6           4.6          3.4           1.4          0.3  setosa
7           5.0          3.4           1.5          0.2  setosa
8           4.4          2.9           1.4          0.2  setosa
9           4.9          3.1           1.5          0.1  setosa


同时,有head就有tail:

iris.tail(10)
Sepal.Length  Sepal.Width  Petal.Length  Petal.Width    Species
140           6.7          3.1           5.6          2.4  virginica
141           6.9          3.1           5.1          2.3  virginica
142           5.8          2.7           5.1          1.9  virginica
143           6.8          3.2           5.9          2.3  virginica
144           6.7          3.3           5.7          2.5  virginica
145           6.7          3.0           5.2          2.3  virginica
146           6.3          2.5           5.0          1.9  virginica
147           6.5          3.0           5.2          2.0  virginica
148           6.2          3.4           5.4          2.3  virginica
149           5.9          3.0           5.1          1.8  virginica


head和tail是针对数据全局的观测,但是毕竟不是很全面,在R中一般会使用两个函数进行数据的整体情况观察:

summary()
str()


这两个函数的区别是summary偏向于对所有列的描述性统计,而str主要介绍每个列是什么,对应python的describe和info,比如:

iris.describe()
Sepal.Length  Sepal.Width  Petal.Length  Petal.Width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.057333      3.758000     1.199333
std        0.828066     0.435866      1.765298     0.762238
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000


describe可以看到不同列的各类分位数的情况,然后info:

iris.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
Sepal.Length    150 non-null float64
Sepal.Width     150 non-null float64
Petal.Length    150 non-null float64
Petal.Width     150 non-null float64
Species         150 non-null object
dtypes: float64(4), object(1)
memory usage: 5.3+ KB


info更偏向于每个列的属性是什么。

然而和R相比,我们的Species这一列,也就是因子这一列,是没有描述性统计的如果硬要统计下:

iris['Species'].describe()


顺便说一句,

iris['Species']


等同于R中的

iris$Species


回到describe,会出来

iris['Species'].describe()
count        150
unique         3
top       setosa
freq          50
Name: Species, dtype: object


也就是说,还是没有因子的分布,这块还是比较重要的,所以我们只能手工计算:

iris['Species'].value_counts() #模拟R的因子分布


得到:

setosa        50
versicolor    50
virginica     50
Name: Species, dtype: int64


一般在数据分析的时候会选择特定的行和列进行筛选或截取,在R中一般都是:

iris$Species #取Species列
iris[,5] #取第五列
iris[1:5,5] #取1:5行,第五列
iris[1:5,3:5] #取1:5行,3:5列


在py中一般应用iloc函数和loc函数,iloc里面需要有数字,而loc里面可以有具体的行列标,举个例子:

iris.iloc[:,4].head()
iris.loc[:,'Species'].head()


是一样的都是:

0    setosa
1    setosa
2    setosa
3    setosa
4    setosa
Name: Species, dtype: object


初次之外,如果想选择多列,R中是

iris[,c('Sepal.Length','Species')]


py中用大括号替代向量,为

iris.loc[:,{'Sepal.Length','Species'}].head()


结果为:

Sepal.Length Species
0           5.1  setosa
1           4.9  setosa
2           4.7  setosa
3           4.6  setosa
4           5.0  setosa


同样的,后面可以跟着描述性统计的各种值:

iris.iloc[:,1].mean()
iris.iloc[:,1].sum()
iris.iloc[:,1].var()
iris.iloc[:,1].median()
iris.iloc[:,1].max()
iris.iloc[:,1].min()
iris.iloc[:,1].value_counts()
iris.iloc[:,1].quantile(0.95) #pandas 95分位数


比如均值、求和、方差、中位数、分布,分位数等等;

最后就是移除NA,这个R中倒是比较复杂,一般是定位到NA这一行,或者用complete.cases()来判断,相比R,py简单的多:

首先创造一个NA值:

iris_na=iris.replace(1,np.nan).loc[20:25,:]


replace函数是替换,就是把1替换成nan:

iris_na
Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species
20           5.4          3.4           1.7          0.2  setosa
21           5.1          3.7           1.5          0.4  setosa
22           4.6          3.6           NaN          0.2  setosa
23           5.1          3.3           1.7          0.5  setosa
24           4.8          3.4           1.9          0.2  setosa
25           5.0          3.0           1.6          0.2  setosa


截取了一部分数据作为base数据集,然后一般情况下是去除这一行:

iris_na.dropna()


Sepal.Length  Sepal.Width  Petal.Length  Petal.Width Species
20           5.4          3.4           1.7
addb
0.2  setosa
21           5.1          3.7           1.5          0.4  setosa
23           5.1          3.3           1.7          0.5  setosa
24           4.8          3.4           1.9          0.2  setosa
25           5.0          3.0           1.6          0.2  setosa


或者去除一列:

iris_na.dropna(1)

Sepal.Length  Sepal.Width  Petal.Width Species
20           5.4          3.4          0.2  setosa
21           5.1          3.7          0.4  setosa
22           4.6          3.6          0.2  setosa
23           5.1          3.3          0.5  setosa
24           4.8          3.4          0.2  setosa
25           5.0          3.0          0.2  setosa
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据分析