R vs Python per analisi dei dati [chiuso]


60

Sto programmando da circa un anno e sono davvero interessato all'analisi dei dati e all'apprendimento automatico. Sto prendendo parte a un paio di corsi online e sto leggendo un paio di libri.

Tutto quello che sto facendo usa R o Python e sto cercando suggerimenti su se dovrei concentrarmi o meno su una lingua (e in tal caso quale) o continuare con entrambe; si completano a vicenda?

- Devo dire che uso C # a scuola ma ho familiarità con Python attraverso lo studio autonomo.


Ecco forse un link interessante: coursera.org/course/compdata
Giorgio

Risposte:


39

Uso sia Python (per l'analisi dei dati del corso, compresi numpy e scipy) sia R uno accanto all'altro. Tuttavia, utilizzo R esclusivamente per eseguire analisi dei dati e Python per attività di programmazione più generiche (ad es. Controllo del flusso di lavoro di un modello di computer).

In termini di operazioni di base, diciamo che le operazioni sugli array e l'ordinamento, R e Python + numpy sono molto comparabili. È nella vastissima libreria di funzioni statistiche che R ha un vantaggio. Inoltre, matplotlib non sembra essere buono come ggplot2, ma non ho usato matplotlib così tanto. Inoltre, mi concentrerei prima su una lingua e diventerò bravo nei dettagli di quella. Sembra che tu sia interessato principalmente all'analisi dei dati, non all'ingegneria del software. Vorrei scegliere R e attenermi a quello. Detto questo, penso che la scelta di Python + numpy + scipy + scikit sia sicuramente e una scelta eccellente, è solo che sento che R è solo un po 'più eccellente.

Vorrei anche dare un'occhiata intorno a quello che stanno usando i tuoi colleghi e altre persone nel tuo campo. Se tutti usano, diciamo, Python, avrebbe senso attenersi a quello per imparare più facilmente da loro e scambiare codice.

Disclaimer: nota che sono un utente R pesante, quindi la mia opinione potrebbe essere distorta, anche se ho cercato di mantenere la mia risposta il più obiettiva possibile. Inoltre, non ho usato ampiamente Python + numpy, ma conosco colleghi che fanno tutte le loro analisi dei dati al suo interno.

ps: questo link potrebbe essere interessante: http://seanjtaylor.com/post/39573264781/the-statistics-software-signal

pps: o questa citazione da questo post :

Uso R e Python per tutte le mie ricerche (con Rcpp o Cython secondo necessità), ma preferirei evitare di scrivere in C o C ++ se posso evitarlo. R è un linguaggio meraviglioso, in gran parte a causa dell'incredibile comunità di utenti. È stato creato dagli statistici, il che significa che l'analisi dei dati è al centro della lingua; Ritengo che questa sia una delle principali caratteristiche della lingua e una grande ragione per cui non verrà sostituita presto. Python è generalmente un linguaggio generale migliore, specialmente se si considera la sua combinazione di programmazione funzionale con orientamento dell'oggetto. Combinato con Scipy / Numpy, Panda e statsmodels, questo fornisce una potente combinazione. Ma a Python manca ancora una seria comunità di statistici / matematici.


3
Dicendo che R è più forte di Python, intendi Python + numpy / blaze + scipy o Python normale?
9000

5
Intendo Python + numpy sì, altrimenti la scelta sarebbe ancora più semplice. Penso che in termini di operazioni di base, diciamo che le operazioni sugli array e il tipo, R e Python + numpy siano molto comparabili. È nella vastissima libreria di funzioni statistiche che R ha un vantaggio. Inoltre, matplotlib non sembra essere buono come ggplot2, ma non ho usato matplotlib così tanto.
Paul Hiemstra,

Detto questo, penso che la scelta di Python + numpy + scipy + scikit sia sicuramente una scelta eccellente ed è solo che sento che R è solo un po 'più eccellente.
Paul Hiemstra,

@PaulHiemstra - Nei tuoi commenti fai dei bei punti che probabilmente migliorerebbero la tua risposta - se la domanda viene riaperta e ne hai l'opportunità.
psr

@psr Ho modificato nei miei commenti, apparentemente non è necessario che la domanda sia aperta se voglio modificarlo (forse solo io posso modificarlo ...).
Paul Hiemstra,

36

Background: sono uno scienziato di dati in una startup ad Austin e vengo dalla scuola di specializzazione (fisica). Uso Python quotidianamente per l'analisi dei dati, ma uso R un po '. Uso anche C # /. NET e Java (quasi ogni giorno), ho usato molto C ++ nelle scuole superiori.

Penso che il problema principale con l'utilizzo di Python per i numeri (sopra R) sia la dimensione della comunità di utenti. Dal momento che la lingua è in circolazione da sempre, molte persone hanno fatto cose che probabilmente vorrai fare. Ciò significa che, di fronte a un problema difficile, puoi semplicemente scaricare il pacchetto e metterti al lavoro. E R "funziona": gli dai un set di dati e sa quali statistiche di riepilogo sono utili. Gli dai dei risultati e sa quali trame vuoi. Tutte le trame comuni che vorresti fare sono lì, anche alcune piuttosto esoteriche che dovrai cercare su Wikipedia. Bello come scipy / numpy / panda / statsmodels / ecc. sono per Python, non sono a livello della libreria R standard.

Il vantaggio principale di Python su R è che è un vero linguaggio di programmazione nella famiglia C. Si ridimensiona facilmente, quindi è concepibile che qualsiasi cosa tu abbia nella tua sandbox possa essere utilizzata in produzione. Python ha l'orientamento agli oggetti integrato, al contrario di R dove sembra una specie di ripensamento (perché lo è). Ci sono anche altre cose che Python fa bene: il threading e l'elaborazione parallela sono abbastanza facili, e non sono sicuro che sia così in R. E anche imparare Python ti dà un potente strumento di scripting. Ci sono anche IDE (gratuiti) davvero buoni per Python, molto migliori se sei disposto a pagare (meno di $ 100), e non sono sicuro che sia così per R - l'unico R IDE che conosco è R Studio, che è abbastanza buono, ma non è buono come PyDev + Eclipse, nella mia esperienza.

Aggiungerò questo un po 'come un kicker: poiché sei ancora a scuola, dovresti pensare ai lavori. Troverai più offerte di lavoro per sviluppatori Python altamente qualificati di quanto non lo troverai per sviluppatori R altamente qualificati. Ad Austin, i lavori per gli sviluppatori di Django stanno cadendo dal cielo. Se conosci R davvero bene, ci sono alcuni posti in cui sarai in grado di capitalizzare quell'abilità (Revolution Analytics, per esempio), ma molti negozi sembrano usare Python. Anche nel campo dell'analisi dei dati / della scienza dei dati, più persone sembrano rivolgersi a Python.

E non sottovalutare il fatto che potresti lavorare con / per le persone che conoscono (diciamo) solo Java. Quelle persone saranno in grado di leggere il tuo codice Python abbastanza facilmente. Questo non sarà necessariamente il caso se fai tutto il tuo lavoro in R. (Questo proviene dall'esperienza.)

Alla fine, questo può sembrare superficiale, ma penso che la documentazione di Python e le convenzioni di denominazione (che sono rispettate religiosamente, si scopre) sia molto più bella dell'utilitaria R doc. Questo sarà discusso caldamente, ne sono certo, ma l'enfasi in Python è la leggibilità. Ciò significa che gli argomenti delle funzioni di Python hanno nomi che puoi leggere e che significano qualcosa. In R, i nomi degli argomenti sono spesso troncati --- L'ho trovato meno vero in Python. Questo può sembrare pedante, ma mi fa impazzire scrivere cose come 'xlab' quando potresti facilmente nominare un argomento 'x_label' (solo un esempio) --- questo ha un effetto enorme quando stai cercando di imparare un nuova API modulo / pacchetto. Leggere R doc è come leggere le pagine man di Linux --- se questo è ciò che fa galleggiare la tua barca, allora più potenza per te.

Detto questo, suggerirei quanto segue (che è anche il mio flusso di lavoro tipico): poiché conosci Python, utilizzalo come primo strumento. Quando trovi Python carente, impara abbastanza R per fare quello che vuoi, e poi:

  1. Scrivi gli script in R ed eseguili da Python usando il modulo subprocess, oppure
  2. Installa il modulo RPy.

Usa Python per ciò che è bravo in Python e colma le lacune con uno dei precedenti. Questo è il mio normale flusso di lavoro --- Di solito uso R per tracciare le cose e Python per il sollevamento di carichi pesanti.

Per riassumere: a causa dell'enfasi di Python sulla leggibilità (cerca su Google "Pythonic"), la disponibilità di buoni IDE gratuiti, il fatto che sia nella famiglia di lingue C, la maggiore possibilità che sarai in grado di capitalizzare lo skillset e il migliore stile di documentazione del linguaggio, suggerirei di rendere Python il tuo punto di riferimento e di fare affidamento su R solo quando necessario.


Ok, questa è (di gran lunga) la mia risposta più popolare in assoluto su un sito stack, e non è nemmeno il n. 1 :) Spero che questo abbia aiutato alcune persone lungo il percorso.

Ad ogni modo, sono giunto alla seguente conclusione dopo diversi anni nel settore:

Questa è probabilmente la domanda sbagliata da porre.

Chiedere "dovrei imparare questa particolare tecnologia" è una cattiva domanda. Perché?

  1. Cambiamenti tecnologici. Dovrai sempre imparare un'altra tecnologia. Se vai a lavorare su Twitter, eseguono Scala. Alcuni posti sono negozi Python. Ad alcuni posti non importa. Non verrai assunto perché conosci o non conosci un particolare pezzo di tecnologia - se non puoi imparare una nuova tecnologia, puoi (e dovresti) essere licenziato. È come se uscisse una nuova chiave a tubo, e tu sei un idraulico, e non riesci a capire come funziona la nuova chiave a tubo, probabilmente sei un idraulico piuttosto schifoso.
  2. Data la scelta di "Imparo questa tecnologia" o "Trascorro più tempo a risolvere problemi reali", dovresti sempre scegliere quest'ultima, senza eccezioni.

Come data scientist, il tuo compito è risolvere i problemi . Quel po 'di saggezza è praticamente sempre perso in ogni conferenza o incontro a cui vai - ogni discorso sui "big data" che abbia mai visto si è concentrato sulla tecnologia, non sulla risoluzione dei problemi. L'effettiva risoluzione dei problemi viene generalmente retrocessa in alcune diapositive alla fine:

[Talk title = "Deep learning at Cool New Startup"] ... [45 minuti di diagrammi e tecno-babele durante i quali esco e controllo il mio telefono] ... E, dopo aver implementato il nostro cluster Hadoop e [Ben zone fuori di nuovo] possiamo eseguire la nostra routine di apprendimento profondo, [svegliati: ecco perché sono venuto!] i cui dettagli sono proprietari. Domande?

Questo dà una brutta impressione che il campo riguardi la tecnologia, e non è vero. Se sei davvero bravo a Scala, o Python o R, ma sei davvero cattivo nel risolvere i problemi , diventerai un pessimo scienziato di dati .

Paco Nathan era ad Austin alcuni mesi fa in una lunga conferenza "big data" e ha detto qualcosa del tipo "La chimica non riguarda le provette". Questo in sostanza lo riassume: la scienza dei dati non riguarda Scala, o Hadoop o Spark, o qualsiasi altra tecnologia del du-pop. Alla fine, voglio assumere persone che pensano, non persone che sono abili nell'usare Stack Overflow per apprendere i toolkit.

Allo stesso modo, se vai a un colloquio di lavoro e non ti assumono solo perché non conosci un linguaggio di programmazione, allora quella società fa schifo . Non capiscono cosa significhi "data scientist", ed è probabilmente meglio per te se non ha funzionato.

Infine, se le tue capacità di problem solving sono marginali (sii onesto con te stesso) o ti piace davvero il lato tecnologico delle cose o l'apprendimento della tecnologia è ciò che ami davvero (di nuovo, sii onesto) allora impara un sacco di tecnologia. Sarai sempre in grado di trovare ruoli di tipo "ingegnere dei dati" adatti al tuo set di abilità. Non è una brutta cosa, i data engineer ingrassano le ruote e ti permettono di fare il tuo lavoro come data scientist. (La differenza è simile all'architetto del software rispetto al team di sviluppo.)


