Jómagam valamikor 2017 nyarán kerültem először kapcsolatba az R nyelvvel. Akkoriban A főrendiházi reform és a magyar főnemesség földbirtokviszonyai címet viselő doktori (PhD) értekezésemen dolgoztam, amelynek hátterét egy relációs adatbázisrendszer adta. A disszertáció témájának megfelelően össze kellett gyűjtenem az 1885 és 1918 élt minden egyes magyar főnemes személyt, azok demográfiai adataival, családi kapcsolataival, földbirtokviszonyaival együtt. Továbbá ugyancsak szükségem volt arra, hogy rekonstruáljam az országgyűlés főrendiházának teljes tagságát az 1885. évi reformot közvetlenül megelőző ülésszaktól kezdve egészen az 1918 novemberében bekövetkezett önfeloszlatásig. Mindez együttvéve tízezernél is több személyt és hozzájuk kapcsolódóan sok százezer adatpontot jelentett. Maga az adatgyűjtés az Access adatbáziskezelőben történt, ahonnan manuálisan exportáltam a táblákat az Excelbe. Ott szintén kézműves módszerekkel, másolással és beillesztéssel, illetve a beépített képletek segítségével raktam össze a szükséges kimutatásokat és állítottam elő az ábrákat.

Egy idő után azonban rá kellett jönnöm arra, hogy ilyen adatmennyiségnél ez a módszer nem túl produktív. Hiszen ha új adatokat találtam, vagy az ellenőrzés során nem stimmelt valami, akkor jó eséllyel kezdhettem elölről az egészet. Szóval erősen éreztem, hogy nincs ez így rendben és elkezdtem keresni egy hatékonyabb megoldást. Ez lett az R nyelv. Szerelem első látásra. Pedig akkoriban még nem is sejtettem, hogy békaemberekkel fogok találkozni az R egy olyan sokoldalú és innovatív eszköz, amely az adatok szimpla manipulációján és a diagramok elkészítésén túlmutatóan minden olyan informatikai területen kínál valami megoldást, amelyre a munkám során szükségem van. Példának okáért ezt a blogposztot (ahogy az összes többit is) R Markdown-ban írom, amelyből a blogdown csomag segítségével állítom elő A programozó történész blogot.

De mi az R nyelv?

Az R programozási nyelvet (teljes néven: The R Project for Statistical Computing) a University of Auckland két statisztikus oktatója, Ross Ihaka és Robert Gentleman alkotta meg az 1990-es években. (Az R elnevezés az ő keresztneveik kezdőbetűjéből ered.) Az első stabil kiadása 2000. február 29-én került közzétételre, tehát az R idén ünnepelte a 20. születésnapját. A nyelv kezdetben a statisztikai feladatok elvégzéséhez szükséges alapvető adatmanipulációs, számítási és vizualizációs képességekkel rendelkezett. Hamarosan azonban önálló életre kelt és egy olyan fejlesztői közösség alakult ki körülötte, amely kiegészítő programcsomagok révén jelentősen kibővítette az R képességeit. A manapság az R Core Team által koordinált munka eredményeként a The Comprehensive R Archive Network (CRAN) mintegy 16500 csomagot számlál. Ezen kívül kisebb számban máshol, például a GitHub-on is elérhetők további csomagok, amelyek összes száma így meghaladja a 20000 darabot. Én a saját praxisomban még nem találkoztam olyan problémával, amelyre ne kínáltak volna ezek valamilyen megoldást.

Meg kell még említenem, hogy az utóbbi években a Microsoft, a saját termékeibe való integrálás szándékával, létrehozott egy klónozott változatot az R-ből, amit Microsoft R Open-nek nevezett el. Ez egy konkrét dátumra vonatkozóan a CRAN tartalmának lementése, tehát mindenben azonos az előbbivel. (Update: Amikor 2023 márciusában újból átolvastam ezt a posztot, akkor az az üzenet fogadott a belinkelt oldalon, hogy a Microsoft 2023. július 1-jén leállítja ezt a szolgáltatását.)

Az R legalapvetőbb képességeit tartalmazó, a telepítéssel együtt megkapott base csomag mellett, ahogy említettem, rengeteg kiegészítő csomagból válogathatunk. Ezek közül néhány olyat szeretnék megemlíteni, amelyet én magam is gyakran használok.

A fentieken kívül számos más csomaggal is kapcsolatba kerültem az elmúlt években. Az itt felsoroltak olyanok, amelyeket az adott területen a legjobbnak tartok.

Mire jó ez nekünk?

