Hiányzó adatok és vizualizáció7 perc olvasás

A cikkem alapjául a Data Mining with R Learning with Case Studies könyv szolgált (a szerző honlapja a többi esettanulmánnyal együtt elérhető itt), azon belül is a Predicting Algae Blooms esettanulmány. A könyv részletes bevezetést ad az adatelemzésbe az adat-előkészítéstől, a vizualizáción át a modellépítésen keresztül a validációig. Én most csak az adat-előkészítést megkönnyítő függvényekre fogok kitérni és néhány vizualizációt mutatok még be, mert ahogy azt a Data preprocessing: Imputálás írásban kifejtettem, az adat-előkészítés, illetve az adatminőség egy kritikus és meghatározó része az elemzői munkának, amit számos beépített függvénnyel megkönnyíthetünk. Elsőként a hiányzó adatokat kezelő függvényeket vesszük sorra, majd pedig néhány elegáns megoldást mutatok, amit számos helyen alkalmazhatunk. Az adatfájlt, amin dolgozni fogunk a beépített DMwR packageből fogjuk használni. Azonban, ha követni akarjuk a könyv pontos módszertanát, akkor egy text fájlt kell beolvasni, ami elérhető a szerző honlapján.

library(DMwR)
head(algae)
algae <- read.table('Analysis.txt',
header=F,
dec='.',
col.names=c('season','size','speed','mxPH','mnO2','Cl',
'NO3','NH4','oPO4','PO4','Chla','a1','a2','a3','a4',
'a5','a6','a7'),
na.strings=c('XXXXXXX'))

