
Monesti olen kouluttaessa kuullut kysymyksen: ”Kumpi on parempi, R vai Python”? Hätäisimmille lukijoille annan saman tien lyhyen, kokemusperäisen vastauksen: ei kumpikaan.
Jos et kuitenkaan tyytynyt tähän vastaukseen, taustoitan alla hieman, miksi olen tätä mieltä.
Historiaa
Olen itse pitkän linjan R-koodaaja. Tutustuin R-kieleen ensimmäisen kerran opintojeni loppuvaiheessa keväällä 2004. Tuolloin komentorivi herätti vielä melkoista hylkimisreaktiota (niin kuin monessa muussakin). Kuitenkin jo tulevana syksynä, kun aloitin siviilipalveluksen Metsäntutkimuslaitoksessa, aloin ymmärtää, että R:n opettelu tulisi olemaan välttämätöntä. Avoimen lähdekoodin ohjelmana uudet innovaatiot tuppaavat ilmestymään R:ään ensimmäisenä, ja laaja käyttäjäkunta tarjoaa korvaamatonta vertaistukea ongelmiin.
Kaksi viikkoa kestäneen intensiivisen treenaamisen jälkeen aloin olla riittävän sujut komentorivin kanssa, jotta kykenin jotenkin soveltamaan R:ää käytännössä. Takana on nyt lähes 15 vuotta lähes päivittäistä aktiivista tekemistä ja itseopiskelua. Tästä huolimatta en voi siltikään voi sanoa hallitsevani R:ää täydellisesti; opin jatkuvasti uutta. Etenkin R-Studion tulo ”markkinoille” on kasvattanut R:n mahdollisuuksia huimasti ja samalla tietysti lisännyt tarvetta omaksua uusia asioita.
Python onkin sitten itselleni paljon tuoreempi tuttavuus. Aloin ottaa tuntumaa ”pyyttoniin” noin vuosi sitten, kun siirryin yliopistosta yrityspuolelle. Käytännön asiakasprojektin kanssa työskentely joudutti oppimista, ja nyt kärmes alkaa totella jo melko kesysti. Toki osaamiseni rajoittuu pitkälti data-analytiikkaan, mikä on vain murto-osa siitä, mihin Python taipuu.
Näistä lähtökohdista voisi luulla, että kallistuisin ilman muuta R:n kannalle. Millä perusteella päädyin kuitenkin tylsään tasapeliin? Myönnän: olisin voinut valita toisinkin, kummankin kielen eduksi. Tämä johtuu siitä, että R ja Python on kehitetty hyvin eri tarkoituksiin. R:n (jonka beta-versio julkaistiin vuonna 2000) kehittivät tilastotieteilijät nimenomaan tilastoanalytiikan tarpeisiin, kun taas Python (ensimmäinen versio käytössä jo 80-luvulla) on yleisohjelmointikieli. Data-analytiikan saralla Pythonia on alettu toden teolla hyödyntää vasta 2010-luvun jälkeen, Pandas- ja Sklearn-kirjastojen myötä. Nykyään tilastomenetelmien kehitys tapahtuu edelleen ensisijaisesti R:ssä, kun taas koneoppimismenetelmiä (esim. neuroverkot ja vahvisteoppiminen) viedään voimakkaasti eteenpäin Pythonissa.
Molempi parempi?
Todenperään olen henkilökohtaisesti sitä mieltä, että on hyödyllistä hallita molemmat kielet, koska ne täydentävät kivasti toisiaan. Tämä ei kuitenkaan ole mitenkään välttämätöntä — kummalla tahansa pärjää mainiosti. Toki, R on kiistatta oikea valinta, jos tarpeena on tehdä monipuolisesti tilastoanalytiikkaa, kun taas Python on mielestäni parempi esimerkiksi datan lukemiseen (pandas-kirjastoa on vaikea päihittää tässä).
Yhdellä kielellä pärjäämistä helpottaa erityisesti se, että R ja Python lähentyvät jatkuvasti toisiaan data-analytiikan saralla. Koska molemmilla kielillä on mittava käyttäjä- ja kehittäjäkunta, on helppo ymmärtää, että molempiin kieliin tuodaan jatkuvasti parhaita ominaisuuksia toisesta kielestä.
Otetaan yksinkertainen esimerkki: datan muokkaukseen on R:ssä lyömätön dplyr-paketti (osa laajempaa tidyverse-kokonaisuutta). Jos esimerkiksi haluan laskea otoskoon moninaisen ryhmittelyn sisällä, on syntaksi yksinkertaisuudessaan:
data %>% group_by(grouping1, grouping2) %>% summarize(counts = n())
missä %>% on ns. putki-operaattori, jolla erillisiä operaatioita voidaan ketjuttaa. Tämän esimerkin toimenpiteen saisi tietysti myös tehtyä esim. aggregate-funktiolla, mutta dplyr:in hienous piileekin siinä, että operaatioita voidaan ketjuttaa loputtomasti, mikä mahdollistaa hyvin monimutkaiset muokkaukset. Jos on tykästynyt dplyr:iin ja kaipailee samanlaista Pythoniin (pandas toki mahdollistaa lähes vastaavan funktionaalisuuden), tähän on olemassa ratkaisu: dfply-kirjasto, jolla em. esimerkki koodataan näin:
(data >> group_by(X.grouping1, X.grouping2) >> summarize(counts = n()))
Rython, PythoR, …
R-Python integraatio on nykyisin sen verran aktiivista, että voisi luulla tämän olevan ihan päämäärätietoista. Python-puolella yhdentymistä pyrkii edistämään rpy2 -kirjasto, joka tuo käytännössä R:n Pythoniin. Vastaavasti, Pythonin koneoppimisvahvuuksia on tuotu R:n puolelle, esimerkiksi kääntämällä Keras-kirjasto R-kielelle. R:stä on myös mahdollista tehdä kutsuja Pythoniin ja pyytää dataa takaisin rPython-paketin avulla.
Toiminnallisesti vastaavia paketteja löytyy molemmista kielistä. Pythonin suosittua sklearn-kirjastoa taas vastaa hyvin pitkälti caret-R-paketti ja R:n visualisointipaketti ggplot2:a vastaa Pythonissa seaborn-kirjasto. Alustojenvälistä työskentelyä on helpotettu jopa luomalla uusi dataformaatti, jota molemmat kielet tukevat. Formaatin nimi on feather, ja se on käytännössä kieliagnostinen binäärinen tiedostorakenne datataulukoiden säilömiseen. Lukemalla feather-tiedoston R:ään (read_feather-funktiolla) palauttaa data.frame -objektin, kun taas Python (feather.read_dataframe-funktiolla) palauttaa pandas.DataFrame -objektin.
R:n ja Pythonin yhteen naittaminen on tehty jopa niin helpoksi, että molempia voi käyttää rinnan samassa ohjelmassa. Asentamalla reticulate -paketti on R-Studiossa mahdollista ajaa Python-blokkeja (kuten myös esim. bash, SQL ja Stan -blokkeja) R-Notebook-tiedostoissa. Esimerkiksi datan lukeminen Pythonin avulla R-Studiossa onnistuu vaikka näin:
```{python} import pandas as pd df = pd.read_csv('data.csv') ```
missä ` ` `{python} ` ` ` rajaa Python-koodi blokin.
Primääristi Pythonille tarkoitetuissa Jupyter Notebook -tiedostoissa taas voi ajaa R-blokkeja (sekä esim. julia, java ja ruby -blokkeja). Varsinkin Jupyter Notebook-maailmaan perehtymistä voi suositella, sillä monilla moderneilla koneoppimis-alustoilla — mm. DataBricks, Azure ML Service ja kotimainen Valohai — operoidaan pitkälti juuri näitä ”muistivihkoja” käyttäen. Jupyter Notebook:issa Star Wars hahmojen keskipituuden laskeminen silmien värin ja sukupuolen suhteen onnistuu R:llä esim. näin:
%load_ext rpy2.ipython %%R require(dplyr) starwars %>% group_by(eye_color,gender) %>% summarize(`mean height` = mean(height)
Loppuun pieni mainos: Jos kiinnostuit aiheesta ja haluaisit tietää lisää, tervetuloa osallistumaan vetämiini R- ja/tai Python -koulutuksiin (tai muihin koulutuksiimme).
