Rozdział 6 Analiza korespondencji (odpowiedniości)
6.1 Problem
Obserwujemy dwie zmienne jakościowe. Pierwsza zmienna przyjmuje wartości z \(n_1\) poziomów, druga z \(n_2\) poziomów.
Interesuje nas, czy zmienne te są od siebie niezależne, a jeżeli nie są niezależne to które kombinacje poziomów występują ze sobą znacznie częściej. Dane z którymi mamy do czynienia to macierz kontyngencji (tabela wielodziel- cza) o wymiarach k × l wyznaczona dla dwóch zmiennych o odpowiednio \(k\) i \(l\) poziomach. Jeżeli \(k\) i \(l\) są małe, to taką macierz można ogarnąć rzutem oka. Jednak dla zmiennych występujących na wielu poziomach potrzebne są już dodatkowe narzędzia.
6.2 Rozwiązanie
Aby ocenić niezależność dwóch zmiennych można wykorzystać test \(\chi^2\) z funkcji
chisq.test()
lub inny test dla macierzy kontyngencji (jeżeli poziomy są uporządkowane to dobrym rozwiązaniem będzie test Cochrana-Armitage). Testem tym zweryfikujemy hipotezę o niezależności częstości występowań poszczególnych zmiennych.
Jeżeli jednak odrzucimy tę hipotezę zerową, czyli przyjmiemy że jest JAKAŚ
zależność, to naturalnym pytaniem będzie jaka to zależność i pomiędzy którymi
poziomami.
Aby ocenić, które zmienne występują częściej ze sobą można wykonuje się tzw.
analizę korespondencji. Jeżeli zmienne były by niezależne od siebie, to zachodziło
by równanie
\[
p_{ij}=p_{i\cdot}p_{\cdot j},\quad i\in \{1\dots k\},\quad j\in \{1\dots l\}.
\]
gdzie \(p_{ij}\) to prawdopodobieństwo zaobserwowania pierwszej zmiennej na poziomie
\(i\) i jednocześnie drugiej na poziomie \(j\), \(p_{i\cdot}\) to prawdopodobieństwo zaobserwowania zmiennej pierwszej na poziomie \(i\) a \(p_{\cdot j}\) to prawdopodobieństwo zaobserwowania zmiennej drugiej na poziomie \(j\).
Żeby ocenić, które zmienne występują częściej lub rzadziej niż wynikało by to z niezależności, wyznaczymy standaryzowane reszty Pearsonowskie, zastąpimy też prawdopodobieństwa ich częstościowymi ocenami (czyli \(\hat{p}\) to liczba obserwowanych zdarzeń podzielona przez liczbę wszystkich obserwowanych zdarzeń) \[ \hat{e}_{ij}=\frac{\hat{p}_{ij}-\hat{p}_{i\cdot}\hat{p}_{\cdot j}}{\hat{p}_{i\cdot}\hat{p}_{\cdot j}} \] Duże dodatnie wartości \(\hat{e}_{ij}\) odpowiadają wysokiemu współwystępowaniu, ujemne \(E=[\hat{e}_{ij}]\) przedstawić w postaci graficznej używając tzw. biplotu. Innymi słowy wyznaczamy dekompozycję SVD macierzy E wartości odpowiadają występowaniu rzadszemu niż losowe. Możemy teraz macierz \[ E_{k\times l}=U_{k\times k}\sum_{k\times k}V_{l \times l}^{T} \]
Kolumny macierzy \(U_{k \times k}\) to wektory własne macierzy \(E^T E\) a kolumny macierzy \(V\) to wektory własne macierzy \(EE^T\). Na przekątnej macierzy diagonalnej \(\sigma\) znajdują się tzw. wartości singularne (osobliwe?) równe pierwiastkom z wartości własnych macierzy \(E^TE\) i EE^T . “Przy okazji”" kolumny macierzy \(U\) rozpinają ortonormalną bazę na kolumnach macierzy \(E\) a kolumny macierzy \(V\) rozpinają ortonormlaną bazę na wierszach macierzy \(E\). Można więc przedstawić macierz \(E\) (lub możliwie dużo informacji z tej macierzy) we nowej przestrzeni określonej na bazie współrzędnych wierszy i kolumn macierzy \(E\).
6.3 Jak to zrobić w R?
Przedstawimy funkcje ca(ca)
oraz corresp(MASS)
. Obie służą do wykonania analizy
korespondencji. Wykonują ją jednak w odrobinę odmienny sposób przez co wyniki
końcowe też są inne.
6.4 Studium przypadku
Przedstawmy przykład bazujący na danych o zatrudnieniu w poszczególnych województwach. Zmienne które chcemy porównać to Województwo (16 poziomów) i Sektor pracy (4 poziomy: rolnictwo, przemysł, usługi, bezrobotni). Podejrzewamy, że struktura zatrudnienia różni się pomiędzy województwami.
library("MASS")
library("ca")
library("RColorBrewer")
# przygotujmy wektor kolorow
kolory = rev(brewer.pal(11,"Spectral"))
# wybierzmy interesujące nas kolumny
# konwertujemy tabele na macierz, takiego formatu spodziewa się funkcja heatmap()
dane = as.matrix(daneGUS[,c(22:25)])
colSums(dane)
## pracujacy.rolnictwo pracujacy.przemysl pracujacy.uslugi
## 2249 4680 8309
## bezrobotni
## 743
rowSums(dane)
## DOLNOSLASKIE KUJAWSKO-POMORSKIE LODZKIE
## 1218 791 1304
## LUBELSKIE LUBUSKIE MALOPOLSKIE
## 1018 451 1336
## MAZOWIECKIE OPOLSKIE PODKARPACKIE
## 2373 379 852
## PODLASKIE POMORSKIE SLASKIE
## 478 792 1845
## SWIETOKRZYSKIE WARMINSKO-MAZURSKIE WIELKOPOLSKIE
## 622 573 1371
## ZACHODNIOPOMORSKIE
## 578
# jak wygląda macierz z danymi?
head(dane)
## pracujacy.rolnictwo pracujacy.przemysl pracujacy.uslugi
## DOLNOSLASKIE 74 415 651
## KUJAWSKO-POMORSKIE 128 245 369
## LODZKIE 220 384 636
## LUBELSKIE 328 197 447
## LUBUSKIE 43 151 244
## MALOPOLSKIE 205 381 689
## bezrobotni
## DOLNOSLASKIE 78
## KUJAWSKO-POMORSKIE 49
## LODZKIE 64
## LUBELSKIE 46
## LUBUSKIE 13
## MALOPOLSKIE 61
Macierz 64 liczb jest trudno ogarnąć nieuzborojonym okiem. Możemy zauważyć, że biorąc pod uwagę, że najwięcej ludzi pracuje w sektorze usługowym (\(8309\) tys.) również łatwo zauważyć, że najludniejsze jest województwo Mazowieckie (\(2 373\) tys.) ale z tych surowych danych ciężko wyciągnąć głębszy wniosek.
# tę macierz można przedstawić w postaci graficznej
# czerwony odpowiada dużym liczbom, niebieski małym
heatmap(dane,scale="col",Colv=NA, col= kolory)
# zobaczmy czy sa zaleznosci pomiedzy kolumnami i wierszami, wygląda na to że nie są to niezależne cechy
chisq.test(dane)
##
## Pearson's Chi-squared test
##
## data: dane
## X-squared = 1031.9, df = 45, p-value < 2.2e-16
Wykonaliśmy test \(\chi^2\) i otrzymaliśmy bardzo małą p-wartość, która upewniła nas w przekonaniu, że województwa mają inną strukturę zatrudnienia.
# zobaczmy które kombinacje występują częściej niż w przypadku niezależności
# policzymy residua Pearsonowskie
P = dane/sum(dane)
# macierz czestosci oczekiwanych
PP = outer(rowSums(P),colSums(P))
# macierz residuow Pearsonowskich
E = (P-PP)/sqrt(PP)
head(E)
## pracujacy.rolnictwo pracujacy.przemysl pracujacy.uslugi
## DOLNOSLASKIE -0.058854443 0.024423457 0.005571820
## KUJAWSKO-POMORSKIE 0.012508000 0.006942431 -0.016485942
## LODZKIE 0.021307056 0.000860813 -0.012756112
## LUBELSKIE 0.122091621 -0.046327197 -0.028293827
## LUBUSKIE -0.020324264 0.013026864 0.004913504
## MALOPOLSKIE 0.009798815 -0.004097028 -0.001688693
## bezrobotni
## DOLNOSLASKIE 0.022465943
## KUJAWSKO-POMORSKIE 0.015945574
## LODZKIE 0.003427270
## LUBELSKIE -0.001528783
## LUBUSKIE -0.013765063
## MALOPOLSKIE -0.001118379
# tę macierz również można przedstawić za pomocą mapy ciepła
heatmap(E,scale="none",Colv=NA,col= kolory)
Wyznaczyliśmy macierz reszt Pearsonowskich \(E\) (którą też przedstawiliśmy graficznie z użyciem mapy ciepła) i z tej macierzy możemy już odczytać w których województwach poszczególne sektory są popularniejsze. Największe reszty obserwujemy dla sektora rolnictwa, zarówno duże dodatnie wartości (w województwie lubelskim, podlaskim, podkarpackim i świętokrzyskim) jak i duże (co do modułu) ujemne wartości (w województwie śląskim i dolnośląskim). Możemy teraz przedstawić graficznie macierz \(E\) z użyciem biplotu (z wykorzystaniem dekompozycji SVD).
# wykonujemy dekompozycje na wartosci osobliwe (singularne/szczegolne)
A = svd(E)
X = t(apply(A$u, 1, "*", sqrt(A$d)))
Y = t(apply(A$v, 1, "*", sqrt(A$d)))
# zwykle współrzędne liczone są ze wzorow, w ktorych A jest dekompozycja innej macierzy
# [TODO: uzupełnić albo pominąć]
# A = Dr^(-1/2) A$u A$d
# B = Dc^(-1/2) A$v a$d
plot(rbind(X[,1:2], Y[,1:2]), xlab="", ylab="", main="Bramka nr. 1", lwd
=3)
# analiza korespondencji z użyciem pakietu MASS
biplot(MASS::corresp(dane, nf = 2))
# analiza korespondencji z użyciem pakietu ca
# argument mass powoduje że liczebności komórek odpowiadają wielkościom punktów na wykresie
plot(ca::ca(dane), mass=c(T,T))
summary(ca::ca(dane))
##
## Principal inertias (eigenvalues):
##
## dim value % cum% scree plot
## 1 0.054859 85.0 85.0 *********************
## 2 0.007352 11.4 96.3 ***
## 3 0.002360 3.7 100.0 *
## -------- -----
## Total: 0.064571 100.0
##
##
## Rows:
## name mass qlt inr k=1 cor ctr k=2 cor ctr
## 1 | DOLN | 76 918 71 | -225 837 70 | -70 81 51 |
## 2 | KUJA | 49 848 11 | 65 286 4 | -91 563 56 |
## 3 | LODZ | 82 1000 10 | 80 838 10 | -35 162 14 |
## 4 | LUBE | 64 1000 277 | 527 990 322 | 53 10 24 |
## 5 | LUBU | 28 723 12 | -142 719 10 | -11 4 0 |
## 6 | MALO | 84 995 2 | 37 960 2 | 7 34 1 |
## 7 | MAZO | 148 1000 88 | -95 238 25 | 171 762 587 |
## 8 | OPOL | 24 496 3 | -5 2 0 | -68 494 15 |
## 9 | PODK | 53 926 78 | 296 925 85 | -12 2 1 |
## 10 | PODL | 30 994 56 | 342 974 64 | 49 20 10 |
## 11 | POMO | 50 939 24 | -171 919 26 | 25 20 4 |
## 12 | SLAS | 115 995 187 | -319 970 214 | -52 25 42 |
## 13 | SWIE | 39 968 128 | 443 926 139 | -94 41 47 |
## 14 | WARM | 36 515 4 | -42 246 1 | -44 269 10 |
## 15 | WIEL | 86 808 15 | -1 0 0 | -97 808 109 |
## 16 | ZACH | 36 806 33 | -203 702 27 | 78 103 30 |
##
## Columns:
## name mass qlt inr k=1 cor ctr k=2 cor ctr
## 1 | prcjcyr | 141 999 720 | 574 999 847 | -4 0 0 |
## 2 | prcjcyp | 293 967 128 | -120 509 77 | -114 458 514 |
## 3 | prcjcys | 520 1000 111 | -90 587 77 | 75 413 402 |
## 4 | bzrb | 46 236 42 | 21 7 0 | -115 228 83 |
Przy opisie analizy korespondencji często wymienianym czynnikiem jest inercja, nazywana czasem bezwładnością (przez podobieństwo do inercji w fizyce). Aby opisać formalnie czym jest ta miara musimy zacząć od kilku innych pojęć.
Niech masa wiersza i masa kolumny będzie określona jako brzegowe częstości macierzy kontyngencji.
(masa.kolumny = colSums(prop.table(dane)))
## pracujacy.rolnictwo pracujacy.przemysl pracujacy.uslugi
## 0.14072962 0.29284776 0.51992992
## bezrobotni
## 0.04649271
(masa.wiersza = rowSums(prop.table(dane)))
## DOLNOSLASKIE KUJAWSKO-POMORSKIE LODZKIE
## 0.07621551 0.04949628 0.08159690
## LUBELSKIE LUBUSKIE MALOPOLSKIE
## 0.06370064 0.02822101 0.08359927
## MAZOWIECKIE OPOLSKIE PODKARPACKIE
## 0.14848883 0.02371566 0.05331331
## PODLASKIE POMORSKIE SLASKIE
## 0.02991052 0.04955885 0.11544960
## SWIETOKRZYSKIE WARMINSKO-MAZURSKIE WIELKOPOLSKIE
## 0.03892122 0.03585508 0.08578937
## ZACHODNIOPOMORSKIE
## 0.03616795
Profilem wiersza (kolumny) będą wartości w wierszu (kolumnie) unormowane przez masę kolumny (wiersza).
head(profil.kolumny <- dane/rowSums(dane))
## pracujacy.rolnictwo pracujacy.przemysl pracujacy.uslugi
## DOLNOSLASKIE 0.06075534 0.3407225 0.5344828
## KUJAWSKO-POMORSKIE 0.16182048 0.3097345 0.4664981
## LODZKIE 0.16871166 0.2944785 0.4877301
## LUBELSKIE 0.32220039 0.1935167 0.4390963
## LUBUSKIE 0.09534368 0.3348115 0.5410200
## MALOPOLSKIE 0.15344311 0.2851796 0.5157186
## bezrobotni
## DOLNOSLASKIE 0.06403941
## KUJAWSKO-POMORSKIE 0.06194690
## LODZKIE 0.04907975
## LUBELSKIE 0.04518664
## LUBUSKIE 0.02882483
## MALOPOLSKIE 0.04565868
Tak unormowane profile wierszy i kolumn mogą być ze sobą porównywane. Im większa odległość pomiędzy profilami kolumn tym mniejsza zależność pomiędzy czynnikami opisanymi w tych kolumnach (oczywiście dla wierszy jest tak samo). Średni profil kolumnowy to masa wiersza a średni profil wierszowy to masa kolumn.
Inercja to odległość (w mierze \(\chi^2\) ) pomiędzy daną kolumną (wierszem, punktem) a średnią wartością dla kolumn (wierszy). Całkowita inercja to suma odległości dla wszystkich kolumn (wierszy). Im większa inercja tym punkty są oddalone dalej od średniego profilu wiersza/kolumny.
[TODO: uzupełnić. nawiązać do wyników funkcji summary.ca()]
Wyniki powyższych instrukcji oglądać można na wykresie 6.1 i kolejnych.
Analizując ten wykres można zauważyć ciekawe zróżnicowanie województw. Na
osi X największą współrzędną ma zmienna pr.rolnictwo
, a więc to ta zmienna odpowiada największemu zróżnicowaniu województw. Wysoki wartości na tej osi osiągają województwa gdzie zatrudnienie w rolnictwie było wyższe niż średnie. Druga
oś rozróżnia województwa w których dominuje zatrudnienie w sektorze usług (dodatnie wartości) versus zatrudnieniu w przemyśle lub braku zatrudnienia (niestety
profil zatrudnienia w przemyśle i braku zatrudnienia jest podobny).
Osoby w województwach Mazowieckim i Zachodniopomorskim częściej pracują w sektorze usług, w województwach Lubelskim, Podlaskim, Świętokrzyskim i Podkarpackim dominuje zatrudnienie w sektorze rolniczym, w województwach Śląskim i Dolnośląskim dominuje zatrudnienie w przemyśle te województwa mają też większe problemy z bezrobociem.
[TODO: opisać podobieństwa i różnice do PCA]