在許多教程或手冊中,敘述似乎暗示R和python作為分析過程的補充組件共存。但是,對我而言,這兩種語言似乎在做同樣的事情。
所以我的問題是這兩種語言是否真的有專門的細分市場,或者使用一種或另一種只是個人喜好?
在許多教程或手冊中,敘述似乎暗示R和python作為分析過程的補充組件共存。但是,對我而言,這兩種語言似乎在做同樣的事情。
所以我的問題是這兩種語言是否真的有專門的細分市場,或者使用一種或另一種只是個人喜好?
它們是互補的。確實,兩個都可以做,但是大多數語言都可以做到這一點。每個都有其優點和缺點。普遍的看法是,Python最適合用於數據收集和準備以及文本分析。 R被認為是進行數據分析的最佳選擇,因為它首先是一種統計語言。
R包含各種您可以想到的東西的大雜燴,但是它的主要內容是統計分析-從基本的卡方分析到因子分析以及危害模型,它簡單而強大。統計中的一些知名人士創建了R程序包,並且它有一個活躍的社區來滿足您的各種需求。 ggplot2
是數據可視化(圖形等)的標準。 R是向量化語言,旨在有效地遍歷數據。它還將所有數據存儲在RAM中,這是一把雙刃劍-它在較小的數據集上比較快(儘管有些人可能會與我爭論),但它不能很好地處理大數據(儘管它具有繞過此包的軟件包) ,例如 ff
)。
Python比R容易得多-特別是對於那些以前有編程經驗的人。 R只是...很奇怪。 Python擅長數據檢索,並且是用於Web抓取的語言(帶有令人驚嘆的 beautifulsoup
)。 Python以其在字符串解析和文本處理方面的優勢而聞名。 pandas
是用於數據處理,合併,轉換等的出色庫,並且速度很快(可能受R啟發)。
當您需要進行一些編程時,Python很棒。這並不奇怪,因為它是通用語言。但是,R及其所有擴展都是由統計學家為統計學家建立的。因此,儘管Python在許多應用程序中可能變得更容易,更好,更快,但R將成為統計分析的首選平台。
我將嘗試使用這兩種語言的人來提出答案,以解決這兩種語言在數據科學/統計/數據分析等方面發揮作用的要點。
數據分析的工作流程通常包括以下步驟:
99%的時間裡,獲取數據的過程歸結為查詢某種SQL或Impala數據庫:Python和R都有特定的客戶端或庫,這些客戶端或庫可立即且同樣出色地完成工作( RImpala
,用於R的 RmySQL
和用於Python的 MySQLdb
可以正常工作,實際上並沒有增加太多)。在讀取外部.csv文件時,用於R的 data.table
程序包提供了 fread
函數,該函數可以讀取大型複雜的.csv文件,並在其中包含任何自定義解析選項。沒有時間,並將結果直接轉換為具有列名和行號的數據框。
我們希望將數據存儲在某種表中,以便我們可以輕鬆訪問任何單個條目,行或列。
R包 data.table
提供了無與倫比的方式來標記,重命名,刪除和訪問數據。標準語法非常類似於SQL,如 dt [i,j,fun_by]
,其中意為 dt [where_condition,select_column,grouped_by(或類似名稱)] 代碼>;可以在其中以及
j
子句中放置自定義的用戶定義函數,這樣您就可以完全自由地操作數據並將任何復雜的或複雜的函數應用於組或子集(例如第i行,第k個元素,並將其求和到第(i-1)行的第(k-2)個元素,當且僅當整列的標準偏差為“是”時,完全按最後一列分組)。看看基準和關於SO的另一個令人驚奇的問題。對列和行進行排序,刪除和重命名就可以完成它們,標準的矢量化R方法 apply,sapply,lapply,ifelse
可以對列和數據幀執行全部矢量化操作,而無需循環遍歷每個元素(請記住,每當您在R中使用循環時,都會犯錯)。
Python的反武器是 pandas
庫。最後,它提供了一種結構 pd.DataFrame
(標準Python缺少這種結構,由於某種原因我還是不知道),該結構將數據按其本身來對待,即數據幀(而不是某些 numpy數組,numpy列表,numpy矩陣
或其他)。分組,重命名,排序等操作很容易實現,在這裡,用戶也可以使用Python apply
或 lambda
。我個人不喜歡語法 df [df.iloc(...)]
來訪問條目,但這只是個人喜好,完全沒有問題。分組操作的基準仍然比R data.table
差一點,但是除非您想節省0.02秒的編譯時間,否則性能不會有太大差異。
R處理字符串的方法是使用 stringr
包,該包允許輕鬆進行任何文本操作,字謎,正則表達式,尾隨空格或類似操作。它也可以與JSON庫結合使用,這些JSON庫解壓縮JSON字典並取消列出其元素,從而使人們擁有一個最終的數據幀,其中的列名和元素是它們所必須的,而沒有任何非UTF8字符或空白在那裡。
Python的Pandas .str。
在處理正則表達式,尾隨或其他方面都表現出與競爭對手相同的工作,因此即使在口味上也沒有太大差異。
在我看來,這是兩種語言之間出現差異的地方。
R擁有無與倫比的庫集,這些庫使用戶基本上可以在一到兩行代碼中完成他們想要的任何事情。標準函數或多項式回歸以單線執行,並產生其係數易於閱讀的輸出,以及相應的置信區間和p值分佈。同樣對於聚類,對於隨機森林模型,對於樹狀圖,主成分分析,奇異值分解,對數擬合,等等。上面每一個的輸出很可能帶有一個特定的繪圖類,該類生成可視化的可視化內容,並用顏色和氣泡表示係數和參數。假設檢驗,統計檢驗,Shapiro,Kruskal-Wallis等可以通過適當的庫以一行代碼進行。
Python試圖跟上 SciPy
和 scikit-learn
。大多數標準分析和模型也都可用,但它們的編碼時間稍長,而讀取則不太直觀(我認為)。雖然可以追溯到已經存在的庫的某些組合,但是缺少更複雜的機械。我更喜歡在Python中而不是在R中做的一件事是使用二字組,三字組和更高階的詞袋文本分析。
這兩種語言都有漂亮的繪圖工具,首先是R ggplot2
和相應的Python等效項。雖然競爭並不多,但它們可以安全可靠地完成工作,儘管我相信,如果您要展示結果,則可能必須使用其他工具-那裡有花哨的色彩繽紛的設計工具,而且沒有Python R也不用花哨的紅色和綠色拖放來使觀眾驚訝。 R最近在其 shiny應用
功能上發布了許多改進,這些改進基本上使它能夠生成交互式輸出。我從不想學習它,但我知道它在那里而且人們很好地使用了它。
作為旁注,我想強調指出,兩種語言之間的主要區別在於Python是通用編程語言,由計算機科學,可移植性,部署等製成,並由它們製成。它的功能很棒,而且學習起來很簡單;沒有人不喜歡python。但這是一種進行編程的編程語言。
另一方面,R是由數學家,物理學家,統計學家和數據科學家發明的,並且是為他們而創造的。如果您來自那個背景,那麼一切都會非常有意義,因為它完美地反映和重現了統計和數學中使用的概念。但是,如果相反,您是計算機科學背景的,並且想在R中模擬Java或C,您將很失望。它沒有標準意義上的“對象”(嗯,有,但是沒有人通常認為的...),它沒有標準意義上的類(是,但沒有通常意義上的類)認為它們是……),它沒有“指針”或所有其他計算機科學結構-只是因為它不需要它們。最後但並非最不重要的一點:文檔和軟件包很容易創建和閱讀(如果使用Rstudio);那裡有一個龐大而熱情的社區,而Google花費大約五秒鐘的時間“如何在R中執行插入隨機問題”,其第一項將您重定向到具有相應代碼的問題的解決方案(由他人完成) ,很快。大多數工業公司的基礎設施都使用Python(或Python友好環境)構建,可以輕鬆集成Python代碼(只需在任何地方 import myAnalysis
即可完成)。但是,任何現代技術,服務器或平台都可以輕鬆運行後台R代碼,而不會出現任何問題。
Python是一種通用的編程語言:因此,它除了執行數據分析外,還可以執行許多其他任務。例如,如果我們要在生產服務器中自動化模型執行,那麼python是一個很好的選擇。其他示例包括連接到硬件/傳感器以讀取數據,與數據庫進行交互(諸如JSON之類的關係或非結構化數據),解析數據,網絡編程(TCP / IP),圖形用戶界面,與Shell進行交互等(嗯,數據科學家為什麼要執行這麼多與預測模型無關的任務呢?我認為人們有不同的定義什麼是數據科學家?在某些組織中,數據並使用儀表板進行描述性分析對於業務而言已經足夠好,數據對於進行預測模型而言還不夠成熟;另一方面,在許多小型公司中,人們可能希望數據科學家進行大量的軟件工程。讓您獨立於其他軟件工程師。)
R有很多統計軟件包,它們比python或MATLAB好得多。通過使用R,人們可以真正地在模型級別而不是實現細節級別進行思考。這是開發統計模型的巨大優勢。例如,許多人正在python中手動實現神經網絡。進行此類工作可能無法幫助您理解神經網絡為何起作用,而只是按照配方復制他人的工作以檢查其是否起作用。如果我們使用R語言,則可以輕鬆地關注模型背後的數學,而不是實現細節。
在許多情況下,人們會一起使用它們。使用python可以輕鬆構建軟件,而使用R可以輕鬆構建模型。如果我們要在生產環境中交付模型而不是紙質文件,則可能需要兩者。如果您的公司有很多軟件工程師,則可能需要更多的R。如果您的公司有很多研究科學家,則可能需要更多的python。
各個階層的程序員低估了文化的語言選擇。像Node.js這樣的Web開發人員。科學家喜歡Python。作為一名能夠同時處理Javascript的流暢性和Java的剛性的多語言軟件工程師,我意識到這些語言對彼此的工作不利並沒有內在的原因-只是大量的軟件包,文檔,社區,書籍,等等。
(出於內在原因,一種隨機語言要比其他某種語言更好,請參見即將對此答案發表的評論。)
我個人的預測是Python是未來的方式,因為它可以完成R可以做的所有事情-或更確切地說,R可以做的一切足以讓專門的程序員努力填補空白-並且是 far 更好的軟件工程語言。軟件工程是一門涉及以下領域的學科:
坦率地說,Python更易於學習。
科學家和統計學家將意識到他們是良好軟件工程實踐的利益相關者,而不是獨立且不受干擾的職業。只是我的看法,但是證明學術準則易碎的論文將支持這一點。
這個答案是我的全部觀點-但您提出了一個非常自以為是的問題,並且由於到目前為止它已廣為接受,所以我認為您應該得到一個樸實無華,合理的(我希望!)觀點作為回應。對於Python來說,關於R的爭論是很嚴重的,當現實本身可能是黨派的時候,我會拒絕發布無黨派的答案。
我是R用戶,但我認為Python是未來(我不認為這是語法)
Python是未來
Python的好處在於,其他人已經提到了更廣泛的支持,並且對於程序員來說,邏輯語法也更豐富。
同樣,您可以將分析結果轉化為生產系統的功能也更加簡單。
也許是因為Python是通用的,而不是R,但是當我看到生產化的R管道時,我甚至大為驚訝。
不僅如此,即使對於高級應用程序,Python也在迅速趕上(Scikit-learn,PyBrain,Tensorflow等),而R在如何實現統計方法方面仍然是學術界的通用語言,由於先進的專業圖書館的出現。
但是R還不錯
許多人似乎喜歡跳上“ R語法不好”的潮流。
我希望提出R的語法是一件好事!
使用R時,賦值函數,惰性評估,非標準評估和公式具有很大的優勢。
它只是節省了很多時間,不必擔心轉義摘要中引用的變量名或擔心如何針對什麼建模邏輯或使用 names()
查看名稱,然後分配新的名稱通過添加 <- c(“ A”,“ B”,“ C”)
來命名。
當人們抱怨R的怪異語法時,他們將其視為一種編程語言,而不是一種數據科學工具。
作為來自R並熱愛dplyr的人,與之相比,我發現pandas的語法有點笨拙。
是的,它稍微靈活一些,但是對於大多數任務,執行一次簡單命令要比在R中花費更多的擊鍵,而這僅僅是為了滿足Python的解析器,而不是表達您的想法。
摘要
當然,兩者都知道是明智的,而在Python到達那裡的同時,R的特定領域的設計選擇只是使其在臨時工作中更加簡單。R的巨大缺點在於,很難離開它的領域,一旦嘗試以可持續的方式實施您的發現,基本上就必須這樣做。
如果您將R視為統計工具而不是編程語言,那確實很棒。它比Stata或SPSS具有更大的靈活性,但也可以盡其所能。我在大學期間學習了Stata,並且R很容易看,因為我已經具有統計工具的視角,而不是其他人可能具有的純編程語言經驗。
我認為,當程序員是那些試圖學習和理解R的人時,R會變得沮喪。但是對於那些通過統計學背景進入R的人來說,這是一個很好的工具。
如果您已經是一名優秀的程序員,那麼Python就是很好的選擇。但是對於剛上大學的編程和統計學初學者來說,R是一個更好的選擇。實際上,偏愛哪種才更適合您的技能和興趣。
添加到一些先前的答案中
以我的經驗,沒有什麼比使用R的dplyr + tidyr,ggplot和Rmarkdown從原始數據獲取可呈現的結果更容易了。Python提供了很多功能,並且我正在越來越多地使用它,但是我肯定喜歡Hadley的軟件包結合在一起的方式。
如其他答案所述,Python是一種很好的通用編程語言,而R作為編程語言具有嚴重缺陷,但具有一組更豐富的數據分析庫。近年來,Python通過開發成熟的數據分析庫(例如scikit-learn)追趕R,而R永遠不會被修復。在實踐中,我幾乎所有內容都使用Python(實際上是 Hy),而對於比較深奧的方法(例如分位數回歸)(在Python的statsmodels中似乎無法實現),只使用R。從Python調用R有幾種方法。PypeR是一種非常簡單的軟件,我已經知道它可以在Windows服務器等惡劣環境中工作。
Edit:我鼓勵任何想對此進行進一步辯論的人與鏈接的文章的作者交談,而不是對此答案發表評論。
Python在科學之外被廣泛採用,因此您將從中受益。正如“ R的憤怒指南”所指出的那樣,R是由一個社區開發的,該社區必須一階零軟件開發人員。
我要說的是,今天R具有兩個主要優勢:在某些領域中一些真正成熟的高度專業化的軟件包,以及最新的可複制研究軟件包knitr。
Python似乎更適合其他所有內容。
這當然是一個意見,因為該線程中的幾乎所有內容都如此。我對此線程仍然存活感到驚訝。