轉行數據分析,是選Python還是R?


 

Python?R?並非只能二選一!

 

在撰寫本文之前,RStudio 的首席數據科學家 Hadley Wickham 在社交網絡上給我發了個回覆(見上圖)。在他的啓發下,我也意識到,R 和 Python 並不是你死我活的關係,完全可以相互協作嘛。這個點子一直在我腦海裏徘徊,我將在文章的末尾講講這個做法。

那麼,讓我們開始吧!

History 語言發展的歷史

簡單地來說:

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 語言的用戶羣時,請先記住一點:

只有 50% 的 Python 用戶和 R 語言的用戶重疊。

這是假設所有的 R 語言用戶都把這個編程語言用於“科學及數學計算”。同時,我們斷定不管是哪個水平段的程序員,他們的使用場景分佈也大致符合上圖的規律。

如果我們打算只對比科學和數學計算的用戶羣,那麼,我們就要面臨第二個問題:具體是哪些用戶呢?在龐大的科學和數學計算羣體中,還存在各種不同的子社羣,它們之間雖然有些重疊,但總體來說,他們和 Python 與 R 的關係還是差別挺大的。

以下是一些依賴 Python 和 R 語言的領域:

● Deep Learning 深度學習

● Machine Learning 機器學習

● Advanced Analytics 高級分析

● Predictive Analytics 預測分析

● Statistics 統計學

● Exploration and Data Analysis 數據探索和分析

● Academic Scientific Research 學術與科學研究

● 以及…數不勝數的各類科學計算領域研究項目

由於每個領域都有自成一體的社區,你可能會發現在統計學和數據探索等方面,R 語言更爲流行一些。在不久之前,用 R 語言設計運行並完成一些相當有意義的數據探索,花的時間比安裝 Python 並完成類似的數據探索任務要少得多。

但自從 Jupyter Notebooks 和 Anaconda 橫空出世,一切都變得不一樣了。

注:Jupyter Notebooks 讓用戶可以在瀏覽器裏編寫運行 Python 或 R 代碼;Anaconda 提供了一個簡單方便的 Python 或 R 語言的包管理工具。

從此,你擁有了一套即開即用的,適合提供數據分析與報告的編程環境。曾經橫亙在技術任務和編程語言之間的環境壁壘被打破了。Python 終於有了一套不依賴於某個平臺的數據分析環境。

另外一個對選語言有着重大影響的社區因素,就是“開源”。這指的不單是那些開源的代碼庫,還有共同合作爲開源貢獻力量的整個社區羣體。目前許多開源授權的開發軟件都同時有 Python 和 R 語言的綁定(比如 Tensorflow 和 GNU 科學庫,分別採用了 Apache 和 GPL 的開源授權協議)。然而諷刺的是,未採用 GPL 授權的 Python 在開源界獲得的支持似乎大大超過採用了 GPL 授權的 R 語言 —— 後者因爲其在統計分析方面的重大作用,獲得了許多來自私營企業(特別是有統計學背景的企業)的支持。

最後,考慮到社區協作,就不能不提到全球最大的“同性交友社區” —— Github。Github 上目前 Python 項目獲得的關注可是遠超 R 語言。比如,Tensorflow 這樣廣受關注的 Python 項目,已獲得了超過 3.5 萬個星。而另一方面,最受關注的 R 語言項目,比如 Shiny 、 Stan 等,一般也很少能超過 2 千個星。

運行速度

運行速度方面其實不具有可比性。因爲不同的編程語言的使用場景完全不同,度量指標也難以統一。此外,不同語言對某些操作的優化程度也不盡相同,甚至在不同的硬件上跑出的結果也可能會大相徑庭。這種比較實在是吃力不討好 —— 就算你做的再詳盡,也不可能涵蓋到每一個細節,然後某個語言的腦殘粉就會跳出來噴的你滿地找牙。不過,管他呢,反正我也不打算搞什麼嚴謹的測試。

來個簡單粗暴的循環比賽吧

