Tänases praktikumis

Eelmisel korral

  • Otsustuspuude headuse näitajad
  • Juhumetsad (random forests)
  • Juhumetsade visualiseerimine

Sel korral

  • Korrespondentsanalüüs
    • lihtne korrespondentsanalüüs
    • mitmene korrespondentsanalüüs

Korrespondentsanalüüs

Otsustuspuud ja juhumetsad esindavad nn juhendatud masinõppe (supervised machine learning) mudeleid, kus hulga seletavate tunnuste järgi õpitakse ennustama andmestikus märgendatud uuritava tunnuse väärtusi. Juhendatud tähendabki seda, et mudelile on ette antud see, mida ta väljundina ennustama peab. Mudeli ennustusi saab võrrelda uuritava tunnuse tegelike väärtustega andmestikus, et näha, kui hästi mudel andmetega sobitub ja kui täpselt uuritava tunnuse väärtusi ennustab. Kui ennustuste kvaliteet on kehv, saab näiteks lisada andmestikku vaatlusi või katsetada teistsuguste seletavate tunnustega. Lisaks saab treeningandmetel tehtud mudeleid valideerida testandmestikel, et näha, kui hästi mudel sobituks uutele andmetele, mis ei olnud mudeli treenimise aluseks.

Juhendamata masinõppe (unsupervised machine learning) mudelite puhul on kõik andmestiku tunnused võrdsed ja ükski tunnus ei ole teistest kuidagi esilduvam või primaarsem. Samuti ei öelda mudelile ette, mis tema väljund täpselt peab olema, vaid mudeli eesmärk on tuvastada andmestikus esinevaid mustreid. Näiteks millised vaatluste grupid on omavahel sarnasemad? Milliste tunnuste põhjal? Millised vaatlused on teistest oluliselt erinevamad? Selliseid mudeleid kasutavad sageli näiteks igasugused veebipoed ja -teenused, mis pakuvad kasutajale asju, mis talle meeldiksid, selle põhjal, mida ta varem on tarbinud või vaadanud. Samuti on juhendamata masinõppe mudelid levinud näotuvastusalgoritmides.

Üks juhendamata masinõppe meetod on korrespondentsanalüüs (Correspondence Analysis). See on eksploratiivne meetod, mille abil saab uurida kategoriaalsete tunnuste vahelisi sageduspõhiseid sõltuvussuhteid (arvuliste tunnuste jaoks sobib nt peakomponentanalüüs). Olenevalt sellest, kas tunnuseid on kaks või enam, nimetatakse meetodit lihtsaks või mitmeseks korrespondentsanalüüsiks (ingl. vastavalt simple ja multiple correspondence analysis).

Korrespondentsanalüüsi sisendiks on enamasti kahemõõtmelised sagedustabelid e risttabelid (lihtne korrespondentsanalüüs) või tavalised andmetabelid, kus tulpades on tunnused ja ridades vaatlused (mitmene korrespondentsanalüüs). NB! Lihtsas korrespondentsanalüüsis peab tunnustel olema vähemalt 3 taset! Sisendiks sobivate tabelite kohta võid põhjalikumalt lugeda nt siit.

Korrespondentsanalüüsi väljundiks on üldjuhul kahemõõtmeline graafik, mis võimaldab ridade- ja tulpadevahelisi suhteid kauguste abil visuaalselt esitada. Graafikul kujutatud üksustevahelisi kaugusi võib tõlgendada ridade sarnasuste ja erinevustena tulpade suhtes või vastupidi - tulpade sarnasuste ja erinevustena ridade suhtes.

Tegu on dimensionaalsuse vähendamise tehnikaga (dimensionality reduction technique), mis tähendab, et infot koondatakse andmemahu vähendamiseks: tunnuste väärtused ja vaatlused võivad olla sarnased või erinevad väga mitmel põhjusel ning kõik need põhjused panustavad erinevatesse varieerumise dimensioonidesse, graafikule valitakse aga ainult kaks dimensiooni (enamasti need, mis seletavad sarnasusi ja erinevusi kõige selgemalt). Dimensioonid ei ole niisiis mitte konkreetsed andmestiku tunnused (!), vaid latentsed, peidetud tegurid, mis sarnasusi ja erinevusi tingivad. Vahel on võimalik dimensioone tõlgendada nii, et saab neile anda ka mingid nimed (nt “positiivsed jooned, negatiivsed jooned”), aga vahel ka mitte.
Dimensionaalsuse vähendamise tehnikana saab korrespondentsanalüüsi kasutada mitte lihtsalt mustrite vaatlemiseks, vaid ka näiteks multikollineaarsuse vähendamiseks enne mõne juhendatud masinõppe mudeli kasutamist - saab ühendada omavahel kaks tunnust, mis on sarnased, või jätta alles ainult ühe neist. Samuti võib kasutada korrespondentsanalüüsi hüpoteeside püstitamiseks. See on niisiis eeskätt esmase, kirjeldava analüüsi meetod, mis tähendab, et selle abil saab leida koosesinemise mustreid, ent see ei võimalda teha järeldusi tunnuste olulisuse kohta või tõestada tunnuste vahel põhjuslikke suhteid.

Näide 1: riigikogu valimiste kandidaadid 2019 (CA)

Vaatleme 2019. aasta riigikogu valimistel osalenud kandidaatide valimisnimekirja kuuluvuse ja haridustaseme seoseid lihtsa korrespondentsanalüüsi abil. Laadime andmestiku ja valmistame tunnused ette.

# Laadime kandidaatide andmestiku
load("kandidaadid.RData")

# Asendame tulba "nimekiri_voi_uksikkandidaat" nime
# lihtsalt tulbanimega "nimekiri"
names(kandidaadid)[4] <- "nimekiri"

# Asendame hariduse taseme nimega
# "Keskharidus (sh keskeriharidus)"
# lihtsalt tasemega "Keskharidus"
levels(kandidaadid$haridus)[2] <- "Keskharidus"

Lihtsa korrespondentsanalüüsi sisendiks peab olema risttabel. Pole vahet, mispidi tabelit teha, aga praegu teeme selle nii, et tabeli ridades on valimisnimekirjad ja tulpades haridustasemed.

tab <- table(kandidaadid$nimekiri, kandidaadid$haridus)
head(tab)
##                                    
##                                     Algharidus Keskharidus Kõrgharidus
##   Eesti Keskerakond                          0          17         108
##   Eesti Konservatiivne Rahvaerakond          0          51          73
##   Eesti Reformierakond                       0          17         108
##   Eesti Vabaerakond                          0          41          77
##   Eestimaa Ühendatud Vasakpartei             0           2           9
##   Elurikkuse Erakond                         0          21          52
##                                    
##                                     Põhiharidus
##   Eesti Keskerakond                           0
##   Eesti Konservatiivne Rahvaerakond           1
##   Eesti Reformierakond                        0
##   Eesti Vabaerakond                           7
##   Eestimaa Ühendatud Vasakpartei              0
##   Elurikkuse Erakond                          0

Niisiis tahame teada,

  • kas mingid ridade väärtused (valimisnimekirjad) on tugevamalt seotud mingite tulba väärtustega (haridustasemetega);
  • millised ridade väärtused (valimisnimekirjad) on oma tulbaprofiililt (haridustasemete jaotuselt) sarnased.

Või ka vastupidi:

  • kas mingid tulpade väärtused (haridustasemed) on tugevamalt seotud mingite ridade väärtustega (valimisnimekirjadega);
  • millised tulpade väärtused (haridustasemed) on oma reaprofiililt (valimisnimekirjade jaotuselt) sarnased.

Korrespondentsanalüüsi tegemiseks R-is on erinevaid pakette, nt ca (funktsioonid ca() ja mjca()), FactoMineR (funktsioonid CA() ja MCA()), MASS (funktsioonid corresp() ja mca()) jt. Kasutame siin paketti FactoMineR ja selle funktsiooni CA() lihtsaks korrespondentsanalüüsiks.

# install.packages("FactoMineR")
library(FactoMineR)

# Teeme mudeli
ca1 <- CA(tab) # automaatselt kuvatakse ka joonis

CA-graafikul paiknevad kahe tunnuse tasemed kahemõõtmelises ruumis. Ridade väärtused (meie mudelis nimekiri), mis on (oma tulpade profiililt) sarnasemad, paiknevad graafikul lähestikku, ning väärtused, mis on erinevad, paiknevad üksteisest kaugemal. Sama käib tulpade (meie mudelis haridustasemete) kohta. Mida kaugemal on väärtused telgede ristumispunktist (x = 0 ja y = 0), seda eristuvamad need on. Mida lähemal on väärtused telgede ristumispunktile, seda vähem eristuvamad need on. Näiteks kõrgharidus on telgede ristumispunktile väga lähedal, seega võib järeldada, et kõrgharidusega kandidaate on andmestikus ilmselt palju ning neid esineb rohkesti kõikides valimisnimekirjades. Seega ei saa kõrgharidusega kandidaatide osakaalu põhjal üksi valimisnimekirju üksteisest kuigi hästi eristada.

Mida lähemal on ühe tunnuse (nt nimekiri) tasemed üksteisele, seda sarnasemad on need tasemed selle põhjal, milline on nendes teise tunnuse (haridus) jaotumine: näiteks Isamaa, SDE, Keskerakond ja Reformierakond tunduvad olevat väga lähedased selle põhjal, kui palju nende nimekirjades on proportsionaalselt alg-, põhi-, kesk- ja kõrgharidusega inimesi.

# Vaatame, kas on sarnased proportsioonid
prop.table(tab, 
           margin = 1)[c("Eesti Reformierakond", 
                         "Eesti Keskerakond",
                         "Isamaa Erakond", 
                         "Sotsiaaldemokraatlik Erakond"),]
##                               
##                                Algharidus Keskharidus Kõrgharidus Põhiharidus
##   Eesti Reformierakond              0.000       0.136       0.864       0.000
##   Eesti Keskerakond                 0.000       0.136       0.864       0.000
##   Isamaa Erakond                    0.000       0.168       0.824       0.008
##   Sotsiaaldemokraatlik Erakond      0.000       0.112       0.880       0.008

Nendest märkimisväärselt kaugemal paiknevad Vabaerakonna nimekirjas ja üksikkandidaatidena kandideerijad, samuti Erakond Eestimaa Rohelised ja EKRE, mistõttu võib oletada, et nende valimisnimekirjade hariduse profiilid on pisut teistsugused.

prop.table(tab, 
           margin = 1)[c("Eesti Vabaerakond", 
                         "Üksikkandidaadid",
                         "Erakond Eestimaa Rohelised", 
                         "Eesti Konservatiivne Rahvaerakond"),]
##                                    
##                                     Algharidus Keskharidus Kõrgharidus
##   Eesti Vabaerakond                 0.00000000  0.32800000  0.61600000
##   Üksikkandidaadid                  0.00000000  0.33333333  0.60000000
##   Erakond Eestimaa Rohelised        0.00000000  0.40000000  0.57600000
##   Eesti Konservatiivne Rahvaerakond 0.00000000  0.40800000  0.58400000
##                                    
##                                     Põhiharidus
##   Eesti Vabaerakond                  0.05600000
##   Üksikkandidaadid                   0.06666667
##   Erakond Eestimaa Rohelised         0.02400000
##   Eesti Konservatiivne Rahvaerakond  0.00800000

Tõepoolest, viimastes on oluliselt madalam kõrgharidusega kandidaatide osakaal ning kõrgem keskharidusega kandidaatide osakaal. Samuti on nendes erakondades mõnevõrra rohkem põhiharidusega kandidaate.

Ülejäänud valimisnimekirjad jäävad ka pigem lähemale SDE, KE, REFi ja Isamaa nimekirjadele, v.a Elurikkuse Erakond, mis on kandidaatide haridustasemete põhjal lähemal pigem EKREle ja Rohelistele.

Samamoodi võime vaadata kandidaatide haridustasemete sarnasusi-erinevusi vastavalt sellele, millised on nende valimisnimekirjade profiilid: kõrgharidus ja keskharidus on üsna lähestikku, samas kui teised haridustasemed paiknevad pigem graafiku äärealadel. See tuleneb sellest, et kõrg- ja keskharidus on andmestikus oluliselt tavalisemad väärtused kui põhi- ja algharidus, mistõttu peab korrespondentsanalüüs viimaseid palju eristuvamateks joonteks. Tegelikult võiks nii harvad väärtused koondada üheks kategooriaks.

table(kandidaadid$haridus)
## 
##  Algharidus Keskharidus Kõrgharidus Põhiharidus 
##           1         265         819          14

Sümmeetriline vs. asümmeetriline graafik

