1. 程式人生 > >做資料分析,Python和R究竟哪個更強?

做資料分析,Python和R究竟哪個更強?

 

作者: Enoch Kan
編譯: Mika
本文為 CDA 資料分析師原創作品,轉載需授權

 

幾十年來,研究人員和開發人員一直在爭論,進行資料科學和資料分析,Python和R語言哪種才是更好的選擇。近年來,資料科學在生物技術、金融和社交媒體等多個行業迅速發展。資料科學的重要性不僅得到了業內人士的認可,而且還得到了許多學術機構的認可,目前越來越多的學校都開始設立資料科學學位。

隨著開源技術的迅速取代了傳統的閉源技術,Python和R語言在資料科學中變得越來越受歡迎。


資料科學就業增長圖——Indeed.com

 

1. 簡介

Python由Guido van Rossum發明,於1991年首次釋出。Python 2.0於2000年釋出,8年後Python 3.0釋出。Python 3.0有一些主要的語法修正,與Python 2.0不相容。但是,2to3等Python庫可以在兩個版本之間自動的轉換。Python 2.0計劃在2020年停止使用。

R語言由Ross Ihaka和Robert Gentleman於1995年發明。R語言最初是由S語言的一種實現,後者由John Chambers於1976年發明。R語言首個穩定的測試版本1.0.0於2000年釋出。目前,由R開發核心團隊維護,最新的穩定版本為3.5.1。與Python不同,R在過去沒有需要語法轉化的重大變化。


Guido van Rossum (左) Ross Ihaka (中) Robert Gentleman (右)

Python和R都擁有龐大的使用者群體支援。根據Stack Overflow在2017年的調查顯示,近45%的資料科學家使用Python作為主要的程式語言。另一方面,11.2%的資料科學家使用R語言。


2017年開發者調查報告——Stack Overflow

值得注意的是,關於Python,特別是Jupyter Notebook在近年來備受追捧。雖然Jupyter Notebook可以用於Python之外的語言,但它主要用於在瀏覽器中記錄和展示Python程式,用於Kaggle等資料科學競賽。根據Ben Frederickson進行的一項調查顯示,Jupyter Notebook在Github上的月活躍使用者(MAU)的佔比在2015年後大幅上升。


GitHub使用者對程式語言的排名——Ben Frederickson

隨著近年來Python越來越受歡迎,我們觀察到在Github上使用R語言的月活躍使用者比例有所下降。

儘管如此,這兩種語言在資料科學家、工程師和分析師中仍然非常受歡迎。

 

2. 可用性

R最初用於研究和學術領域,如今它已不僅僅是一種統計語言。R可以從CRAN(Comprehensive R Archive Network)上輕鬆下載。CRAN還可用作包管理器,可以下載超過1萬多個包。R Studio等流行的開源整合開發環境(IDE)都可以用來執行R語言。

作為統計學專業的人,我承認在Stack Overflow上R語言有非常強大的使用者群體。在本科學習期間,我遇到的許多R相關問題都可以在=Stack Overflow的R語言標籤找到答案。如果你剛開始學習R語言,Coursera等線上課程上都有提供R以及Python的初級課程。

在本地計算機上設定Python工程環境也很容易。事實上,最近Mac 上安裝了內建的Python 2.7以及幾個有用的庫。如果你像我一樣是Mac使用者,我推薦你看Brian Torres-Gil的相關指南:

Definitive Guide to Python on Mac OSX https://medium.com/@briantorresgil/definitive-guide-to-python-on-mac-osx-65acd8d969d0

你還可以在Python的官網下載PyPI和Anaconda等開源Python包管理系統。同樣,Anaconda也支援R語言。 當然,大多數人更喜歡直接使用CRAN管理包。比起R語言,PyPI或Python通常有更多的包。但是,並不是每個都適用於統計和資料分析。

 

3. 視覺化

Python和R都具有出色的視覺化庫。由R Studio的首席科學家Hadley Wickham建立的ggplot2 如今是R歷史上最受歡迎的資料視覺化軟體包之一。我非常喜歡ggplot2的各種功能和自定義。與基礎的R圖形相比,ggplot2允許使用者在更高的抽象級別自定義繪圖元件。ggplot2提供的50多種影象適用於各種行業,我最喜歡的圖包括日曆熱圖,層次樹圖和叢集圖。關於如何使用ggplot2,Selva Prabhakaran有很棒的教程可供參考。


ggplot2中的日曆熱圖(左上角)、叢集圖(左下)和層次樹圖(右下)

Python也有出色的資料視覺化庫。Matplotlib及其seaborn擴充套件對視覺化和生成統計圖很有幫助。我推薦你檢視George Seif的相關視覺化文章,以便更好地理解Matplotlib。

與R的ggplot2類似,matplotlib能夠建立各種各樣的圖,比如直方圖、向量場流線圖、雷達圖等。Matplotlib最出色功能之一可能就是地形山體陰影效果,在我看來它比R raster的`hillShade()`功能更強大。