Az adatok elemzésére a magyar történészek általában az Excelt használják. (A speciális igényeket kielégítő térinformatikai vagy statisztikai szoftverek nyilván más lapra tartoznak.) Az R megtanulása természetesen sokkal nagyobb erőfeszítést igényel, mint az interaktív felhasználói felülettel rendelkező táblázatkezelő programokban való munka. Ez az időbefektetés azonban megtérül azáltal, hogy az életünk egyszerűbbé válik és a lehetőségeink jelentősen kitágulnak. Őszintén szólva a mából visszatekintve már abszurdnak tűnik, hogy valaha is másként csináltam.

Az alábbiakban néhány konkrét érvet szeretnék felhozni a táblázatokban való munkavégzéssel szemben és az R nyelv mellett.

  • Az első probléma gyakran ott van, hogy megpróbálunk egy statikus, kétdimenziós táblázatba beleerőszakolni egy olyan adatstruktúrát, amely a valóságban sokkal bonyolultabb szerkezetű. Vagyis már az érdemi elemzést megelőzően szelektáljuk és egyszerűsítjük az adatainkat.

  • Az Excelben alapvetően mechanikusan, kattintgatással elvégzett műveletek sorozatáról van szó. Ez rettentő időigényes és sok a hibázási lehetőség.

  • A nyers adatok és az elemzés végeredménye egybemosódik, vagyis az előbbieket közvetlenül felülírjuk, vagy felülírhatjuk az utóbbiakkal.

  • Gyakorlatilag követhetetlen, hogy milyen műveleteket hajtottunk végre. Utólag csak a végeredményt látjuk, maga a folyamat nem rekonstruálható. Esetleg észre sem vesszük, ha menet közben hibáztunk valahol.

  • Az egymásba ágyazott képletek már kis mélységben is teljesen áttekinthetetlenek.

Táblázatkezelő LOL

Maga az R mindazt tudja, ami az Excelből előnyös, plusz megoldást kínál az említett problémákra is.

  • Nem kell előzetesen válogatnunk az adatainkból. Mindenkor az adatbázisunk teljes tartalma, az összes adat és belső kapcsolat figyelembevételével készülhetnek az elemzések.

  • A feladatok teljeskörűen automatizálhatók és a végeredmény reprodukálható. Ha nem változtatunk a bemeneti adatokon, akkor garantáltan mindig ugyanazt az eredményt kapjuk. Mindemellett lehetőségünk van arra is, hogy dinamikusan változó feltételek mellett előállított bemeneti adatokból ezeknek megfelelő, dinamikusan változó kimenetet produkáljunk. Vagyis valós időben követni tudja az adatbázisban bekövetkező változásokat és ezeknek megfelelően módosítja a végeredményt. Például ha a felviszünk egy új személyt, akkor a következő futtatáskor már őt is figyelembe veszi a rendszer.

  • Az eredeti adatok érintetlenek maradnak, ezeknek csak a másolatával dolgozunk.

  • A műveletek sorrendje előre definiált. Lehetőségünk van ismétléses ciklusok és feltételekhez kötött utasítások beépítésére is. Ezek tetszőleges mélységben egymásba ágyazhatók, így bármilyen bonyolultnak látszó művelet elvégezhető.

  • És végül az is fontos szempont, hogy nem cellákba kell bezsúfolni mindent. Következetes kódolással és a kódhoz fűzött megjegyzésekkel az algoritmus áttekinthető marad.

Lehetséges, hogy a szakmabeli olvasók egy része ijesztőnek találja az algoritmusok és a programozás emlegetését. A helyzet azonban az, hogy az adatokat a legkevésbé sem érdekli, hogy mi történészek vagyunk: makacsul némák maradnak, ha nem a megfelelő módon közelítünk hozzájuk. Az adatok hatékony kezelésének, elemzésének, vizualizálásának módszerei interdiszciplinárisak. Minket történészeket ezen a területen egyedül az adataink történelmi relevanciája és a megválaszolandó kérdések különböztetnek meg az egyéb tudományágak képviselőitől. Aki történészként adatokra kívánja építeni a kutatását, az nem spórolhatja meg a programozást.

Hogyan kezdjünk hozzá az R nyelv megtanulásához?