Vaikimisi on korrespondentsanalüüsi graafik sümmeetriline, mis tähendab, et otseselt saab tõlgendada vaid sama tunnuse väärtuste vahelisi kaugusi (nt mingid erakonnad on üksteisega sarnasemad või mingid haridustasemed on üksteisega sarnasemad, kui nad on graafikul lähestikku). Eri tunnuste vaheliste kauguste tõlgendamisel peab piirduma ainult väga üldise mustri kirjeldamisega: nt ehkki Eesti200 ja Elurikkuse Erakond on alghariduse sildile enam-vähem sama lähedal, ei ole need mõlemad alghariduse sildiga ühtmoodi seotud, kuna algharidusega kandidaate leidub ainult Eesti200 nimekirjas. Küll aga on üpris sarnane nendes nimekirjas kandideerinute üldine haridusprofiil.

prop.table(tab, 
           margin = 1)[c("Erakond Eesti 200", "Elurikkuse Erakond"),]
##                     
##                      Algharidus Keskharidus Kõrgharidus Põhiharidus
##   Erakond Eesti 200   0.0080000   0.2080000   0.7840000   0.0000000
##   Elurikkuse Erakond  0.0000000   0.2876712   0.7123288   0.0000000

Selleks, et tõlgendada otseselt kaugusi ka kahe tunnuse väärtuste ehk tabeli tulpade ja ridade vahel, peaks kasutama asümmeetrilist graafikut. Kui sümmeetrilisel graafikul on mõlema tunnuse väärtuste koordinaadid nn pea- või P-koordinaadid (principal coordinate), siis asümmeetrilistel graafikutel kasutatakse ühe tunnuse jaoks (ridade või tulpade) koordinaatidena hoopis standardkoordinaate (standard coordinate). Nende arvutamise erinevuste kohta saab soovi korral lugeda näiteks siit.

R-is saab selleks kasutada näiteks paketti factoextra ning selle funktsiooni fviz_ca_biplot(), mis võimaldab teha nii sümmeetrilisi kui ka asümmeetrilisi graafikuid.

# install.packages("factoextra")
library(factoextra)

# map = "colprincipal" säilitab tulpade 
# (haridustasemete) originaalkoordinaadid 
# ja kuvab ridu n-ö tulbaruumis
fviz_ca_biplot(ca1, 
               map = "colprincipal",
               title = "Tulpade originaalkoordinaadid")


# map = "rowprincipal" säilitab ridade 
# (valimisnimekirjade) originaalkoordinaadid 
# ja kuvab tulpasid rearuumis
fviz_ca_biplot(ca1, 
               map = "rowprincipal",
               title = "Ridade originaalkoordinaadid")

Ülemiselt ehk tulpade originaalkoordinaate säilitavalt graafikult näeme nüüd, et algharidus on väga tugevalt seotud Eesti200 kandidaatidega. Alumiselt graafikult aga seda, et enamik nimekirju on väga tugevalt seotud kõrgharidusega, veidi vähem keskharidusega ning hoopis vähe alg- ja põhiharidusega.

Ka asümmeetrilistel graafikutel ei ole paraku kõikide väärtuste vahelised kaugused otseselt tõlgendatavad.

  • colprincipal graafikutel on õigesti esitatud tulpades oleva tunnuse väärtuste vahelised kaugused ja tulpade ja ridade väärtuste vahelised kaugused, ent mitte ridades oleva tunnuse väärtuste vahelised kaugused;
  • rowprincipal graafikutel on õigesti esitatud ridades oleva tunnuse väärtuste vahelised kaugused ja ridade ja tulpade väärtuste vahelised kaugused, ent mitte tulpades oleva tunnuse väärtuste vahelised kaugused.

Seega võiks vaadata enamasti esmalt sümmeetrilist graafikut ning valida kõrvale asümmeetriline graafik, mis kuvab paremini meid rohkem huvitavat tunnust. Näiteks antud juhul võime otsustada, kas meid huvitab rohkem see, kui erinevad on kandidaatide haridustasemed selle järgi, mis valimisnimekirja nad kuuluvad (colprincipal), või see, millised valimisnimekirjad üksteisest kandidaatide haridusprofiilidelt erinevad (rowprincipal). Antud juhul on esimene graafik veidi informatiivsem, seega kasutame seda.

Korrespondentsanalüüsi mudel

Vaatame nüüd ka ca-objekti sisse.

ca1
## **Results of the Correspondence Analysis (CA)**
## The row variable has  11  categories; the column variable has 4 categories
## The chi square of independence between the two variables is equal to 115.2001 (p-value =  6.427637e-12 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

Kõigepealt saame teada, et ridades on tunnus, millel on 11 taset, ning tulpades tunnus, millel on 4 taset.
Kahe tunnuse vahelise seose hindamise aluseks on hii-ruut-test (kontrolli nt funktsiooniga chisq.test(kandidaadid$nimekiri, kandidaadid$haridus)). Siin on p-väärtus väike ja kahe tunnuse vahel on statistiliselt oluline seos olemas.

Lisaks testi p-väärtusele võiks vaadata ka tabeli nn jälge (koguinertsi, ingl trace või total inertia), mis näitab seose tugevust ja millest võetud ruutjuur on tõlgendatav ridade ja tulpade vahelise korrelatsiooni koefitsiendina. Jälje väärtus sõltub vaatluste arvust ning hii-ruut-statistiku suurusest ning näitab seose tugevust niisiis ligikaudselt.
Jälje moodustab mudelis omaväärtuste (eigenvalue) summa. Omaväärtused näitavad dimensioonis sisalduva informatsiooni osakaalu ning ühtlasi ka vastava dimensiooni suhtelist tähtsust. Seda, kuidas täpselt omaväärtusi arvutatakse, võib lugeda näiteks siit.

# Omaväärtused on tulbas "eigenvalue"
ca1$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.08091039               77.18788                          77.18788
## dim 2 0.01742706               16.62528                          93.81316
## dim 3 0.00648521                6.18684                         100.00000

# Jälg e omaväärtuste summa
(trace <- sum(ca1$eig[,"eigenvalue"]))
## [1] 0.1048227

# Ruutjuur jäljest e korrelatsiooni koefitsient
sqrt(trace)
## [1] 0.3237633

# Võrdle ka Craméri V-ga
vcd::assocstats(tab)
##                     X^2 df   P(> X^2)
## Likelihood Ratio 107.31 30 1.2585e-10
## Pearson          115.20 30 6.4276e-12
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.308 
## Cramer's V        : 0.187

Iga dimensiooni omaväärtus jagatuna jäljega (omaväärtuste summaga) annab selle dimensiooni poolt seletatud varieeruvuse/hajuvuse protsendi andmetes.

# Seletatud varieeruvuse protsent
# on tulbas "percentage of variance"
ca1$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.08091039               77.18788                          77.18788
## dim 2 0.01742706               16.62528                          93.81316
## dim 3 0.00648521                6.18684                         100.00000

# Näiteks dim 1 väärtuse saame,
# kui jagame selle rea
# omaväärtuse jäljega
ca1$eig[1,1]/trace
## [1] 0.7718788

Mida suurem on see protsent, seda enam konkreetne dimensioon kahe tunnuse vahelist seost kirjeldab. Niisiis: ehkki valimisnimekirja ja haridustaseme vaheline seos on pigem nõrk (korrelatsioon oli 0.32), siis sellest seosest u 77% kirjeldab ära 1. dimensiooni aluseks olev (latentne, varjatud) tegur. Üldse on selles mudelis 3 dimensiooni, millest iga järgmine kirjeldab vähem kui eelmine ning mis kokku annavad 100%.

Dimensioonid

Graafikul on kuvatud kõikidest võimalikest dimensioonidest 2. Dimensioonid on põhimõtteliselt mittemõõdetavad, varjatud tegurid, mis kahe tunnuse vahelist suhet kirjeldavad. Dimensioonide põhjal koonduvate tunnuste väärtused võivad anda aimu sellest, milline võiks olla selle teguri olemus, aga ei pruugi.

1. dimensioonis (x- ehk horisontaaltelje suhtes) moodustub kaks rühma, millest üks jääb nullpunktist vasakule ja teine paremale. Paremale jäävad näiteks Vabaerakond, EKRE, Rohelised, ERE ja üksikkandidaadid. Samuti jäävad x-telje 0-punktist paremale keskharidus ja põhiharidus. Paremal olevad erakonnad tunduvad seega olevat omavahel sarnasemad selles osas, et nende kandidaate iseloomustab rohkem keskhariduse omamine kui vasakule jäävaid erakondi. Mingil määral on nähtavasti keskharidusega kandidaatidega valimisnimekirjad sarnased ka põhiharidusega kandidaate sisaldavate nimekirjadega (võrreldes kõrg- ja algharidusega kandidaate sisaldavate nimekirjadega). 1. dimensioon seletab 77.19% ehk suurema osa kahe tunnuse vahelisest suhtest.

2. dimensioonis (y- ehk vertikaaltelje suhtes) moodustuvad veidi raskemini defineeritavad rühmad: y-telje 0-punktist ülespoole jäävad SDE, Isamaa, Keskerakond, Reformierakond, Vabaerakond ja üksikkandidaadid, samuti kõrgharidus ja põhiharidus. Y-teljest allapoole jäävad Vasakpartei, Eesti200, Elurikkuse Erakond, Rohelised ja EKRE, samuti keskharidus ja algharidus. Seda dimensiooni võib motiveerida seega alg- ja põhiharidusega inimeste osakaal nimekirjades, ent kuna neid inimesi on vähe ning nad esinevad ainult üksikutes valimisnimekirjades, on selle dimensiooni seletusjõud võrdlemisi väike (16.3%). Samuti võib olla, et dimensiooni motiveerib hoopis midagi muud.

prop.table(tab, 
           margin = 1)[,c("Algharidus", 
                          "Põhiharidus")]
##                                    
##                                     Algharidus Põhiharidus
##   Eesti Keskerakond                 0.00000000  0.00000000
##   Eesti Konservatiivne Rahvaerakond 0.00000000  0.00800000
##   Eesti Reformierakond              0.00000000  0.00000000
##   Eesti Vabaerakond                 0.00000000  0.05600000
##   Eestimaa Ühendatud Vasakpartei    0.00000000  0.00000000
##   Elurikkuse Erakond                0.00000000  0.00000000
##   Erakond Eesti 200                 0.00800000  0.00000000
##   Erakond Eestimaa Rohelised        0.00000000  0.02400000
##   Isamaa Erakond                    0.00000000  0.00800000
##   Sotsiaaldemokraatlik Erakond      0.00000000  0.00800000
##   Üksikkandidaadid                  0.00000000  0.06666667

Võime graafikul kuvatavaid dimensioone ka muuta.

# x-teljel 2. dimensioon, y-teljel 3. dimensioon
plot(ca1, axes = c(2,3), title = "2. ja 3. dimensioon")


# x-teljel 3. dimensioon, y-teljel 1. dimensioon
plot(ca1, axes = c(3,1), title = "3. ja 1. dimensioon")

Tundub, et 2. dimensiooni eristab põhiharidusega inimeste osakaal nimekirjas, ja 3. dimensiooni algharidusega inimeste osakaal. Sama saame teada tegelikult ka mudelist, vaadates tunnuste väärtuste panuseid.

Panused

Panused saame kätte objektist $contrib. Tasemed, millel on suurem väärtus, panustavad rohkem dimensioonide olemuse kirjeldamisse.

# Tulpade e haridustasemete panus dimensioonidesse
ca1$col$contrib 
##                  Dim 1     Dim 2       Dim 3
## Algharidus   0.2373317  3.967686 95.70399074
## Keskharidus 59.8069155 15.750356  0.32989888
## Kõrgharidus 24.0445796  1.358575  0.07455231
## Põhiharidus 15.9111731 78.923383  3.89155807

# Kui nimekirja ja dimensiooni vahel ei oleks seost, 
# oleks tulpade oodatav keskmine panus dimensioonidesse
1/ncol(tab)*100
## [1] 25

# Seega panustab nt keskharidus 1. dimensiooni defineerimisse 
# keskmisest üle kahe korra rohkem.

# 2. dimensiooni panustab enim põhiharidus

# 3. dimensiooni panustab enim algharidus
# Ridade e valimisnimekirjade panus dimensioonidesse
ca1$row$contrib 
##                                        Dim 1      Dim 2      Dim 3
## Eesti Keskerakond                 10.7539339  0.0296636  3.2784099
## Eesti Konservatiivne Rahvaerakond 16.1650583 23.0496158  4.7810623
## Eesti Reformierakond              10.7539339  0.0296636  3.2784099
## Eesti Vabaerakond                 18.6846763 43.7356903  2.8101895
## Eestimaa Ühendatud Vasakpartei     0.3937184  0.0764126  0.3430418
## Elurikkuse Erakond                 0.1925788  7.0828737  3.2325353
## Erakond Eesti 200                  2.4003254  8.6431379 77.5825603
## Erakond Eestimaa Rohelised        21.1187676  2.0910380  0.9324499
## Isamaa Erakond                     4.3147016  0.9647693  1.7657968
## Sotsiaaldemokraatlik Erakond      12.2499852  5.4365760  1.2739538
## Üksikkandidaadid                   2.9723206  8.8605593  0.7215904

# Kui nimekirja ja dimensiooni vahel ei oleks seost, 
# oleks tulpade oodatav keskmine panus dimensioonidesse
1/nrow(tab)*100
## [1] 9.090909

