
R語言的優(yōu)劣勢是什么_數(shù)據(jù)分析師考試
工欲善其事,必先利其器,作為一個戰(zhàn)斗在IT界第一線的工程師,C/C++、java、perl、python、ruby、php、javascript、erlang等等等等,你手中總有一把使用自如的刀,幫助你披荊斬棘。
應(yīng)用場景決定知識的儲備與工具的選擇,反過來,無論你選擇了什么樣的工具,你一定會努力地把它改造成符合自己應(yīng)用場景所需的那個樣子。從這個道理來說,我選擇了R[1]作為數(shù)據(jù)挖掘人員手中攻城陷池的那把云梯,并努力地把它改造成自己希望的那個樣子。
關(guān)于R的一個比較準(zhǔn)確的描述是:R是一門用于統(tǒng)計計算和作圖的語言,它不單是一門語言,更是一個數(shù)據(jù)計算與分析的環(huán)境。統(tǒng)計計算領(lǐng)域有三大工具:SAS、 SPSS、S,R正是受S語言和Scheme語言影響發(fā)展而來。其最主要的特點是免費、開源、各種各樣的模塊十分齊全,在R的綜合檔案網(wǎng)絡(luò)CRAN中,提供了大量的第三方功能包,其內(nèi)容涵蓋了從統(tǒng)計計算到機器學(xué)習(xí),從金融分析到生物信息,從社會網(wǎng)絡(luò)分析到自然語言處理,從各種數(shù)據(jù)庫各種語言接口到高性能計算模型,可以說無所不包,無所不容,這也是為什么R正在獲得越來越多各行各業(yè)的從業(yè)人員喜愛的一個重要原因。
從R的普及來看,國外的普及度要明顯好于國內(nèi),跟盜版windows的泛濫會影響linux在中國的普及一樣的道理,破解的matlab與SPSS的存在也影響了R在中國的使用人群。但在國外高校的統(tǒng)計系,R幾乎是一門必修的語言,具有統(tǒng)治性的地位。在工業(yè)界,作為互聯(lián)網(wǎng)公司翹楚的google內(nèi)部也有不少的工程使用R進(jìn)行數(shù)據(jù)分析工作,這里[2]有一個google campus的講課視頻,內(nèi)容就是用R作為工具來講述數(shù)據(jù)挖掘的概念與算法。
隨著近年來R使用者的增加,關(guān)于R的報道也屢有見于報端,如2009年初美國紐約時報就有一篇很好的報道:Data Analysts Captivated by R’s Power[3]。報道中述說了R的發(fā)展歷史以及由于數(shù)據(jù)挖掘需求的增長而日益普及的現(xiàn)狀,它雖源于S但其發(fā)展卻遠(yuǎn)遠(yuǎn)地超過了S,已經(jīng)成為高校畢業(yè)學(xué)生所選用的第二大工具語言,google與Pfizer的員工也介紹了R在自己公司中的應(yīng)用。此外,報道中g(shù)oogle首席經(jīng)濟(jì)學(xué)家Hal Varian說:R的最讓人驚艷之處在于你可以通過修改它來做所有的事情,而你已經(jīng)擁有大量可用的工具包,這無疑讓你是站在巨人的肩膀上工作。
以下就R的幾個主要應(yīng)用場景以及我在實踐中的經(jīng)驗對這個并不算主流的編程語言作一些介紹。
統(tǒng)計計算:R之最強項
R從它出生的第一天就是為了做統(tǒng)計計算的,那時它被定義為一個統(tǒng)計計算與作圖的工具,雖然發(fā)展到現(xiàn)在它已被賦予了越來越強大的功能,但現(xiàn)在R的開發(fā)人員里,還是以各個高校統(tǒng)計系的老師與學(xué)生為主,他們自然最了解自己最需要的是什么。
在統(tǒng)計計算中,我們常常需要根據(jù)樣本數(shù)據(jù)作線性回歸,得到一定的規(guī)律性,R中實現(xiàn)這個功能十分簡單,以下是一個一元線性回歸的例子:
x <- 1:10
y <- x+rnorm(10, 0, 1)
fit <- lm(y ~ x)
summary(fit)
注明一下,R里的“<-”符號意義為賦值,大多數(shù)情況下它可以用“=”號來代替,但某些特殊的場合不可以,本文會遵循“<-”這種官方使用的寫法。這個例子的前兩行準(zhǔn)備了兩列數(shù)據(jù):自變量x與因變量y,第三行的函數(shù)lm即根據(jù)提供的樣本數(shù)據(jù)進(jìn)行線性回歸計算,得到的模型結(jié)果可以用第四行打印出來。函數(shù)lm除了可以做這種簡單的一元線性回歸,還可以做多元線性回歸,同時返回模型的各種統(tǒng)計量。
統(tǒng)計的往往免不了要做各種各樣的圖形,R的另一個基本特點就是對圖形的強大支持,以下代碼展示了一個箱線圖的作法,代碼來自boxplot函數(shù)的manual,該圖顯示了幾列數(shù)據(jù)的分位數(shù)、中值、均值、奇異點等信息及其對比位置。更詳細(xì)的關(guān)于R的作圖功能可以參看[4]。
boxplot(mpg~cyl,data=mtcars, main=”Car Milage Data”, xlab=”Number of Cylinders”, ylab=”Miles Per Gallon”)
機器學(xué)習(xí):讓你的數(shù)據(jù)發(fā)揮它應(yīng)有的作用
機器學(xué)習(xí)、數(shù)據(jù)挖掘領(lǐng)域面臨著一些抽象自大量現(xiàn)實生活的問題,比如關(guān)聯(lián)規(guī)則挖掘、聚類、分類這三大問題。作為一個完備的工程計算包,R毫無疑問對它們都提供了足夠的支持。
關(guān)聯(lián)規(guī)則問題源于“買了這件商品的顧客還買了什么”這個問題,現(xiàn)在已經(jīng)廣泛應(yīng)用于客戶行為分析以及互聯(lián)網(wǎng)用戶行為分析中。關(guān)聯(lián)規(guī)則挖掘領(lǐng)域最經(jīng)典的算法為 apriori,R的第三方包arules[5],就是專門用于做關(guān)聯(lián)規(guī)則挖掘的。以下例子需要你已經(jīng)安裝了arules包。
library(arules)
data <- paste(“item1,item2″,”item1″,”item2,item3″, sep=”\n”)
write(data, file = “demo_basket”)
tr <- read.transactions(“demo_basket”, format = “basket”, sep=”,”)
data(“Adult”)
rules <- apriori(Adult, parameter = list(supp = 0.5, conf = 0.9, target = “rules”))
最后一行的apriori函數(shù)接受一個transaction對象的輸入,輸出關(guān)聯(lián)規(guī)則對象rules,為方便起見,這里用于計算的transaction 對象Adult是通過第5行從arules包中現(xiàn)成載入進(jìn)來的,第2~4行說明了怎么從一個文本文件中讀入數(shù)據(jù)并生成一個transaction對象。
聚類算法使用最廣泛的高效算法無疑是kmeans,R在其默認(rèn)載入的stats包中就包含了這個函數(shù),以下是一個來自kmean說明文檔的例子:
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2), matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
cl <- kmeans(x, 2)
plot(x, col = cl$cluster)
points(cl$centers, col = 1:2, pch = 8, cex=2)
代碼第1行生成兩組兩維的正態(tài)分布的數(shù)據(jù),第一組均值為0,第二組均值為1,兩組數(shù)據(jù)方差都為0.3。第2行對該數(shù)據(jù)進(jìn)行聚類,第3和第4行把聚類結(jié)果畫出來。
分類器是模式識別領(lǐng)域的研究主題,也是人類認(rèn)知活動的中心。多年來的學(xué)術(shù)研究積累下來很多種類型的分類器,而其中比較靠譜的分類器基本都能在R中找到對應(yīng)的實現(xiàn)。諸多分類器中以svm最為著名,它也被一些人稱為是單分類器的王道。以下是一個利用svm對著名的iris數(shù)據(jù)集進(jìn)行分類的過程,運行該例子需要你已經(jīng)安裝了e1071這個包[6]。
library(e1071)
data(iris)
x <- subset(iris, select = -Species)
y <- iris$Species
model <- svm(x, y)
summary(model)
pred <- predict(model, x)
table(pred, y)
第5行代碼調(diào)用svm函數(shù),計算由x作為特征y作為類別標(biāo)簽的分類器模型,第7行把模型應(yīng)用于原數(shù)據(jù)進(jìn)行預(yù)測。
以上例子的演示并非想讓各位讀者當(dāng)場學(xué)會各個不同領(lǐng)域中這些功能函數(shù)的用法,而是一方面展示一些實際的R代碼以及它解決問題的方式,另一方面說明了R在這些常見的機器學(xué)習(xí)領(lǐng)域的積累。在R幫助下去解決這些或許不是我們專業(yè)的問題,可以省去我們大量重復(fù)造輪子的精力,寫出來的代碼也足夠的短小精悍,節(jié)省時間之余也讓你對自己算法邏輯的全局一覽無余。
高性能計算:向量化與并行/分布計算
作為現(xiàn)代數(shù)據(jù)挖掘人員從業(yè)者,可能第一個需要關(guān)心的是所使用工具的可伸縮性(scalability),具體來說就是在面對大數(shù)據(jù)量場景時的計算能力。
一個擁有高性能計算能力的計算包,首先它必須能充分利用歷史上積累下來的那些著名的數(shù)值計算包,比如blas、lapack;另一方面,它必須具有良好的可擴(kuò)展性,即它必須方便開發(fā)人員并行化自己的算法,很幸運這些特性R都具備了。
類似于R、scilab與matlab那樣的工程計算包,通常都會以向量化計算(Vectorization)作為其基本的計算特點(即使python的 numpy包也是如此),因為向量化的處理方式是現(xiàn)代大型計算機的基本特性,在計算機領(lǐng)域,無論硬件還是軟件,都提供了對向量化的支持,硬件上如 Intel的MMX, SSE等指令集都提供了對向量化的支持,更多可以看到wikipedia上的介紹[7]。軟件上如blas等著名的計算包,天然地就可以對向量化的命令自動實施并行計算。
所謂向量化,是一種特殊的并行計算的方式,相比于一般程序在同一時間只執(zhí)行一個操作的方式,它可以在同一時間執(zhí)行多次操作,通常是對不同的數(shù)據(jù)執(zhí)行同樣的一個或一批指令,或者說把指令應(yīng)用于一個數(shù)組/向量。以下列出R中經(jīng)常使用幾種向量化運算,都是十分稀松平常的操作,但它們本質(zhì)上都是同時對一批數(shù)據(jù)應(yīng)用相同的操作,所以都可以經(jīng)過向量化處理方式的改造:
向量取值,如:V[1:10]
向量賦值,如:V[1:10] <- seq(1,10)
lapply,類似于python里的map函數(shù):lapply(A, mean)
矩陣運算:A + B;A %*% B
向量化因其在計算過程中數(shù)據(jù)的前后不依賴的特點,是并行計算的天然先驅(qū),一個用向量化實現(xiàn)的算法,必定是一個可以高度并行化的算法。正因為這個原因,在利用 R寫腳本的時候,都要盡量利用向量化的思想來設(shè)計自己的算法,盡可能少地使用循環(huán)結(jié)構(gòu)。一旦你的程序都是或大都是基于向量化的,除了當(dāng)時獲得來自于計算機軟硬件上的優(yōu)化外,將來某一天數(shù)據(jù)量膨脹使得計算成為瓶頸時,你就可以極為方便地把原來的算法并行化。正如我們所知,CRAN包括了各種你能想像得到的工具包,當(dāng)然也有不少并行計算的包,這些包被歸納在R高性能計算相關(guān)的包列表中[8]。
關(guān)于R的向量化及并行計算更詳細(xì)的內(nèi)容可以參考我的一篇博客[9]。
編寫接口與工具包:最有用的包必定是你寫的那一個
一個開源軟件的最強大之處在于大量從業(yè)人員的貢獻(xiàn),R最讓人激奮,進(jìn)而選擇它作為工作平臺的一個重要原因則是龐大而無所不包的的CRAN,在那里幾乎能找到所有你能想像得到的與分析研究相關(guān)的工具包,可以說絲毫不遜色于perl的CPAN。之所以擁有一個如此強大的第三方支持,一方面在于R本身在統(tǒng)計計算與計算能力方面的支持,另一方面則在于開發(fā)一個R擴(kuò)展是如此地容易,以致于每一個使用R作為自己常用工具的人,都會按捺不住強烈的沖動要寫一個自己的包,以滿足工作需要。如果自己的這個包感覺寫得不錯,又為很多人所需要,就可以提交到CRAN。這是造成CRAN如此龐大的原因,但同時也造成了CRAN的軟件包良萎不全。但大多數(shù)情況下,這些包都會是你的得力助手,特別是那些著名而廣為使用的包,如果覺得它們不滿足你的需要,那么放心地對它們進(jìn)行修改吧,因為它們都是開源的。
下面展示一個簡單的R擴(kuò)展包的制作過程:
1、生成包結(jié)構(gòu):新建一個目錄mypkg,同時作為包名,在mypkg中新建幾個目錄與文件,mypkg的目錄結(jié)構(gòu)如下圖所示。R自帶的函數(shù)package.skeleton可以自動幫你生成這些目錄,但它需要一些現(xiàn)成的函數(shù)對象或文件作啟動,為了順序說明整個過程,這里沒有使用。
2、目錄說明:必需的是DEscriptION文件、man目錄和R目錄,剩下的都是可選的。DEscriptION文件描述包的meta信息;R目錄下面存放R腳本文件,里面的函數(shù)可導(dǎo)出作為包函數(shù)庫提供給外部使用;如果要在包里放一些試驗數(shù)據(jù),可以放在data目錄里,常用是以csv格式存放,在R終端里data(***)可以載入,這里留空;man目錄是R的幫助文檔,有一定的格式要求,這里也留空,生成包時會有一些警告,可以不用管;src存放c/c++/fortran源代碼,必須同時放置Makefile或Makevars文件指導(dǎo)編譯程序工作,這里留空;zzz.R可以在載入包時做一些事情,這里也留空。
3、添加功能:DEscriptION文件的內(nèi)容可以參考任意一個R包對應(yīng)文件的寫法,依樣把信息修改成自己相應(yīng)的信息即可。以下只寫一個簡單的R函數(shù)作為說明,在R目錄下添加一個名為helloword.R的文件,文件內(nèi)容如下:
helloword <- function(x, y)
{
return(x*y)
}
4、安裝:在命令行中運行R CMD build mypkg,會編譯生成一個mypkg_0.1.tar.gz安裝包,其中的數(shù)字是我在DEscriptION里寫的版本號;運行R CMD INSTALL mypkg,就可以把包安裝到系統(tǒng)里。
5、試驗:運行R,進(jìn)入R終端;library(mypkg),載入剛制作的包;search(),可以看到mypkg包已經(jīng)被載入;在R終端運行helloworld(2,3),返回6,試驗成功。
一個具有一定功能的包就這樣做好了,是不是很簡單。如果有其它需要,只要往R目錄或src目錄添加文件,然后重新生成并安裝就可以了。R與c/c++之間的接口調(diào)用也十分方便,限于篇幅,無法更仔細(xì)地說明,更詳細(xì)的內(nèi)容可以參考我的幾篇博客[10-13]。
R在中國的發(fā)展
R 在中國的普及現(xiàn)在并不十分地廣泛,主要還是學(xué)校及研究機構(gòu)在使用,但近年來隨著R的聲名鵲起,也已經(jīng)有越來越多各個領(lǐng)域的工業(yè)界從業(yè)人員選擇R作為自己的工作平臺,其中統(tǒng)計之都[14]是一個國內(nèi)R用戶的聚焦地。今年的6月份在人民大學(xué)舉行了第3屆R語言會議,從前三屆會議的人員組成來看,R的中國用戶群一直呈現(xiàn)較大的增長趨勢,用戶分布的領(lǐng)域也越來越豐富。第三屆R語言會議參會者人來源可以從會議紀(jì)要中看到[15]。相信隨著數(shù)據(jù)挖掘廣為各個公司接受,R也會走近工業(yè)界的各行各業(yè)中。
R在豆瓣中的應(yīng)用
有一段時間,我一直在尋找介乎于matlab與系統(tǒng)語言(如C, Fortran)的中間物,希望它既能擁有系統(tǒng)語言的高性能,又能方便數(shù)據(jù)挖掘人員的日常工作,于是我找到了R,這不僅是一門語言,它更是一個理想的計算環(huán)境。它一方面方便我對新算法原型的構(gòu)建、調(diào)試、評測,另一方面并沒有讓我失去系統(tǒng)級語言的計算優(yōu)勢,甚至在實現(xiàn)并行計算方面擁有了更多的選擇。現(xiàn)在我使用R編寫我們自己的工具包,進(jìn)行算法原型構(gòu)造、矩陣運算、并行算法等離線應(yīng)用,為相似性計算、推薦系統(tǒng)等上層應(yīng)用提供底層的支持。
一個R寫的協(xié)同過濾推薦的例子
最后用一個R實現(xiàn)的協(xié)同過濾推薦的例子來結(jié)束本文,協(xié)同過濾是推薦系統(tǒng)中一個基本的算法,詳細(xì)內(nèi)容可以參考這里[16]。由于大量地采用了向量化的計算方式(包括各種矩陣運算),所以算法的實現(xiàn)相當(dāng)簡潔,有可能是史上代碼最少的協(xié)同過濾推薦引擎
data <- read.table(‘data.dat’, sep=’,', header=TRUE)
user <- unique(data$user_id)
subject <- unique(data$subject)
uidx <- match(data$user, user)
iidx <- match(data$subject, subject)
M <- matrix(0, length(user), length(subject))
i <- cbind(uidx, iidx)
M[i] <- 1
mod <- colSums(M^2)^0.5
MM <- M %*% diag(1/mod
S <- crossprod(MM
R <- M %*% S
R <- apply(R, 1, FUN=sort, decreasing=TRUE, index.return=TRUE)
k <- 5
res <- lapply(R, FUN=function(r)return(subject[r$ix[1:k]]))
write.table(paste(user, res, sep=’:'), file=’result.dat’,
quote=FALSE, row.name=FALSE, col.name=FALSE)
代碼我就不細(xì)加注釋了,有興趣了解其原理的同學(xué)可以看這里[16]。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03