Matplotlib的山體陰影效果

R和Python都有Leaflet.js的包裝, Leaflet.js是用Javascript編寫的互動式地圖模組。Leaflet.js是我用過最好的開源GIS技術之一,因為它提供了與OpenStreetMaps和Google Maps的無縫整合。你還可以使用Leaflet.js輕鬆建立氣泡圖、熱圖和等值線圖。我強烈建議你試試絕對Python和R的Leaflet.js的包裝,與Basemap和其他GIS庫相比,這個更容易安裝。

Plotly對於Python和R都是很棒的圖形庫。Plotly(或Plot.ly)是用Python和Django框架構建的。它的前端是用JavaScript構建的,並集成了Python、R、MATLAB、Perl、Julia、Arduino和REST。如果你想構建web應用來展示視覺化,我建議你試試Plotly,因為它有帶滑塊和按鈕的互動式圖表。


使用鳶尾花資料集的Plotly相關圖

 

4. 預測分析

Python和R都有強大的預測分析庫。在高水平的預測建模中很難比較兩者的表現。R語言是專門用作統計語言編寫的,因此與Python相比,用R進行搜尋與統計建模要更容易。

在谷歌中搜索`logistic regression in R`能得到6千萬個結果,這是搜尋`logistic regression in Python`的37倍。但是,具有軟體工程背景的資料科學家使用Python更容易,因為畢竟R是由統計學家編寫的。同時我還發現,與其他程式語言相比,R和Python同樣易於理解。

對於Python和R哪個更適合進行預測分析,Kaggle使用者NanoMathias進行了非常相識的調查。他得出結論,在資料科學家和分析師中,Python和R使用者數量基本相同。他的研究中還發現,程式設計經驗超過12年的人更傾向於選擇R而不是Python。這表明程式設計師選擇R或Python進行預測分析只不過是他們的個人喜好。


嵌入縮放的線性判別分析,R和Python使用者

因此人們普遍認為這兩種語言在預測方面能力相似。但真是如此嗎?

讓我們使用R和Python將邏輯迴歸模型擬合到鳶尾花資料集,並計算其預測的準確性。之所以選擇鳶尾花資料集是因為它體積小,資料缺失少。在此我沒有進行探索性資料分析和特徵工程,我簡單地做了80-20的訓練測試的分割,用預測器來匹配邏輯迴歸模型。

```
library(datasets)
#load data
ir_data<- iris
head(ir_data)
#split data
ir_data<-ir_data[1:100,]
set.seed(100)
samp<-sample(1:100,80)
ir_train<-ir_data[samp,]
ir_test<-ir_data[-samp,]
#fit model
y<-ir_train$Species; x<-ir_train$Sepal.Length
glfit<-glm(y~x, family = 'binomial')
newdata<- data.frame(x=ir_test$Sepal.Length)
#prediction
predicted_val<-predict(glfit, newdata, type="response")
prediction<-data.frame(ir_test$Sepal.Length, ir_test$Species,predicted_val, ifelse(predicted_val>0.5,'versicolor','setosa'))
#accuracy
sum(factor(prediction$ir_test.Species)==factor(prediction$ifelse.predicted_val...0.5...versicolor....setosa..))/length(predicted_val)
```


R的glm模型準確率達到95%,還不錯。

```
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
#load data
traindf = pd.read_csv("~/data_directory/ir_train")
testdf = pd.read_csv("~/data_directory/ir_test")
x = traindf['Sepal.Length'].values.reshape(-1,1)
y = traindf['Species']
x_test = testdf['Sepal.Length'].values.reshape(-1,1)
y_test = testdf['Species']
#fit model
classifier = LogisticRegression(random_state=0)
classifier.fit(x,y)
#prediction
y_pred = classifier.predict(x_test)
#confusion matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print confusion_matrix
#accuracy
print classifier.score(x_test, y_test)
```


Python sklearn的邏輯迴歸模型準確率達到90%

使用R stat `glm`函式和Python scikit-learn的 `LogisticRegression` ,我將兩個邏輯迴歸模型擬合到鳶尾花資料集的隨機子集。在模型中,我們只使用了一個預測器`sepal length`來預測花朵種類 `species`。兩種型號都達到了90%以上的精度,其中R語言的效果更好。然而,這不足以證明R具有比Python更好的預測模型,邏輯迴歸只是Python和R構建的眾多預測模型中的一個。

Python超過R的一個方面是其出色的深度學習模組。流行的Python深度學習庫包括Tensorflow、Theano和Keras,而且這些庫有很多文字教程,同時Siraj Raval在Youtube上也釋出了多個教程。

說實話,我寧願花一個小時在Keras上對深度卷積神經網路進行程式設計,而不是花費半天時間來弄清楚如何在R中實現它們。同時Igor Bobriakov也有很多這方面的文章,我也推薦你去看看。


比較Python、R和Scala的頂級資料科學庫——Igor Bobriakov

 

5. 效能