# 1. dimensiooni panustavad seega keskmisest enam KE, EKRE, REF, 
# Vabaerakond, Rohelised ja SDE

# 2. dimensiooni panustavad põhiliselt Vabaerakond ja EKRE

# 3. dimensiooni panustab enim Eesti200

Näeme seega, et kui haridustasemete põhjal oli dimensioonide olemust lihtsam hinnata, siis valimisnimekirjade järgi asi nii selge ei ole.

    1. dimensioonis eristuvad selgelt n-ö etableerunud erakonnad (v.a Isamaa). Ehkki panuste järgi ei saa öelda, millised valimisnimekirjad üksteisest eristuvad, saame haridustasemete panuste ja joonise põhjal öelda, et eristuvad eeskätte valimisnimekirjad, kus on rohkem keskharidusega kandidaate, ja nimekirjad, kus neid on vähem (kõrgharidusega kandidaatide arvelt).
    1. dimensioonis eristuvaid erakondi on aga keerulisem määratleda. Vabaerakonnas on küll kõige rohkem põhiharidusega kandidaate (ka proportsionaalselt), ent pelgalt põhihariduse osakaalu arvestades võiks EKRE asemel panustada 2. dimensiooni rohkem hoopis Rohelised. Siin võib oletada seega mingit põhi- ja keskhariduse koosmõju, mis seletaks seda, miks just EKRE sellesse dimensiooni kõige rohkem panustab.
    1. dimensioonis eristub selgelt Eesti200, kuna nende nimekirjas on ainuke algharidusega kandidaat.

Panuste visualiseerimiseks saab kasutada nt funktsiooni corrplot() samanimelisest paketist.

#install.packages("corrplot")
library(corrplot)

par(mfrow = c(1,2))

# argument "is.corr = FALSE" ütleb, et 
# tegemist ei ole päris korrelatsioonidega (vahemikus -1 ja 1)
corrplot(ca1$col$contrib, is.corr = FALSE)
corrplot(ca1$row$contrib, is.corr = FALSE)

Mida tumedam on mummuke, seda suurem on tulba/rea panus dimensiooni olemuse seletamisse.

Samuti saab kasutada visualiseerimiseks funktsiooni fviz_contrib() paketist factoextra.

# library(factoextra)

# Punane joon näitab oodatavat keskmist panust, 
# kui tunnuste ja dimensioonide vahel poleks mingit seost

fviz_contrib(ca1, choice = "col", axes = 1, 
             title = "Haridustasemete panus 1. dimensiooni") 

fviz_contrib(ca1, choice = "col", axes = 2, 
             title = "Haridustasemete panus 2. dimensiooni") 

fviz_contrib(ca1, choice = "col", axes = 3, 
             title = "Haridustasemete panus 3. dimensiooni") 

# Saab kasutada ggploti omadusi
fviz_contrib(ca1, choice = "row", axes = c(1:2), top = 5, 
             fill = "darkgoldenrod3", color = "darkgoldenrod3", 
             ggtheme = theme_bw()) + 
  labs(title = "Valimisnimekirjade panus 1. ja 2. dimensiooni kokku", 
       subtitle = "(top 5 panustajat)",
       y = "Panus (%)") + 
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

Esindatuse kvaliteet

Kõik tabeli read (antud juhul nimekirjad) ja tulbad (haridustasemed) ei ole esimeses kahes dimensioonis ühtviisi hästi esindatud. Näiteks Eesti200 puhul saab informatiivseks just kolmas dimensioon, mis on seotud algharidusega kandidaatide osakaaluga. Esindatuse kvaliteeti ehk seost ridade/tulpade ja mingi dimensiooni vahel näitab koosinuse ruut.

ca1$col$cos2
##                  Dim 1      Dim 2        Dim 3
## Algharidus  0.02708375 0.09752370 0.8753925442
## Keskharidus 0.94592606 0.05365572 0.0004182215
## Kõrgharidus 0.98773392 0.01202060 0.0002454730
## Põhiharidus 0.47893225 0.51167884 0.0093889097
ca1$row$cos2
##                                        Dim 1        Dim 2       Dim 3
## Eesti Keskerakond                 0.97558186 0.0005796157 0.023838525
## Eesti Konservatiivne Rahvaerakond 0.75141348 0.2307731549 0.017813361
## Eesti Reformierakond              0.97558186 0.0005796157 0.023838525
## Eesti Vabaerakond                 0.65953608 0.3325131690 0.007950755
## Eestimaa Ühendatud Vasakpartei    0.89957302 0.0376041376 0.062822847
## Elurikkuse Erakond                0.09739797 0.7715618713 0.131040161
## Erakond Eesti 200                 0.22902948 0.1776284730 0.593342052
## Erakond Eestimaa Rohelised        0.97573812 0.0208087747 0.003453106
## Isamaa Erakond                    0.92510071 0.0445534774 0.030345811
## Sotsiaaldemokraatlik Erakond      0.90585862 0.0865904911 0.007550892
## Üksikkandidaadid                  0.60185377 0.3864349066 0.011711321

Kui panus näitab tunnuste tasemete panust mingi dimensiooni seletamisse, siis koosinuse ruut näitab mingi dimensiooni võimet esindada mingit taset. Need ei ole alati võrdsed. Ehkki mõne tulba/rea panus mingisse dimensiooni võib olla väike, võib see dimensioon esindada seda tulpa/rida dimensioonidest siiski kõige paremini.
Näiteks ehkki Eestimaa Ühendatud Vasakpartei panustab 1. dimensiooni olemuse kirjeldamisse ainult ~4%, esindab 1. dimensioon seda valimisnimekirja siiski kõige paremini.

# Panus
ca1$row$contrib["Eestimaa Ühendatud Vasakpartei",]
##     Dim 1     Dim 2     Dim 3 
## 0.3937184 0.0764126 0.3430418

# Esindatus
ca1$row$cos2["Eestimaa Ühendatud Vasakpartei",] 
##      Dim 1      Dim 2      Dim 3 
## 0.89957302 0.03760414 0.06282285

Esindatust saab visualiseerida samamoodi nagu panuseid.

# library(corrplot)
par(mfrow = c(1,2))
corrplot(ca1$col$cos2, is.corr = FALSE)
corrplot(ca1$row$cos2, is.corr = FALSE)

fviz_cos2(ca1, choice = "col", axes = 1, 
          title = "Haridustasemete esindatus 1. dimensioonis") 

fviz_cos2(ca1, choice = "col", axes = 2, 
          title = "Haridustasemete esindatus 2. dimensioonis") 

fviz_cos2(ca1, choice = "col", axes = 3,
          title = "Haridustasemete esindatus 3. dimensioonis") 

fviz_cos2(ca1, choice = "row", axes = 2, top = 7, 
          fill = "darkgoldenrod3", color = "darkgoldenrod3", 
          ggtheme = theme_bw()) + 
  labs(title = "Valimisnimekirjade esindatus 2. dimensioonis", 
       subtitle = "(7 kõige paremini 2. dimensioonis esindatud nimekirja)",
       y = "Esindatus") + 
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

Erinevalt panustest esindavad kõik dimensioonid kokku igat tunnust täielikult, st kõikide dimensioonide cos2 väärtused tunnuse väärtuse puhul annavad kokku 1.

Näide 2: muusika ja emotsioonid (CA)

Laadime uue andmestiku, mis pärineb uuringust, kus vaadeldi muusika ja kõne omaduste ja nende kuulmisel tekkinud baasemotsioonide suhet. Keskendume siin muusika omadustele.

load("cue_emotion_data.RData")

# Teeme kõik tunnused faktoriteks
x[sapply(x, is.character)] <- lapply(x[sapply(x, is.character)], 
                                     as.factor)

head(x)
##   Domain       Cue Level     Term Quadrant     Study Basic_emotion
## 1  Music Intensity  Loud Restless      HAN   FS 2003          FEAR
## 2  Music Intensity  Loud Agitated      HAN   FS 2003          FEAR
## 3  Music Intensity  Loud    Tense      HAN   FS 2003          FEAR
## 4  Music Intensity  Loud    Anger      HAN   JL 2010         ANGER
## 5  Music Intensity  Loud    Anger      HAN Sche 2013         ANGER
## 6  Music Intensity  Loud     Fear      HAN Sche 2013          FEAR

# Teeme uue tulba, milles on kokku kleebitud mingi omadus (Cue)
# ja selle väärtus (Level)
x$CueLevel <- paste(x$Cue, x$Level, sep = "")

# Teeme eraldi andmestiku muusika kohta
music <- droplevels(x[x$Domain == "Music",])

Teeme esmalt tabeli, milles on ridades omaduste väärtused (nt kiire ja aeglane tempo, minoorne ja mažoorne helilaad) ja tulpades nende tekitatud baasemotsioonid (viha, hirm, rõõm, armastus, kurbus) ning seejärel korrespondentsanalüüsi mudeli.

tab_music <- table(music$CueLevel, music$Basic_emotion)
head(tab_music)
##                       
##                        ANGER FEAR HAPPINESS LOVE-TENDERNESS SADNESS
##   ArticulationLegato       0    0         0               3       3
##   ArticulationStaccato     1    2         2               0       0
##   AttacksFast             10    1         6               0       0
##   AttacksSlow              0    2         1               4       9
##   ContourFalling           0    0         0               1       2
##   ContourRising            2    2         5               0       0
# Jätame esialgu graafiku joonistamata
ca_music <- CA(tab_music, graph = FALSE)

ca_music
## **Results of the Correspondence Analysis (CA)**
## The row variable has  37  categories; the column variable has 5 categories
## The chi square of independence between the two variables is equal to 492.7374 (p-value =  1.054377e-39 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

# Jälg
trace <- sum(ca_music$eig[,"eigenvalue"]) 
sqrt(trace) # Väga tugev seos
## [1] 1.03723

vcd::assocstats(tab_music) # Craméri V näitab ka tugevat seost
##                     X^2  df P(> X^2)
## Likelihood Ratio 549.46 144        0
## Pearson          492.74 144        0
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.72 
## Cramer's V        : 0.519

Vaatame dimensioone ja nende poolt seletatud varieeruvuse osakaalu.

ca_music$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.65288744              60.685970                          60.68597
## dim 2 0.21465643              19.952342                          80.63831
## dim 3 0.13041296              12.121901                          92.76021
## dim 4 0.07788894               7.239787                         100.00000

Muusika omaduste ja selle tekitatud emotsioonide seost kirjeldab kokku 4 dimensiooni (= varjatud tegurit).

Sümmeetriline graafik

fviz_ca_biplot(ca_music)

Asümmeetrilised graafikud

fviz_ca_biplot(ca_music, map = "colprincipal",
               title = "Tulpade (emotsioonide) originaalkoordinaadid") 


fviz_ca_biplot(ca_music, map = "rowprincipal", 
               title = "Ridade (muusika omaduste) originaalkoordinaadid")


# Kui tahta näha graafikul kõiki kattuvaid silte, 
# võib täpsustada funktsioonides ka argumendi repel = TRUE
  1. dimensioonis eristuvad niisiis emotsioonid viha (ANGER) ja rõõm (HAPPINESS), mis jäävad x-telje suhtes vasakule poole, ning armastus-õrnus (LOVE-TENDERNESS) ja kurbus (SADNESS), mis jäävad paremale poole. Tundub, et viimaseid emotsioone tekitab muusikas nt aeglane tempo, lihtsad rütmid, madalad helisagedused, madal intensiivsus, laskuv meloodiajoonis jmt jooned. Viha ja rõõm on jällegi emotsioonid, mille kutsub esile rütmikam, energilisem ja kõrgemate helisagedustega muusika.

  2. dimensioonis näivad omakorda rohkem eristuvat viha ja rõõm: järsud rütmilised kujundid, suur intensiivsus, valjus ja keskmised helisagedused iseloomustavad pigem muusikat, mis seostub vihaga; rõõmu kutsub esile jällegi intensiivsuselt mõõdukam muusika.

Hirm baasemotsioonina esimeses kahes dimensioonis ei tundu kuigivõrd eristuvat.

Tulpade panused ja esindatus

par(mfrow = c(1,2))
corrplot(ca_music$col$contrib, is.corr = FALSE, title = "Panused")
corrplot(ca_music$col$cos2, is.corr = FALSE, title = "Esindatus")

Ridade panused ja esindatus

par(mfrow = c(1,2))
corrplot(ca_music$row$contrib, is.corr = FALSE, title = "Panused")
corrplot(ca_music$row$cos2, is.corr = FALSE, title = "Esindatus")

Visualiseerimine

Korrespondentsanalüüsi graafikuid saab visualiseerida üsna hästi funktsiooni fviz_ca_biplot() funktsiooni võimalusi ära kasutades. Siin on kasutatud funktsiooni grid.arrange() paketist gridExtra, et kuvada ggploti graafikuid paarikaupa, ent selle kasutamine ei ole muus osas vajalik.

