歡迎光臨
每天分享高質量文章

如何用 Python 編寫你最喜歡的 R 函式?

(點選上方公眾號,可快速關註)


英文:Tirthajyoti Sarkar,翻譯:資料派THU/陳之炎


是用R語言還是用Python語言?這是一個曠日持久的爭論。在此,我們可以嘗試採用折中路線:建立一個Python指令碼,用該指令碼模仿R風格的函式,來方便地進行統計!



簡介


用R語言還是用Python語言?這是資料科學和機器學習的一場大的爭論。毫無疑問,這兩種語言在最近幾年都取得了巨大的進展,成為資料科學、預測分析和機器學習的首選程式語言。事實上,在IEEE新近的一篇文章中,Python取代C++成為2018年的頂級程式語言,R已經牢牢地保住了它在前10名中的位置。


然而,這兩種程式語言之間存在著一些本質的差異。R主要是為資料分析問題的統計分析和快速原型化而開發的工具。另一方面,Python作為一種通用的現代面向物件語言,與C或Java相似,它具有更簡單的學習曲線和更為靈活的行為方式。因此,R在統計學家、定量生物學家、物理學家和經濟學家中仍然非常受歡迎,而Python逐漸成為日常指令碼、自動化、後端web開發、分析和通用機器學習框架的首選語言,Python語言的技術支援基礎比較廣泛,同時還有許多開源社群。


如何在Python環境中模仿函式式程式設計?


R語言的函式程式設計特性為使用者提供了非常簡單有效地介面,用於快速計算機率,併為資料分析問題提供必要的描述性/推理統計。例如,僅僅使用一個緊致函式呼叫就能回答下麵的問題,這是不是很神奇?


  • 如何計算資料向量的平均/中值/模型?

  • 如何計算服從正態分佈的某一事件的累積機率?如果該分佈是泊松分佈,則如何計算?

  • 如何計算一系列資料點的四分位數間距?

  • 如何根據學生的t分佈生成少量隨機數?


在R語言程式設計環境中,這些您都能實現。


另一方面,Python指令碼編寫能使分析人員在各種分析管線中創造性地使用這些統計資料。


為了結合這兩種語言的優勢,需要設計一個簡單的基於Python的包裝類庫,它包含最常用的函式,這些函式涉及以R風格定義的機率分佈和描述性統計資訊,使用者可以快速地呼叫這些函式,而無需呼叫Python統計庫,並弄明白所有方法和引數。


最為便捷的R-函式的Python包裝類指令碼


我用Python編寫了一個指令碼,用來定義在簡單統計分析中最為便捷和最被廣泛使用的R函式。匯入這個指令碼之後,您將能夠像在R程式設計環境中一樣自然地使用那些R-函式。


這個指令碼的標的是利用簡單的Python子程式,來模仿R風格的統計函式,從而快速計算密度/點估計、累積分佈、分位數,併為各種重要的機率分佈生成隨機變數。為了保持R的風格,沒有使用類分層結構,只在該檔案中定義了一些原始函式,這樣使用者便可以方便地匯入這個Python指令碼,併在需要時使用所有函式,而僅僅只需做一個名稱的呼叫。


註意,在此使用了“模仿”這個詞。我並沒有聲稱要模仿R真正的功能程式設計正規化:那些由深層次的環境設定和這些環境與物件之間組成的複雜的相互關係。這個指令碼只允許我(同時也希望有無數其他Python使用者)能夠快速啟動Python程式或Jupyter筆記本(一種互動式筆記本,支援執行 40 多種程式語言)匯入指令碼,併在短時間內開始進行簡單的描述性統計。這就是標的,僅此而已。


或者,你可能已經會用R語言編碼,剛開始學習和使用Python進行資料分析。你可以高興地看到和使用Jupyter筆記本里的一些眾所周知的函式,這些都和你使用的R語言環境中的方法類似。


簡單實體

 

例如,如果需要計算資料點向量的TuKEY五數綜合。你只需呼叫一個簡單函式FiVunm並傳遞給向量,它便在一個Numpy陣列中傳回五數綜合(最小值;第1四分位數(Q1);中位數(Q2);第3四分位數(Q3);最大值。)。


lst=[20,12,16,32,27,65,44,45,22,18]
fivenum(lst)
> array([12. , 18.5, 24.5, 41. , 65. ])


或者,你想知道以下問題的答案:


假設一臺機器平均每小時輸出10件成品,標準差為2,輸出樣式服從近似正態分佈。在接下來的一小時內,機器輸出至少7臺但不超過12臺的機率是多少?


答案基本上是這樣,



利用pNorm…,只需要一行程式碼就可以得到答案。


pnorm(12,10,2)-pnorm(7,10,2)
> 0.7745375447996848


或者,對於如下問題:


假設你有一枚硬幣,每次拋硬幣的時候,都有60%的轉動機率,玩的是10次拋擲的遊戲。如何用這枚硬幣計算出所有可能的贏球數(從0到10)?


只需使用一個dbinom…函式和幾行程式碼就可以獲得一個很好的條形圖。


probs=[]
import matplotlib.pyplot as plt
for i in range(11):
    probs.append(dbinom(i,10,0.6))
plt.bar(range(11),height=probs)
plt.grid(True)
plt.show()



目前已經實現的函式


目前,已經實現了的、可以用於快速呼叫的R風格函式在以下指令碼中實現。


  • 均值、中值、方差、標準差

  • TuKEY五數綜合、矩陣的IQR

  • 矩陣的協方差或兩個向量之間的協方差

  • 密度、累積機率、分位函式和隨機變數生成,用於下列分佈:正態分佈,均勻分佈,二項分佈,泊松分佈,F分佈,Student’s-t分佈,卡方分佈,Beta分佈,和Gamma分佈


後續工作


這項工作還正在進行之中,我計劃在指令碼中新增一些更為便捷的R-函式。例如,在R單行命令中,lm可以得到一個最小二乘擬合模型,該模型具有所有必要的推斷統計量(P值、標準誤差等)。這將是多麼的簡短和緊湊!另一方面,Python中的標準線性回歸問題通常是使用Scikit-Learning來解決,需要用到更多的指令碼來實現它。我計劃使用Python的statsmodel後端結合這個單一函式線性模型來實現。

【關於投稿】


如果大家有原創好文投稿,請直接給公號傳送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章連結

② 示例:
【投稿】
《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/


③ 最後請附上您的個人簡介哈~

看完本文有收穫?請轉發分享給更多人

關註「資料分析與開發」,提升資料技能

贊(0)

分享創造快樂