在實際開始前,讓我們再稍稍暫停一下。你看,我們是要拿 Python 來和 R 做對比,但你真的會拿 R 來搞一大堆循環嗎?這兩個語言在設計用法上就不是這樣搞的吧?

不過爲了滿足大家的好奇心,我還是運行了一下下面的代碼:

Python 的運行時間是 0.000037 秒,而 R 是 0.00158 秒

讓我檢查一下:包括載入和運行時間在內,R 的實際運行時間在 0.238 秒,Python 在 0.147 秒。不過我要再次強調,這不是一個很科學的測試。

這個測試有點過分簡單粗暴了。沒錯,跑循環 Python 看起來快很多,但這真的有用嗎?

對數據科學家來說,哪種速度纔是最重要的?近年來,Python 和 R 更多地被用作指令語言,而常用的數據分析和處理工作都由第三方庫完成(比如 Python 基本上強烈依賴 Pandas 庫)。於是,我們的討論話題其實就變成哪個語言能更好更快地利用第三方庫資源來完成任務——這個比較起來纔有意義。

第三方庫支持/包管理工具

Python 有 PyPI,R 有 CRAN,Anaconda 這個神器,兩者都能用。

CRAN 採用它的發行版內置的 install.packages 命令來安裝所需的第三方庫。到目前爲止,CRAN 上已經有大約 1.2 萬個第三方包,其中大約一半多一點是數據科學方向的,也就是大概6000多個吧。

PyPi 上的包數量差不多有 CRAN 的十倍還多:14.1萬個,其中含有“科學”或“工程”類標籤的包大約有3700多個。此外還有一些可以用作數據分析或科學計算使用的包,因爲未標上標籤,所以未被我們統計在內。

所以,基本上不管你用哪種語言,都不太可能發生不得不重複造輪子的情況。沒錯,如果你用 PyPi 搜索“Random Forest”(隨機森林,一種機器學習算法),你可能會發現它給你返回了 170 個項目,不過這些結果裏的軟件包似乎並不相同啦。

所以,雖然 Python 的第三方包數量比 R 多出了十倍,實際可用的科學計算和數據科學庫其實跟 R 差不多——甚至還略少一點。

第三方庫的可用性是相當重要的。畢竟如果什麼都得靠自己從底層開始寫,這可太挫折了。同樣的,如果你用你喜歡的語言搞出了什麼特別好用的玩意,希望你也能將它回饋給開源社區。

數據分析的速度纔是關鍵

那麼,我們就用 R 和 Python 上最具代表性的 DataFrames 和 Pandas 庫,來代表兩門語言進行一場比試吧。

我們的實驗方法如下:用兩種語言分別對同一個數據集執行數據探索,測量並對比每一個分步驟的執行時間。測試結果如下:

Python 在大部分的任務中的速度都比較快。

測試腳本的源代碼:代碼:http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882

正如上面顯示的,Python + Pandas 比 R 自帶的 DataFrames 快了不少。請注意,這並不意味着 Python 運行庫速度很快。Pandas 基本上是基於 Numpy,而後者是用 C 寫的。

繪製個可視化看看!

實際上,這就變成了 ggplot2 和 matplotlib 的對決。聲明:matplotlib 的作者,是我在整個 Python 社區裏最尊敬的人,也是教我學 Python 的導師,John D. Hunter。

那麼,在我看來,Matplotlib 就像一隻 800 磅重的大猩猩,壯實、擴展性好,但你若要想自定義調教它,可以是可以,不過得花上好多精力去學習和理解。當然,你若要想自定義 ggplot,也不是啥容易的事,有些人甚至會說這玩意更難調。

但是,如果你也跟我一樣喜歡漂亮的圖形,也不需要任何自定義的話,R 就是我的首選。如果你需要做出比 Matplotlib 更漂亮的東西,或是需要可交互的功能的話,那你應該試試 bokeh 。類似的,在 R 語言下,你可以試試 ShinnyR ,它提供了你在尋找的那些交互功能。