# library(factoextra)
library(gridExtra)

plotA <- fviz_ca_biplot(ca1, map = "colprincipal", 
                        title = "Kandidaatide valimisnimekiri ja haridustase")

plotB <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                       title = "Muusika omadused ja baasemotsioonid")

grid.arrange(plotA, plotB, nrow = 1)


# Jäta alles ainult ridades või tulpades oleva tunnuse sildid
plotA1 <- fviz_ca_biplot(ca1, map = "colprincipal", 
                         title = "Kandidaatide valimisnimekiri ja haridustase", 
                         label = "row") # ridade sildid

plotB1 <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                         title = "Muusika omadused ja baasemotsioonid", 
                         label = "col") # tulpade sildid

grid.arrange(plotA1, plotB1, nrow = 1)


# Kuva ainult teksti või punkte
# Muuda teksti/punktide värvi, suurust ja kuju
plotA2 <- fviz_ca_biplot(ca1, map = "colprincipal", 
                         title = "Kandidaatide valimisnimekiri ja haridustase", 
                         geom = "text", # kuva ainult teksti
                         labelsize = 6, # teksti suurus
                         col.row = "darkcyan", col.col = "lightpink3") # tunnuste värvid

plotB2 <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                         title = "Muusika omadused ja baasemotsioonid", 
                         geom = "point", # kuva ainult punkte
                         pointsize = 5, # punktide suurus
                         col.row = "goldenrod1", col.col = "grey50", # tunnuste värvid
                         shape.col = 15, # tulbatunnuse kujund
                         alpha = 0.7) # punktide läbipaistvus

grid.arrange(plotA2, plotB2, nrow = 1)


# Värvi tekst/punktid panuse järgi
plotA3 <- fviz_ca_biplot(ca1, map = "colprincipal", 
                         title = "Kandidaatide valimisnimekiri ja haridustase", 
                         pointsize = 3,
                         col.row = "contrib", col.col = "contrib") + # tunnuste värv panuse järgi
  scale_color_gradient(low = "darkcyan", high = "lightpink3") # määra värviskaala äärmused

plotB3 <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                         title = "Muusika omadused ja baasemotsioonid",
                         pointsize = 5, 
                         col.row = "contrib", # tulba värv panuse järgi
                         geom.row = "point", geom.col = "text") + # read punktidena, tulbad tekstina
  scale_color_gradient(low = "grey50", high = "goldenrod1") # määra värviskaala äärmused

grid.arrange(plotA3, plotB3, nrow = 1)


# Jäta alles ainult read ja tulbad, mida esimesed kaks dimensiooni esindavad > 0.5
plotA4 <- fviz_ca_biplot(ca1, map = "colprincipal", 
                         title = "Kandidaatide valimisnimekiri ja haridustase", 
                         pointsize = 3, 
                         col.row = "contrib", col.col = "contrib", 
                         select.row = list(cos2 = 0.5), # read, kus cos2 > 0.5
                         select.col = list(cos2 = 0.5)) + # tulbad, kus cos2 > 0.5
  scale_color_gradient(low = "darkcyan", high = "lightpink3")

plotB4 <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                         title = "Muusika omadused ja baasemotsioonid", 
                         pointsize = 5, 
                         geom.row = "text", geom.col = "text", # mõlemad tunnused tekstina
                         col.row = "contrib", col.col = "steelblue3",
                         select.row = list(cos2 = 0.5), # read, kus cos2 > 0.5
                         select.col = list(cos2 = 0.5)) + # tulbad, kus cos2 > 0.5
  scale_color_gradient(low = "grey50", high = "goldenrod1")

grid.arrange(plotA4, plotB4, nrow = 1)


# Jäta alles ainult esimesed 7 rida, mida esimesed dimensioonid kõige paremini esindavad, 
# ning tulbad, mida esimesed kaks dimensiooni esindavad > 0.5
plotA5 <- fviz_ca_biplot(ca1, map = "colprincipal", 
                         title = "Kandidaatide valimisnimekiri ja haridustase", 
                         pointsize = 3,
                         col.row = "contrib", col.col = "contrib", 
                         select.row = list(cos2 = 7), # 7 kõige suurema cos2-ga rida
                         select.col = list(cos2 = 0.5)) + # tulbad, kus cos2 > 0.5
  scale_color_gradient(low = "darkcyan", high = "lightpink3")

plotB5 <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                         title = "Muusika omadused ja baasemotsioonid", 
                         pointsize = 5, 
                         geom.col = "text", geom.row = "text", 
                         col.row = "contrib", col.col = "steelblue3", 
                         select.row = list(cos2 = 7), # 7 kõige suurema cos2-ga rida
                         select.col = list(cos2 = 0.5)) + # tulbad, kus cos2 > 0.5
  scale_color_gradient(low = "grey50", high = "goldenrod1")

grid.arrange(plotA5, plotB5, nrow = 1)


# Muuda graafikute teemat ja fikseeri telgede skaala vahemikud võrdselt 
# (ehk 0.5 x-teljel = 0.5 y-teljel)
plotA6 <- fviz_ca_biplot(ca1, map = "colprincipal", 
                         title = "Kandidaatide valimisnimekiri ja haridustase", 
                         pointsize = 3, 
                         col.row = "contrib", col.col = "contrib",
                         select.row = list(cos2 = 7), 
                         select.col = list(cos2 = 0.5)) +
  scale_color_gradient(low = "darkcyan", high = "lightpink3") + 
  theme_classic() + # klassikaline teema
  coord_fixed(xlim = c(-2, 2)) # fikseeritud teljed ja x-telje ulatus

plotB6 <- fviz_ca_biplot(ca_music, map = "colprincipal", 
                         title = "Muusika omadused ja baasemotsioonid",
                         pointsize = 5, 
                         geom.col = "text", geom.row = "text", 
                         col.row = "contrib", col.col = "steelblue3",
                         select.row = list(cos2 = 7), 
                         select.col = list(cos2 = 0.5)) +
  scale_color_gradient(low = "grey50", high = "goldenrod1") + 
  theme_grey() + # hall teema
  coord_fixed(xlim = c(-3,3), ylim = c(-4,3)) # fikseeritud teljed ja telgede ulatus

grid.arrange(plotA6, plotB6, nrow = 1)

ggplot2

Selleks, et teha ggplot2-ga ilusaid graafikuid, peame tegema korrespondentsanalüüsi tulemustest andmetabeli.

# vektor, milles on 11 korda sõna "nimekiri" ja 4 korda sõna "haridus"
tunnused <- c(rep("nimekiri", nrow(tab)), 
              rep("haridus", ncol(tab))) 

# punktide koordinaadid 1. dimensioonis (x-teljel)
dim1_koordinaadid <- c(ca1$row$coord[,"Dim 1"], ca1$col$coord[,"Dim 1"]) 
# punktide koordinaadid 2. dimensioonis (y-teljel)
dim2_koordinaadid <- c(ca1$row$coord[,"Dim 2"], ca1$col$coord[,"Dim 2"]) 

ca1_df <- data.frame(tunnused, names(dim1_koordinaadid),
                     dim1_koordinaadid, dim2_koordinaadid, 
                     row.names = NULL) # tabel
names(ca1_df) <- c("tunnused", "sildid", "dim1", "dim2")

head(ca1_df)
##   tunnused                            sildid        dim1         dim2
## 1 nimekiri                 Eesti Keskerakond -0.27658566  0.006741676
## 2 nimekiri Eesti Konservatiivne Rahvaerakond  0.33910533 -0.187926389
## 3 nimekiri              Eesti Reformierakond -0.27658566  0.006741676
## 4 nimekiri                 Eesti Vabaerakond  0.36457658  0.258865346
## 5 nimekiri    Eestimaa Ühendatud Vasakpartei -0.17840108 -0.036475150
## 6 nimekiri                Elurikkuse Erakond  0.04843327 -0.136318327
library(ggplot2)

ggplot(data = ca1_df, aes(x = dim1, y = dim2)) + # dimensioonid annavad koordinaadid
  geom_point(color = "grey20", alpha = 0.3) + # punktid hallid ja üsna läbipaistvad
  geom_text(aes(label = sildid, # tunnuste väärtused tekstina
                color = tunnused), # teksti värv tunnuse liigi järgi
            size = c(rep(4, 11), # teksti suurus nimekirjadel 4 
                     rep(5, 4)), # teksti suurus haridusel 5
            alpha = c(rep(0.7, 11), # teksti läbipaistvus nimekirjadel 0.7
                      rep(1, 4)), # teksti läbipaistvus haridusel 1
            vjust = 1) + # paiguta sildi tekst punkti alla
  geom_hline(yintercept = 0, color = "grey60") + # joonista x-telje 0-joon
  geom_vline(xintercept = 0, color = "grey60") + # joonista y-telje 0-joon
  scale_color_manual(values = c("steelblue", "tomato3"), # muuda tunnuse liikide värve
                     name = "Tunnus") + # muuda värvi legendi pealkirja
  labs(x = paste("Dim 1 (", round(ca1$eig[1,2]), "%)", sep = ""), # x-telje pealkiri
       y = paste("Dim 2 (", round(ca1$eig[2,2]), "%)", sep = ""), # y-telje pealkiri
       title = "Korrespondentsanalüüsi graafik valimisnimekirja ja hariduse seostest") +
  theme_minimal() + # muuda teemat
  theme(text = element_text(color = "grey30", size = 12), # graafiku teksti suurus ja värv
        plot.title = element_text(hjust = 0.5)) + # graafiku pealkirja joondus
  xlim(c(-0.75,1.25)) + # graafiku piirid x-teljel
  coord_fixed() # fikseerime x- ja y-telje suhte

Selleks, et joonistada asümmeetrilist graafikut, tuleb muuta ridade või tulpade koordinaate. Peakoordinaatide (P) ja standardkoordinaatide (S) suhet kirjeldab valem P = sqrt(omaväärtus) * S, seega saame standardkoordinaadid nii, kui jagame originaalkoordinaadid läbi vastavate dimensioonide omaväärtuste ruutjuurega.

ca1_df2 <- ca1_df

# Jätame samaks tulpade (haridustasemete) koordinaadid ja 
# muudame ridade (valimisnimekirjade) koordinaate nii, et
# jagame need läbi ruutjuurega vastava dimensiooni omaväärtusest
sqrt_eig_dim1 <- sqrt(ca1$eig["dim 1","eigenvalue"])
sqrt_eig_dim2 <- sqrt(ca1$eig["dim 2","eigenvalue"])

ca1_df2[ca1_df2$tunnused == "nimekiri",]$dim1 <- 
  ca1_df2[ca1_df2$tunnused == "nimekiri",]$dim1/sqrt_eig_dim1

ca1_df2[ca1_df2$tunnused == "nimekiri",]$dim2 <- 
  ca1_df2[ca1_df2$tunnused == "nimekiri",]$dim2/sqrt_eig_dim2


ggplot(data = ca1_df2, aes(x = dim1, y = dim2)) + 
  geom_point(color = "grey20", alpha = 0.3) + 
  geom_text(aes(label = sildid,
                color = tunnused), 
            size = c(rep(4, 11),
                     rep(5, 4)),
            alpha = c(rep(0.7, 11), 
                      rep(1, 4)),
            vjust = 1) + 
  geom_hline(yintercept = 0, color = "grey60") + 
  geom_vline(xintercept = 0, color = "grey60") + 
  scale_color_manual(values = c("steelblue", "tomato3"), 
                     name = "Tunnus") + 
  labs(x = paste("Dim 1 (", round(ca1$eig[1,2]), "%)", sep = ""),
       y = paste("Dim 2 (", round(ca1$eig[2,2]), "%)", sep = ""), 
       title = "Korrespondentsanalüüsi graafik valimisnimekirja ja hariduse seostest",
       subtitle = "(colprincipal)") + # graafiku alapealkiri
  theme_minimal() + 
  theme(text = element_text(color = "grey30", size = 12),
        plot.title = element_text(hjust = 0.5), 
        plot.subtitle = element_text(hjust = 0.5)) + # graafiku alapealkirja joondus
  xlim(c(-3,3)) + # graafiku piirid x-teljel
  ylim(c(-1.5, 3)) + # graafiku piirid y-teljel
  coord_fixed()

Lisame ca1_df2 tabelisse tulba, milles oleks kõikide nimekirjade ja haridustasemete kogupanus esimesse kahte dimensiooni. Samuti lisame tulba, milles on haridustasemete kogu esindatus esimeses kahes dimensioonis. Mõlema puhul tuleb vastavad mõõdikud korrutada läbi dimensioonide omaväärtustega ning tulemused kokku liita.

# Ridade ja tulpade kogupanused 1. ja 2. dimensiooni
ca1_df2$contrib <- c(ca1$eig["dim 1", "eigenvalue"] * ca1$row$contrib[, "Dim 1"] + 
                       ca1$eig["dim 2", "eigenvalue"] * ca1$row$contrib[, "Dim 2"], 
                     ca1$eig["dim 1", "eigenvalue"] * ca1$col$contrib[, "Dim 1"] + 
                       ca1$eig["dim 2", "eigenvalue"] * ca1$col$contrib[, "Dim 2"])

