R vs Python để phân tích dữ liệu [đã đóng]


60

Tôi đã lập trình được khoảng một năm và tôi thực sự quan tâm đến phân tích dữ liệu và học máy. Tôi đang tham gia một vài khóa học trực tuyến và đang đọc một vài cuốn sách.

Mọi thứ tôi đang làm đều sử dụng R hoặc Python và tôi đang tìm kiếm gợi ý về việc tôi nên tập trung vào một ngôn ngữ (và nếu vậy) hay tiếp tục với cả hai; họ có bổ sung cho nhau không?

- Tôi nên đề cập rằng tôi sử dụng C # ở trường nhưng quen thuộc với Python thông qua việc tự học.


Đây có thể là một liên kết thú vị: coursera.org/cference/compdata
Giorgio

Câu trả lời:


39

Tôi sử dụng cả Python (để phân tích dữ liệu bao gồm cả numpy và scipy) và R cạnh nhau. Tuy nhiên, tôi chỉ sử dụng R để thực hiện phân tích dữ liệu và Python cho các tác vụ lập trình chung hơn (ví dụ: điều khiển quy trình làm việc của mô hình máy tính).

Về các hoạt động cơ bản, giả sử các hoạt động trên mảng và sắp xếp, R và Python + numpy rất tương đương nhau. Chính trong thư viện các hàm thống kê rất lớn mà R có lợi thế. Ngoài ra, matplotlib dường như không tốt bằng ggplot2, nhưng tôi chưa sử dụng matplotlib nhiều như vậy. Ngoài ra, tôi sẽ tập trung đầu tiên vào một ngôn ngữ và trở nên giỏi về các chi tiết cụ thể của ngôn ngữ đó. Bạn dường như rất quan tâm đến phân tích dữ liệu, không phải kỹ thuật phần mềm. Tôi sẽ chọn R và dính vào đó. Điều đó nói rằng, tôi nghĩ rằng việc chọn Python + numpy + scipy + scikit là sự lựa chọn chắc chắn và tuyệt vời, chỉ là tôi cảm thấy R chỉ xuất sắc hơn một chút.

Tôi cũng sẽ nhìn xung quanh bạn những gì đồng nghiệp của bạn và những người khác trong lĩnh vực của bạn đang sử dụng. Nếu tất cả đều sử dụng, giả sử, Python, sẽ hợp lý khi bám vào đó để dễ dàng học hỏi từ họ và trao đổi mã hơn.

Tuyên bố miễn trừ trách nhiệm: Lưu ý rằng tôi là người dùng R nặng, vì vậy ý ​​kiến ​​của tôi có thể bị sai lệch, mặc dù tôi đã cố gắng giữ câu trả lời của mình khách quan nhất có thể. Ngoài ra, tôi chưa sử dụng Python + numpy một cách rộng rãi, nhưng tôi biết các đồng nghiệp, những người thực hiện tất cả các phân tích dữ liệu của họ trong đó.

ps: Liên kết này có thể thú vị: http://seanjtaylor.com/post/39573264781/the-statistic-software-signal

pps: hoặc trích dẫn này từ bài viết này :

Tôi sử dụng R và Python cho tất cả các nghiên cứu của mình (với Rcpp hoặc Cython khi cần), nhưng tôi muốn tránh viết bằng C hoặc C ++ nếu tôi có thể tránh được. R là một ngôn ngữ tuyệt vời, phần lớn là do cộng đồng người dùng đáng kinh ngạc. Nó được tạo ra bởi các nhà thống kê, có nghĩa là phân tích dữ liệu nằm ở trung tâm của ngôn ngữ; Tôi coi đây là một tính năng chính của ngôn ngữ và một lý do lớn tại sao nó sẽ không được thay thế sớm. Python nói chung là một ngôn ngữ tổng thể tốt hơn, đặc biệt là khi bạn xem xét sự pha trộn của lập trình chức năng với hướng đối tượng. Kết hợp với Scipy / Numpy, Pandas và statsmodels, điều này mang đến sự kết hợp mạnh mẽ. Nhưng Python vẫn thiếu một cộng đồng nghiêm túc gồm các nhà thống kê / toán học.


