[原]深入對比數據科學工具箱:Python和R之爭

作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息並註明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog/harryprinc...,如果涉及源代碼請註明GitHub地址:harryprince (HarryZhu) · GitHub。微信號: harryzhustudio

商業使用請聯繫作者。

概述

在真實的數據科學世界裡,我們會有兩個極端,一個是業務,一個是工程。偏向業務的數據科學被稱為數據分析(Data Analysis),也就是A型數據科學。偏向工程的數據科學被稱為數據構建(Data Building),也就是B型數據科學。

從工具上來看,按由業務到工程的順序,這個兩條是:EXCEL >> R >> Python >> Scala

在實際工作中,對於小數據集的簡單分析來說,使用EXCEL絕對是最佳選擇。當我們需要更多複雜的統計分析和數據處理時,我們就需要轉移到 Python 和 R 上。在確定工程實施和大數據集操作時,我們就需要依賴 Scala 的靜態類型等工程方法構建完整的數據分析系統。

Scala 和 Excel 是兩個極端,對於大多數創業公司而言,我們沒有足夠多的人手來實現專業化的分工,更多情況下,我們會在 Python 和 R 上花費更多的時間同時完成數據分析(A型)和數據構建(B型)的工作。而許多人也對 Python 和 R 的交叉使用存在疑惑,所以本文將從實踐角度對 Python 和 R 中做了一個詳細的比較。

應用場景對比

應用Python的場景

  • 網路爬蟲/抓取:儘管 rvest 已經讓 R 的網路爬蟲/抓取變得容易,但 Python 的 beautifulsoup 和 Scrapy 更加成熟、功能更強大,結合django-scrapy我們可以很快的構建一個定製化的爬蟲管理系統。

  • 連接資料庫: R 提供了許多連接資料庫的選擇,但 Python 只用 sqlachemy 通過ORM的方式,一個包就解決了多種資料庫連接的問題,且在生產環境中廣泛使用。Python由於支持佔位符操作,在拼接SQL語句時也更加方便。

  • 內容管理系統:基於Django,Python可以快速通過ORM建立資料庫、後台管理系統,而R

    中的 Shiny 的鑒權功能暫時還需要付費使用。

  • API構建:通過Tornado這個標準的網路處理庫,Python也可以快速實現輕量級的API,而R則較為複雜。

應用R的場景

  • 統計分析: 儘管 Python 里 Scipy、Pandas、statsmodels 提供了一系列統計工具 ,R 本身是專門為統計分析應用建立的,所以擁有更多此類工具。

  • 互動式圖表/面板: 近來 bokeh、plotly、 intuitics 將 Python 的圖形功能擴展到了網頁瀏覽器,甚至我們可以用tornado+d3來進一步定製可視化頁面,但 R 的 shiny 和 shiny dashboard 速度更快,所需代碼更少。

此外,當今數據分析團隊擁有許多技能,選擇哪種語言實際上基於背景知識和經驗。對於一些應用,尤其是原型設計和開發類,工作人員使用已經熟悉的工具會比較快速。

數據流編程對比

接著,我們將通過下面幾個方面,對Python 和 R 的數據流編程做出一個詳細的對比。

  1. 參數傳遞

  2. 數據讀取

  3. 基本數據結構對照

  4. 矩陣轉化

  5. 矩陣計算

  6. 數據操作

參數傳遞

Python/R 都可以通過命令行的方式和其他語言做交互,通過命令行而不是直接調用某個類或方法可以更好地降低耦合性,在提高團隊協作的效率。

對於數據傳輸與解析,我們首推的格式是csv,因為一方面,csv格式的讀寫解析都可以通過 Python 和 R 的原生函數完成,不需要再安裝其他包。另一方面,csv格式可以很快的轉化為 data frame 格式,而data frame 格式是數據流分析的核心。數據傳輸與解析

不過,實際情況中,我們需要傳輸一些非結構化的數據,這時候就必須用到 JSNO 或者 YAML。

由於是從科學計算的角度出發,R 中的數據結構非常的簡單,主要包括 向量(一維)、多維數組(二維時為矩陣)、列表(非結構化數據)、數據框(結構化數據)。而 Python 則包含更豐富的數據結構來實現數據更精準的訪問和內存控制,多維數組(可讀寫、有序)、元組(只讀、有序)、集合(唯一、無序)、字典(Key-Value)等等。

基本數據結構

矩陣操作

實際上,Python(numpy) 和 R中的矩陣都是通過一個多維數組(ndarray)實現的。

數據框操作