# Ridade ja tulpade esindatus 1. ja 2. dimensioonis
ca1_df2$cos2 <- c(ca1$eig["dim 1", "eigenvalue"] * ca1$row$cos2[, "Dim 1"] + 
                    ca1$eig["dim 2", "eigenvalue"] * ca1$row$cos2[, "Dim 2"],
                  ca1$eig["dim 1", "eigenvalue"] * ca1$col$cos2[, "Dim 1"] + 
                    ca1$eig["dim 2", "eigenvalue"] * ca1$col$cos2[, "Dim 2"])

head(ca1_df2)
##   tunnused                            sildid       dim1        dim2    contrib
## 1 nimekiri                 Eesti Keskerakond -0.9723610  0.05106882 0.87062190
## 2 nimekiri Eesti Konservatiivne Rahvaerakond  1.1921543 -1.42355970 1.70960820
## 3 nimekiri              Eesti Reformierakond -0.9723610  0.05106882 0.87062190
## 4 nimekiri                 Eesti Vabaerakond  1.2817007  1.96092883 2.27396896
## 5 nimekiri    Eestimaa Ühendatud Vasakpartei -0.6271845 -0.27630262 0.03318755
## 6 nimekiri                Elurikkuse Erakond  0.1702714 -1.03262388 0.13901530
##         cos2
## 1 0.07894481
## 2 0.06481885
## 3 0.07894481
## 4 0.05915805
## 5 0.07344013
## 6 0.02132656

Kuvame nüüd näiteks kogupanust teksti suuruse ning esindatust teksti läbipaistvuse kaudu.

ggplot(data = ca1_df2, aes(x = dim1, y = dim2)) +
  geom_point(color = "grey20", alpha = 0.3) + 
  geom_text(aes(label = sildid,
                color = tunnused,
                size = contrib, # teksti suurus panuse järgi
                alpha = cos2), # teksti läbipaistvus esindatuse järgi
            vjust = 1) + 
  geom_hline(yintercept = 0, color = "grey60") + 
  geom_vline(xintercept = 0, color = "grey60") + 
  scale_color_manual(values = c("steelblue", "tomato3"), 
                     name = "Tunnus") + 
  labs(x = paste("Dim 1 (", round(ca1$eig[1,2]), "%)", sep = ""),
       y = paste("Dim 2 (", round(ca1$eig[2,2]), "%)", sep = ""),
       title = "Korrespondentsanalüüsi graafik valimisnimekirja ja hariduse seostest",
       subtitle = "(colprincipal)",
       size = "Kogupanus", # suuruse legendi pealkiri
       alpha = "Esindatus") + # esindatuse legendi pealkiri
  theme_minimal() + # muuda teemat
  theme(text = element_text(color = "grey30", size = 12), 
        plot.title = element_text(hjust = 0.5), 
        plot.subtitle = element_text(hjust = 0.5)) + 
  xlim(c(-3,3)) + 
  ylim(c(-2, 3)) +
  coord_fixed() 

Mitmene korrespondentsanalüüs (MCA)

Mitmene korrespondentsanalüüs (Multiple Correspondence Analysis) on lihtsa korrespondentsanalüüsi laiendus, mis võimaldab vaadelda enama kui kahe tunnuse koosesinemismustreid. Samuti saab mitmene korrespondentsanalüüs edukalt hakkama ka tunnustega, millel on vaid kaks taset.

Paketis FactoMineR on mitmese korrespondentsanalüüsi tegemiseks funktsioon MCA(). MCA sisendiks ei pea olema enam risttabel, vaid tavaline tabel, mille tulpades on tunnused ja ridades iga vaatluse väärtused nende tunnuste kohta (profiilid).

Koordinaatide, panuste, koosinuste ruutude jm tõlgendamine käib üldjoontes samamoodi nagu lihtsas korrespondentsanalüüsis. Ridade ja tulpade infot (panus, cos2, koordinaadid) MCA mudelis enam eraldi ei kuvata, sest sisendiks ei ole risttabel. Selle asemel eristab MCA mudel tunnused ja individuaalsed vaatlused tabelis.

Näide 1: kandidaadid

Vaatame kõigepealt MCA-ga sama kandidaatide andmestikku, millega tegelesime lihtsa korrespondentsanalüüsi juures.

# library(FactoMineR)

# Alamandmestik kategoriaalsete tunnustega, mida tahame analüüsi kaasata
# Neid tunnuseid nimetatakse "aktiivseteks" tunnusteks
mca_sisend <- kandidaadid[,c("nimekiri", "haridus", "sugu")] 

# MCA mudel (ilma graafiku kuvamiseta)
# Jätame esialgu kandidaadi soo välja ja teeme ainult kahe tunnusega mudeli
mca1 <- MCA(mca_sisend[,c("nimekiri", "haridus")], graph = FALSE)
mca1
## **Results of the Multiple Correspondence Analysis (MCA)**
## The analysis was performed on 1099 individuals, described by 2 variables
## *The results are available in the following objects:
## 
##    name              description                       
## 1  "$eig"            "eigenvalues"                     
## 2  "$var"            "results for the variables"       
## 3  "$var$coord"      "coord. of the categories"        
## 4  "$var$cos2"       "cos2 for the categories"         
## 5  "$var$contrib"    "contributions of the categories" 
## 6  "$var$v.test"     "v-test for the categories"       
## 7  "$ind"            "results for the individuals"     
## 8  "$ind$coord"      "coord. for the individuals"      
## 9  "$ind$cos2"       "cos2 for the individuals"        
## 10 "$ind$contrib"    "contributions of the individuals"
## 11 "$call"           "intermediate results"            
## 12 "$call$marge.col" "weights of columns"              
## 13 "$call$marge.li"  "weights of rows"

Nagu näha, ei põhine see mudel enam hii-ruut-testil. Seetõttu peetakse seda sageli ka ebatäpsemaks. Vaatame kõigepealt dimensioone ja nende omaväärtusi.

mca1$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1   0.6422238               9.880365                          9.880365
## dim 2   0.5660058               8.707782                         18.588147
## dim 3   0.5402654               8.311775                         26.899922
## dim 4   0.5000000               7.692308                         34.592230
## dim 5   0.5000000               7.692308                         42.284538
## dim 6   0.5000000               7.692308                         49.976845
## dim 7   0.5000000               7.692308                         57.669153
## dim 8   0.5000000               7.692308                         65.361461
## dim 9   0.5000000               7.692308                         73.053769
## dim 10  0.5000000               7.692308                         80.746076
## dim 11  0.4597346               7.072840                         87.818916
## dim 12  0.4339942               6.676834                         94.495750
## dim 13  0.3577762               5.504250                        100.000000

Näeme, et dimensioone on palju rohkem ning iga dimensioon seletab märkimisväärselt väiksema osa varieeruvusest kui lihtsas korrespondentsanalüüsis. MCAs ongi seletatud varieerumise protsendid enamasti hinnatud oluliselt väiksemaks kui CAs. Seepärast ei saa neid protsente väga otseselt tõlgendada. Võrdluseks võib kasutada nt paketi ca funktsiooni mjca(), mis annab meile kohandatud ja seega täpsemad protsendid.

# install.packages("ca")
summary(mjca <- ca::mjca(mca_sisend[,c("haridus", "nimekiri")]))[1]
## $scree
##                 values2 values3
## [1,] 1 0.080910    77.2    77.2
## [2,] 2 0.017427    16.6    93.8
## [3,] 3 0.006485     6.2   100.0
## [4,] 4 0.000000     0.0   100.0
## [5,] 5 0.000000     0.0   100.0
## [6,] 6 0.000000     0.0   100.0
## [7,] 7 0.000000     0.0   100.0

Näeme, et selle paketiga saame samad tulemused, mis lihtsas korrespondentsanalüüsis. Ka rohkemate tunnustega võib võrdluseks mjca-funktsiooni kasutada, et hinnata dimensioonide seletusvõimet adekvaatsemalt.

Visualiseerime nüüd meie esialgset mca1-mudelit paketi factoextra funktsiooniga fviz_mca_biplot().

# library(factoextra)

fviz_mca_biplot(mca1)

Graafikul on nüüd ühtmoodi (punase teksti ja kolmnurgaga) märgitud kõik analüüsi kaasatud tunnused - nii valimisnimekirjad kui ka haridustasemed - ning lisaks kõik individuaalsed vaatlused ehk algandmestiku read. Nõnda kasutatakse MCA-d sageli nt küsitluste andmete analüüsil, et näha, millised vastajad on oma vastustes sarnasemad. Vaatluse number näitab selle reaindeksit andmestikus. Näiteks vaatlus real 989 on

mca_sisend[989,]
##              nimekiri    haridus sugu
## 989 Erakond Eesti 200 Algharidus mees

Individuaalsed vaatlused võib peita argumendiga invisible = "ind". Värvime ka tunnused halliks ning suurendame veidi graafikul kuvatavat ala.

fviz_mca_biplot(mca1, invisible = "ind", 
                col.var = "grey50") +
  coord_fixed(xlim = c(-5, 5))

MCA fviz-graafikutel kuvatavaid tunnuseid eristada ei saagi. Kõiki tunnuseid ja nende tasemeid käsitletakse võrdsena ning neid eristatakse vaid individuaalsetest vaatlustest. Seda näeme ka mudelist endast, kus on tunnuste info objektis $var ning vaatluste info objektis $ind.

