Bevezetés a többszörös korrespondencia-elemzésbe (MCA)8 perc olvasás

A rendelkezésreálló adattömeg növekedése magával hozta az igényt az adatok és a bennük rejlő információ tömörítésére, mert a hatalmas adathalmazok már áttekinthetetlenné váltak. Az adatelemzők számos módszert alkalmaznak az adatok  csoportosítására, ami két szegmensbe osztható. Vannak szegmentáló és dimenziócsökkentő eljárások, az előbbi a klaszterezést takarja, míg az utóbbi több alkategóriát foglal magába, mint például a faktor-elemzés, a főkomponens- és korrespondencia-elemzés. Úgy gondolom, hogy a főkomponens-analízis jóval elterjedtebb és szélesebb körben alkalmazott megközelítés, mint a többváltozós korrespondencia-elemzés, ezért ebben az írásomban részletesen a korrespondencia-analízis speciális típusával a többszörös korrespondencia-elemzésbe adok betekintést.

A többszörös korrespondencia-elemzés (MCA) nagyon közel áll a főkomponens-analízishez (PCA),  a fő eltérés a két módszertan között, hogy eltérő típusú változókra alkalmazhatóak. A főkomponens-elemzés a numerikus változók tömörítésére alkalmas, míg a többszörös korrespondencia-elemzés alapvetően kategorikus változókra használható. Anélkül, hogy a módszertanban mélyen elmerülnénk, a dimenziócsökkentés alapgondolata, hogy szükségünk van egymással közepesen-erősen korreláló változókra, amiket olyan új változókba akarunk összegyűjteni, amik viszont korrelálatlanok.

Az MCA lépései a következők Molnár alapján:

  • Összegyűjtjük az adatokat.
  • Többdimenziós kereszttáblába rendezzük az adatokat, amiket „dekódoltunk” (például a nem változót férfi 0, nő 1).
  • A többdimenziós táblát kétdimenzióssá alakítjuk.
  • Előállítjuk a sor- és oszlopprofilokat, ami azt jelenti, hogy a sor és oszlopváltozók értékeit a sor és oszlopösszegekkel leosztjuk, normáljuk.
  • Meghatározzuk a kategóriák súlypontjait, ez az ún. centroidok meghatározásához szükséges (a centroid a peremprofilok körüli szóródási mutatószámok).
  • Kiszámítjuk a kategóriák közti távolságot, mivel a geometriai súlyponttól mért euklideszi távolság kiszámításával kapunk információt az adatok hasonlóságáról.
  • Kiszámítjuk az adatok súlyozott varianciáját (a szaknyelv ezt hívja inerciának), ami a geometriai súlypont körüli szóródás mértékét jellemzi.
  • Csökkentjük a dimenziók számát, oly módon, hogy a lehető legtöbb információt megőrizzünk.
  • Interpretáljuk az eredményeket. Vagyis készítünk ábrát, ami alapján csoportosíthatjuk a megfigyeléseinket és következtetéseket vonhatunk le belőle. Azonban ezt legfeljebb kettő vagy három dimenzió esetén tudjuk megtenni.
  • Értékelünk.

Azért tartottam fontosnak a lépések vázlatos bemutatását, mert kisebb-nagyobb ugrásokkal ezt a gondolatmenetet fogom követni, de természetesen a mély technikai részleteket az R programnyelv beépített függvényei fogják elvégezni. Azonban véleményem szerint, ha nincs kellő rálátásunk a módszertanra, akkor nehézkes lehet az eredmény értelmezése.

Most térjünk rá a gyakorlati példára. Az R-ben beépített „tea” adatokat fogjuk használni. (A példához használt anyagokat itt, itt és  itt találjátok.)

Az R-ben számos package segítségével meg lehet csinálni az MCA-t (MASS, ade4, homals, FactoMineR stb.) én az utóbbit használom azon belül pedig az MCA függvényt.

Az elemzésben lesz egy kis csavar, mert a gyakorlati példáknál nem színtisztán csak numerikus vagy kategorikus változóink vannak, hanem mindegyikből található az adattáblában, ezért a példában szintén lesz a kategorikus változók mellett numerikus is, konkrétan az „age” változó.

Elsőként egy kis csellel megváltoztatjuk a változók sorrendjét, és az age-et előre hozzuk, valamint vetünk egy pillantást a megfigyelésekre és a változókra.

