資料科學大Battle,你站Python還是R

大数据文摘發表於2018-06-30

Python 或 R,這是一個問題。在資料科學工作中,你可能也經常遇到這個選擇困難問題。本文作者Brian Ray基於數十年的Python和R在資料科學領域的使用檢驗,分享了自己的看法,希望能夠幫大家做出更好的選擇。

希望這篇文章能幫助那些在資料科學中糾結於選擇Python還是R的小夥伴們。如果你是資料科學領域的新手,或者你需要在專案中選擇一個語言來用,這篇文章一定能幫到你。

也許存在第三種選項

資料科學大Battle,你站Python還是R

Hadley Wickham,RStudio的首席資料科學家,已經給出了回答:與其說選擇其中一種語言(R“還是”Python)更好,還不如說讓兩種語言相互合作 (R“和”Python)是最佳的選擇。所以,我所說的第三種選項就是同時使用Python和R。這讓我很感興趣,我也將在本文末尾處詳細闡述。

Hadley Wickham推特: 

https://twitter.com/hadleywickham

如何比較R和Python

以下不是兩種語言的詳細對比清單,只是一些值得進行對比的要素

  • 歷史:R和Python有著差異明顯又相互交錯的歷史。

  • 使用群體:實地調查顯示了許多複雜的社會學和人類學因素。

  • 效能:詳細的效能比較,以及為什麼很難比較兩種語言的原因。

  • 第三方支援:模組、程式碼庫、視覺化工具、組織及開發環境。

  • 用例:某些型別的工作或任務中,更適用於使用兩種語言中的一種。

  • 同時使用兩種語言:在Python中使用R,在R中使用Python。

  • R與Python預測能力的比較:介紹一個“自給自足”的練習。

  • 企業和個人偏好:揭曉最終答案

歷史

資料科學大Battle,你站Python還是R

簡史:

  • ABC語言 ->Python問世(1989年由Guido van Rossum創立)-> Python 2 (2000年) -> Python 3 (2008年)

  • Fortan語言->S語言(貝爾實驗室)->R語言問世(1991年由Ross Ihaka 和 Robert Gentleman創立)R 1.0.0 (2000年) -> R 3.0.2 (2013年)

使用群體

比較Python與R的使用者時,要謹記以下圖表:

資料科學大Battle,你站Python還是R

只有50%的Python使用者同時使用R

上述結果假設所有的R程式設計師都用R來做“科學與資料研究”,無論程式設計師水平如何,我們能夠確定以上統計分佈是真實的。

想進一步瞭解Python的“熱潮”,可以閱讀我的文章,裡面有關於Python熱潮的調查結果。

文章連結:

https://www.linkedin.com/pulse/python-hype-survey-results-experience-any-drastic-decline-brian-ray/

如果我們僅從“科學與資料研究”群體來看,這就引出了我們的第二個觀點,即R/Python究竟適用於哪些群體?整個“科學與資料研究”群體存在著很多子群體,雖然這些子群體存在交叉,你可能會疑惑他們在更廣的大群體中是如何互動並有著不同的表現的。

以下是Python/R適用的一些子群體:

  • 深度學習

  • 機器學習

  • 高階分析

  • 預測分析

  • 統計學

  • 探索性資料分析學術研究

  • 近乎所有的計算研究領域

雖然每個專業領域似乎都服務於特定的群體,但你會發現R在統計學和資料探索領域使用更廣泛。不久之前,比起使用Python進行資料探索,啟動並執行R能花費較少的時間,況且你還需要花時間安裝Python。

所有一切都將被Jupyter Notebooks 和Anaconda技術顛覆。

注意:Jupyter Notebooks增加了在瀏覽器中編寫Python/R的功能;Anaconda可以輕鬆安裝並管理Python和R及其語言包。

現在你可以在友好的環境中程式設計,並用創造性的方式來生成報表和完成資料分析。程式設計師與他們鍾愛的程式語言之間已不存在屏障。現在,Python能夠在一個平臺獨立執行,並且提供前所未有的快速、簡潔的分析功能。