mca1
## **Results of the Multiple Correspondence Analysis (MCA)**
## The analysis was performed on 1099 individuals, described by 2 variables
## *The results are available in the following objects:
## 
##    name              description                       
## 1  "$eig"            "eigenvalues"                     
## 2  "$var"            "results for the variables"       
## 3  "$var$coord"      "coord. of the categories"        
## 4  "$var$cos2"       "cos2 for the categories"         
## 5  "$var$contrib"    "contributions of the categories" 
## 6  "$var$v.test"     "v-test for the categories"       
## 7  "$ind"            "results for the individuals"     
## 8  "$ind$coord"      "coord. for the individuals"      
## 9  "$ind$cos2"       "cos2 for the individuals"        
## 10 "$ind$contrib"    "contributions of the individuals"
## 11 "$call"           "intermediate results"            
## 12 "$call$marge.col" "weights of columns"              
## 13 "$call$marge.li"  "weights of rows"
mca1$var
## $coord
##                                        Dim 1       Dim 2       Dim 3
## Eesti Keskerakond                 -0.7792390  0.03842079 -0.39461996
## Eesti Konservatiivne Rahvaerakond  0.9553789 -1.07099175 -0.47655126
## Eesti Reformierakond              -0.7792390  0.03842079 -0.39461996
## Eesti Vabaerakond                  1.0271404  1.47527259  0.36535514
## Eestimaa Ühendatud Vasakpartei    -0.5026186 -0.20787173 -0.43030820
## Elurikkuse Erakond                 0.1364536 -0.77687761 -0.51275822
## Erakond Eesti 200                 -0.3681477 -0.65582807  1.91968279
## Erakond Eestimaa Rohelised         1.0919967 -0.32257837 -0.21045545
## Isamaa Erakond                    -0.4935855  0.21911192 -0.28961282
## Sotsiaaldemokraatlik Erakond      -0.8316772  0.52013612 -0.24599385
## Üksikkandidaadid                   1.1826173  1.91687690  0.53444397
## Algharidus                        -1.2942553 -4.96795803 23.83787005
## Keskharidus                        1.2621030 -0.60803914 -0.08597455
## Kõrgharidus                       -0.4552067  0.10158022 -0.02324829
## Põhiharidus                        2.8322339  5.92172338  1.28469539
##                                           Dim 4         Dim 5
## Eesti Keskerakond                  0.000000e+00  0.000000e+00
## Eesti Konservatiivne Rahvaerakond -8.024811e-01 -5.234522e-01
## Eesti Reformierakond               1.249487e-01 -1.235954e+00
## Eesti Vabaerakond                  1.479171e-01  1.607658e-01
## Eestimaa Ühendatud Vasakpartei     8.922734e+00 -1.819692e+00
## Elurikkuse Erakond                 8.780603e-01  3.127885e+00
## Erakond Eesti 200                  5.760924e-16  3.559428e-15
## Erakond Eestimaa Rohelised         2.856237e-01 -7.526906e-01
## Isamaa Erakond                    -4.195790e-01  4.932188e-01
## Sotsiaaldemokraatlik Erakond      -6.295336e-01  5.909822e-02
## Üksikkandidaadid                  -4.069752e-02  1.103846e+00
## Algharidus                         4.015216e-13  1.366076e-12
## Keskharidus                       -6.372982e-15 -8.400749e-15
## Kõrgharidus                        1.820603e-15  8.841783e-16
## Põhiharidus                       -4.826082e-14 -1.931970e-14
## 
## $contrib
##                                         Dim 1      Dim 2       Dim 3
## Eesti Keskerakond                  5.37696694  0.0148318  1.63920496
## Eesti Konservatiivne Rahvaerakond  8.08252914 11.5248079  2.39053114
## Eesti Reformierakond               5.37696694  0.0148318  1.63920496
## Eesti Vabaerakond                  9.34233814 21.8678451  1.40509476
## Eestimaa Ühendatud Vasakpartei     0.19685918  0.0382063  0.17152092
## Elurikkuse Erakond                 0.09628941  3.5414369  1.61626765
## Erakond Eesti 200                  1.20016271  4.3215690 38.79128017
## Erakond Eestimaa Rohelised        10.55938381  1.0455190  0.46622495
## Isamaa Erakond                     2.15735079  0.4823846  0.88289840
## Sotsiaaldemokraatlik Erakond       6.12499260  2.7182880  0.63697688
## Üksikkandidaadid                   1.48616032  4.4302796  0.36079522
## Algharidus                         0.11866587  1.9838429 47.85199537
## Keskharidus                       29.90345777  7.8751779  0.16494944
## Kõrgharidus                       12.02228981  0.6792875  0.03727615
## Põhiharidus                        7.95558654 39.4616917  1.94577904
##                                          Dim 4        Dim 5
## Eesti Keskerakond                 0.000000e+00 0.000000e+00
## Eesti Konservatiivne Rahvaerakond 7.324566e+00 3.116494e+00
## Eesti Reformierakond              1.775726e-01 1.737467e+01
## Eesti Vabaerakond                 2.488567e-01 2.939679e-01
## Eestimaa Ühendatud Vasakpartei    7.968762e+01 3.314293e+00
## Elurikkuse Erakond                5.121225e+00 6.498704e+01
## Erakond Eesti 200                 3.774823e-30 1.441029e-28
## Erakond Eestimaa Rohelised        9.278993e-01 6.443849e+00
## Isamaa Erakond                    2.002349e+00 2.766888e+00
## Sotsiaaldemokraatlik Erakond      4.507650e+00 3.972475e-02
## Üksikkandidaadid                  2.260629e-03 1.663070e+00
## Algharidus                        1.466967e-26 1.698057e-25
## Keskharidus                       9.793402e-28 1.701705e-27
## Kõrgharidus                       2.470113e-28 5.825938e-29
## Põhiharidus                       2.967015e-27 4.754787e-28
## 
## $cos2
##                                         Dim 1        Dim 2       Dim 3
## Eesti Keskerakond                 0.077927809 0.0001894452 0.019985230
## Eesti Konservatiivne Rahvaerakond 0.117139233 0.1472052527 0.029145418
## Eesti Reformierakond              0.077927809 0.0001894452 0.019985230
## Eesti Vabaerakond                 0.135397511 0.2793158630 0.017130952
## Eestimaa Ühendatud Vasakpartei    0.002554117 0.0004368725 0.001872074
## Elurikkuse Erakond                0.001324784 0.0429418460 0.018706854
## Erakond Eesti 200                 0.017393830 0.0551989807 0.472944304
## Erakond Eestimaa Rohelised        0.153036024 0.0133543126 0.005684227
## Isamaa Erakond                    0.031266255 0.0061614522 0.010764320
## Sotsiaaldemokraatlik Erakond      0.088768865 0.0347204285 0.007766039
## Üksikkandidaadid                  0.019353095 0.0508452544 0.003952450
## Algharidus                        0.001525589 0.0224777841 0.517526456
## Keskharidus                       0.506138546 0.1174743062 0.002348657
## Kõrgharidus                       0.606098509 0.0301817337 0.001580913
## Põhiharidus                       0.103503854 0.4524749387 0.021296029
##                                          Dim 4        Dim 5
## Eesti Keskerakond                 0.000000e+00 0.000000e+00
## Eesti Konservatiivne Rahvaerakond 8.264577e-02 3.516455e-02
## Eesti Reformierakond              2.003617e-03 1.960448e-01
## Eesti Vabaerakond                 2.807942e-03 3.316948e-03
## Eestimaa Ühendatud Vasakpartei    8.049329e-01 3.347802e-02
## Elurikkuse Erakond                5.485600e-02 6.961087e-01
## Erakond Eesti 200                 4.259271e-32 1.625966e-30
## Erakond Eestimaa Rohelised        1.046983e-02 7.270831e-02
## Isamaa Erakond                    2.259324e-02 3.121981e-02
## Sotsiaaldemokraatlik Erakond      5.086147e-02 4.482289e-04
## Üksikkandidaadid                  2.291911e-05 1.686083e-02
## Algharidus                        1.468303e-28 1.699604e-27
## Keskharidus                       1.290521e-29 2.242414e-29
## Kõrgharidus                       9.695195e-30 2.286681e-30
## Põhiharidus                       3.005300e-29 4.816139e-30
## 
## $v.test
##                                        Dim 1       Dim 2     Dim 3
## Eesti Keskerakond                  -9.250121   0.4560820 -4.684419
## Eesti Konservatiivne Rahvaerakond  11.341026 -12.7134326 -5.657002
## Eesti Reformierakond               -9.250121   0.4560820 -4.684419
## Eesti Vabaerakond                  12.192886  17.5125332  4.337025
## Eestimaa Ühendatud Vasakpartei     -1.674640  -0.6925936 -1.433715
## Elurikkuse Erakond                  1.206074  -6.8665965 -4.532122
## Erakond Eesti 200                  -4.370175  -7.7851449 22.787998
## Erakond Eestimaa Rohelised         12.962776  -3.8292343 -2.498256
## Isamaa Erakond                     -5.859211   2.6010141 -3.437910
## Sotsiaaldemokraatlik Erakond       -9.872599   6.1743850 -2.920122
## Üksikkandidaadid                    4.609740   7.4718197  2.083216
## Algharidus                         -1.294255  -4.9679580 23.837870
## Keskharidus                        23.574141 -11.3572351 -1.605872
## Kõrgharidus                       -25.797212   5.7566955 -1.317514
## Põhiharidus                        10.660546  22.2894029  4.835601
##                                           Dim 4         Dim 5
## Eesti Keskerakond                  0.000000e+00  0.000000e+00
## Eesti Konservatiivne Rahvaerakond -9.526020e+00 -6.213749e+00
## Eesti Reformierakond               1.483230e+00 -1.467165e+01
## Eesti Vabaerakond                  1.755882e+00  1.908405e+00
## Eestimaa Ühendatud Vasakpartei     2.972905e+01 -6.062909e+00
## Elurikkuse Erakond                 7.760921e+00  2.764647e+01
## Erakond Eesti 200                  6.838625e-15  4.225294e-14
## Erakond Eestimaa Rohelised         3.390556e+00 -8.934972e+00
## Isamaa Erakond                    -4.980700e+00  5.854857e+00
## Sotsiaaldemokraatlik Erakond      -7.473011e+00  7.015379e-01
## Üksikkandidaadid                  -1.586354e-01  4.302696e+00
## Algharidus                         4.015216e-13  1.366076e-12
## Keskharidus                       -1.190375e-13 -1.569131e-13
## Kõrgharidus                        1.031762e-13  5.010764e-14
## Põhiharidus                       -1.816540e-13 -7.271947e-14
## 
## $eta2
##              Dim 1     Dim 2     Dim 3        Dim 4        Dim 5
## nimekiri 0.6422238 0.5660058 0.5402654 1.000000e+00 1.000000e+00
## haridus  0.6422238 0.5660058 0.5402654 1.886303e-28 1.720412e-27

Lisaks koordinaatidele, panustele ja esindatusele väljendab MCA-mudel lisaks veel paari näitajat. v.test väljendab tunnuste väärtuste ja dimensioonide vahelise suhte tugevust ja suunda (miinusmärgiga väärtused dimensioonis ühel pool ja plussmärgiga teisel pool). Tabelis eta2 on tunnuste ja dimensioonide vaheliste korrelatsioonide ruudud (R2). Mõlemad tunnused tervikuna on mudelis esimese kolme dimensiooniga sama tugevalt seotud, ent kõige tugevamalt 1. dimensiooniga. R2 väärtusi kasutatakse koordinaatidena järgmisel graafikul, mis näitab tunnuste seotust dimensioonidega visuaalselt.

fviz_mca_biplot(mca1, invisible = "ind", choix = "var")

Nii tunnuste kui nende väärtuste seotust dimensioonidega saab küsida ka funktsiooniga dimdesc() (paketist FactoMineR).

# 1. dimensioon
dimdesc(mca1)$`Dim 1`
## $quali
##                 R2       p.value
## haridus  0.6422238 8.478214e-244
## nimekiri 0.6422238 9.275235e-235
## 
## $category
##                                              Estimate       p.value
## haridus=Keskharidus                         0.5416460 2.962324e-170
## nimekiri=Erakond Eestimaa Rohelised         0.8285545  1.663795e-41
## nimekiri=Eesti Vabaerakond                  0.7765794  1.436431e-36
## nimekiri=Eesti Konservatiivne Rahvaerakond  0.7190706  1.466692e-31
## haridus=Põhiharidus                         1.7999310  6.977723e-28
## nimekiri=Üksikkandidaadid                   0.9011769  3.672294e-06
## nimekiri=Erakond Eesti 200                 -0.3415886  1.152624e-05
## nimekiri=Isamaa Erakond                    -0.4421130  3.596217e-09
## nimekiri=Eesti Reformierakond              -0.6710325  4.026207e-21
## nimekiri=Eesti Keskerakond                 -0.6710325  4.026207e-21
## nimekiri=Sotsiaaldemokraatlik Erakond      -0.7130559  5.753092e-24
## haridus=Kõrgharidus                        -0.8345865 3.633470e-224
## 
## attr(,"class")
## [1] "condes" "list "

$quali näitab, kui tugevalt mingi tunnus mingi dimensiooniga seotud on (ainult statistiliselt olulised seosed). Nii haridustase kui ka valimisnimekiri on mõlemad 1. dimensioonis olulised tunnused.
$category näitab seose suunda iga (statistiliselt olulise) väärtuse kohta. Jällegi tõmbuvad plussmärgiga tunnused ja väärtused dimensiooni ühte suunda ning miinusmärgiga teise. Individuaalsed vaatlused (antud juhul kandidaadid), kellel on 1. dimensioonis suured (positiivsed) koordinaatide väärtused, on tõenäolisemalt põhi- või keskharidusega ning kandideerivad Roheliste, Vabaerakonna või EKRE ridades või hoopis üksikkandidaadina.

Kontrollime. Otsime välja vaatlused, millel on 1. dimensioonis suured koordinaatide väärtused ning viime need kokku sisendandmestiku ridadega.

(suur_dim1 <- head(sort(mca1$ind$coord[,"Dim 1"], decreasing = TRUE)))
##      479      150      504      953      339      345 
## 2.504934 2.448394 2.448394 2.448394 2.407929 2.407929
mca_sisend[names(suur_dim1),]
##                       nimekiri     haridus  sugu
## 479           Üksikkandidaadid Põhiharidus  mees
## 150 Erakond Eestimaa Rohelised Põhiharidus  mees
## 504 Erakond Eestimaa Rohelised Põhiharidus naine
## 953 Erakond Eestimaa Rohelised Põhiharidus naine
## 339          Eesti Vabaerakond Põhiharidus naine
## 345          Eesti Vabaerakond Põhiharidus  mees

Vaikimisi teeb FactoMineR MCA-mudeli, kus ta hoiab infot ainult esimese 5 dimensiooni kohta. Kui tahta infot ka kõikide teiste võimalike dimensioonide kohta, tuleb mudeli tegemisel täpsustada argument ncp = Inf. Teemegi nüüd sellise mudeli ning lisame mudelisse ka kandidaatide soo.

mca2 <- MCA(mca_sisend, ncp = Inf, graph = FALSE)
mca2$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1   0.4295752               9.205182                          9.205182
## dim 2   0.3968461               8.503845                         17.709027
## dim 3   0.3753088               8.042331                         25.751358
## dim 4   0.3594171               7.701795                         33.453153
## dim 5   0.3333333               7.142857                         40.596010
## dim 6   0.3333333               7.142857                         47.738867
## dim 7   0.3333333               7.142857                         54.881725
## dim 8   0.3333333               7.142857                         62.024582
## dim 9   0.3333333               7.142857                         69.167439
## dim 10  0.3333333               7.142857                         76.310296
## dim 11  0.3092145               6.626026                         82.936322
## dim 12  0.2911357               6.238621                         89.174943
## dim 13  0.2747601               5.887716                         95.062659
## dim 14  0.2304092               4.937341                        100.000000

Kuvame analüüsi graafikul.

fviz_mca_biplot(mca2, invisible = "ind", col.var = "grey50") + 
  coord_fixed(xlim = c(-3, 4), ylim = c(-1.5, 3))

Tundub, et 1. dimensiooni iseloomustab endiselt keskharidusega kandidaatide osakaal valimisnimekirjas ning 2. dimensiooni põhiharidusega kandidaatide osakaal, ent lisandunud tunnus on nüüd omakorda punkte pisut ringi liigutanud ning mees-naine-telg näib eristavat eeskätt Rohelisi, Vabaerakonda ja EÜVP-d ühelt poolt ja EKREt, Isamaad ja üksikkandidaate teiselt poolt.

