⑴ 做數據分析必須學R語言的4個理由
做數據分析必須學R語言的4個理由
R 是一種靈活的編程語言,專為促進探索性數據分析、經典統計學測試和高級圖形學而設計。R 擁有豐富的、仍在不斷擴大的數據包庫,處於統計學、數據分析和數據挖掘發展的前沿。R 已證明自己是不斷成長的大數據領域的一個有用工具,並且已集成到多個商用包中,比如 IBM SPSS? 和 InfoSphere?,以及 Mathematica。
本文提供了一位統計學家Catherine Dalzell對 R 的價值的看法。
為什麼選擇 R?
R可以執行統計。您可以將它視為 SAS Analytics 等分析系統的競爭對手,更不用提 StatSoft STATISTICA 或 Minitab 等更簡單的包。政府、企業和制葯行業中許多專業統計學家和方法學家都將其全部職業生涯都投入到了 IBM SPSS 或 SAS 中,但卻沒有編寫過一行 R 代碼。所以從某種程度上講,學習和使用 R 的決定事關企業文化和您希望如何工作。我在統計咨詢實踐中使用了多種工具,但我的大部分工作都是在 R 中完成的。以下這些示例給出了我使用 R 的原因:
R 是一種強大的腳本語言。我最近被要求分析一個范圍研究的結果。研究人員檢查了 1,600 篇研究論文,並依據多個條件對它們的內容進行編碼,事實上,這些條件是大量具有多個選項和分叉的條件。它們的數據(曾經扁平化到一個 Microsoft? Excel? 電子表格上)包含 8,000 多列,其中大部分都是空的。研究人員希望統計不同類別和標題下的總數。R 是一種強大的腳本語言,能夠訪問類似 Perl 的正則表達式來處理文本。凌亂的數據需要一種編程語言資源,而且盡管 SAS 和 SPSS 提供了腳本語言來執行下拉菜單意外的任務,但 R 是作為一種編程語言編寫的,所以是一種更適合該用途的工具。
R 走在時代的前沿。統計學中的許多新發展最初都是以 R 包的形式出現的,然後才被引入到商業平台中。我最近獲得了一項對患者回憶的醫療研究的數據。對於每位患者,我們擁有醫生建議的治療項目數量,以及患者實際記住的項目數量。自然模型是貝塔—二項分布。這從上世紀 50 年代就已知道,但將該模型與感興趣的變數相關聯的估算過程是最近才出現的。像這樣的數據通常由廣義估計方程式 (general estimating equations, GEE) 處理,但 GEE 方法是漸進的,而且假設抽樣范圍很廣。我想要一種具有貝塔—二項 R 的廣義線性模型。一個最新的 R 包估算了這一模型:Ben Bolker 編寫的 betabinom。而 SPSS 沒有。
集成文檔發布。 R 完美地集成了 LaTeX 文檔發布系統,這意味著來自 R 的統計輸出和圖形可嵌入到可供發布的文檔中。這不是所有人都用得上,但如果您希望便攜非同步關於數據分析的書籍,或者只是不希望將結果復制到文字處理文檔,最短且最優雅的路徑就是通過 R 和 LaTeX。
沒有成本。作為一個小型企業的所有者,我很喜歡 R 的免費特定。即使對於更大的企業,知道您能夠臨時調入某個人並立即讓他們坐在工作站旁使用一流的分析軟體,也很不錯。無需擔憂預算。
R 是什麼,它有何用途?
作為一種編程語言,R 與許多其他語言都很類似。任何編寫過代碼的人都會在 R 中找到很多熟悉的東西。R 的特殊性在於它支持的統計哲學。
一種統計學革命:S 和探索性數據分析
140 字元的解釋:R 是 S 的一種開源實現,是一種用於數據分析和圖形的編程環境。
計算機總是擅長計算 — 在您編寫並調試了一個程序來執行您想要的演算法後。但在上世紀 60 和 70 年代,計算機並不擅長信息的顯示,尤其是圖形。這些技術限制在結合統計理論中的趨勢,意味著統計實踐和統計學家的培訓專注於模型構建和假設測試。一個人假定這樣一個世界,研究人員在其中設定假設(常常是農業方面的),構建精心設計的實驗(在一個農業站),填入模型,然後運行測試。一個基於電子表格、菜單驅動的程序(比如 SPSS 反映了這一方法)。事實上,SPSS 和 SAS Analytics 的第一個版本包含一些子常式,這些子常式可從一個(Fortran 或其他)程序調用來填入和測試一個模型工具箱中的一個模型。
在這個規范化和滲透理論的框架中,John Tukey 放入了探索性數據分析 (EDA) 的概念,這就像一個鵝卵石擊中了玻璃屋頂。如今,很難想像沒有使用箱線圖(box plot) 來檢查偏度和異常值就開始分析一個數據集的情形,或者沒有針對一個分位點圖檢查某個線性模型殘差的常態的情形。這些想法由 Tukey 提出,現在任何介紹性的統計課程都會介紹它們。但並不總是如此。
與其說 EDA 是一種理論,不如說它是一種方法。該方法離不開以下經驗規則:
只要有可能,就應使用圖形來識別感興趣的功能。
分析是遞增的。嘗試以下這種模型;根據結果來填充另一個模型。
使用圖形檢查模型假設。標記存在異常值。
使用健全的方法來防止違背分布假設。
Tukey 的方法引發了一個新的圖形方法和穩健估計的發展浪潮。它還啟發了一個更適合探索性方法的新軟體框架的開發。
S 語言是在貝爾實驗室由 John Chambers 和同事開發的,被用作一個統計分析平台,尤其是 Tukey 排序。第一個版本(供貝爾實驗室內部使用)於 1976 年開發,但直到 1988 年,它才形成了類似其當前形式的版本。在這時,該語言也可供貝爾實驗室外部的用戶使用。該語言的每個方面都符合數據分析的 「新模型」:
S 是一種在編程環境操作的解釋語言。S 語法與 C 的語法很相似,但省去了困難的部分。S 負責執行內存管理和變數聲明,舉例而言,這樣用戶就無需編寫或調試這些方面了。更低的編程開銷使得用戶可以在同一個數據集上快速執行大量分析。
從一開始,S 就考慮到了高級圖形的創建,您可向任何打開的圖形窗口添加功能。您可很容易地突出興趣點,查詢它們的值,使散點圖變得更平滑,等等。
面向對象性是 1992 年添加到 S 中的。在一個編程語言中,對象構造數據和函數來滿足用戶的直覺。人類的思維始終是面向對象的,統計推理尤其如此。統計學家處理頻率表、時間序列、矩陣、具有各種數據類型的電子表格、模型,等等。在每種情況下,原始數據都擁有屬性和期望值:舉例而言,一個時間序列包含觀察值和時間點。而且對於每種數據類型,都應得到標准統計數據和平面圖。對於時間序列,我可能繪制一個時間序列平面圖和一個相關圖;對於擬合模型,我可能繪制擬合值和殘差。S 支持為所有這些概念創建對象,您可以根據需要創建更多的對象類。對象使得從問題的概念化到其代碼的實現變得非常簡單。
一種具有態度的語言:S、S-Plus 和假設測試
最初的 S 語言非常重視 Tukey 的 EDA,已達到只能 在 S 中執行 EDA 而不能執行其他任何操作的程度。這是一種具有態度的語言。舉例而言,盡管 S 帶來了一些有用的內部功能,但它缺乏您希望統計軟體擁有的一些最明顯的功能。沒有函數來執行雙抽樣測試或任何類型的真實假設測試。但 Tukey 認為,假設測試有時正合適。
1988 年,位於西雅圖的 Statistical Science 獲得 S 的授權,並將該語言的一個增強版本(稱為 S-Plus)移植到 DOS 以及以後的 Windows? 中。實際認識到客戶想要什麼後,Statistical Science 向 S-Plus 添加了經典統計學功能。添加執行方差分析 (ANOVA)、測試和其他模型的功能。對 S 的面向對象性而言,任何這類擬合模型的結果本身都是一個 S 對象。合適的函數調用都會提供假設測試的擬合值、殘差和 p-值。模型對象甚至可以包含分析的中間計算步驟,比如一個設計矩陣的 QR 分解(其中 Q 是對角線,R 是右上角)。
有一個 R 包來完成該任務!還有一個開源社區
大約在與發布 S-Plus 相同的時間,紐西蘭奧克蘭大學的 Ross Ihaka 和 Robert Gentleman 決定嘗試編寫一個解釋器。他們選擇了 S 語言作為其模型。該項目逐漸成形並獲得了支持。它們將其命名為 R。
R 是 S 的一種實現,包含 S-Plus 開發的更多模型。有時候,發揮作用的是同一些人。R 是 GNU 許可下的一個開源項目。在此基礎上,R 不斷發展,主要通過添加包。R 包 是一個包含數據集、R 函數、文檔和 C 或 Fortran 動態載入項的集合,可以一起安裝並從 R 會話訪問。R 包向 R 添加新功能,通過這些包,研究人員可在同行之間輕松地共享計算方法。一些包的范圍有限,另一些包代表著整個統計學領域,還有一些包含最新的技術發展。事實上,統計學中的許多發展最初都是以 R 包形式出現的,然後才應用到商用軟體中。
在撰寫本文時,R 下載站點 CRAN 上已有 4,701 個 R 包。其中,單單那一天就添加了 6 個 R 。萬事萬物都有一個對應的 R 包,至少看起來是這樣。
我在使用 R 時會發生什麼?
備註:本文不是一部 R 教程。下面的示例僅試圖讓您了解 R 會話看起來是什麼樣的。
R 二進制文件可用於 Windows、Mac OS X 和多個 Linux? 發行版。源代碼也可供人們自行編譯。
在 Windows? 中,安裝程序將 R 添加到開始菜單中。要在 Linux 中啟動 R,可打開一個終端窗口並在提示符下鍵入 R。您應看到類似圖 1 的畫面。
圖 1. R 工作區
在提示符下鍵入一個命令,R 就會響應。
此時,在真實的環境中,您可能會從一個外部數據文件將數據讀入 R 對象中。R 可從各種不同格式的文件讀取數據,但對於本示例,我使用的是來自 MASS 包的 michelson 數據。這個包附帶了 Venables and Ripley 的標志性文本 Modern Applied Statistics with S-Plus(參見 參考資料)。michelson 包含來自測量光速的流行的 Michelson and Morley 實驗的結果。
清單 1 中提供的命令可以載入 MASS 包,獲取並查看 michelson 數據。圖 2 顯示了這些命令和來自 R 的響應。每一行包含一個 R 函數,它的參數放在方括弧 ([]) 內。
清單 1. 啟動一個 R 會話
2+2 # R can be a calculator. R responds, correctly, with 4.
library(「MASS」) # Loads into memory the functions and data sets from
# package MASS, that accompanies Modern Applied Statistics in S
data(michelson) # Copies the michelson data set into the workspace.
ls() # Lists the contents of the workspace. The michelson data is there.
head(michelson) # Displays the first few lines of this data set.
# Column Speed contains Michelson and Morleys estimates of the
# speed of light, less 299,000, in km/s.
# Michelson and Morley ran five experiments with 20 runs each.
# The data set contains indicator variables for experiment and run.
help(michelson) # Calls a help screen, which describes the data set.
圖 2. 會話啟動和 R 的響應
現在讓我們看看該數據(參見 清單 2)。輸出如 圖 3 中所示。
清單 2. R 中的一個箱線圖
# Basic boxplot
with(michelson, boxplot(Speed ~ Expt))
# I can add colour and labels. I can also save the results to an object.
michelson.bp = with(michelson, boxplot(Speed ~ Expt, xlab=」Experiment」, las=1,
ylab=」Speed of Light – 299,000 m/s」,
main=」Michelson-Morley Experiments」,
col=」slateblue1″))
# The current estimate of the speed of light, on this scale, is 734.5
# Add a horizontal line to highlight this value.
abline(h=734.5, lwd=2,col=」purple」) #Add modern speed of light
Michelson and Morley 似乎有計劃地高估了光速。各個實驗之間似乎也存在一定的不均勻性。
圖 3. 繪制一個箱線圖
在對分析感到滿意後,我可以將所有命令保存到一個 R 函數中。參見清單 3。
清單 3. R 中的一個簡單函數
MyExample = function(){
library(MASS)
data(michelson)
michelson.bw = with(michelson, boxplot(Speed ~ Expt, xlab=」Experiment」, las=1,
ylab=」Speed of Light – 299,000 m/s」, main=」Michelsen-Morley Experiments」,
col=」slateblue1″))
abline(h=734.5, lwd=2,col=」purple」)
}
這個簡單示例演示了 R 的多個重要功能:
保存結果—boxplot() 函數返回一些有用的統計數據和一個圖表,您可以通過類似 michelson.bp = … 的負值語句將這些結果保存到一個 R 對象中,並在需要時提取它們。任何賦值語句的結果都可在 R 會話的整個過程中獲得,並且可以作為進一步分析的主題。boxplot 函數返回一個用於繪制箱線圖的統計數據(中位數、四分位等)矩陣、每個箱線圖中的項數,以及異常值(在 圖 3 中的圖表上顯示為開口圓)。請參見圖 4。
圖 4. 來自 boxplot 函數的統計數據
公式語言— R(和 S)有一種緊湊的語言來表達統計模型。參數中的代碼 Speed ~ Expt 告訴函數在每個 Expt (實驗數字)級別上繪制 Speed 的箱線圖。如果希望執行方差分析來測試各次實驗中的速度是否存在顯著差異,那麼可以使用相同的公式:lm(Speed ~ Expt)。公式語言可表達豐富多樣的統計模型,包括交叉和嵌套效應,以及固定和隨機因素。
用戶定義的 R 函數— 這是一種編程語言。
R 已進入 21 世紀
Tukey 的探索性數據分析方法已成為常規課程。我們在教授這種方法,而統計學家也在使用該方法。R 支持這種方法,這解釋了它為什麼仍然如此流行的原因。面向對象性還幫助 R 保持最新,因為新的數據來源需要新的數據結構來執行分析。InfoSphere? Streams 現在支持對與 John Chambers 所設想的不同的數據執行 R 分析。
R 與 InfoSphere Streams
InfoSphere Streams 是一個計算平台和集成開發環境,用於分析從數千個來源獲得的高速數據。這些數據流的內容通常是非結構化或半結構化的。分析的目的是檢測數據中不斷變化的模式,基於快速變化的事件來指導決策。SPL(用於 InfoSphere Streams 的編程語言)通過一種範例來組織數據,反映了數據的動態性以及對快速分析和響應的需求。
我們已經距離用於經典統計分析的電子表格和常規平面文件很遠,但 R 能夠應付自如。從 3.1 版開始,SPL 應用程序可將數據傳遞給 R,從而利用 R 龐大的包庫。InfoSphere Streams 對 R 的支持方式是,創建合適的 R 對象來接收 SPL 元組(SPL 中的基本數據結構)中包含的信息。InfoSphere Streams 數據因此可傳遞給 R 供進一步分析,並將結果傳回到 SPL。
R 需要主流硬體嗎?
我在一台運行 Crunchbang Linux 的宏碁上網本上運行了這個示例。R 不需要笨重的機器來執行中小規模的分析。20 年來,人們一直認為 R 之所以緩慢是因為它是一種解釋性語言,而且它可以分析的數據大小受計算機內存的限制。這是真的,但這通常與現代機器毫無干係,除非應用程序非常大(大數據)。
R 的不足之處
公平地講,R 也有一些事做不好或完全不會做。不是每個用戶都適合使用 R:
R 不是一個數據倉庫。在 R 中輸入數據的最簡單方式是,將數據輸入到其他地方,然後將它導入到 R 中。人們已經努力地為 R 添加了一個電子表格前端,但它們還沒流行起來。電子表格功能的缺乏不僅會影響數據輸入,還會讓以直觀的方式檢查 R 中的數據變得很困難,就像在 SPSS 或 Excel 中一樣。
R 使普通的任務變得很困難。舉例而言,在醫療研究中,您對數據做的第一件事就是計算所有變數的概括統計量,列出無響應的地方和缺少的數據。這在 SPSS 中只需 3 次單擊即可完成,但 R 沒有內置的函數來計算這些非常明顯的信息,並以表格形式顯示它。您可以非常輕松地編寫一些代碼,但有時您只是想指向要計算的信息並單擊滑鼠。
R 的學習曲線是非平凡的。初學者可打開一個菜單驅動的統計平台並在幾分鍾內獲取結果。不是每個人都希望成為程序員,然後再成為一名分析家,而且或許不是每個人都需要這么做。
R 是開源的。R 社區很大、非常成熟並且很活躍,R 無疑屬於比較成功的開源項目。前面已經提到過,R 的實現已有超過 20 年歷史,S 語言的存在時間更長。這是一個久經考驗的概念和久經考驗的產品。但對於任何開源產品,可靠性都離不開透明性。我們信任它的代碼,因為我們可自行檢查它,而且其他人可以檢查它並報告錯誤。這與自行執行基準測試並驗證其軟體的企業項目不同。而且對於更少使用的 R 包,您沒有理由假設它們會實際生成正確的結果。
結束語
我是否需要學習 R?或許不需要;需要 是一個感情很強烈的詞。但 R 是否是一個有價值的數據分析工具呢?當然是的。該語言專為反映統計學家的思考和工作方式而設計。R 鞏固了良好的習慣和合理的分析。對我而言,它是適合我的工作的工具。