Cercherò di formulare una risposta toccando i punti principali in cui le due lingue entrano in gioco per la scienza dei dati / statistiche / analisi dei dati e simili, come qualcuno che usa entrambi.
Il flusso di lavoro nell'analisi dei dati è generalmente costituito dai seguenti passaggi:
- Recupero dei dati da una sorta di sorgente (molto probabilmente un database SQL / noSQL o file .csv).
- Analizzare i dati in un formato decente e ragionevole (frame di dati) in modo che si possano fare operazioni e pensarci sopra.
- Applicazione di alcune funzioni ai dati (raggruppamento, eliminazione, fusione, ridenominazione).
- Applicare una sorta di modello ai dati (regressione, clustering, una rete neurale o qualsiasi altra teoria più o meno complicata).
- Distribuire / presentare i risultati a un pubblico tecnico più o meno.
Recuperando i dati
Il 99% delle volte, il processo di recupero dei dati si riduce alla query di una sorta di database SQL o Impala: sia Python che R hanno client o librerie specifici che fanno il lavoro in pochissimo tempo e ugualmente bene ( RImpala
, RmySQL
per R e MySQLdb
per Python funziona senza intoppi, non molto da aggiungere). Quando si tratta di leggere file .csv esterni, il data.table
pacchetto per R fornisce la funzione fread
che legge in file CSV enormi e complicati con qualsiasi opzione di analisi personalizzata in pochissimo tempo e trasforma il risultato direttamente in frame di dati con nomi di colonna e numeri di riga.
Organizzazione dei frame di dati
Vogliamo che i dati vengano archiviati in una sorta di tabella in modo da poter accedere facilmente a qualsiasi singola voce, riga o colonna.
Il pacchetto Rdata.table
offre modi imbattibili per etichettare, rinominare, eliminare e accedere ai dati. La sintassi standard è molto simile a SQL come dt[i, j, fun_by]
, dove dovrebbe essere dt[where_condition, select_column, grouped_by (or the like)]
; le funzioni personalizzate definite dall'utente possono essere inserite sia all'interno che nella j
clausola, in modo da essere completamente liberi di manipolare i dati e applicare qualsiasi funzione complicata o elaborata su gruppi o sottoinsiemi (come prendere l'i-esima riga, k-esima e sommalo all'elemento (k-2) -th della riga (i-1) se e solo se la deviazione standard dell'intera colonna è quella che è, raggruppata per ultima colonna). Dai un'occhiata ai benchmark e a questa altra fantastica domanda su SO. L'ordinamento, l'eliminazione e la ridenominazione di colonne e righe fanno quello che devono fare, e i metodi R vettoriali standardizzati apply, sapply, lapply, ifelse
eseguono operazioni vettorizzate su colonne e frame di dati del tutto, senza scorrere attraverso ogni elemento (ricorda che ogni volta che usi loop in R tu lo stanno facendo molto male).
L'arma contraria di Python è la pandas
biblioteca. Fornisce infine la struttura pd.DataFrame
(che manca a Python standard, per qualche ragione ancora sconosciuta a me) che tratta i dati per quello che sono, vale a dire frame di dati (invece di alcuni numpy array, numpy list, numpy matrix
o altro). Operazioni come il raggruppamento, la ridenominazione, l'ordinamento e simili possono essere facilmente realizzate e anche qui l'utente può applicare qualsiasi funzione personalizzata a un set di dati raggruppato o un sottoinsieme del frame usando Python apply
o lambda
. Personalmente non mi piace la grammatica df[df.iloc(...)]
per accedere alle voci, ma è solo gusto personale e nessun problema. I parametri di riferimento per le operazioni di raggruppamento sono ancora leggermente peggiori di R, data.table
ma a meno che non si desideri risparmiare 0,02 secondi per la compilazione non vi sono grandi differenze nelle prestazioni.
stringhe
Il modo R di trattare le stringhe è utilizzare il stringr
pacchetto che consente di manipolare il testo, l'anagramma, l'espressione regolare, il trascinamento di spazi bianchi o simili con facilità. Può anche essere utilizzato in combinazione con le librerie JSON che decomprimono i dizionari JSON e unlist i loro elementi, in modo che uno abbia un frame di dati finale in cui i nomi delle colonne e gli elementi sono quelli che devono essere, senza alcun carattere non UTF8 o spazio bianco lì dentro.
I panda di Python .str.
svolgono lo stesso compito di giocare con espressioni regolari, finali o altro come il loro concorrente, quindi anche qui nessuna grande differenza nel gusto.
Applicazione di modelli
Qui è dove, a mio avviso, sorgono differenze tra le due lingue.
Rha, ad oggi, un insieme imbattibile di librerie che consentono all'utente di fare praticamente tutto ciò che vogliono in una o due righe di codice. Le regressioni funzionali o polinomiali standard vengono eseguite in una riga e producono output i cui coefficienti sono facilmente leggibili, accompagnati dai corrispondenti intervalli di confidenza e distribuzioni dei valori p. Allo stesso modo per il clustering, allo stesso modo per i modelli di foresta casuali, allo stesso modo per i dendogrammi, l'analisi dei componenti principali, le scomposizioni di valori singolari, gli accoppiamenti logistici e molti altri. L'output per ognuna delle precedenti ha probabilmente una classe di stampa specifica che genera visualizzazioni di ciò che hai appena fatto, con colori e bolle per coefficienti e parametri. Test di ipotesi, test statistici, Shapiro,
Python sta cercando di tenere il passo con SciPy
e scikit-learn
. Sono disponibili anche la maggior parte delle analisi e dei modelli standard, ma sono leggermente più lunghi da codificare e meno intuitivi da leggere (secondo me). Mancano macchinari più complicati, sebbene alcuni possano essere ricondotti ad alcune combinazioni delle librerie già esistenti. Una cosa che preferisco fare in Python piuttosto che in R è l'analisi del testo bag-of-word con bi-grammi, tri-grammi e ordini superiori.
Presentando i risultati
Entrambe le lingue hanno bellissimi strumenti di disegno, ggplot2
soprattutto R e il corrispondente equivalente di Python. Non molto per competere, fanno il lavoro sano e salvo, anche se credo che se stai presentando i risultati potresti dover usare altri strumenti: ci sono fantastici strumenti di progettazione colorati là fuori e né Python né R sono pensati per stupire il pubblico con fantasiosi drag and drop rossi e verdi. R ha recentemente pubblicato molti miglioramenti sulle sue shiny app
caratteristiche, che sostanzialmente gli consentono di produrre output interattivi . Non ho mai voluto impararlo, ma so che è lì e la gente lo usa bene.
Nota a margine
Come nota a margine, vorrei sottolineare che la principale differenza tra i due linguaggi è che Python è una lingua di programmazione per scopi generici, realizzata da e per l'informatica, la portabilità, le distribuzioni e così via. È fantastico in ciò che fa ed è semplice da imparare; non c'è nessuno a cui non piaccia il pitone. Ma è un linguaggio di programmazione fare programmazione.
Rd'altra parte, è stato inventato da e per matematici, fisici, statistici e data scientist. Se vieni da quello sfondo, tutto ha perfettamente senso perché rispecchia perfettamente e riproduce i concetti utilizzati in statistica e matematica. Ma se invece venissi da un background informatico e vuoi simulare Java o C in R rimarrai deluso; non ha "oggetti" in senso standard (beh, lo fa, ma non ciò che si pensa in genere sono ...), non ha classi in senso standard (beh, lo fa, ma non ciò che si usa in genere pensa che siano ...), non ha "puntatori" o tutte le altre strutture informatiche - ma solo perché non ne ha bisogno. Ultimo ma non meno importante: la documentazione e i pacchetti sono facili da creare e leggere (se si utilizza Rstudio); c'è una grande e appassionata comunità là fuori, e ci vogliono letteralmente cinque secondi per Google "come fare il problema di inserimento casuale in R" la cui prima voce ti reindirizza a una soluzione al problema (fatta da qualcun altro) con codice corrispondente , in nessun tempo.
La maggior parte delle aziende industriali ha la propria infrastruttura integrata in Python (o in un ambiente compatibile con Python) che consente una facile integrazione del codice Python (praticamente import myAnalysis
ovunque e in pratica è fatto). Tuttavia, qualsiasi tecnologia moderna o server o piattaforma esegue facilmente il codice R di sfondo senza problemi.