參考 R 中的 data frame 結構,Python 的 Pandas包也實現了類似的 data frame 數據結構。現在,為了加強數據框的操作,R 中更是演進出了 data table 格式(簡稱dt),這種格式以 dt[where,select,group by] 的形式支持類似SQL的語法。

數據流編程對比的示例

Python 的 Pandas 中的管道操作

(dfn .groupby([a, b, c], as_index=False)n .agg({d: sum, e: mean, f, np.std})n .assign(g=lambda x: x.a / x.c)n .query("g > 0.05")n .merge(df2, on=a))n

R 的 dplyr 中的管道操作

flights %>% group_by(year, month, day) %>%n select(arr_delay, dep_delay) nn summarise(nn arr = mean(arr_delay, na.rm = TRUE),nn dep = mean(dep_delay, na.rm = TRUE)) %>%nn filter(arr > 30 | dep > 30)n

數據可視化對比

繪製相關性散點圖

對比數據相關性是數據探索常用的一種方法,下面是Python和R的對比。

Python

import seaborn as snsnimport matplotlib.pyplot as pltnsns.pairplot(nba[["ast", "fg", "trb"]])nplt.show()n

R

library(GGally)nggpairs(nba[,c("ast", "fg", "trb")])n

雖然我們最終得到了類似的圖形,這裡R中GGally是依賴於ggplot2,而Python則是在matplotlib的基礎上結合Seaborn,除了GGally在R中我們還有很多其他的類似方法來實現對比製圖,顯然R中的繪圖有更完善的生態系統。

繪製聚類效果圖

這裡以K-means為例,為了方便聚類,我們將非數值型或者有確實數據的列排除在外。

Python

from sklearn.cluster import KMeansnkmeans_model = KMeans(n_clusters=5, random_state=1)ngood_columns = nba._get_numeric_data().dropna(axis=1)nkmeans_model.fit(good_columns)nlabels = kmeans_model.labels_nnfrom sklearn.decomposition import PCAnpca_2 = PCA(2)nplot_columns = pca_2.fit_transform(good_columns)nplt.scatter(x=plot_columns[:,0], y=plot_columns[:,1], c=labels)nplt.show()n

R

library(cluster)nset.seed(1)nisGoodCol <- function(col){n sum(is.na(col)) == 0 && is.numeric(col) n}ngoodCols <- sapply(nba, isGoodCol)nclusters <- kmeans(nba[,goodCols], centers=5)nlabels <- clusters$clusternnnba2d <- prcomp(nba[,goodCols], center=TRUE)ntwoColumns <- nba2d$x[,1:2]nclusplot(twoColumns, labels)n

速度對比

Python

import numpy as npnxx = np.zeros(100000000)n%timeit xx[:] = 1n

The slowest run took 9.29 times longer than the fastest. This could mean that an intermediate result is being cached n1 loops, best of 3: 111 ms per loopn

R

xx <- rep(0, 100000000)nsystem.time(xx[] <- 1)n

user system elapsed n 1.326 0.103 1.433n

顯然這裡 R 1.326的成績 比 Python 的 Numpy 3:111 的速度快了不少。

事實上,現在 R 和 Python 的數據操作的速度已經被優化得旗鼓相當了。下面是R中的 data.table、dplyr 與 Python 中的 pandas 的數據操作性能對比:

結論

Python 的 pandas 從 R 中偷師 dataframes,R 中的 rvest 則借鑒了 Python 的 BeautifulSoup,我們可以看出兩種語言在一定程度上存在的互補性,通常,我們認為 Python 比 R 在泛型編程上更有優勢,而 R 在數據探索、統計分析是一種更高效的獨立數據分析工具。所以說,同時學會Python和R這兩把刷子才是數據科學的王道。

參考資料

  • pandas doucumentation: Comparison with R / R libraries

  • Comparison – R vs. Python: head to head data analysis

  • Hacker News: Comparison – R vs. Python

  • Quora: How does R compare with pandas?

  • yhat: R and pandas and what Ive learned about each

  • Why are pandas merges in python faster than data.table merges in R?

  • Python和R科學計算操作速查表

  • 知乎:R 和 Python (numpy scipy pandas) 用於統計學分析,哪個更好?

  • Choosing R or Python for data analysis? An infographic

推薦閱讀:

全棧 - 7 爬蟲 Http請求和Chrome
數據在設計中的重要性
信貸數據探索(二)逾期客戶年齡特徵
還在用Excel做圖表?他們手繪的信息圖已經美出屏幕了
咦,我的 個人主頁動態 有點異常呢?

TAG:Python | R编程语言 | 数据 |