3
Nói rằng R mạnh hơn Python, ý bạn là Python + numpy / blaze + scipy hay Python đơn giản?
9000

5
Ý tôi là Python + numpy có, nếu không sự lựa chọn sẽ còn dễ dàng hơn nữa. Tôi nghĩ về các hoạt động cơ bản, nói rằng các hoạt động trên mảng và sắp xếp, R và Python + numpy là rất tương đương. Chính trong thư viện các hàm thống kê rất lớn mà R có lợi thế. Ngoài ra, matplotlib dường như không tốt bằng ggplot2, nhưng tôi chưa sử dụng matplotlib nhiều như vậy.
Paul Hiemstra

Điều đó nói rằng, tôi nghĩ rằng việc chọn Python + numpy + scipy + scikit là sự lựa chọn chắc chắn và tuyệt vời, chỉ là tôi cảm thấy R chỉ xuất sắc hơn một chút.
Paul Hiemstra

@PaulHiemstra - Bạn đưa ra một số điểm hay trong nhận xét của mình có thể sẽ cải thiện câu trả lời của bạn - nếu câu hỏi được mở lại và bạn có cơ hội đó.
psr

@psr Tôi đã chỉnh sửa trong các nhận xét của mình, dường như không cần mở câu hỏi nếu tôi muốn chỉnh sửa nó (có lẽ chỉ tôi mới có thể chỉnh sửa nó ...).
Paul Hiemstra

36

Bối cảnh: Tôi là một nhà khoa học dữ liệu tại một công ty khởi nghiệp ở Austin và tôi đến từ trường cấp ba (Vật lý). Tôi sử dụng Python hàng ngày để phân tích dữ liệu, nhưng sử dụng R một chút. Tôi cũng sử dụng C # /. NET và Java (chỉ khoảng hàng ngày), tôi đã sử dụng C ++ rất nhiều ở trường học.

Tôi nghĩ vấn đề chính của việc sử dụng Python cho số (trên R) là quy mô của cộng đồng người dùng. Vì ngôn ngữ đã tồn tại mãi mãi, rất nhiều người đã làm những việc mà bạn có thể muốn làm. Điều này có nghĩa là, khi gặp vấn đề khó khăn, bạn chỉ cần tải gói và đi làm. Và R "chỉ hoạt động": bạn cung cấp cho nó một bộ dữ liệu và nó biết những thống kê tóm tắt nào hữu ích. Bạn cung cấp cho nó một số kết quả, và nó biết những gì bạn muốn. Tất cả các âm mưu phổ biến bạn muốn thực hiện đều có ở đó, thậm chí một số cốt truyện bí truyền mà bạn sẽ phải tìm kiếm trên Wikipedia. Đẹp như scipy / numpy / pandas / statsmodels / vv. là dành cho Python, chúng không ở cấp độ của thư viện chuẩn R.

Ưu điểm chính của Python so với R là ngôn ngữ lập trình thực sự trong họ C. Nó dễ dàng thay đổi, do đó, có thể hiểu được rằng bất cứ thứ gì bạn có trong hộp cát của bạn đều có thể được sử dụng trong sản xuất. Python có Object Orientation nướng, trái ngược với R nơi mà nó cảm thấy giống như một suy nghĩ lại (bởi vì nó là). Có một số thứ khác mà Python cũng làm rất tốt: xử lý luồng và xử lý song song khá dễ dàng và tôi không chắc đó có phải là trường hợp của R. Và học Python cũng cung cấp cho bạn một công cụ kịch bản mạnh mẽ. Ngoài ra còn có các IDE thực sự tốt (miễn phí) cho Python, những IDE tốt hơn nhiều nếu bạn sẵn sàng trả (dưới 100 đô la) và tôi không chắc đây là trường hợp của R - IDE R duy nhất tôi biết là R Studio, khá tốt, nhưng không tốt bằng PyDev + Eclipse, theo kinh nghiệm của tôi.