3
Dirò, tuttavia, che se stavo lavorando su una piattaforma di trading e il trader capo venisse da me con una csv di prezzi delle opzioni e volesse che li adattassi a una distribuzione log-lineare e ripristinassi la deviazione media e standard, Non prenderei nemmeno in considerazione Python. Penso che sia come tre righe di codice per farlo in R.
BenDundee,

12

Quindi, ho fatto principalmente l'analisi dei dati in Matlab, ma ne ho fatti alcuni in Python (e più usato Python per scopi generali) e ho anche iniziato un po 'di R. Ho intenzione di andare controcorrente qui e suggerire di utilizzare Pitone. Il motivo è perché stai facendo analisi dei dati da una prospettiva di Machine Learning, non statistiche (dove R è dominante) o elaborazione del segnale digitale (dove Matlab è dominante).

C'è ovviamente una forte sovrapposizione tra Machine Learning e Statistiche. Ma la sovrapposizione non è identità. L'apprendimento automatico utilizza idee di CS che io per primo non vorrei implementare in R. Certo, puoi calcolare un albero di spanning minimo in R. Tuttavia, può sembrare un brutto pasticcio. Le persone che apprendono con il machine learning presumono che tu abbia un facile accesso alle tabelle hash, agli alberi di ricerca binari e così via. Nella mia mente è più semplice implementare un algoritmo di statistica quando necessario, piuttosto che provare a parlare di ciò che è fondamentalmente un linguaggio specifico di dominio in un linguaggio di programmazione generale.

