最近遇到一些程序员同窗向我了解R语言,有些更是想转行作数据分析,故开始学习R或者Python之类的语言。在有其余编程语言的背景下,学习R的语法的确是一件十分简单的事。霸特,若是觉得仅仅是这样的话那就图样图森破。 首先,数据分析是一个很是庞杂的职能,也许岗位抬头均为数据分析师的两人,作的事情却大不相同——好比使用hadoop作日志统计和使用Excel处理报表,这简直是两个领域,相互之间的职能了解,可能仅为对方工做的冰山一角。 其次,不管任何行业的数据分析,其平常工做主要为如下几块:
数据获取——数据库,统计网站,BI,各类生产系统数据,网页爬虫;
数据处理与探索——把各个来源的数据根据分析目的糅合在一块儿,删补缺失值,处理极端或异常值,探索各维度的分布状况;
分析——提出基于各个维度的假设,根据计算结果验证;
结果展现——图、表、报告;
而且不一样的行业的数据分析,侧重方向也不一样,好比金融行业,更注重于量化策略和时间序列分析;对于生物统计,更多的考验来自于稀疏矩阵的计算。 总之,若是只是学到了R语言的语法,你也作不了太多的事情。好在以上所说的,R目前的环境基本都支持。程序员
R与其被称之为一个统计软件,不如称其为一个数学计算环境,其强大的功能主要来自于各式扩展包,不一样的包知足了不一样的计算需求。截止到目前,官方社区CRAN(https://cran.r-project.org/)上收录了7261个扩展包。
获取数据是展开分析工做的前提,目前R语言几乎支持全部主流数据库的链接,各类数据分析软件如SPSS、SAS文件的交互,基本文件存储格式如txt、csv、json、xlsx等的I/O功能,且有很强大的扩展功能。好比对于xlsx文件,能够设置单元格格式、筛选、边框、字体、数值格式等等。 R也有支持网页爬虫和HTML、XML解析的扩展包如RCurl、rvest等。
在实际工做中,数据处理每每占总工做时间的70%甚至更多,因不一样的分析目的或分析假设,须要把数据按不一样维度、不一样粒度进行汇总、归类、整理和探索。 R在这方面也有本身的优点,其拥有大量的基于C++编写的速度极快的扩展包,如plyr、dplyr等。
分析数据是整个流程的关键,也最为考验分析师水平; 一方面,从数据、表格、趋势图、数据的交叉对比中发现数据的规律,从而发现观察到业务上的问题。这就是常说的数据分析的方法论,如何根据业务,有逻辑的去提出假设,验证假设。好比,当咱们发现销售额降低,那么须要分析的目的就是什么因素引发了其降低。在这里的逻辑为,针对某一维度,假设其降低致使了销售额的降低,从而对数据进行验证。 另外一方面就是如何对假设进行验证,好比咱们的假设是转化率降低,那么就要验证当前的转化率是否低于上一周期,或者历史同期,或者某一时间段内的转化率均值低于另外一段时间的均值。如此可见,对于假设的验证就须要至关多的统计方法,例如对于某一组数据与另外一组数据的均值差别的检验,就须要t检验或者z检验,而若是仅仅使用简单的算术平均值做为比较每每说服力不够。 而R语言也一样提供了大量统计计算的扩展包与函数,从而使使用者能灵活机动的进行数据分析。固然,做为一门编程语言,也能够创造出符合业务须要的新的统计计算方法。 为了方便起见,咱们使用R自带的iris——鸢尾花数据集作一些小的测试。 iris数据集已经被集成在R的环境里,故不须要作任何的导入便可进行分析,首先咱们来看看数据是什么样的:
#如下的包若是没有安装需使用install.packages安装,如:install.packages("plyr") library(plyr) library(dplyr) library(magrittr) library(ggplot2) #查看数据的基础信息 head(iris)#查看数据的前六行
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species ## 1 5.1 3.5 1.4 0.2 setosa ## 2 4.9 3.0 1.4 0.2 setosa ## 3 4.7 3.2 1.3 0.2 setosa ## 4 4.6 3.1 1.5 0.2 setosa ## 5 5.0 3.6 1.4 0.2 setosa ## 6 5.4 3.9 1.7 0.4 setosa
glimpse(iris)#查看每一个变量的信息
## Observations: 150 ## Variables: ## $ Sepal.Length (dbl) 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9,... ## $ Sepal.Width (dbl) 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1,... ## $ Petal.Length (dbl) 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5,... ## $ Petal.Width (dbl) 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1,... ## $ Species (fctr) setosa, setosa, setosa, setosa, setosa, setosa, ...
unique(iris$Species)#查看Species变量的惟一值
## [1] setosa versicolor virginica ## Levels: setosa versicolor virginica
table(iris$Species)#查看每一个分类的记录个数
## ## setosa versicolor virginica ## 50 50 50
数据集为5*150,共5个变量,150条数据。共三个品种的鸢尾花,每一个品种50条记录,分别统计了花瓣和花萼的长度与宽度。 咱们能够假设,不一样品种的鸢尾花的花瓣、花萼的长宽多是有差别的,再来看看基础的统计量。
#分片查看数据信息 dlply(iris,.(Species),summary)
## $setosa ## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Min. :4.300 Min. :2.300 Min. :1.000 Min. :0.100 ## 1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:0.200 ## Median :5.000 Median :3.400 Median :1.500 Median :0.200 ## Mean :5.006 Mean :3.428 Mean :1.462 Mean :0.246 ## 3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:0.300 ## Max. :5.800 Max. :4.400 Max. :1.900 Max. :0.600 ## Species ## setosa :50 ## versicolor: 0 ## virginica : 0 ## ## ## ## ## $versicolor ## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Min. :4.900 Min. :2.000 Min. :3.00 Min. :1.000 ## 1st Qu.:5.600 1st Qu.:2.525 1st Qu.:4.00 1st Qu.:1.200 ## Median :5.900 Median :2.800 Median :4.35 Median :1.300 ## Mean :5.936 Mean :2.770 Mean :4.26 Mean :1.326 ## 3rd Qu.:6.300 3rd Qu.:3.000 3rd Qu.:4.60 3rd Qu.:1.500 ## Max. :7.000 Max. :3.400 Max. :5.10 Max. :1.800 ## Species ## setosa : 0 ## versicolor:50 ## virginica : 0 ## ## ## ## ## $virginica ## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Min. :4.900 Min. :2.200 Min. :4.500 Min. :1.400 ## 1st Qu.:6.225 1st Qu.:2.800 1st Qu.:5.100 1st Qu.:1.800 ## Median :6.500 Median :3.000 Median :5.550 Median :2.000 ## Mean :6.588 Mean :2.974 Mean :5.552 Mean :2.026 ## 3rd Qu.:6.900 3rd Qu.:3.175 3rd Qu.:5.875 3rd Qu.:2.300 ## Max. :7.900 Max. :3.800 Max. :6.900 Max. :2.500 ## Species ## setosa : 0 ## versicolor: 0 ## virginica :50 ## ## ## ## ## attr(,"split_type") ## [1] "data.frame" ## attr(,"split_labels") ## Species ## 1 setosa ## 2 versicolor ## 3 virginica
从结果能够看出setosa品种的花瓣从长度和宽度来看都是最小的,基本从花瓣的长宽就能够判断此品种。 进一步来看,图说有益,首先看花瓣的形状:
#花瓣长宽的散点图 qplot(Petal.Length,Petal.Width,data=iris,color=Species,shape=Species)
#花萼长宽的散点图 qplot(Sepal.Length,Sepal.Width,data=iris,color=Species,shape=Species)
因而可知,seotosa品种能够很直观的与其余两个品种区分开来。而versicolor品种的花瓣也比virginica要小不少,但有少许的值是混在一块儿的,花萼的区别不太明显,简单的作个t检验:数据库
#t.test t.test(filter(iris,Species=="versicolor")%$% Sepal.Length, filter(iris,Species=="virginica")%$% Sepal.Length,var.equal=T)
## ## Two Sample t-test ## ## data: filter(iris, Species == "versicolor") %$% Sepal.Length and filter(iris, Species == "virginica") %$% Sepal.Length ## t = -5.6292, df = 98, p-value = 1.725e-07 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percent confidence interval: ## -0.8818516 -0.4221484 ## sample estimates: ## mean of x mean of y ## 5.936 6.588
t.test(filter(iris,Species=="versicolor")%$% Petal.Length, filter(iris,Species=="virginica")%$% Petal.Length,var.equal=T)
## ## Two Sample t-test ## ## data: filter(iris, Species == "versicolor") %$% Petal.Length and filter(iris, Species == "virginica") %$% Petal.Length ## t = -12.604, df = 98, p-value < 2.2e-16 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percent confidence interval: ## -1.495426 -1.088574 ## sample estimates: ## mean of x mean of y ## 4.260 5.552
在95%的显著水平下,二者的长度仍是有明显的差距。
R语言有着丰富的可视化包。对于图,不管是经常使用的直方图、饼图、条形图等,仍是复杂的组合图、地图、热图、动画都有很是完善的扩展包,>>好比上例中使用的ggplot2。而shiny包也支持局域网内部小型BI的展现,knitr支持自动化报告的生成。 固然,R语言与数据分析的小秘密天然不止如此这般,若是真的下决心学习R,对如下的学习曲线要有个准备,瓶颈必然在于数据分析。
data=data.frame(x=seq(0.005,5,0.005),y=2^(seq(0.01,10,0.01))) ggplot(data,aes(x,y))+ geom_line(colour="red")+ theme(axis.text.x=element_blank(),axis.text.y=element_blank())+ labs(list(title="R语言学习曲线",x="学习时间",y="学习难度"))
#如下的包若是没有安装需使用install.packages安装,如:install.packages("plyr") library(plyr) library(dplyr) library(magrittr) library(ggplot2) #查看数据的基础信息 head(iris)#查看数据的前六行 glimpse(iris)#查看每一个变量的信息 unique(iris$Species)#查看Species变量的惟一值 table(iris$Species)#查看每一个分类的记录个数 #分片查看数据信息 dlply(iris,.(Species),summary) #花瓣长宽的散点图 qplot(Petal.Length,Petal.Width,data=iris,color=Species,shape=Species) #花萼长宽的散点图 qplot(Sepal.Length,Sepal.Width,data=iris,color=Species,shape=Species) #t.test t.test(filter(iris,Species=="versicolor")%$% Sepal.Length, filter(iris,Species=="virginica")%$% Sepal.Length,var.equal=T) t.test(filter(iris,Species=="versicolor")%$% Petal.Length, filter(iris,Species=="virginica")%$% Petal.Length,var.equal=T) data=data.frame(x=seq(0.005,5,0.005),y=2^(seq(0.01,10,0.01))) ggplot(data,aes(x,y))+ geom_line(colour="red")+ theme(axis.text.y=element_blank(),axis.text.y=element_blank())+ labs(list(title="R语言学习曲线",x="学习时间",y="学习难度"))