Tôi sẽ thêm điều này như một chút của một kicker: vì bạn vẫn còn đi học, bạn nên nghĩ về công việc. Bạn sẽ tìm thấy nhiều bài đăng công việc cho các nhà phát triển Python có tay nghề cao hơn so với các nhà phát triển R có tay nghề cao. Ở Austin, việc làm cho các nhà phát triển Django là loại rơi khỏi bầu trời. Nếu bạn biết R thực sự rõ ràng, có một vài nơi bạn sẽ có thể tận dụng kỹ năng đó (chẳng hạn như Revolution Analytics), nhưng rất nhiều cửa hàng dường như sử dụng Python. Ngay cả trong lĩnh vực phân tích dữ liệu / khoa học dữ liệu, nhiều người dường như đang chuyển sang Python.

Và đừng đánh giá thấp rằng bạn có thể làm việc với / cho những người chỉ biết (nói) Java. Những người đó sẽ có thể đọc mã Python của bạn khá dễ dàng. Điều này sẽ không nhất thiết là trường hợp nếu bạn thực hiện tất cả công việc của mình ở R. (Điều này xuất phát từ kinh nghiệm.)

Cuối cùng, điều này nghe có vẻ hời hợt, nhưng tôi nghĩ rằng tài liệu Python và các quy ước đặt tên (được tuân thủ một cách tôn giáo, hóa ra) lại đẹp hơn nhiều so với tài liệu R thực dụng. Điều này sẽ được tranh luận sôi nổi, tôi chắc chắn, nhưng điểm nhấn trong Python là khả năng đọc. Điều đó có nghĩa là các đối số cho các hàm Python có tên mà bạn có thể đọc và điều đó có nghĩa là một cái gì đó. Trong R, tên đối số thường bị cắt ngắn --- Tôi thấy điều này ít đúng trong Python. Điều này nghe có vẻ khoa trương, nhưng nó khiến tôi phải viết những thứ như 'xlab' khi bạn có thể dễ dàng đặt tên cho một đối số 'x_label' (chỉ một ví dụ) --- điều này có tác dụng rất lớn khi bạn cố gắng học API mô-đun / gói mới. Đọc tài liệu R giống như đọc các trang dành cho người dùng Linux --- nếu đó là những gì làm nổi thuyền của bạn, thì sẽ tiếp thêm sức mạnh cho bạn.

Tất cả điều đó đang được nói, tôi đề nghị những điều sau đây (cũng là quy trình công việc điển hình của tôi): vì bạn biết Python, hãy sử dụng nó làm công cụ đầu tiên của bạn. Khi bạn thấy Python thiếu, hãy học đủ R để làm những gì bạn muốn và sau đó:

  1. Viết các tập lệnh trong R và chạy chúng từ Python bằng mô đun quy trình con, hoặc
  2. Cài đặt mô-đun RPy.

Sử dụng Python cho những gì Python giỏi và điền vào các khoảng trống với một trong những điều trên. Đây là quy trình làm việc bình thường của tôi --- Tôi thường sử dụng R để vẽ đồ thị và Python cho việc nâng vật nặng.

Vì vậy, để tóm tắt: vì sự nhấn mạnh của Python vào khả năng đọc (tìm kiếm từ "Pythonic"), sự sẵn có của các IDE tốt, miễn phí, thực tế là trong họ ngôn ngữ C, khả năng lớn hơn là bạn sẽ có thể viết hoa bộ kỹ năng và phong cách ngôn ngữ tài liệu tốt hơn xung quanh, tôi khuyên bạn nên biến Python thành công cụ của mình và chỉ dựa vào R khi cần thiết.


Ok, đây là (cho đến nay) câu trả lời phổ biến nhất của tôi từ trước đến nay trên một trang web stack, và nó thậm chí không phải là số 1 :) Tôi hy vọng điều này đã giúp một vài người trên con đường này.

Bằng mọi giá, tôi đã đi đến kết luận sau vài năm trong lĩnh vực này:

Đây có lẽ là câu hỏi sai.

