Hálózatok automatizált importálása a Gephibe

A hálózatokkal való foglalatoskodás legnagyobb részét az adatok összegyűjtése és azok megfelelő előkészítése teszi ki. Ezek után persze már alig várja az ember, hogy valamit lásson is a munkájából. A hálózatok megjelenítésére és elemzésére szolgáló számos szoftveres megoldásból a digitális bölcsészet- és társadalomtudományok terén a Gephi a legnépszerűbb alkalmazás.

A Gephi egy kifejezetten hálózatokhoz kifejlesztett vizualizációs és elemző platform. Célja, hogy részint szemrevételezéssel, részint különböző statisztikai mutatók segítségével jobban felfedezhetővé, megérthetővé, leírhatóvá tegye a vizsgált hálózatokat. Használatának nagy előnye, hogy nincs szükség hozzá programozási ismeretekre, hanem egyszerűen, egérkattintásokkal léphetünk interakcióba a hálózatunkkal. Az így rendelkezésre álló lehetőségeket ugyan idővel könnyen kinövi az ember, de kezdetnek ez több mint elegendő.

A Gephi nyílt forráskódú szoftver, bárki számára szabadon és ingyenesen letölthető. Ez azonban azzal jár, hogy senki sem garantálja a stabil és hosszútávú működését. Vagy hogy egyáltalán működni fog. A jelenlegi 0.9.2-es verziót 2017 szeptemberében adták ki, azaz a Gephi legfrissebb változata immáron három és fél éves. Azóta lényegében tetszhalott állapotban van. Bár egyesek már a lélekharangot kongatják felette, de egyelőre nemigen látszik a hasonló értékű alternatíva.

E blogposztban azt fogom bemutatni, hogy miként lehet automatizálni a Gephibe való adatbevitelt.

Amit meg akarunk spórolni: az adatok manuális betöltése

A Gephi ugyan többféle bemeneti formátumot is ismer, de a táblázatos adatokkal rendelkező kutatók számára az a legkézenfekvőbb, ha bemenetként is a táblázatos formát választják. A Gephi azonban nem fogad el akármilyen táblázatot, ennek meg kell felelnie bizonyos formai kritériumoknak. A nehézséget itt az okozza, hogy olyan táblázatokat vár tőlünk, amelyek felépítése általában jelentősen eltér azoktól a tábláktól, amelyekben a hálózat alapjául szolgáló adatainkat gyűjtjük és tároljuk. Vagyis az importálás megkezdése előtt össze kell állítanunk a bemeneti formátumnak megfelelő adatkészletet. És ha a későbbiekben kiderül, hogy valamit rosszul csináltunk, vagy megváltoznak a vizsgálati szempontjaink, esetleg újabb adatokat akarunk bevonni a kutatásba, akkor kezdhetjük elölről az egészet. Természetesen nemcsak az adatkészlet összeállítását, hanem ennek hosszas beimportálását is.

A bemeneti adatok formátuma

Ahhoz, hogy a Gephi elfogadja tőlünk az adatokat, az alábbiakban megadott táblákra van szükség. Ha manuálisan dolgozunk, akkor ezeket kell összebarkácsolni.

A kapcsolati adatokat (edges) tartalmazó táblának valamennyi releváns kapcsolatot tartalmaznia kell, függetlenül attól, hogy azt hol és milyen módon tároljuk az adatbázisunkban. A tábla minden rekordja egy-egy ilyen kapcsolatnak felel meg. Ezeket a bennük érintett két csomópont ID-jeivel határozzuk meg, amelyeket a Source és a Target mezőkben kell elhelyezni. A két ID sorrendjének, vagyis a forrás és a cél mezők tartalmának az úgynevezett irányított hálózatok esetében van jelentősége. Szintén ez utóbbival állösszefüggésben a Type mező is, amely a directed vagy az undirected szöveget tartalmazhatja. A Weight mező tartalmával súlyozni tudjuk az egyes kapcsolatokat. Ha ezt nem akarjuk, akkor ide minden rekordban az 1-es szám kerüljön. Végül az utolsó kötött mezőben, amely a Label elnevezést viseli, a hálózat vizuális ábrázolásakor az adott kapcsolat linkje mellett szerepeltetni szándékozott felirat szövegét helyezhetjük el. Ezt vagy a cellák egy részét üresen is hagyhatjuk. Az imént felsorolt öt mezőn túl újabbakat is hozzáadhatunk a kapcsolatokat magában foglaló táblához, ha azoknak valamilyen vonatkozásban szerepet szánunk a hálózat elemzésében vagy megjelenítésében.