I vantaggi collaterali di Python per l'analisi dei dati sono anche molto più elevati. Imparerai allo stesso tempo un vero linguaggio di programmazione, in grado di gestire script, creare applicazioni più grandi, ecc. R è davvero un linguaggio di nicchia della comunità delle statistiche, anche Matlab è molto più ampiamente utilizzato.

Immagino che prima guarderei alcuni dei giornali e vedrei in quale lingua postano il codice. Se non è in R, non usarlo.


1
Grazie mille. Sono decisamente più interessato al lato ML delle cose.
The_Cthulhu_Kid

1
Solo un piccolo addendum: sono sicuro che R può farlo anche in qualche modo, ma Python è ben noto per la sua capacità di chiamare C o compilare funzioni in C usando Cython con un sovraccarico minimo. Quindi di solito puoi ottenere più velocemente con meno sforzo, una considerazione importante per guardare dati reali. Un'altra nota (finale) esotica: Java ha alcune librerie di machine learning davvero buone (come WEKA). Tuttavia, la cosa bella è che puoi anche chiamare questi da Python, usando Jython :-)
Nir Friedman

7

Come scienziato della vecchia scuola (oltre 50) che ha e continua a utilizzare un certo numero di questi strumenti, aggiungerò i miei due centesimi. Ho lavorato con colleghi che scrivono ancora ogni pezzo di codice in Fortran, dai banali lavori di analisi dei dati una tantum al codice che domina alcuni dei supercomputer del mondo. I dialetti Fortran recenti (F90, F95, F2003, F2008) sono IMHO, alcune delle lingue meglio progettate esistenti. Decenni di esperienza con il calcolo ad alte prestazioni hanno portato a uno sviluppo del linguaggio piuttosto impressionante.