Đặt câu hỏi "tôi có nên học công nghệ đặc biệt này không" là một câu hỏi tồi. Tại sao?

  1. Công nghệ thay đổi. Bạn sẽ luôn phải học một công nghệ khác. Nếu bạn đi làm ở Twitter, họ điều hành Scala. Một số nơi là cửa hàng Python. Một số nơi không quan tâm. Bạn sẽ không được thuê vì bạn biết hoặc không biết một số công nghệ cụ thể - nếu bạn không thể học một công nghệ mới, bạn có thể (và nên) bị sa thải. Giống như, nếu một chiếc cờ lê ống mới xuất hiện, và bạn là một thợ sửa ống nước, và bạn không thể hiểu được cách mà cờ lê ống mới hoạt động, có lẽ bạn là một thợ sửa ống nước khá tệ hại.
  2. Đưa ra lựa chọn "Tôi có học công nghệ này" hay "Tôi có dành nhiều thời gian hơn để giải quyết các vấn đề thực sự không", bạn nên luôn luôn chọn cách sau, không có ngoại lệ.

Là một nhà khoa học dữ liệu, công việc của bạn là giải quyết các vấn đề . Một chút khôn ngoan đó luôn bị mất đi trong mỗi cuộc hội thảo hoặc cuộc gặp gỡ mà bạn tham dự - mọi cuộc nói chuyện "dữ liệu lớn" mà tôi từng thấy đều tập trung vào công nghệ, chứ không phải giải quyết vấn đề. Việc giải quyết vấn đề thực tế thường được đưa xuống một vài slide ở cuối:

[Tiêu đề trò chuyện = "Học sâu khi khởi động mới tuyệt vời"] ... [45 phút sơ đồ và kỹ thuật-babel trong đó tôi khoanh vùng và kiểm tra điện thoại của mình] ... Và, sau khi triển khai cụm Hadoop của chúng tôi và [Khu vực Ben ra một lần nữa] chúng ta có thể điều hành thói quen học tập sâu của mình, [thức dậy: đây là lý do tại sao tôi đến!] các chi tiết thuộc sở hữu độc quyền. Câu hỏi?

Điều này mang lại một ấn tượng xấu rằng lĩnh vực này là về công nghệ, và nó không đúng. Nếu bạn thực sự giỏi về Scala, hoặc Python hoặc R, nhưng bạn thực sự kém trong việc giải quyết vấn đề, bạn sẽ trở thành một nhà khoa học dữ liệu tệ hại .

Paco Nathan đã ở Austin một vài tháng trước tại một hội nghị "dữ liệu lớn" kéo dài một ngày và nói một cái gì đó như "Hóa học không phải là về ống nghiệm". Điều đó khá nhiều tiền - khoa học dữ liệu không phải là về Scala, hay Hadoop, hay Spark, hay bất cứ thứ gì khác về công nghệ-du-jour xuất hiện. Vào cuối ngày, tôi muốn thuê những người suy nghĩ chứ không phải những người lão luyện trong việc sử dụng Stack Overflow để học các bộ công cụ.

Tương tự như vậy, nếu bạn đi phỏng vấn xin việc và họ không thuê bạn chỉ vì bạn không biết một số ngôn ngữ lập trình, thì công ty đó thật tệ . Họ không hiểu "nhà khoa học dữ liệu" nghĩa là gì và có lẽ tốt hơn cho bạn nếu nó không thành công.

Cuối cùng, nếu khả năng giải quyết vấn đề của bạn là ngoài lề (trung thực với chính mình), hoặc bạn thực sự chỉ thích công nghệ, hoặc học công nghệ là điều bạn thực sự yêu thích (một lần nữa, hãy trung thực), sau đó học nhiều công nghệ. Bạn sẽ luôn có thể tìm thấy các vai trò loại "kỹ sư dữ liệu" phù hợp với bộ kỹ năng của bạn. Đây không phải là một điều xấu, các kỹ sư dữ liệu bôi trơn các bánh xe và giúp bạn có thể làm công việc của mình như một nhà khoa học dữ liệu. (Sự khác biệt gần giống với kiến ​​trúc sư phần mềm so với nhóm phát triển.)