Vaatame ka, kui tugevasti tunnused tervikuna dimensioonidega seotud on.

fviz_mca_biplot(mca2, invisible = "ind", choix = "var")

Haridus näib olevat seotud eeskätt 1. dimensiooniga (ehk erinevustega kesk- ja kõrgharidusega kandidaatide osakaalus), sugu eeskätt 2. dimensiooniga (ehk erinevustega mees- ja naiskandidaatide osakaalus), valimisnimekiri aga tugevalt mõlema dimensiooniga.

dimdesc(mca2)$`Dim 1` 
## $quali
##                  R2       p.value
## haridus  0.64604391 2.382773e-246
## nimekiri 0.60965077 2.904841e-214
## sugu     0.03303077  1.288941e-09
## 
## $category
##                                              Estimate       p.value
## haridus=Keskharidus                         0.4582589 6.115367e-182
## nimekiri=Eesti Konservatiivne Rahvaerakond  0.6877332  7.348789e-43
## nimekiri=Eesti Vabaerakond                  0.5749324  2.442978e-30
## nimekiri=Erakond Eestimaa Rohelised         0.5561776  1.633559e-28
## haridus=Põhiharidus                         1.3039796  3.098046e-23
## sugu=mees                                   0.1264597  1.288941e-09
## nimekiri=Üksikkandidaadid                   0.8753704  4.454351e-08
## nimekiri=Eestimaa Ühendatud Vasakpartei    -0.4689529  2.880294e-02
## nimekiri=Isamaa Erakond                    -0.2456793  1.758640e-04
## nimekiri=Erakond Eesti 200                 -0.3206375  2.949733e-07
## sugu=naine                                 -0.1264597  1.288941e-09
## nimekiri=Eesti Keskerakond                 -0.5052720  9.502037e-18
## nimekiri=Eesti Reformierakond              -0.5262956  2.683557e-19
## nimekiri=Sotsiaaldemokraatlik Erakond      -0.6295625  4.633494e-28
## haridus=Kõrgharidus                        -0.6899495 3.735831e-233
## 
## attr(,"class")
## [1] "condes" "list "
dimdesc(mca2)$`Dim 2`
## $quali
##                  R2       p.value
## nimekiri 0.56775652 2.663804e-190
## sugu     0.52443546 2.957500e-179
## haridus  0.09834628  2.023895e-24
## 
## $category
##                                              Estimate       p.value
## sugu=naine                                  0.4843177 2.957500e-179
## nimekiri=Erakond Eestimaa Rohelised         0.6931261  5.038744e-43
## haridus=Põhiharidus                         1.4813861  3.274335e-25
## nimekiri=Eesti Vabaerakond                  0.5234501  1.574838e-24
## nimekiri=Sotsiaaldemokraatlik Erakond       0.2788850  6.157034e-08
## nimekiri=Erakond Eesti 200                  0.1719093  7.449424e-04
## nimekiri=Eestimaa Ühendatud Vasakpartei     0.5336753  4.216042e-03
## nimekiri=Elurikkuse Erakond                 0.1929167  5.044861e-03
## haridus=Keskharidus                        -0.3027494  8.570865e-03
## nimekiri=Eesti Reformierakond              -0.1695371  2.122323e-03
## nimekiri=Üksikkandidaadid                  -0.5771289  4.045449e-04
## nimekiri=Eesti Keskerakond                 -0.2915454  6.695376e-08
## nimekiri=Eesti Konservatiivne Rahvaerakond -0.6730314  7.597691e-39
## nimekiri=Isamaa Erakond                    -0.6827198  5.032856e-40
## sugu=mees                                  -0.4843177 2.957500e-179
## 
## attr(,"class")
## [1] "condes" "list "
dimdesc(mca2)$`Dim 3`
## $quali
##                  R2       p.value
## nimekiri 0.60924450 5.101892e-214
## haridus  0.47547120 6.833661e-153
## sugu     0.04121064  1.098142e-11
## 
## $category
##                                               Estimate       p.value
## haridus=Põhiharidus                         3.45779002 8.035214e-111
## nimekiri=Eesti Vabaerakond                  0.71184999  7.506421e-58
## nimekiri=Üksikkandidaadid                   1.45884174  2.786888e-23
## nimekiri=Isamaa Erakond                     0.34318533  4.679740e-16
## sugu=mees                                   0.13202990  1.098142e-11
## haridus=Kõrgharidus                         0.25113291  7.638007e-08
## nimekiri=Sotsiaaldemokraatlik Erakond       0.13282039  8.165930e-05
## nimekiri=Eesti Keskerakond                  0.05520796  1.526730e-02
## nimekiri=Eestimaa Ühendatud Vasakpartei    -0.43759538  4.548300e-02
## haridus=Algharidus                         -3.56547521  6.210206e-10
## sugu=naine                                 -0.13202990  1.098142e-11
## nimekiri=Eesti Konservatiivne Rahvaerakond -0.45916290  2.209451e-14
## nimekiri=Elurikkuse Erakond                -0.64915435  2.084122e-17
## nimekiri=Erakond Eestimaa Rohelised        -0.52992802  1.132630e-19
## haridus=Keskharidus                        -0.14344771  6.820642e-26
## nimekiri=Erakond Eesti 200                 -0.63094620  5.441411e-29
## 
## attr(,"class")
## [1] "condes" "list "

Panused ja esindatus

# library(corrplot)
corrplot(mca2$var$contrib, is.corr = FALSE)

Panustest saame teada, et 1. dimensiooni olemusse panustab tõesti kõige enam keskharidus, 2. dimensiooni aga naiskandidaatide osakaal. Põhiharidus panustab enim 3. dimensiooni.

Vaatame ka tunnuste väärtuste esindatust dimensioonides.

corrplot(mca2$var$cos2, is.corr = FALSE)

Kõige paremini on jällegi esimestes dimensioonides esindatud haridus ja sugu.

Näide 2: 1. isiku asesõna esinemine

Vaatame nüüd mitmese korrespondentsanalüüsiga ka juba tuttavaks saanud 1. isiku andmestikku. Sel korral ei ennusta me asesõna esinemist, vaid vaatame lihtsalt asesõna esinemise-mitteesinemise kontekste ning nendes ilmnevaid mustreid.

load("isik1suur.RData")

# alamandmestik tunnustega, mida tahame analüüsi kaasata
mca_sisend2 <- isik1suur[,c("Pron", "Lopp", "Murre", "Ref_kaugus_klass", "Aeg", "Verbiklass")] 
mca3 <- MCA(mca_sisend2[,-1], graph = FALSE, ncp = Inf) # jätame pronoomeni esialgu mudelist välja
mca3
## **Results of the Multiple Correspondence Analysis (MCA)**
## The analysis was performed on 4066 individuals, described by 5 variables
## *The results are available in the following objects:
## 
##    name              description                       
## 1  "$eig"            "eigenvalues"                     
## 2  "$var"            "results for the variables"       
## 3  "$var$coord"      "coord. of the categories"        
## 4  "$var$cos2"       "cos2 for the categories"         
## 5  "$var$contrib"    "contributions of the categories" 
## 6  "$var$v.test"     "v-test for the categories"       
## 7  "$ind"            "results for the individuals"     
## 8  "$ind$coord"      "coord. for the individuals"      
## 9  "$ind$cos2"       "cos2 for the individuals"        
## 10 "$ind$contrib"    "contributions of the individuals"
## 11 "$call"           "intermediate results"            
## 12 "$call$marge.col" "weights of columns"              
## 13 "$call$marge.li"  "weights of rows"
mca3$eig
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.36733734              16.697152                          16.69715
## dim 2  0.25754789              11.706722                          28.40387
## dim 3  0.21518807               9.781276                          38.18515
## dim 4  0.21032437               9.560199                          47.74535
## dim 5  0.20279429               9.217922                          56.96327
## dim 6  0.20104841               9.138564                          66.10184
## dim 7  0.19534119               8.879145                          74.98098
## dim 8  0.18741306               8.518775                          83.49976
## dim 9  0.18012166               8.187348                          91.68710
## dim 10 0.14724727               6.693058                          98.38016
## dim 11 0.03563643               1.619838                         100.00000

Teeme graafiku.

fviz_mca_biplot(mca3, invisible = "ind") + 
    coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))

Kas on tuttav pilt? 1. dimensiooni seletamises näivad konkureerivat murded ja pöördelõpu olemasolu (see võib ühtlasi viidata multikollineaarsusele, nagu juba teame). 2. dimensioonis domineerivad verbiklass ning tegusõna ajavorm. Viitekaugus klassidena operatsionaliseeritult esimeses kahes dimensioonis kuigivõrd esile ei tõuse.

Panused ja esindatus

par(mfrow = c(1,2))

corrplot(mca3$var$contrib, is.corr = FALSE)
corrplot(mca3$var$cos2, is.corr = FALSE)

Näeme, et 1. dimensiooni panustamises jääb peale pöördelõpu olemasolu või puudumine tegusõnadel, ent murded on nendega samuti seotud. 2. dimensiooni tervikuna näib rohkem panustavat tunnus Aeg, ent tugevalt ka kognitiivsed tegusõnad. Teame varasemast, et ka need kaks tunnust on tegelikult omavahel seotud. Alles 3. dimensioonis tõuseb esile viitamiskaugus. Esindatus on sedapuhku esimestes dimensioonides panustega suhteliselt sarnane.

Tunnuste seotus dimensioonidega

fviz_mca_biplot(mca3, invisible = "ind", choix = "var")

Saame taas kord kinnitust, et meil on esimeses kahes dimensioonis tunnusepaarid, mis on omavahel tõenäoliselt uuritavas kontekstis tihedalt seotud ning üks tunnus (Ref_kaugus_klass), mis nendes dimensioonides oluline ei ole.

Grupeerimine

Võime aga ka vaadelda, kas vaatlused grupeeruvad mingi andmestiku tunnuse järgi. Selleks kasutame argumenti habillage. Grupeerime andmepunktid pöördelõpu olemasolu järgi, mis panustas 1. dimensiooni olemuse seletamisse kõige rohkem.

fviz_mca_biplot(mca3, habillage = "Lopp", geom.ind = "point", alpha.ind = 0.3) +
    coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))

Näeme, et vaatlused grupeeruvad üsna selgelt pöördelõpu olemasolu põhjal kahte gruppi. Kui püüame grupeerida teiste tunnuste põhjal, siis nii selgeid erinevusi välja ei joonistu, ehkki üldised mustrid on nähtavad (välja arvatud viitekauguse puhul).

p1 <- fviz_mca_biplot(mca3, habillage = "Murre", geom.ind = "point", alpha.ind = 0.3) +
  coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))
p2 <- fviz_mca_biplot(mca3, habillage = "Verbiklass", geom.ind = "point", alpha.ind = 0.3) +
  coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))
p3 <- fviz_mca_biplot(mca3, habillage = "Aeg", geom.ind = "point", alpha.ind = 0.3) +
  coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))
p4 <- fviz_mca_biplot(mca3, habillage = "Ref_kaugus_klass", geom.ind = "point", alpha.ind = 0.3) +
  coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))

gridExtra::grid.arrange(p1, p2, p3, p4, nrow = 2)

Täiendavad tunnused

Lisame nüüd mudelisse pronoomeni esinemise kvalitatiivse täiendava tunnusena (supplementary variable). See tähendab, et seda tunnust ei arvestata kahedimensioonilise ruumi loomisel, küll aga võib vaadelda, kuhu selle tunnuse väärtused dimensioonide loodud kontekstides paigutuksid. Täiendavaid tunnuseid võib käsitleda niisiis tõlgendamist hõlbustavate tunnustena.

# 1. tulpa käsitletakse täiendava tunnusena
mca4 <- MCA(mca_sisend2, quali.sup = 1, graph = FALSE, ncp = Inf) 

fviz_mca_biplot(mca4, habillage = "Lopp", geom.ind = "point", alpha.ind = 0.3) +
    coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))

Jooniselt ei ole esmalt hästi näha, aga joonise keskele on ilmunud tunnused Pron_jah ja Pron_ei. Kui meil on mudeli andmetes mitu tunnust, millel on samasugused väärtused (nt Lopp tasemed on “ei” ja “jah” ning Pron tasemed on “ei” ja “jah”), siis lisab mudel automaatselt tasemete ette ka tunnuse nimetuse, et tasemeid oleks võimalik eristada.

Proovime nüüd veel natuke graafiku kujundusega mängida

fviz_mca_biplot(mca4, habillage = "Lopp", # mudel ja grupeeriv tunnus
                geom.ind = "point", alpha.ind = 0.2, # vaatluste kuju ja läbipaistvus
                palette = c("burlywood1", "plum3"), # grupeeriva tunnuse värvid
                geom.var = "text", col.var = "grey50", # tunnuste kuju ja värv
                col.quali.sup = "black") + # täiendava tunnuse värv
    coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3))