Ho usato Python solo a volte, e lo rivisiterò (principalmente a causa di Sage) ma uso una suite di linguaggi testata nel tempo che funziona bene per me. Fortran, C, Perl, R e Scheme (con tcl per lo scripting VMD). Trovo che la combinazione di R, Fortran e C sia molto comoda. Contrariamente ad altri commenti fatti sul modello a oggetti in R, è un buon modello a oggetti per il lavoro interattivo, basato sul concetto CLOS di funzioni generiche e invio del metodo. Quando si lavora in modo interattivo con un nuovo pacchetto, è spesso possibile fare affidamento su funzioni generiche come "stampa" e "trama" per fare qualcosa di produttivo.

L'API per Fortran e C è molto facile da usare. Se sei abituato a lavorare in Fortran e C per la modellazione e l'analisi dei dati, questo è un grande vantaggio. La capacità di generare dinamicamente il codice R e valutarlo, sebbene non altrettanto pulito come i sistemi macro in Lisp e C, è molto utile quando si lavora su set di dati dinamici.

Alcune limitazioni di R per i dati reali includono l'approccio call by value. Mentre ci sono ragioni CS per la chiamata in base al valore, la programmazione nel mondo reale con grandi dati numerici richiede una qualche forma di chiamata per riferimento (notare l'importanza dei blocchi comuni Fortran nel codice precedente o i dati del modulo nel codice più recente). L'approccio adottato da PDL (Perl Data Language) è particolarmente elegante in questo senso. (I pdl sono essenzialmente chiamati per riferimento a meno che tu non richieda una copia. Il riferimento al sub-pdl è una sottosezione di un pdl padre, in una sintassi molto più pulita di quella fornita da Fortran o C).