# install.packages("FactoMiner")
library(FactoMineR) # ezt használjuk az MCA-hoz
data(tea) # adatsor délutáni teázáshoz
head(tea) # egy kis betekintés (első 6 sor)
          # nagy adattömböknél célszerű használni
newcup<-data.table(tea) # beletesszük egy új változóba az adatsort
            #ezt csak azért csináljuk, hogy a numerikus változót (age) kihozhassuk az elejére
newcup$age<-NULL # age-et eltüntetjük
newcup<-cbind(tea$age,newcup) # majd visszatesszük előre
colnames(newcup)[1]<-"age" # és visszakereszteljük az eredeti nevére
head(newcup) # megszemléljük az új csészénket

dim(newcup) # megnézzük hány megfigyelésünk (300) és változónk (36) van

Majd ezt követően az MCA függvénnyel varázsolunk egyet, és már készen is vagyunk. Ez a “varázslat” tartalmazza azt a sok lépést, amit az elején lépésenként sorra vettünk, mivel a beépített függvény ezt pillanatok alatt elvégzi nekünk, ezért ezzel nincs sok dolgunk, ugyanakkor szerintem a módszertan “black box” jellegét csak úgy oldhatjuk fel, ha belenézünk kicsit a dobozba és meggyőződünk róla, hogy mi is folyik ott, noha programoznunk nem kell az ott látottakat.


mca = MCA(newcup, graph = FALSE, quanti.sup = 1) # megcsináljuk az MCA-t
mca # rengeteg információt zsúfoltak bele a készítők

Azért némi magyarázatot érdemes hozzáfűzni a dologhoz. Az MCA használatához meg kell adnunk az adatfájlt, és mivel van numerikus változónk, annak a helyét is fel kell tüntetni. Emiatt nem volt felesleges lépés az age-et előre hozni, mert így tudjuk, hogy az első helyen van, ezért lesz a quanti.sup (kiegészítő kvantitatív változó) paraméter 1, és nem azért, mert csak 1 numerikus változónk van.


summary.MCA(mca, nbelements = Inf, ncp = 3) # nbelements = hány eleme látszódik

                                            # ncp = dimenziók száma

A summary() segítségével pedig nagyon sok információt ki tudunk nyerni az adatokból, például az egyes dimenziók részarányát a teljes információtartalomból, az egyes változók és a dimenziók kapcsolatának mértékét  stb. A továbbiakban ezekből fogunk csemegézni.


plot.MCA(mca, axes = c(1,5))

A plot.MCA() segítségével 2 dimenziót hasonlíthatunk össze, oly módon, hogy az egyes kategóriák és a megfigyelések miképpen helyezkednek el 2 dimenzióban. Az axes=c(1,5) azt jelenti, hogy az első és az ötödik dimenziót hasonlítjuk össze, és az ábrán pedig a megfigyelések és változók egy része látható.

Nagyon fontosak a sajátértékek, amik gyakorlatilag azt mutatják meg, hogy az egyes komponensek mennyi információt tartalmaznak. Ugyanakkor érdekesség, hogy a főkomponens-elemzéssel ellentétben itt jóval több és jóval kisebb sajátértékek a jellemzőek, emiatt nehéz az összes dimenzió egy ábrán megjelenítése, illetve a nagy mértékű dimenziócsökkentés is. A sajátértékek nagy számossága miatt nézzük csak az első 20-at. Ehhez a factoextra package-re lesz szükségünk

</pre>

# install.packages("factoextra")

library(factoextra)

fviz_screeplot(mca, addlabels = TRUE, ylim = c(0, 6), ncp=20)

Látjuk, hogy a legnagyobb sajátérték is csak a teljes információ kevesebb, mint 6%-át hordozzák magukkal és nagyjából azonos nagyságrendűek.

Emellett megnézhetjük az egyes dimenziók és változók közti korrelációt is.


fviz_mca_var(mca, choice = "mca.cor",

repel = TRUE, # Avoid text overlapping (slow)

ggtheme = theme_minimal())

Vagy az egyes változók befolyását az egyes dimenziókra, itt az első 15 legnagyobbat néztük.


fviz_contrib(mca, choice = "var", axes = 1, top = 15)

Ezzel a rövid betekintés végére értünk, remélem, hogy ezután a dimenziócsökkentésnél nem csak a főkomponens elemzést, hanem a többszörös korrespondencia-analízist is használni fogjátok.

 

Leave a Reply

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