影響人們選擇程式語言的另一個區別在於“開源”,不僅僅在於開源庫,還包括協作群體對於開源的貢獻。諷刺的是,像Tensorflow和GNU科學計算庫(分別隸屬於Apache和GPL)這類開源許可軟體,似乎同時繫結Python和R。

儘管還存在不少R的支持者,但Python使用群體中更多人是Python的純粹支持者。另一方面,似乎有更多的企業支援R,尤其是那些曾經廣泛使用統計學來做分析的企業。

最後,關於群體和協作,在Github中Python的支持者更多。在最新的Python語言包中,像Tensorflow這樣的包擁有超過3.5萬顆星的使用者收藏。相反,再看一下最新的R語言包,像Shiny和Stan,都只有少於2千顆星的使用者收藏。

效能

Python和R的比較一直都不太容易,因為有太多指標和情況需要測試。在任何一個特定的硬體環境上測試都很困難。有些操作分析在一種語言上已經進行了優化,但在另一種語言上卻沒有。但無論如何,我們還是要進行這項比較。

非常簡單的迴圈語句比較

開始之前,我們先思考一下在使用層面Python和R的區別。你真的想要用R寫很多迴圈嗎?我覺得不同的語言在被開發時的意圖上應該是各不相同的。

import numpy as np %load_ext rpy2.ipython

defdef  do_loopdo_loop(u1):    # Initialize `usq`    usq = {}    for i in range(100):      # i-th element of `u1` squared into `i`-th position of `usq`       usq[i] = u1[i] * u1[i]