Az adatokat beolvassuk, majd jöhetnek a különböző függvények. Most egy pontábrát készítünk, az eredetihez képest annyit változtattam, hogy a ggplot2 package-et használjuk, így egy kicsit igényesebb lesz. Mielőtt folytatjuk a gondolatmenetet néhány megjegyzés. Bár most nem néztük meg a hiányzó adatokat, de vannak az adatfájlban, ezek kezelését a már korábban idézett írásomban bemutattam, most fókuszáljunk az ábrára. (A ggplot2 használatához cheat sheet-et itt értek el.

A ggplot-ban az na.rm = T jelenti, azt, hogy a medián és átlag számításnál (és általában a számolásnál) kihagyja az NA értékeket, így nem futunk hibára, ez elég hasznos tud lenni, ha az eredeti adatokkal kívánunk számolni. Vagy ha nem szeretnénk bajlódni az ismeretlen adatokkal, akkor az na.omit() függvénnyel megszabadulhatunk tőlük. A függvény eltünteti azokat a sorokat, amiben van hiányzó elem. Ezt én nem ajánlom, de demonstrációs célra alkalmas, ugyanakkor a pontos elemzés elkészítéséhez nem célszerű, mert információt veszítünk. (Az ábrán a különböző színű vízszintes vonalak jelentése a következő: a kék jelöli az átlagot, a zöld az átlagtól vett egy szórásnyi távolságot, míg a piros a mediánt.)


# install.packages("ggplot2")
library(ggplot2)
ggplot()+geom_point(data=as.data.frame(algae$NH4), aes(x=seq(0,197,1),y=algae$NH4))+
geom_abline(mapping = NULL, data = as.data.frame(algae$NH4),na.rm = T, slope = 0,intercept = mean(algae$NH4,na.rm=T),color="blue")+
geom_abline(mapping = NULL, data = as.data.frame(algae$NH4),na.rm = T, slope = 0,intercept = (mean(algae$NH4,na.rm=T)+sd(algae$NH4,na.rm=T)),color="green")+
geom_abline(mapping = NULL, data = as.data.frame(algae$NH4),na.rm = T, slope = 0,intercept = (median(algae$NH4,na.rm=T)),color="red")
identify(algae$NH4)

Ha elkészítettük az ábrát, az identify() paranccsal ki tudjuk választani az egyes elemek sorszámát, ha rákattintunk a pontokra, majd nyomjunk Esc-et, így kilépünk a függvényből, és láthatjuk a kiválasztott pontjainkat. Ez például a szélsőséges elemek, az outlierek kereséséhez ajánlott.

Egy másik hasznos függvény egy boxplotot készít, a folyó méret változója alapján kategorizáljuk az adatokat, a boxplot (magyarul dobozábra) pedig az R-ben hagyományos módon a minimumot, az első és harmadik kvartilist és maximumot jelöli, feltéve, hogy nincs az interkvartilis terjedelem (az első és a harmadik kvartilis távolsága) másfélszeresénél távolabbi elem, mert azokat outlierként ábrázolja. A fekete pontok a mediánt (második kvartilis) jelölik.


# install.packages("lattice")
library(lattice)
print(bwplot(size ~ a1, data=algae,ylab='River Size',xlab='Algal A1'))

Ugyanezt az ábrát elkészíthetjük úgy, hogy az eloszlás látványosabb legyen, mintha hegedűdiagramokat ábrázolnánk (a hegedűdiagram gyakorlatilag két „egymásba fordított” sűrűségfüggvény).

Ehhez a Hmisc package-et használjuk.


install.packages("Hmisc")
library(Hmisc) # ez nagyon tetszik
print(bwplot(size ~ a1, data=algae,panel=panel.bpplot,
probs=seq(.01,.49,by=.01), datadensity=TRUE,
ylab='River Size',xlab='Algal A1'))

A hiányzó adatok feltérképezésére szintén számos hasznos függvény van az R-ben a korábban említett na.omit() függvényen kívül is. Az apply() függvény segítségével megszámoljuk, hogy oszloponként hány hiányzó elem van. (Az apply() egyébként ugyanazt a műveletet ismétli meg az egyes sorokon/oszlopokon, ezért írtam 2-őt a második helyre, mert ez a második dimenzió, az első pedig a sor.) Az is.na() függvény egy boolean változót (igaz/hamis) ad vissza, és ezeket adjuk össze, úgy, hogy az R a hamist 0-ként, az igazat pedig 1-ként kezeli.


apply(algae,2,function(x) sum(is.na(x)))

 

A manyNAs() függvény csak azokat a sorokat adja vissza, amikben az algae adatsor több mint 20%-a hiányzik, persze ezt a paramétert tetszőlegesen állíthatjuk.

manyNAs(algae,0.2)

A hiányzó adatok kezelése, nemcsak a medián vagy az átlag számításnál okoz gondot, hanem ha például korrelációt szeretnénk számolni, mivel hiányzó adatok esetén hibára fut a program. Ezt kerülhetjük el, ha betoldjuk a use = “complete.obs” sort a cor() függvénybe, akkor az szépen kiszámolja nekünk a korrelációs mátrixot, miközben kihagyja a hiányzó értékeket.

cor(algae[,4:18],use="complete.obs")

Eddig a hiányzó adatokhoz kapcsolódó függvényeket néztük meg, a továbbiakban néhány egyszerű, de hatékony formalizmust szeretnék bemutatni. Például, ha nem a ggplot2 package-et használjuk, de hisztogramot szeretnénk készíteni, akkor nagyon hasznos az alábbi példa.

histogram(~ mxPH | season,data=algae)

A hullámjel után adjuk meg a változónkat, aminek az eloszlását megnézzük, utána a függőleges vonal után a csoportosító kategóriát, végül pedig a beviteli adatokat.

Végül egy pontdiagramot helyettesítő ábrát mutatok, amit a stripplot() függvény segítségével keltünk életre.

stripplot(size ~ mxPH | speed, data = algae, jitter = T)

A size változót ábrázoljuk az y, még a speed változót az x tengelyen. Az adatfájl az algae adatbázis, és beállítottuk a rezegtetést (ezt jelenti, hogy a jitter = TRUE), csak az R-nek elég megadni a True kezdőbetűjét. Amennyiben ki szeretnénk kapcsolni, akkor írjuk a jitter = F (FALSE) meghatározást.

Remélem tudtam hasznos tippeket adni a hiányzó adatok kezeléséhez és a vizualizációhoz.

Leave a Reply

Your email address will not be published. Required fields are marked *