Dave_ – r-projekt.hu R: az ingyenes adatelemző szoftver és statisztikai programozási környezet Fri, 26 Mar 2021 00:15:32 +0000 hu hourly 1 https://wordpress.org/?v=4.8.18 Magyarország térképének kirajzolása MDS-sel /2014/10/04/magyarorszag-terkepenek-kirajzolasa-mds-sel/ /2014/10/04/magyarorszag-terkepenek-kirajzolasa-mds-sel/#comments Sat, 04 Oct 2014 19:10:27 +0000 /?p=17212 Continue reading ]]> A többdimenziós skálázást (MDS) egy dimenziócsökkentő eljárás, melyet először a földrajzban használtak térképek kirajzolására. Azóta számos más területen is alkalmazzák, pl. pszichológiában kognitív térképek. Ennek a bejegyzésnek a célja az MDS alkalmazásának bemutatása R-ben. Példaként Magyarország térképét fogjuk kirajzolni települések távolságmátrixának felhasználásával.

Hazánk távolságmátrixát a http://www.psoft.hu/termekek/telepules-matrix.html weboldalról lehet letölteni XLS formátumban.

XLS fájl beolvasására bőven van választási lehetőség az R csomagok között: gdata, xlsReadWrite, XLConnect, xlsx, stb. Ezek közül én személy szerint az XLConnect csomagot használom, illetve fogom használni a példa során.

Adatok betöltése:

Az adatok betöltését 2 lépésből oldjuk meg: Az xls fájl betöltése után az adatokat az első munkalapból olvassuk be, ugyanis ez tartalmazza a távolságokat.

library(XLConnect)

wb <- loadWorkbook("psoft-telepules-matrix-30000.xls")  # A munkafüzet beolvasása
data <- readWorksheet(wb, 1)                            # Az első munkalap betöltése

Adatok tisztítása:

Az elemzés elvégzéséhez egy numerikus mátrixra van szükségünk, illetve a városok neveire. Amit alakítani kell a jelenlegi adathalmazon:

  • Az első oszlopot tartalmazó városnevekből sorneveket csinálunk, majd töröljük.
  • Utolsó sorban a psoft promo szövege található, amire értelemszerűen nincs szükségünk.
  • Azonos városok távolságánál hiányzó, vagyis (NA) értékek szerepelnek, ezeket le kell cserélni 0-ra.

Megvalósítás:

rownames(data) <- data[, 1]                             # Sornév létrehozása 
data <- data[-nrow(data), -1]                           # Utolsó sor és első oszlop elhagyása
data[is.na(data)] <- 0                                  # NA értékek lecserélése 0-ra.

Kész is van a távolságmátrixunk, most már nekieshetünk a többdimenziós skálázásnak. MDS-re több lehetőség is van, én a legegyszerűbbet: a cmdscale függvényt alkalmazom, ami a stat package-en belül található. Paraméterként egy numerikus mátrixot, vagy data.frame-et kell megadni. Alapértelmezetten 2 dimenziót használ, ezt a k paraméterrel lehet állítani. Általában a priori módon határozzák meg.

MDS <- cmdscale(data)

A koordinátákat az MDS mátrix 2 oszlopa tartalmazza. Ezek alapján szeretnénk kirajzolni a térképet a ggplot2 quickplotja segítségével. Az első oszlop az x koordináta, a második pedig az y.

library(ggplot2)
p <- qplot(MDS[, 1], MDS[, 2], label=rownames(data))
p <- p + geom_text()
p

Ezzel a probléma, hogy a tengelyek fel vannak cserélve. Az MDS ugyanis a távolságok alapján nem tudja megállapítani, hogy melyik város van északra, vagy éppen délre. Ha mindkét tengelyre tükrözzük a koordinátákat, akkor már ismerősebb lehet a plot.

p2 <- qplot(-1*MDS[, 1], -1*MDS[, 2], label=rownames(data))
p2 <- p2 + geom_text()
p2

MDS_Plot2

Ellenőrzés, a modell jósága:

Az MDS lényege hogy egy adathalmazt dimenziócsökkentéssel könnyebben elemezhetővé tegyen. A dimenziócsökkentési eljárások a legtöbb esetben információveszteséggel járnak. A modell jóságát többféleképpen is ellenőrizhetjük, jelen esetben a determinációs hányados alapján fogunk dönteni.

library(MASS)
shep <- Shepard(data, MDS) 
summary(lm(shep$yf ~ shep$x))$r.squared

 

0.9875959

Az információveszteség mértéke kevesebb mint 2% tehát a modell kiemelkedően jónak számít.

]]>
/2014/10/04/magyarorszag-terkepenek-kirajzolasa-mds-sel/feed/ 841