%%R do_loop <- function(u1) {    # Initialize `usq`        usq <- 0    for(i in 1:100) {      # i-th element of `u1` squared into `i`-th position of `usq`      usq[i] <- u1[i]*u1[i]    } }

%%timeit -n 1000 %%R u1 <- rnorm(100) do_loop(u1)

執行結果:1.58 ms ± 42.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%%%timeittimeit  --nn  10001000 u1u1    ==  npnp..randomrandom..randnrandn((100100))  do_loopdo_loop(u1)

執行結果:36.9 µs ± 5.99 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

在程式的合理性檢驗中,載入時間以及在命令列上的總執行時間:R語言是0m0.238s,Python是0m0.147s。再次強調,這並不是一個嚴謹的科學測試。

但這個簡單的測試表明,Python的速度明顯更快。雖然在大多數情況下,這並不是十分重要。

一種語言的速度快慢對於一個資料科學家而言的意義在哪裡呢?這兩種語言的興起是因為它們可以被當作“命令語言”來使用。例如,我們使用Python工作時,對Pandas語言包的依賴性很大。這就引出了兩種語言模組和庫上更深層次的比較,事實上,這也是一個更具意義的比較。

第三方支援

Python擁有PyPI,而R使用CRAN,並且它們都可以使用Anaconda。

CRAN使用其內建的“install.packages”命令進行使用。截止撰寫本文時止,CRAN上大約有1.2萬個包可以使用。其中有超過二分之一(大約6千多個)甚至更多的包跟資料科學相關。

PyPi擁有10倍於R的包數量,14.1萬個包。其中有3700個包被標記為用於特定的科學工程領域。還有很多包雖然沒被標記但的確也用於科學應用。

在這兩種語言中,似乎都沒有太多完全重複的包。當我在PyPi中搜尋“Random Forest”時,我們得到了170個專案,但是都不盡相同。

儘管Python的軟體包數量是R的10倍,但資料科學相關的軟體包的數量大致相同。

第三方工具包的可用性是非常重要的。為了用指定的開發語言而不得不從頭開始寫程式很令人沮喪。但與此同時,如果你確實需要這樣做,我希望你能將你的成果貢獻給開源社群。

特定任務下執行速度的比較

DataFrames與Pandas的比較可能更有意義。

我們進行了一項實驗,在同一環境下比較它們針對複雜分析任務時,每一個步驟的執行時間,結果如下。

資料科學大Battle,你站Python還是R

資料科學大Battle,你站Python還是R

大多數任務下Python比R更快

來源連結:

 http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882

實驗原始碼:

http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882

如我們看到的,Python+Pandas比R中原生的DataFrames要快的多。請注意,這並不意味著Python執行的更快。Pandas庫是在Numpy的基礎上用C語言編譯的.

資料視覺化的比較

資料科學大Battle,你站Python還是R

我真正想表現的是ggplot2和matplotlib的比較

Matplotlib是一隻800磅的大猩猩,雖然學習起來不是那麼容易,但是支援自定義並且非常容易擴充套件。而基於ggplot的自定義不是那麼簡單,甚至有些時候會非常難。

如果你喜歡漂亮的圖表,並且不怎麼需要自定義,R是個好選擇。如果你需要更多的功能,那麼Matplotlib甚至其他互動式的製圖工具會對你更有幫助。R中的ShinnyR也可以為你提供這種互動性製圖。

我們只能二選一?

肯定有人會說,為什麼不能同時使用呢?

在如下一些情況下,你可以兩個同時使用:

  • 你的小組或公司允許你這麼幹

  • 你可以在你的程式設計環境中輕鬆安裝和維護

  • 你的程式碼不需要進入另一個系統

  • 這不會讓別人與你合作時感到困惑。

兩種語言同時使用的一些方法:

  • Python為R提供的開發包比如:rpy2、pyRserve、Rpython等等

  • R也有相對應的包:rPython、PythonInR、reticulate、rJython、SnakeCharmR、XRPython。

  • 使用Jupyter,同時使用,示例如下:

reticulate地址:

https://blog.rstudio.com/2018/03/26/reticulate-r-interface-to-python/

資料科學大Battle,你站Python還是R

然後我們就可以直接傳遞Pandas的DataFrames,rpy2會自動將其轉換為R的DataFrames,並通過“-i df”進行切換。

資料科學大Battle,你站Python還是R

來源連結:

http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a

原始碼地址:

http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a

預測R和Python的未來

有人在Kaggle的Kernel平臺上發表了關於“預測開發者們用R還是Python”的分析,他基於已有資料提出了一些有意思的看法。

資料科學大Battle,你站Python還是R

  • 如果你打算來年向Linux靠攏,那麼你更可能是Python使用者

  • 如果你學習統計學,你更可能用R;如果學電腦科學,那麼更可能用Python

  • 如果你還年輕(18-24歲),你更可能是Python使用者

  • 如果你參加程式碼競賽,你更可能是Python使用者

  • 如果你來年想使用android,你更可能是一個Python使用者

  • 如果你來年想學習SQL,你更可能是R使用者

  • 如果你使用MS Office,你更可能是R使用者

  • 如果你來年想要Rasperry Pi,你更可能是一個Python使用者

  • 如果你是全職學生,你更有可能成為Python使用者

  • 如果您使用敏捷方法(Agile methodology),您更可能成為Python使用者

  • 如果你對Ai的擔心大於期待,那麼你更有可能成為R使用者

企業和個人偏好

當我與Google員工 、Stack Overflow 的領導人物Alex Martelli進行交流時,他向我解釋了google為什麼最開始只官方支援少數幾種開發語言。即使在像google這樣自由創新的環境下,似乎也有一些限制。這就是企業的一些選擇偏好。

除了企業偏好外,組織中第一個使用某種語言的人也可能是決定企業偏好的關鍵人物。比如在Deloitte第一個使用R的人,他仍然在公司工作,並且現在成為了首席資料科學家。我認為,不管用什麼語言,關鍵是追求並熱愛你的專案並努力成為最好的那一個。

雖然我不是首次嘗試這些工具的智者,但在此我還是要鄭重宣告,如果你正在研究一些重要的專案,那麼在專案中去比較兩種語言的差距是不可取的。

當然,雖然錯誤在所難免,但每一個精心規劃的專案都應該為資料科學家預留一部分空間,讓他們學習和實驗。保持開放的態度,並擁抱多元化。

最後,從個人角度來說,我將主要使用Python。同時不管未來是和Python一起使用還是獨立使用R,我都期待學習更多的R知識。

相關報導:

https://blog.usejournal.com/python-vs-and-r-for-data-science-833b48ccc91d

相關文章