Ehkki ka funktsioonil fviz_mca_biplot() on põhimõtteliselt olemas argument map, millega saaks justkui teha asümmeetrilisi graafikuid, siis praktikas see ei tööta.

ggplot2

Kui tahaksime graafiku tegemisel veel rohkem vabadust, võime mõistagi jälle teha lihtsalt andmetabeli.

# Väärtuste x-koordinaadid
varkoorddim1 <- mca4$var$coord[,"Dim 1"]

# Väärtuste y-koordinaadid
varkoorddim2 <- mca4$var$coord[,"Dim 2"]

# Väärtuste nimed
vaartused <- rownames(mca4$var$coord) 

# Tunnuste nimed
tunnused <- c(rep("Pöördelõpp", nlevels(mca_sisend2$Lopp)),
              rep("Murre", nlevels(mca_sisend2$Murre)),
              rep("Ref_kaugus_klass", nlevels(as.factor(mca_sisend2$Ref_kaugus_klass))),
              rep("Aeg", nlevels(mca_sisend2$Aeg)),
              rep("Verbiklass", nlevels(mca_sisend2$Verbiklass)))

# Panused
contrib <- mca4$eig["dim 1","eigenvalue"] * mca4$var$contrib[, "Dim 1"] + 
  mca4$eig["dim 2", "eigenvalue"] * mca4$var$contrib[, "Dim 2"]

# Esindatus
cos2 <- mca4$eig["dim 1","eigenvalue"] * mca4$var$cos2[, "Dim 1"] + 
  mca4$eig["dim 2", "eigenvalue"] * mca4$var$cos2[, "Dim 2"]

# Kontrollime, et kõik vektorid oleksid ühepikkused
sapply(list(varkoorddim1, varkoorddim2, vaartused, tunnused, contrib, cos2),length)
## [1] 16 16 16 16 16 16

# Teeme tabeli
mca4_df_vars <- data.frame(varkoorddim1, varkoorddim2, vaartused, tunnused, contrib, cos2)

head(mca4_df_vars)
##          varkoorddim1 varkoorddim2 vaartused   tunnused   contrib       cos2
## Lopp_ei     1.1633238   0.04178531   Lopp_ei Pöördelõpp 10.844545 0.33192100
## Lopp_jah   -0.7760262  -0.02787401  Lopp_jah Pöördelõpp  7.234143 0.33192100
## IDA        -0.8774540   0.35230903       IDA      Murre  1.917386 0.03780945
## KESK       -0.9190748   0.25362857      KESK      Murre  4.833532 0.11836922
## RANNA      -0.9097923  -0.99515124     RANNA      Murre  4.668082 0.08235192
## SAARTE      0.6359313   0.16236963    SAARTE      Murre  2.771522 0.07367309
# Teeme kõigepealt põhigraafikuga ggploti objekti. Sellel on kuvatud väärtused kahedimensioonilises ruumis.
(baas <- ggplot(data = mca4_df_vars, aes(x = varkoorddim1, y = varkoorddim2)) +
   geom_point(size = 2, alpha = 0.2, color = "grey60") + 
   geom_text(aes(label = vaartused, color = tunnused, alpha = contrib, size = cos2), 
             vjust = -0.3, fontface = "bold") +
   geom_hline(yintercept = 0, color = "grey60", linetype = "dashed") + 
   geom_vline(xintercept = 0, color = "grey60", linetype = "dashed") +
   scale_color_brewer(type = "qual", palette = 3, name = "Tunnus") +
   scale_alpha_continuous(range = c(0.3,1), name = "Panus") +
   scale_size_continuous(name = "Esindatus") +
   theme_minimal() + 
   theme(plot.title = element_text(hjust = 0.5), 
         text = element_text(color = "grey30"), 
         panel.border = element_rect(color = "grey60", fill = "transparent"),
         legend.text = element_text(size = 6),
         legend.key.size = unit(0.2, "cm"),
         legend.title = element_text(size = 8)) +
   coord_fixed(xlim = c(-1.5, 2), ylim = c(-1.5, 3)) +
   labs(title = "Mitmese korrespondentsanalüüsi graafik", 
        x = paste("Dim 1 (", round(mca2$eig[1,2],2), "%)", sep = ""), 
        y = paste("Dim 2 (", round(mca2$eig[2,2],2), "%)", sep = "")))

# Teeme eraldi tabeli individuaalsete vaatluste koordinaatide ja pöördelõpu tunnusega,
# selleks et kuvada vaatluste andmepunktid, mis oleks grupeeritud tunuse `Lopp` järgi
ind <- data.frame(mca4$ind$coord[,c("Dim 1", "Dim 2")], Lopp = mca_sisend2[,"Lopp"]) 
head(ind)
##        Dim.1       Dim.2 Lopp
## 1 -0.5723738 -0.31891776  jah
## 2 -0.3364736  0.15436900  jah
## 3 -0.5270223 -0.08890808  jah
## 4 -0.5377958 -0.20901618  jah
## 5 -0.5377958 -0.20901618  jah
## 6 -0.5377958 -0.20901618  jah


# Lisame graafikule uue kihi, milles kasutame äsja loodud vaatluste tabelit
# ning kuvame vaatluste gruppe erinevate kujundite abil.
# Lisame ka ellipsid, mis näitavad sisuliselt usaldusvahemikke ehk piirkondi
# koordinaatsüsteemis, kud kummagi `Lopp` väärtused kõige tõenäolisemalt paiknevad
(p1 <- baas + 
    geom_point(data = ind, aes(x = Dim.1, y = Dim.2, shape = Lopp), 
               color = "grey80") + 
    scale_shape_manual(values = c(0,2)) + 
    stat_ellipse(data = ind, aes(x = Dim.1, y = Dim.2, group = Lopp), 
                 type = "norm", color = "grey80"))

# Teeme andmetabeli, kus on täiendava tunnuse väärtuste koordinaadid
qualisup <- as.data.frame(mca4$quali.sup$coord[,c("Dim 1", "Dim 2")])
head(qualisup)
##               Dim 1      Dim 2
## Pron_ei  -0.2144966 -0.2149761
## Pron_jah  0.1868578  0.1872755

# Lisame graafikule täiendava kvalitatiivse tunnuse sildid
(p2 <- p1 + 
    geom_label(data = qualisup, aes(x = qualisup[, "Dim 1"], y = qualisup[, "Dim 2"], 
                                    label = rownames(qualisup)), 
               color = "grey50", fontface = "bold", alpha = 0.3))

Ennustamine eksploratiivse meetodiga?

Ehkki eksploratiivsed meetodid on mõeldud ennekõike andmete uurimiseks ning varieerumismustrite tuvastamiseks, saame mitmeses korrespondentsanalüüsis tekkinud kahedimensioonilise ruumi koordinaatide kaudu ennustada ka mingi tunnuse esinemist, kuna meil on kasutada ka individuaalsete vaatluste andmed.

# 1. dimensiooni vaatluste koordinaadid
dim1 <- mca4$ind$coord[, "Dim 1"]
# 2. dimensiooni vaatluste koordinaadid
dim2 <- mca4$ind$coord[, "Dim 2"]

library(rms)
# logistilise regressiooni mudel, milles Pronoomeni esinemist andmestikus 
# ennustatakse MCA mudeli koordinaatide kaudu.
m <- lrm(mca_sisend2$Pron ~ dim1 + dim2) 
m
## Logistic Regression Model
##  
##  lrm(formula = mca_sisend2$Pron ~ dim1 + dim2)
##  
##                        Model Likelihood     Discrimination    Rank Discrim.    
##                           Ratio Test           Indexes           Indexes       
##  Obs          4066    LR chi2     340.08    R2       0.107    C       0.657    
##   ei          1893    d.f.             2    g        0.694    Dxy     0.314    
##   jah         2173    Pr(> chi2) <0.0001    gr       2.001    gamma   0.326    
##  max |deriv| 4e-11                          gp       0.161    tau-a   0.156    
##                                             Brier    0.229                     
##  
##            Coef   S.E.   Wald Z Pr(>|Z|)
##  Intercept 0.1543 0.0329  4.70  <0.0001 
##  dim1      0.7008 0.0546 12.83  <0.0001 
##  dim2      0.8780 0.0696 12.62  <0.0001 
## 

Mida suurem on koordinaat x-teljel (1. dimensioonis) ja mida suurem on koordinaat y-teljel (2. dimensioonis), seda suuremad on pronoomeni esinemise šansid. Konkreetsete seletavate tunnuste asemel kasutame seega ära andmete vähendatud dimensioone, mis esindavad juba teatud kontekste.

Võiksime muidugi kasutada ennustamisel ära kõikide dimensioonide koordinaate, ehkki sellisel juhul ei ole enam graafikuga võrdlemine võimalik.

rms::lrm(mca_sisend2$Pron ~ mca4$ind$coord)
## Logistic Regression Model
##  
##  rms::lrm(formula = mca_sisend2$Pron ~ mca4$ind$coord)
##  
##                        Model Likelihood     Discrimination    Rank Discrim.    
##                           Ratio Test           Indexes           Indexes       
##  Obs          4066    LR chi2     645.82    R2       0.196    C       0.719    
##   ei          1893    d.f.            11    g        1.013    Dxy     0.438    
##   jah         2173    Pr(> chi2) <0.0001    gr       2.755    gamma   0.454    
##  max |deriv| 6e-12                          gp       0.219    tau-a   0.218    
##                                             Brier    0.212                     
##  
##            Coef    S.E.   Wald Z Pr(>|Z|)
##  Intercept  0.1952 0.0347  5.63  <0.0001 
##  Dim 1      0.7703 0.0571 13.49  <0.0001 
##  Dim 2      0.9403 0.0711 13.22  <0.0001 
##  Dim 3      0.8033 0.0788 10.19  <0.0001 
##  Dim 4      0.2445 0.0792  3.09  0.0020  
##  Dim 5     -0.4133 0.0774 -5.34  <0.0001 
##  Dim 6      0.1322 0.0759  1.74  0.0816  
##  Dim 7     -0.4664 0.0789 -5.91  <0.0001 
##  Dim 8      0.4140 0.0843  4.91  <0.0001 
##  Dim 9      0.1214 0.0826  1.47  0.1418  
##  Dim 10    -0.1538 0.0903 -1.70  0.0885  
##  Dim 11     1.7745 0.1841  9.64  <0.0001 
## 

Kordamisküsimused

1. Mis on juhendamata masinõpe?

  1. Masinõppe liik, kus mudeleid kasutatakse andmestikus esinevate mustrite ja struktuuride tuvastamiseks.
  2. Masinõppe liik, kus mudelite abil ennustatakse uurijat huvitava tunnuse väärtusi.
  3. Masinõppe liik, kus uuritavaid tunnuseid on mitu ja mudel leiab ise need seletavad tunnused, mis mingi uuritava tunnuse väärtuseid kõige paremini ennustavad.

2. Mis on korrespondentsanalüüsi dimensioonid?

  1. Graafiku mõõtmed.
  2. Kõige olulisemad andmestiku tunnused ja nende väärtused.
  3. Varjatud, latentsed tegurid, mis juhivad ja seletavad andmetes leiduvaid struktuure.
  4. Varjatud koordinaadid, mille põhjal tunnuseid graafikule paigutatakse.

3. Mida näitab korrespondentsanalüüsis panus (contribution)?

  1. Seda, kui hästi mingi dimensioon tunnuse väärtust esindab.
  2. Seda, kui tugevalt mingi tunnus tervikuna dimensiooniga seotud on.
  3. Seda, kui palju mingi tunnus panustab dimensiooni varjatud olemuse kirjeldamisse.

4. Milleks kasutatakse korrespondentsanalüüsis asümmeetrilisi graafikuid?

  1. Selleks, et tõlgendada kas ainult ridade või ainult tulpade vahelisi kaugusi.
  2. Selleks, et paigutada ridade ja tulpade väärtusi graafikule asümmeetrilisemalt.
  3. Selleks, et vähendada veelgi dimensionaalsust.
  4. Selleks, et tõlgendada ridade ja tulpade vahelisi kaugusi.

5. Mille poolest erineb mitmene korrespondentsanalüüs lihtsast korrespondentsanalüüsist?

  1. Sisendiks sobib ka tavaline andmetabel, kus ridades on vaatlused ja tulpades tunnused.
  2. On ebatäpsem.
  3. Võimaldab kaasata analüüsi ka tunnuseid, millel on ainult 2 taset.
  4. Annab infot ka individuaalsete vaatluste kohta.
  5. Tunnustevaheliste kauguste otsene tõlgendamine graafikul on keerulisem.

6. Milleks kasutada mitmeses korrespondentsanalüüsis täiendavaid tunnuseid (supplementary variable)?

  1. Need võivad hõlbustada tõlgendamist.
  2. Need on uuritavad tunnused.
  3. Need võimaldavad vaatlusi grupeerida.

Järgmisel korral

  • Klasteranalüüs