A csomópontok (nodes) adatait tartalmazó tábla esetén egy-egy csomópontot képviselnek a rekordok. Az Id nevű mezőben értelemszerűen a csomópont egyéni ID-jét, a Label mezőben pedig annak a feliratnak a szövegét kell rögzíteni, amit a csomópontnál a karunk megjeleníteni. Emellett, ha szükséges, itt is kibővíthetjük a táblát.

Megjegyzendő, hogy a kapcsolati adatok táblájával ellentétben a csomópontokhoz kötődő adatok táblájának kitöltése fakultatív jellegű, akár teljesen el is maradhat. A kapcsolatokban résztvevő ID-k alapján ekkor is legenerálódik ugyan a tábla, de az azonosítókon kívül más egyebet nem fog tartalmazni. Érdemleges szerepe akkor van tehát, ha valami miatt jelentőséget tulajdonítunk a Label és az esetleges további mezők tartalmának. Amennyiben olyan ID-ket rögzítünk itt, amelyek egyáltalán nem szerepelnek a másik tábla Source vagy Target mezőiben, akkor ezek önálló, kapcsolat nélküli csomópontok létrejöttét fogják eredményezni. Ez befolyással lehet a hálózat elemzésének eredményére, így érdemes figyelni arra, hogy a két tábla szinkronban legyen egymással.

Az adatok manuális beimportálása

Manuális betöltés esetén a bemenetet a fenti táblák jelentik, XLSX (Excel) vagy CSV formátumban.

Adatok manuális importálása a Gephi-be

A végrehajtandó műveletsor a következő:

  1. Egy új projekt indítása: File ➽ New Project.

  2. Az előkészített fájlok importálása a Data Laboratory szekción belül történik. Itt először a kapcsolatokat, majd a csomópontokat tartalmazó táblázatot töltöm be.

  3. A Data Table feliratú fülecske alatti menüsorban: Edges, majd Import Spreadsheet. A megjelenő ablakban kiválasztjuk és megnyitjuk a kapcsolatokat magában foglaló fájlt.

  4. Excel fájlt importálása esetén a következő ablakban tulajdonképpen nincs semmi teendőnk. Amennyiben CSV formátummal próbálkoztam volna, akkor itt kellene kiválasztani a szeparátort (vessző, pontosvessző, tabulátor, szóköz) és a karakterkódolást. Ha az ablak alján lévő betekintő képben rendben van a táblázat, vagyis az oszlopok tagolása megfelel a valóságnak és nincsenek benne olvashatatlan karakterek, akkor mehetünk is tovább.

  5. Az ezt követő ablakban ki tudjuk választani, hogy a korábban megadott táblából melyik mezők kerüljenek importálásra. Alapból mind ki van jelölve. A Source és a Target természetesen elengedhetetlen, de a többi akár el is hagyható. Emellett bizonyos mezőknél – ahol ennek értelme van – beállítható az is, hogy milyen formátumban (szám, szöveg és ezek különféle finomságai) szeretnénk beolvasni az adatokat.

  6. Végül még egy ablakot kapunk. Itt tájékozódni tudunk a behúzott táblában lévő kapcsolatok és csomópontok számáról, illetve az esetleges importálási hibákról, problémákról. Emellett néhány beállítást is el kell végeznünk.

    1. A Gephi alapból új munkalapot akar nyitni az importált adatoknak – a már létező munkalap(ok) mellett. Ez különösen akkor lehet bosszantó, ha egy meglévő hálózathoz szeretnénk új kapcsolatokat és csomópontokat adni, amelyek új munkalapra kerülve természetesen nem találkoznak a korábban betöltött adatainkkal. Ennek elkerülése érdekében az Append to existing workspace lehetőséget kell választani. (Az alapértelmezett a New workspace.)
    2. A Graph Type legördülő menüben a hálózatunk irányítottságát lehet beállítani: irányított (directed), irányítatlan (undirected) és vegyes (mixed). Ezt elvileg felismeri a táblázatban megadott paraméterek alapján, de azért nem árt egy pillantást vetni rá.
    3. Amennyiben az Issues elnevezésű panelben a “Parallel edges detected, remember to choose a merge strategy” felirat szerepel, akkor bizonyos kapcsolatok többször szerepelnek az importált táblázatunkban. Ez nem feltétlenül jelent problémát, ezt mindig a kutatónak kell megítélnie. Ha a mi hálózatunkban nem szabadna többes kapcsolatoknak szerepelnie, akkor rosszul állítottuk össze az adatkészletünket. Ebben az esetben vizsgáljuk felül a táblánkat, keressük meg és javítsuk a hibát, majd importáljuk be újból. Ha viszont normálisnak tartjuk az ilyen kapcsolatok jelenlétét, akkor a More options… linkre kattintva megnyíló panelen az Edges merge strategy legördülő menüben be tudjuk állítani, hogy mit csináljon ezekkel a Gephi. Például hagyja úgy, ahogy vannak (Dont’ merge) vagy végezzen valamilyen összevonást vagy szelekciót.
  7. Ezzel készen is vagyunk a kapcsolatok importálásával. Ezeket megtekinthetjük az Edges nevű táblázatban. Itt tulajdonképpen meg is állhatnánk, hiszen a linkek két oldalán szereplő csomópontok automatikusan bekerültek a Nodes nevű táblázatba, azaz a hálózatunk használatra kész. A csomópontjainkat azonban egyelőre csak egy-egy szám, azok azonosítói reprezentálják, ami a hálózat értelmezését nagyban megnehezíti. Ha szeretnénk, hogy ezek valamilyen nevet is kapjanak, akkor importálnunk kell a csomópontokat tartalmazó táblát is.

  8. A csomópontok importálásához a Data Table feliratú fülecske alatti menüsorban válasszuk a Nodes, majd Import Spreadsheet lehetőséget. Innentől kezdve a műveletsor lényegében azonos a fentiekkel. Különösen ügyeljünk azonban a 6/a. pontban leírtakra, hiszen csak akkor áll össze a két adatkészlet, ha azonos munkalapra kerülnek!

  9. A későbbiekben – amennyiben szükségesnek érezzük – a fentebb leírt módon újabb kapcsolatokat és csomópontokat is hozzáadhatunk a hálózatunkhoz, illetve az Edges és a Nodes táblázatoknál rendelkezésre álló manipulációs eszközökkel változtathatunk a beimportált adatainkon.

