Postaram się sformułować odpowiedź dotykającą głównych punktów, w których oba języki wchodzą w grę w zakresie analizy danych / statystyki / analizy danych i tym podobnych, jako ktoś, kto używa obu.
Przepływ pracy w analizie danych zasadniczo składa się z następujących kroków:
- Pobieranie danych z jakiegoś źródła (najprawdopodobniej z bazy danych SQL / noSQL lub plików .csv).
- Przetwarzanie danych w przyzwoitym i rozsądnym formacie (ramka danych), aby można było wykonywać operacje i myśleć o tym.
- Zastosowanie niektórych funkcji do danych (grupowanie, usuwanie, scalanie, zmiana nazwy).
- Zastosowanie pewnego rodzaju modelu do danych (regresja, grupowanie, sieć neuronowa lub inna mniej lub bardziej skomplikowana teoria).
- Wdrażanie / prezentowanie wyników mniej lub bardziej technicznym odbiorcom.
Pobieranie danych
99% czasu, proces pobierania danych sprowadza się do zapytań jakiś SQL lub bazy danych Impala: zarówno Python i R mają specyficzne dla klientów lub biblioteki, które wykonują pracę w krótkim czasie i równie dobrze ( RImpala
, RmySQL
dla R i MySQLdb
dla Pythona działa płynnie, niewiele do dodania). Jeśli chodzi o czytanie zewnętrznych plików .csv, data.table
pakiet dla R udostępnia funkcję, fread
która odczytuje w dużych i skomplikowanych plikach .csv z dowolną niestandardową opcją parsowania, i przekształca wynik bezpośrednio w ramki danych z nazwami kolumn i numerami wierszy.
Porządkowanie ramek danych
Chcemy, aby dane były przechowywane w jakiejś tabeli, abyśmy mogli z łatwością uzyskać dostęp do dowolnego wpisu, wiersza lub kolumny.
R Pakiet data.table
zapewnia niepowtarzalne sposoby etykieta, zmieniać nazwy, usuwać i dostępu do danych. Standardowa składnia jest bardzo podobna do SQL dt[i, j, fun_by]
, ponieważ ma to być dt[where_condition, select_column, grouped_by (or the like)]
; niestandardowe funkcje zdefiniowane przez użytkownika mogą być tam umieszczone, jak również w j
klauzuli, dzięki czemu masz całkowitą swobodę w manipulowaniu danymi i stosowaniu dowolnej skomplikowanej lub fantazyjnej funkcji w grupach lub podzbiorach (jak weź i-ty rząd, k-ty element i zsumuj go do (k-2) -tego elementu (i-1) -tego rzędu, jeśli i tylko wtedy, gdy odchylenie standardowe całej kolumny jest tym, czym jest, pogrupowane według ostatniej kolumny). Spójrz na testy i inne niesamowite pytanie dotyczące SO. Sortowanie, usuwanie i zmiana nazwy kolumn i wierszy robi to, co trzeba, a standardowe metody wektoryzacji R apply, sapply, lapply, ifelse
wykonują wektoryzowane operacje na kolumnach i ramkach danych w całości, bez zapętlania poszczególnych elementów (pamiętaj, że ilekroć używasz pętli w R robią to bardzo źle).
Przeciwwagą Pythona jest pandas
biblioteka. Wreszcie zapewnia strukturę pd.DataFrame
(której brakuje w standardowym języku Python, z jakiegoś nieznanego mi powodu), która traktuje dane takimi, jakie są, a mianowicie ramkami danych (zamiast niektórych numpy array, numpy list, numpy matrix
lub czegokolwiek). Operacje takie jak grupowanie, zmiana nazwy, sortowanie i tym podobne można łatwo osiągnąć i tutaj również użytkownik może zastosować dowolną funkcję niestandardową do zgrupowanego zestawu danych lub podzbioru ramki za pomocą Pythona apply
lub lambda
. Osobiście nie lubię gramatyki df[df.iloc(...)]
dostępu do wpisów, ale to tylko osobisty gust i żaden problem. Testy porównawcze dla operacji grupowania są nadal nieco gorsze niż R, data.table
ale chyba że chcesz zaoszczędzić 0,02 sekundy na kompilacji, nie ma dużej różnicy w wydajności.
Smyczki
R sposobem leczenia strun jest użycie stringr
pakietu, który umożliwia dowolną manipulacji tekstu, anagram, wyrażenia regularne, ciągnąc spacji lub podobny z łatwością. Można go również używać w połączeniu z bibliotekami JSON, które rozpakowują słowniki JSON i usuwają listę ich elementów, dzięki czemu uzyskuje się ostateczną ramkę danych, w której nazwy kolumn i elementy są tym, czym powinny być, bez znaków innych niż UTF8 ani białych znaków tam.
Pandy Pythona .str.
wykonują tę samą robotę, używając wyrażeń regularnych, kończących lub tak dobrych jak jego konkurent, więc nawet tutaj nie ma dużej różnicy w smaku.
Stosowanie modeli
Tutaj, moim zdaniem, powstają różnice między tymi dwoma językami.
Rma na dzień dzisiejszy niezrównany zestaw bibliotek, które pozwalają użytkownikowi zasadniczo robić wszystko, co chcą, w jednym lub dwóch wierszach kodu. Standardowe regresje funkcjonalne lub wielomianowe są wykonywane w liniach jednowierszowych i dają wyniki, których współczynniki są łatwo czytelne, wraz z odpowiadającymi im przedziałami ufności i rozkładami wartości p. Podobnie w przypadku grupowania, podobnie w przypadku losowych modeli lasu, podobnie w przypadku dendogramów, analizy głównych składników, rozkładów wartości pojedynczych, dopasowań logistycznych i wielu innych. Dane wyjściowe dla każdej z powyższych najprawdopodobniej zawierają określoną klasę wydruku, która generuje wizualizacje tego, co właśnie zrobiłeś, z kolorami i bąbelkami dla współczynników i parametrów. Testy hipotez, testy statystyczne, Shapiro,
Python stara się nadążyć za SciPy
i scikit-learn
. Większość standardowych analiz i modeli jest również dostępna, ale ich kodowanie jest nieco dłuższe i mniej intuicyjne w czytaniu (moim zdaniem). Brakuje bardziej skomplikowanych maszyn, chociaż niektóre z nich można prześledzić do niektórych kombinacji już istniejących bibliotek. Jedną z rzeczy, które wolę robić w Pythonie niż w R, jest analiza tekstów typu bag-of-word z bi-gramami, tri-gramami i wyższymi rzędami.
Prezentacja wyników
Oba języki mają piękne narzędzia do kreślenia, ggplot2
przede wszystkim R i odpowiedni odpowiednik Pythona. Nie za bardzo konkurują, robią to bezpiecznie i solidnie, chociaż uważam, że jeśli prezentujesz wyniki, być może będziesz musiał użyć innych narzędzi - istnieją fantazyjne kolorowe narzędzia do projektowania i ani Python, ani R nie mają na celu zadziwić publiczność z fantazyjnymi czerwono-zielonymi przeciągnięciami i upuszczeniami. Ostatnio R opublikował wiele ulepszeń swoich shiny app
funkcji, które w zasadzie pozwalają mu wytwarzać interaktywne wyniki . Nigdy nie chciałem się tego uczyć, ale wiem, że jest i ludzie dobrze go wykorzystują.
Dygresja
Na marginesie chciałbym podkreślić, że główna różnica między tymi dwoma językami polega na tym, że Python jest językiem programowania ogólnego przeznaczenia, stworzonym przez i dla informatyki, przenośności, wdrożeń i tak dalej. Jest niesamowity w tym, co robi i jest łatwy do nauczenia; nie ma nikogo, kto nie lubi Pythona. Ale jest to język programowania do programowania.
Rz drugiej strony został wynaleziony przez matematyków, fizyków, statystyk i naukowców danych. Jeśli pochodzisz z tego tła, wszystko ma sens, ponieważ idealnie odzwierciedla i odtwarza pojęcia stosowane w statystyce i matematyce. Ale jeśli zamiast tego pochodzisz z informatyki i chcesz symulować Javę lub C w R, będziesz rozczarowany; nie ma „obiektów” w sensie standardowym (no cóż, ale nie ma tego, co zwykle myśli się, że są…), nie ma klas w sensie standardowym (no cóż, ale nie ma tego, co zwykle uważa, że są ...), nie ma „wskaźników” ani innych struktur informatycznych - tylko dlatego, że ich nie potrzebuje. Ostatni, ale nie mniej ważny: dokumentacja i pakiety są łatwe do utworzenia i odczytu (jeśli używasz Rstudio); istnieje duża i pełna pasji społeczność, a Google zajmuje dosłownie pięć sekund „jak zrobić losowy problem w R”, którego pierwszy wpis przekierowuje cię do rozwiązania problemu (zrobionego przez kogoś innego) z odpowiednim kodem , w krótkim czasie.
Większość firm przemysłowych ma infrastrukturę zbudowaną w języku Python (lub środowisku przyjaznym dla języka Python), co umożliwia łatwą integrację kodu w języku Python (tylko w import myAnalysis
dowolnym miejscu i po prostu gotowe). Jednak każda nowoczesna technologia, serwer lub platforma z łatwością uruchamia kod R w tle bez żadnych problemów.