我們就不能好好相處嗎?

對,也許有人會問,爲啥我們不能同時利用這兩個語言呢?

對,在有那麼幾種情況下,你確實可以把兩種語言混在一起用。比如:

● 你所在的公司或者機構允許你這麼玩。

● 你能方便快捷地搭建和維護這樣的工作環境。

● 你不需要遷移代碼到別的系統上去。

● 你並不打算拿這一團混沌的代碼去禍害其他小朋友。

如果你已經打定主意這麼幹,下面有幾種方法你可以試試:

● Python 封裝的 R 語言包,比如 rpy2、pyRserve、Rpython 等(rpy2的插件能讓你在 Jupyter notebook 裏寫 R 代碼)

● R 語言的其他實現,比如 rPython、PythonInR、reticulate、 rJython、 SnakeCharmR 以及 XRPython 等(這裏有一個關於 reticulate 的介紹:https://blog.rstudio.com/2018/03/26/reticulate-r-interface-to-python/

● 直接在 Jupyter Notebook 裏把它們混着用,比如下面這樣:

上面這樣處理完之後,我們就可以把 pandas 的 dataframe 對象傳給 ggplot2,它將會通過 rpy2 插件自動轉換成一個 R 語言的 Dataframe。(需要傳入 -i df 開關參數)

以上腳本的源代碼見:http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a

誰更愛用 R,誰更愛 Python ?

數據科學雲服務 Kaggle 上有人寫了一個項目,用來預測一個分析師更愛用 R 還是 Python。根據觀測到的數據,他提出了幾個有趣的結論:

● 如果你接下來的一年內考慮遷移到 Linux,你更有可能是 Python 用戶。

● 如果你學的是統計學,那你更可能用 R,而如果你學的是計算機科學,那基本 Python 沒跑了。

● 如果你比較年輕(比如18-24歲),你更可能用 Python。

● 如果你參加代碼大賽,你更可能用 Python。

● 如果你接下來想要弄個機器人什麼的,你更可能用 Python。

● 如果你接下來想要學 SQL,你更可能用 R。

● 如果你習慣用微軟的 Office,你更可能是 R 語言的用戶。

● 如果你想要搞個樹莓派,你更可能用 Python。

● 如果你是個全日制學生,你更可能用 Python。

●如果你用敏捷方法,你更可能用 Python。

● 如果你對人工智能表示擔心,而不是興奮,那你很有可能用 R 語言。

關於選擇傾向

當我和著名的 Googler 兼 Stack Overflow 大佬 Alex Martelli 合作時,他曾跟我解釋過,爲啥 Google 初創時只用那幾種他們官方支持的語言。即使在 Google 這樣充滿自由創新精神的地方,似乎還是有這樣一些限制的。有些選擇是由整個公司的傾向所決定的。

但對於一個企業,一個社團來說,總得有人做第一個吃螃蟹的人。比如我就認識那個在Deloitte(德勤)裏第一個用 R 的傢伙,他現在還沒跳槽,已經是首席數據科學家了。

因此,我個人的總體建議是(劃重點),跟隨自己內心的喜好,正視自己的選擇,在團隊裏做到最好,並熱愛自己的事業。

另外,給初入行數據科學領域的新人一點忠告。雖然我從來就不是一個唯工具優先論者,但如果你需要處理一些很重要的東西,倘若不經過認真分析,隨便亂選一個工具,可不是什麼明智的事情。

沒錯,錯誤是難免的。然而,每一個設計良好的數據科學項目,都給未來的數據科學家留下了一些空間。試着利用這些項目,學習、嘗試,提升自己,保持開放的心態,擁抱多樣性吧。

最後,我承認,我主要還是依賴 Python,不過我也在不斷學習關於 R 語言的知識,不管有沒有和 Python 一起,這兩門語言都值得你花時間瞭解一下。

發佈了424 篇原創文章 · 獲贊 2872 · 訪問量 91萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章