Az adatok importálásakor nagyon ajánlott elgondolkodni azon, hogy a várakozásoknak megfelelő számú kapcsolat és csomópont került-e be a Gephibe. Erről kell lennie valamilyen elképzelésünknek, ha máshonnan nem, akkor a beimportált táblák sorainak számából. Ezeket az adatokat egyrészt menet közben, a fentebbi 6. pontban említett ablakban, másrészt az importálást követően az Overview szekcióban, a képernyő jobb felső sarkában, a Context nevű panelen tudjuk ellenőrizni. Ez az animált GIF utolsó képén is látható.

Tipikus hiba például, hogy a kapcsolatok beimportálása után kevesebb csomópontot látunk, mint ami az utóbbiakat tartalmazó tábla sorainak számából következne. Ez arra utal, hogy olyan csomópontjaink is vannak, amelyek nem kapcsolódnak semmihez, vagyis szorosan értelmezve nem részei a hálózatnak. Lehet persze, hogy ez így rendben van a számunkra. De ha mégsem, akkor javítani kell az adatkészletünket. Amennyiben a kapcsolatok száma lenne kevesebb, mint ami az importált tábla sorainak száma alapján elvárható lenne, akkor ez esetben a 6/c. pontban leírtaknak megfelelően valamilyen összevonás vagy szelekció történt. Ha ezt nem akartuk, akkor ismételjük meg az importálást a megfelelő beállításokkal.

Ahogy sokkal kényelmesebb: adatok importálása az R nyelv segítségével

Az alább leírtak szorosan kapcsolódnak az előző posztom tartalmához, ahol az R igraph nevű csomagjával már összeállítottam egy hálózatként értelmezhető adatstruktúrát. Ez egy köztes lépés volt a kutatás folyamatában, aminek számos további kimenete lehetséges. Most egy konkrét felhasználási módra mutatok egy példát. Vagyis a (genealógiai adatokat tartalmazó) halozat.RData állományt átkonvertálom egy olyan formátumba, amelyet képes a Gephi automatikusan beimportálni.

Értelemszerűen a műveletsor jelentősége nem az egyszeri használatban mutatkozik meg, hanem abban, hogy a segítségével bármennyi alkalommal, bármilyen variációban át tudjuk adni a hálózatot a Gephinek. Egy olyan fájl előállítása a cél, amelyre rákattintva minden további nélkül beimportálódnak az adataink.

