最近遇到一些程序員同窗向我瞭解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="學習難度"))