2017 nyarán a nulláról kezdtem el megtanulni az R-t. Meg kell említenem azonban, hogy némi programozási ismerettel már rendelkeztem akkoriban, mivel a kétezres évek elején egy rövid ideig számítástechnika szakos hallgató is voltam. Az ott tanult Turbo Pascal nyelvből ugyan nem emlékszem semmire, de az algoritmusokban való gondolkodás képessége, úgy érzem, kellően belém rögzült. Szerintem a programozáshoz ez legalább annyira fontos, mint az adott nyelv elemeinek és lehetőségeinek ismerete. Éppen ezért én azt javaslom, hogy az R iránt érdeklődők szánjanak némi időt erre a területre is. Aki interaktív módon akar megismerkedni az algoritmizálással és nem riad vissza egy gyerekeknek szóló oldaltól, annak ajánlom a Scratch alkalmazás kipróbálását. Annyi azonban biztos, hogy az algoritmusok “működésére” csak gyakorlással lehet ráérezni.

A R tanulását az interneten fellelhető magyar nyelvű dokumentumok alapján kezdtem el. Ilyet az “r nyelv jegyzet” keresőkifejezéssel többet is lehet találni. Mivel az R folyamatosan fejlődik, ezért előfordulhat, hogy ezek egyben-másban elavultak lesznek. De az alapok elsajátításához mindenesetre elegendőek. Ezt követően már van annyi rálátása az embernek, hogy célzottan keresgéljen a továbblépéshez. Angol nyelvű tutoriálokból kismillió változat található a neten. Ha azonban profiktól és profi módon felépített tananyagokból, gyakorlatorientált módon akar valaki tanulni, akkor a DataCamp kurzusai egyértelműen a prémium minőséget képviselik. Ez viszont az előfizetéses formában működő oldal árszínvonalán is meglátszik. Évente néhány alkalommal szokott lenni olyan akció, ami magyar pénztárcával is megfizethetővé teszi a képzést. Egyébként pedig a kurzusok első leckéje szabadon elérhető, így mindenki el tudja dönteni, hogy kell-e ez neki. Aki befektetésnek tekinti a tanulást, annak mindenképpen ajánlom. Én voltam egy ideig előfizető és sokat tanultam belőle. (Ha valaki viszonylag rendszeresen tud foglalkozni vele, akkor egy év bőven elég ebből.) Ugyancsak jó szívvel ajánlom, szintén bevezető jelleggel, Hadley Wickham és Garrett Grolemund R for Data Science című könyvét, amelynek online változata teljes szövegében ingyenesen elérhető.

A tanulás gyakorlati részét tekintve eleinte próbáltam az emlékezetemre hagyatkozni, de kénytelen voltam rájönni, hogy ez így nem fog menni. Mivel a munkanapjaim többségén “normális” történészként és oktatóként dolgozom, azaz nem a programozás a főállásom, ezért a ritkábban használt funkciókat egykettőre elfelejtettem. A megoldást végül az jelentette, hogy egy online munkafüzetbe – én az Evernote-ot használom, de bármilyen elektronikus dokumentum megteszi – jegyzeteket készítek. Témakörök szerint csoportosítva feljegyzem, ha valami olyan megoldást találok ki vagy olyan kódrészlettel találkozom, amelyre feltehetően szükségem lesz a későbbiekben is. Emellett a fontosabbnak tekintett R csomagok tartalmát kijegyzeteltem. (Általában véve elmondható, hogy az R csomagok igen jól dokumentáltak.) Így ha nem is emlékszem mindenre, de van egy rálátásom arra, hogy az adott problémára hol érdemes keresni a megoldást. Ez a rendszer jól bevált nálam. Léteznek előre elkészített “csaló lapok” is, amelyek tömör áttekintést nyújtanak egy-egy csomagról.

Végül megemlítem még, hogy az R egy nagyon aktív és lelkes támogatói közösséggel bír. Az R-hez kapcsolódó angol nyelvű blogposztokból folyamatosan frissített válogatást közöl az R-bloggers gyűjtőoldal, míg az R Weekly heti szinten teszi ugyanezt. De hasznos lehet a témába vágó Twitter csatornákra is feliratkozni. Ezekből nagyon sokat lehet tanulni és inspirálódni. A programozás közben felmerülő problémákra pedig szinte mindig találhatunk valamilyen megoldást, ha tömören, angol kulcsszavakba sűrítve rákeresünk az interneten.

A programozás elsajátítása természetesen csak gyakorlással lehetséges. Eleinte még sok minden zavarosnak és érthetetlennek tűnik, de ez így van rendjén. Nem szabad leragadni a kezdeti problémáknál! Ha nem értjük valaminek a működését, akkor próbáljuk ki a gyakorlatban. Ha még mindig nem értjük, akkor keressünk rá példákat az interneten. A sok funkció közül azok használata, amelyekre valóban szüksége van az embernek, előbb-utóbb rögzül és készséggé válik.

Az R gyakorlati alkalmazásához szükséges fejlesztői környezet telepítését és beüzemelését a következő blogposztban mutatom be.