R開發人員使用Python
如果您用R語言工作,並且對使用Python感到好奇,但您卻不太了解如何開始,這篇博文就很適合你。我遇到了很多想要嘗試Python的R用戶,但是他們卻沒有時間來確定他們需要了解哪些軟體包以及使用哪種編碼環境。
在本文中,我將介紹在Python中建立統計計算所需的所有基本軟體包,並儘可能直接與R語言進行比較。
在本文的末尾,您應該已經具備了一個編程環境。為此,我將跳過許多Python語言特性和包,您稍後可能會發現這些特性和包很有用,不過在相關的地方,我將鏈接到更廣泛的文檔。我希望這篇文章能提供足夠的基礎,讓您知道如何在這個基礎上構建更高級的用例。
我假設您熟悉R語言、熟悉命令行,但不熟悉Python。
安裝Python(通過Anaconda)
安裝Python最簡單的方法是安裝Anaconda。就我們的目的而言,您可以將Anaconda視為Python的容器。特別是,它包括numpy,scipy,jupyter,以及許多其他有用的軟體包,其中一些將在稍後使用介紹。
要安裝anaconda,請訪問其下載頁面並按照操作系統的說明進行操作。它們的安裝包下載需要一段時間才能完成,運行也需要一段時間(因為它會下載所有相關的軟體包)。在最後時刻,它會詢問您:
一定要選擇yes。這將會給您打開一個新的終端窗口,當您在命令行中引用python,jupyter或任何其他包含python的安裝包時,都會被發送到Anaconda中去安裝這些包。
在Jupyter編輯器中編寫Python代碼
Jupyter編輯器提供了一個令人難以置信的互動式環境來編寫Python代碼。無需知道太多的細節,您就可以使用jupyter編輯器運行和編輯您的python代碼。它允許您對你的代碼排版,並按照您的排版顯示。瀏覽器將它們呈現為漂亮的文檔,並且可以將它們導出為PDF或HTML文件。R語言中不太注意排版,這點差異還是很明顯的。
開始時,請為您的Python代碼創建一個新的目錄。在終端中導航到該目錄,然後鍵入jupyter notebook。這將啟動一個新的jupyter編輯伺服器,您可以用localhost:8888在你的機器上訪問。然後,您可以在該伺服器上創建一個新的文本文件。這將在您的文件系統中創建一個*.ipynb文件,它將映射到您的瀏覽器中顯示。
要關閉jupyter伺服器,請返回到您的終端並點擊 Ctr-c Ctr-c。
下面是我經歷所有這些步驟的GIF,並顯示已創建的.ipynb文件。
GIF
最後您會注意到在瀏覽器中彈出連接失敗的提示。那是因為我們關閉了jupyter伺服器,所以沒有什麼可以連接的了。
現在您知道如何讓一個jupyter編輯的程序運行起來。當我們看更多的帖子時,我們將學習更多jupyter編輯器的功能。
List
最基本的一種python數據結構被稱為list。就像在R中一樣,Python列表可以由不同類型的元素組成,只是表示一個有序的集合。
我聽R族人說,您不能用Python來矢量化操作,他們可能已經從列表中嘗試這樣的想法得到了這個結論:
這裡所做的事情是,python只是重複您的列表兩次,這是對列表的乘法運算相當合理的解釋。順便提一句,R中試圖將列表乘以數字的結果是:
好吧,好吧。但是我們真正關心的是將一個R中的向量乘以一個數字:
為了在Python中矢量化操作,我們必須引入numpy包。Numpy包中的「數組」大致等於R向量。
載入包
首先,快速放下。Python是一種通用的編程語言。由於這個原因,它不會自動載入很多Python用戶不需要的統計庫(同樣,它不會載入大量的Web開發庫,您可能不會每天都使用它)。這意味著我們將不得不載入軟體包以獲取R中默認提供的許多功能。
要在Python中載入一個包,我們使用一個import語句:
這大致相當於在R中載入一個包:
在這種情況下,有兩點值得指出。首先,當您在R中載入一個包的時候,它將載入所有包到您的全局函數中。換句話說,如果您載入,例如,MASS庫,然後您想調用該glm.nb函數,您可以指定該函數來自MASS空間MASS::glm.nb(...)。但是您不需要; 您也可以直接調用該函數的glm.nb(...)。
Python的處理有所不同。為了盡量減少命名衝突,您必須引用特定包中的函數和包的名字。例如,如果我們用import numpy語句載入numpy,為了獲得這個array 函數,我們必須輸入numpy.array(...)。
因為輸入長包名稱會很繁瑣,所以可以用更簡短的名稱將包名稱化。在這種情況下,通過使用import numpy as np,我們告訴Python,每當我們鍵入np,我們其實是指numpy,所以我們可以調用numpy的數組函數np.array(...)。
我將在這篇文章中引用的所有軟體包的別名,這些別名是社區長期以來已經公認了的別名,我將在這篇文章中使用它們。
Numpy數組(就像R向量)
現在我們已經載入了這個numpy包,我們可以創建numpy數組。在大多數情況下,這些行為與R向量很相似。
為了構建一個簡單的numpy數組,我們可以傳遞一個列表給numpy的數組函數:
讓我們來看看numpy數組像R矢量一樣的情況:
所以,一般來說,當您認為您需要一個R向量時,就用numpy的數組。
R中的許多數值函數都可以在numpy中找到。所以要取一個numpy數組的平均數,我們可以使用numpy的mean函數。
樣本方差,標準偏差,計算協方差等也是如此。如果您需要做任何事情來計算數組中的值,只需在谷歌搜索中輸入「用numpy怎麼做X」。
另外,這個指導R用戶手冊的numpy似乎涵蓋了更多的內容。
拋開Jupyter
回到您的jupyter編輯器嘗試一下。像以前一樣啟動jupyter編輯伺服器jupyter notebook,並開始運行代碼。
您可以將上面的Python代碼複製到編輯器的第一個單元格中,然後點擊 Shift+Enter運行該代碼段。我將在下面用GIF進行演示。
GIF
矩陣
python中的矩陣只是2維的numpy數組。我們可以通過傳遞numpy數組函數列表來創建一個矩陣。每個內部列表將被視為矩陣的一行。
您可以用@符號讓矩陣乘以矩陣。
生成序列
生成序列的兩個非常有用的numpy函數是np.linspace和np.arange。
這些都對應於R的seq函數。
linspace接受開始和結束參數,並且有一個可選參數,可以設置返回數組的長度。默認情況下,它會返回的陣列長度為50,linspace功能類似於使用seq函數,並設置參數length。
arange對應於僅使用起始點和停止點的seq,當然也可以增加一個參數by。
繪製
Python中的核心繪圖庫是matplotlib,我們用它來繪製一些東西,因為我們還沒有讀取數據,所以讓我們回到numpy來生成一些數據。
我們將使用numpy的sin函數和上面的序列生成函數來繪製正弦波。幾乎所有(如果不是全部的話)在基礎R(sin,exp,log等)中可用的向量化函數也可以在numpy中使用。
首先,我們必須導入matplotlib。接下來,為了讓圖形在jupyter編輯器內聯顯示,我們需要輸入一個特殊的符號,如下所示:
接下來,我們生成0到2π的x值,並將這些x值和x的正弦函數值繪製成我們自己的圖形。
GIF
您也可以通過使用plt.scatter和直方圖來輕鬆繪製散點圖plt.hist。
如果您正在尋找一種更高級的繪圖包,您可能需要去看看R的seaborn軟體包。
Dataframes
Python Dataframes是在pandas包中實現的 ,它提供了將數據讀入python的最簡單的方法。
pandas文檔提供了pandas Dataframes和R Dataframes之間大量的比較,以及如何用pandas完成與普通R包相同的事情。
為此,我們需要讀取一些數據。 如您所料,pandas的read_csv函數將把一個csv文件讀取到pandas Dataframes中。上述情況,我們是從URL中讀取一個csv文件,當然也可以直接讀取一個本地的csv文件。
我們使用來自github的數據:https://raw.githubusercontent.com/fivethirtyeight/data/master/most-common-name/new-top-firstNames.csv
我們可以用如下方法讀取數據:
我們使用index_col參數是因為我們載入的數據已經在第一列有一個索引列,所以我們不希望pandas默認添加另外一個索引。
我們使用0來表示第一列而不是1的原因是,python與R不同,但與幾乎所有其他編程語言一樣,python是零索引的,這將會適用所有你要使用索引選擇數據的時候。
很好,現在我們有數據了。假設我們只想要超過0.5%的人口的名字。對數據進行子集化的一種方法是創建掩碼,就像在R中的做法那樣。
這裡,data["newPerct2013"] > .005表達式是創建一個True和False值的數組,然後我們使用它來只選擇該數組中True值的那些行。
然而,在pandas中查詢的方法越來越多,這只是其中的一種方法:
現在我們來說說假如我們想知道一百個最受歡迎的嬰兒名字佔總人口數的百分比。
GIF
當然,我們可能還想對DataFrames做其它的操作,除了上面提到的以R文檔外, pandas文檔也相當地不錯。
統計功能
Python的統計功能和R中的dnorm很相似,qnorm是scipy.stats包中的函數。
對於許多已經發行的版本,這個軟體包提供了隨機生成變數的方法,計算分布,任意點的pdf和log pdf,計算quatiles等等的函數。就像在R中一樣,這些函數是矢量化的。
這幾乎適用於任何分布,而不僅僅是正態分布。scipy中的大多數發行版本也提供了更多的方法。請參閱有關正態分布的文檔。
統計模型
最後,許多內置於R中的統計模型可以在python statsmodels包中找到。我們來看一下泊松分布的線性模型。
首先,我們生成數據。
其次,我們可以看看我們生成數據的plt.plot(x, y)。
之後,我們載入statsmodels。有一點需要注意的是,與R的glm不同,statsmodels不會自動使用截距的模型。幸運的是,它提供了一個用於向設計矩陣中添加常量的實用函數,我們可以使用該矩陣來擬合具有截距的模型。
最後我們可以看看它是否合適fit.summary()。擬合對象具有許多與R的擬合對象相同的性質,包括偏差、殘差,模型對設計矩陣的估計等等。它還具有predict預測新觀察結果的方法。
GIF
對於來自R的人來說,statsmodels公式api提供了非常類似R的體驗(包括默認擬合截距)。我建議看看這個操作指南,如何從R轉換到statsmodels。
獲得幫助
Jupyter編輯器提供了查看函數的文檔,如果在一個函數名稱後面寫一個問號,然後運行。
例如:
將會彈出numpy的linspace函數的文檔。
Jupyter編輯器也有補全名稱的功能,所以在輸入軟體包名稱之後,按Tab鍵就給出所有你可以使用的函數名稱的概覽。
如果不想在瀏覽器使用,更喜歡在命令行使用,你可以使用ipython,ipython是一個很好的python編輯工具。在這篇文章中提到的一切都可以用在它上面。
更一般地說,有大量的資源可以用來深入了解這些主題。
結論
對於那些對統計計算感興趣的人來說,Python和R都有很多工具可供使用。我希望這篇文章有助於降低R開發者的Python入門障礙。我的目標是提供一個總體概述,哪些工具可能使R開發人員感覺更容易使用,並為探索Python系統進行統計計算提供基礎。如果您有任何更好的建議,或者發現任何錯誤,請聯繫我們!
※學數據分析到底要不要掌握Linux-Python基礎前傳(2)
TAG:Python |