數據分析和R語言的那點事兒_1

  最近遇到一些程序員同窗向我瞭解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="學習難度"))
相關文章
相關標籤/搜索