È bene imparare molte lingue. Python è senza dubbio un linguaggio importante, ma anche R è nel suo dominio. Ma quando la gomma ha davvero bisogno di incontrare la strada nella scienza, Fortran e C (e C ++ per alcuni) saranno difficili da sostituire.


1

Una caratteristica chiave di R è che è una libreria di pacchetti, tanto quanto è un linguaggio di programmazione. Ogni autore di pacchetti ha accesso, in linea di principio, a ciò che si trova in ogni altro pacchetto. Ciò riduce drasticamente la necessità, di reinventare, riprogrammare, riapprendere. Questo vale sia per gli autori dei pacchetti che per gli utenti. Naturalmente, questa infrastruttura ha un costo. Gli autori dei pacchetti devono soddisfare standard che diventano sempre più difficili con il passare del tempo. Parte di questo potrebbe riversarsi su ciò che gli utenti incontrano.

Python, a quanto ho capito, non ha un sistema di gestione dei pacchetti. Non esiste un equivalente di R's Complete R Archive Network ( http://cran.r-project.org ) e nessun equivalente diretto delle viste attività R ( http://cran.csiro.au/web/views/ ). Quindi, in una misura che non è il caso di R, uno strumento per i programmatori che lavora praticamente da solo piuttosto che come parte di uno sforzo comunitario per basarsi su ciò che è già disponibile.

Per l'analisi dei dati e l'apprendimento automatico, la domanda è sicuramente, in larga misura, di basarsi e sfruttare le capacità già esistenti. Per attività di programmazione più generiche, Python potrebbe avere dei vantaggi. Farai questo tipo di lavoro abbastanza per giustificare lo sforzo di apprendimento di Python?


3
Python ha un sistema di gestione dei pacchetti chiamato pip. Non fa parte della libreria standard, ma verrà fornito con Python standard a partire da Python 3.4, che verrà rilasciato il mese prossimo (marzo 2014).
Cody Piersall,

2
L'equivalente Python della rete completa di archivio R è PyPI: pypi.python.org/pypi
Wilfred Hughes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.