3
Tuy nhiên, tôi sẽ nói rằng nếu tôi đang làm việc trên sàn giao dịch và người giao dịch chính đã đến với tôi với một giá tùy chọn và muốn tôi điều chỉnh chúng với phân phối log-linear và đưa ra độ lệch chuẩn và trung bình, Tôi thậm chí sẽ không xem xét Python. Tôi nghĩ rằng nó giống như ba dòng mã để làm điều này trong R.
BenDundee

12

Vì vậy, tôi chủ yếu thực hiện phân tích dữ liệu trong Matlab, nhưng đã thực hiện một số bằng Python (và sử dụng Python nhiều hơn cho mục đích chung) và tôi cũng đã bắt đầu một chút về R. Tôi sẽ đi ngược lại với ngũ cốc ở đây và đề nghị bạn sử dụng Con trăn. Lý do là vì bạn đang thực hiện phân tích dữ liệu từ góc độ Machine Learning, chứ không phải thống kê (trong đó R chiếm ưu thế) hoặc xử lý tín hiệu số (trong đó Matlab chiếm ưu thế).

Rõ ràng có sự chồng chéo nặng nề giữa Machine Learning và Stats. Nhưng chồng chéo không phải là bản sắc. Machine Learning sử dụng các ý tưởng từ CS mà tôi không muốn thực hiện trong R. Chắc chắn, bạn có thể tính toán một cây bao trùm tối thiểu trong R. Nó có thể trông giống như một mớ hỗn độn xấu xí. Những người học máy sẽ cho rằng bạn có quyền truy cập dễ dàng vào các bảng băm, cây tìm kiếm nhị phân, v.v. Trong tâm trí tôi, việc triển khai thuật toán thống kê sẽ dễ dàng hơn khi cần thiết, hơn là cố gắng đánh bóng ngôn ngữ cụ thể của miền thành ngôn ngữ lập trình chung.

Lợi ích phụ của Python để phân tích dữ liệu cũng cao hơn nhiều. Bạn sẽ học một ngôn ngữ lập trình thực sự cùng một lúc, có thể xử lý kịch bản, tạo các ứng dụng lớn hơn, v.v ... R thực sự là ngôn ngữ thích hợp của cộng đồng thống kê, thậm chí Matlab được sử dụng rộng rãi hơn nhiều.

Tôi đoán, tôi sẽ xem xét một số bài báo trước và xem ngôn ngữ họ đăng mã. Nếu nó không ở R, thì đừng sử dụng nó.


1
Cảm ơn rât nhiều. Tôi chắc chắn quan tâm nhiều hơn đến khía cạnh ML của mọi thứ.
The_Cthulhu_Kid

1
Chỉ là một phụ lục nhỏ: Tôi chắc chắn R cũng có thể làm điều này theo cách nào đó, nhưng Python nổi tiếng với khả năng gọi C hoặc biên dịch các hàm thành C bằng Cython với chi phí tối thiểu. Vì vậy, bạn thường có thể nhanh hơn với ít nỗ lực hơn, một sự cân nhắc chính cho việc xem xét dữ liệu thực. Một lưu ý kỳ lạ (cuối cùng): Java có một số thư viện máy học thực sự tốt (như WEKA). Tuy nhiên, điều tuyệt vời là bạn có thể gọi những thứ này cũng từ Python, sử dụng Jython :-)
Nir Friedman

7

Là một nhà khoa học cũ (hơn 50), người đã và đang tiếp tục sử dụng một số công cụ này, tôi sẽ thêm hai xu của mình. Tôi đã làm việc với các đồng nghiệp vẫn viết mọi đoạn mã trong Fortran, từ các công việc phân tích dữ liệu một lần tầm thường đến mã thống trị một số siêu máy tính trên thế giới. Các phương ngữ Fortran gần đây (F90, F95, F2003, F2008) là IMHO, một số ngôn ngữ được thiết kế tốt nhất đang tồn tại. Nhiều thập kỷ kinh nghiệm với tính toán hiệu năng cao đã dẫn đến sự phát triển ngôn ngữ khá ấn tượng.