Az alábbiakban R nyelven (v4.0.3) írt kódot használok a feladat végrehajtásához. A magyarázó szövegek közé ékelt fekete kódblokkok tartalmát az RStudio-ban egymás alá illesztve elvileg bárki által reprodukálható az itt bemutatott műveletsor. A kódblokkok # kezdetű sorai pusztán magyarázó funkcióval bírnak, ezekre a program futtatásakor nincs szükség.

A Gephi a táblázatos adatokon kívül néhány egzotikusabb bemeneti formátumot is képes kezelni. Ezek közül én az XML alapú GEXF-et választottam. Ennek előállításához az R nyelven rendelkezésre áll az rgexf csomag, amellyel az igraphban korábban összerakott hálózatunkat viszonylag egyszerűen át tudjuk konvertálni a Gephi számára értelmezhető formára. Ennek létezik ugyan egy igraph.to.gexf() nevű függvénye, amely közvetlenül is elboldogul a feladattal. Ez azonban egyrészt – ki tudja miért – átszámozza a hálózat csomópontjainak ID-jeit. Másrészt az is problémát okoz, hogy az igraph nem képes kezelni az egyszerre irányított és irányítatlan kapcsolatokat is tartalmazó hálózatokat, így ezek figyelembevételéhez némi furfang szükségeltetik. De megoldható. 😉

# A szükséges csomagok betöltése.
# A legelső használat előtt az install.packages("...") utasítással telepíteni   
# kell ezeket. A ... helyére az adott csomag neve írandó.
library(rgexf)
library(igraph)
library(stringr)

# Ide a saját munkakönyvtárunk elérését kell beírni!
# Töltsük le ide a fentebb belinkelt halozat.RData állományt!
setwd("C:/Munkakönyvtár")

# A halozat.RData betöltése.
load("halozat.RData")

# Csomópontok és a kapcsolatok adatainak kinyerése az igraph hálózatból abban
# a formában, ahogy az rgexf csomag elvárja tőlünk.
rgexfNodes <- data.frame("id" = as.numeric(V(halozat)$name), "label" = utf8::as_utf8(V(halozat)$label))
rgexfEdges <- data.frame("source" = as.numeric(get.edgelist(halozat)[,1]), "target" = as.numeric(get.edgelist(halozat)[,2]))

# Az exportálandó GEXF formátumú állomány előállítása.
export <- write.gexf(rgexfNodes, rgexfEdges, defaultedgetype = "mutual", encoding = "UTF-8")

# Az előbbi átszerkesztése a kapcsolatok irányának hozáfűzése érdekében.
export <- str_split(export$graph, "\n") %>% unlist()
export[str_which(export,"edge id")] <- str_replace(export[str_which(export,"edge id")], "weight", paste0("type=\"",ifelse(E(halozat)$iranyitott,"directed","undirected"),"\" weight"))

# A kész anyag kimentése.
writeLines(export, "halozat.gexf")

GEXF Graph File

A kód futtatása után a munkakönyvtárunkban megjelenik a halozat.gexf nevű állomány. Erre duplán kattintva elindul a Gephi, ahol helyből a manuális importálásnál említett 6. pontban találjuk magunkat. A beállításokat tekintve az ott leírtakat érdemes figyelembe venni. Vegyes – irányított és irányítatlan kapcsolatokat tartalmazó – hálózatoknál a Graph Type legördülő menüben a mixed lehetőséget válasszuk, ahogy erre fel is hívja a figyelmünket a program. Ha megvan, akkor egy OK-t nyomva készen vagyunk az importálással! Ettől kezdve a továbbiak már a Gephi használatának ismeretén múlnak.

Az előző blogposztban leírtakkal együtt immáron egy olyan algoritmus birtokában vagyunk, amely gombnyomásra képes vizuálisan megjelenített hálózatot generálni az adatainkból. Univerzális, mindenki által azonnal használható recept természetesen nem létezik. A legnehezebb feladatot, a működőképes technika kiagyalását azonban elvégeztem. A jól dokumentált kódok lehetővé teszik, hogy ezek az algoritmusok némi átalakítással személyre szabhatók legyenek.

A későbbiekben biztosan lesznek még hálózatokkal kapcsolatos blogposztok, hiszen az igraph adatstruktúra számos további lehetőséget tartogat magában. Most azonban egy időre elbúcsúzom a hálózatos írásoktól.

comments powered by Disqus