測量程式語言的速度通常會有些偏差。每種語言都有針對特定任務的內建優化外掛(例如R語言對統計分析能進行優化)。可以通過多種不同方式完成對Python和R進行效能測試。我在Python和R中編寫了兩個簡單的指令碼,用來比較Yelp的學術使用者資料集的載入時間,該資料集略大於2GB。

R
```
require(RJSONIO)
start_time <- Sys.time()
json_file <- fromJSON("~/desktop/medium/rpycomparison/yelp-dataset/yelp_academic_dataset_user.json")
json_file <- lapply(json_file, function(x) {
x[sapply(x, is.null)] <- NA
unlist(x)
})
df<-as.data.frame(do.call("cbind", json_file))
end_time <- Sys.time()
end_time - start_time
#Time difference of 37.18632 secs
```

Python
```
import time
import pandas as pd
start = time.time()
y1 = pd.read_json('~/desktop/medium/rpycomparison/yelp-dataset/yelp_academic_dataset_user.json', lines = True)
end = time.time()
print("Time difference of " + str(end - start) + " seconds"
#Time difference of 169.13606596 seconds
```

R載入json檔案幾乎比Python快5倍。眾所周知,Python的載入時間比R快,正如Brian Ray的測試所證明的那樣。讓我們看看兩個程式如何處理大型.csv檔案,因為.csv是一種常用的資料格式。我們稍微修改上面的程式碼來載入 Seattle Library Inventory 資料集,大小約為4.5GB。

Seattle Library Inventory資料集
https://www.kaggle.com/city-of-seattle/seattle-library-collection-inventory/version/15

R
```
start_time <- Sys.time()
df <- read.csv("~/desktop/medium/library-collection-inventory.csv")
end_time <- Sys.time()
end_time - start_time
#Time difference of 3.317888 mins
```

Python
```
import time
import pandas as pd
start = time.time()
y1 = pd.read_csv('~/desktop/medium/library-collection-inventory.csv')
end = time.time()
print("Time difference of " + str(end - start) + " seconds")
#Time difference of 92.6236419678 seconds
```

與Python 的pandas相比,R載入4.5GB的.csv檔案的時間是前者的兩倍。雖然pandas主要是用Python編寫的,但是庫中更關鍵的部分是用Cython和C語言編寫的。這可能會對載入時間產生些影響,具體取決於資料格式。

下面讓我們做一些有趣的事情。

Bootstrapping是一種從群體中隨機重新取樣的統計方法。這是一個耗時的過程,因為我們必須反覆重新取樣資料以進行多次迭代。以下程式碼分別測試R和Python中進行引導10萬次bootstrapping所需的重複的執行時:

R
```
#generate data and set boostrap size
set.seed(999)
x <- 0:100
y <- 2*x + rnorm(101, 0, 10)
n <- 1e5
#model definition
fit.mod <- lm(y ~ x)
errors <- resid(fit.mod)
yhat <- fitted(fit.mod)
#bootstrap
boot <- function(n){
b1 <- numeric(n)
b1[1] <- coef(fit.mod)[2]
for(i in 2:n){
resid_boot <- sample(errors, replace=F)
yboot <- yhat + resid_boot
model_boot <- lm(yboot ~ x)
b1[i] <- coef(model_boot)[2]
}
return(b1)
}
start_time <- Sys.time()
boot(n)
end_time <- Sys.time()
#output time
end_time - start_time
#Time difference of 1.116677 mins
```

Python
```
import numpy as np
import statsmodels.api as sm
import time
#generate data and set bootstrap size
x = np.arange(0, 101)
y = 2*x + np.random.normal(0, 10, 101)
n = 100000
X = sm.add_constant(x, prepend=False)
#model definition
fitmod = sm.OLS(y, X)
results = fitmod.fit()
resid = results.resid
yhat = results.fittedvalues
#bootstrap
b1 = np.zeros((n))
b1[0] = results.params[0]
start = time.time()
for i in np.arange(1, 100000):
resid_boot = np.random.permutation(resid)
yboot = yhat + resid_boot
model_boot = sm.OLS(yboot, X)
resultsboot = model_boot.fit()
b1[i] = resultsboot.params[0]
end = time.time()
#output time
print("Time difference of " + str(end - start) + " seconds")
#Time difference of 29.486082077 seconds
```

R花了幾乎兩倍的時間來執行bootstrap。鑑於Python通常被視為“慢”程式語言,這是相當令人驚訝的。我開始後悔在完成本科統計學作業時使用R語言而不是Python。

 

結論

本文僅討論了Python和R之間的根本區別。就個人而言,我會根據手頭的任務選擇使用Python或R語言。最近,資料科學家一直在努力將Python和R 結合使用。在不久的將來,很有可能會出現第三種語言,並最終比Python和R更受到歡迎。作為資料科學家和工程師,我們有責任跟上最新技術並保持創新。

那麼你又更喜歡Python還是R語言呢?請給我們留言吧!!