Đôi khi tôi chỉ sử dụng Python và sẽ xem lại nó (chủ yếu là vì Sage) nhưng tôi sử dụng bộ ngôn ngữ được thử nghiệm thời gian phù hợp với tôi. Fortran, C, Perl, R và Scheme (với tcl cho kịch bản VMD). Tôi thấy sự kết hợp của R và Fortran và C rất thoải mái. Ngược lại với các nhận xét khác về mô hình đối tượng trong R, nó là mô hình đối tượng tốt cho công việc tương tác, dựa trên khái niệm CLOS về các hàm chung và phương thức gửi. Khi làm việc tương tác với một gói mới, bạn thường có thể dựa vào các chức năng chung chung như bản in của bản in và bản vẽ âm mưu để làm một việc gì đó hiệu quả.

API cho Fortran và C rất dễ sử dụng. Nếu bạn đã từng làm việc ở Fortran và C để lập mô hình và phân tích dữ liệu thì đây là một điểm cộng lớn. Khả năng tự động tạo mã R và đánh giá nó, trong khi gần như không sạch như các hệ thống macro trong Lisp và C, rất hữu ích khi làm việc với các bộ dữ liệu động.

Một số hạn chế của R đối với dữ liệu thực bao gồm cuộc gọi theo cách tiếp cận giá trị. Mặc dù có các lý do CS để gọi theo giá trị, lập trình trong thế giới thực với dữ liệu số lớn yêu cầu một số hình thức gọi theo tham chiếu (lưu ý tầm quan trọng của các khối chung Fortran trong mã cũ hoặc dữ liệu mô-đun trong mã mới hơn). Cách tiếp cận được PDL (Ngôn ngữ dữ liệu Perl) áp dụng đặc biệt thanh lịch trong vấn đề này. (Pdls về cơ bản được gọi theo tham chiếu trừ khi bạn yêu cầu một bản sao. Tham chiếu của pdl một phần phụ của pdl cha, theo cú pháp rõ ràng hơn nhiều so với Fortran hoặc C cung cấp).

Nó là tốt để học nhiều ngôn ngữ. Python chắc chắn là một ngôn ngữ quan trọng, nhưng R cũng thuộc miền của nó. Nhưng khi cao su thực sự cần đáp ứng con đường trong khoa học thì Fortran và C (và C ++ đối với một số người) sẽ khó thay thế.


1

Một tính năng chính của R là nó là một thư viện các gói, nhiều như nó là một ngôn ngữ lập trình. Mọi người viết gói đều có quyền truy cập, về nguyên tắc, những gì có trong mọi gói khác. Điều này làm giảm đáng kể nhu cầu, phát minh lại, tài liệu lại, học lại. Điều này áp dụng cho cả tác giả gói và người dùng. Tất nhiên, cơ sở hạ tầng này có chi phí. Các tác giả trọn gói phải đáp ứng các tiêu chuẩn ngày càng trở nên khó khăn với thời gian. Một số điều này có thể tràn vào những gì người dùng gặp phải.

Python không, theo tôi hiểu, có một hệ thống quản lý gói. Không có tương đương với Mạng lưu trữ toàn diện R của R ( http://cran.r-project.org ) và không tương đương trực tiếp với các chế độ xem nhiệm vụ R ( http://cran.csiro.au/web/view/ ). Do đó, ở một mức độ nào đó không phải là trường hợp của R, một công cụ cho các lập trình viên tự làm việc khá nhiều thay vì là một phần của nỗ lực cộng sản để xây dựng dựa trên những gì đã có sẵn.

Đối với phân tích dữ liệu và học máy, nhu cầu chắc chắn, ở một mức độ rất lớn, để xây dựng và tận dụng các khả năng đã có sẵn. Đối với các tác vụ lập trình chung hơn, Python có thể có lợi thế. Bạn sẽ làm loại công việc này đủ để biện minh cho nỗ lực học Python?


3
Python có một hệ thống quản lý gói được gọi là pip. Nó không phải là một phần của thư viện tiêu chuẩn, nhưng nó sẽ được xuất xưởng với Python chuẩn bắt đầu với Python 3.4, sẽ được phát hành vào tháng tới (tháng 3 năm 2014).
Cody Piersall

2
Tương đương Python của Mạng lưu trữ toàn diện R là PyPI: pypi.python.org/pypi
Wilfred Hughes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.