Stats & AI tech blog - '일단 시도함'

[ML/DL] MCA, Multiple Correspondence Analysis (다중 대응 분석) 본문

Statistics & AI/Dimension Reduction

[ML/DL] MCA, Multiple Correspondence Analysis (다중 대응 분석)

justdoit ok? 2023. 12. 27. 16:38

1. 다중대응분석(MCA)이란? 

다변량 범주형 자료의 탐색적 분석에 이용되는 차원 축소 기법이다.

대응분석(CA)의 확장이며, 범주형 데이터에 대한 주성분분석(PCA)으로 이해할 수 있다.

 

연속형 자료의 차원 축소 기법인 PCA에서는 공분산을 통해 변수 간의 관계성 파악한다. 관계가 밀접한 변수들의 선형조합으로 정보량이 많은 변수(주성분)를 추출한다.

 

범주형 자료에서는 공분산을 사용할 수 없기 때문에 범주형 변수의 관계성 지표인 카이제곱 검정통계량을 사용한다. 두 변수의 관계가 밀접할 수록 카이제곱 검정통계량은 커지게 된다.

 

변수 간 카이제곱 검정통계량으로 만든 행렬을 분해(Decomposition)하여 요인을 찾아내는 것이 대응분석(CA)이고, CA를 여러 변수로 확장한 것이 다중대응분석(MCA)이다.

 

 

 

2. 다중대응분석(MCA) 예제

  • 사용데이터
    아래와 같이 group, 연령 그룹, 성별, 기타 범주형 요인(x1-x5)으로 구성된 데이터에서,
    변수들의 관계성 (카이제곱 검정통계량)을 통해서 차원을 축소하고자 한다.

 

  • MCA
    FactoMineR 패키지의 MCA 함수를 통해 다중 대응 분석을 수행할 수 있다. 
library(FactoMineR)
mca1 <- MCA(data_mca[,-1], graph = F)
mca1$eig
mca1$var$coord
mca1$var$cos2 
mca1$var$contrib

 

 - $eig : 고유값과 설명가능한 분산의 비율 확인

 - $var$coord : 각 dimension에 대한 좌표값 확인 

 - $var$cos2 : squared cosine으로 변수에 대해 중요한 요인이 무엇인지 확인

 - $var$contrib : 기여도로 요인에게 중요한 변수가 무엇인지 확인

> mca1$eig
       eigenvalue percentage of variance cumulative percentage of variance
dim 1  0.36064426             19.4193063                          19.41931
dim 2  0.26660717             14.3557705                          33.77508
dim 3  0.22485914             12.1077999                          45.88288
dim 4  0.17356612              9.3458678                          55.22874
dim 5  0.15918114              8.5712920                          63.80004
dim 6  0.14227990              7.6612257                          71.46126
dim 7  0.13955353              7.5144211                          78.97568
dim 8  0.12741915              6.8610311                          85.83671
dim 9  0.09808896              5.2817134                          91.11843
dim 10 0.06461860              3.4794630                          94.59789
dim 11 0.04933498              2.6564991                          97.25439
dim 12 0.03278146              1.7651553                          99.01955
dim 13 0.01820845              0.9804549                         100.00000

 

dimension 5에서 총 분산의 63% 정도를 설명 가능하다는 것을 확인할 수 있다.

dimentsion 8에서는 총 분산의 85%가 설명 가능하다. input으로 사용된 변수가 8개였는데, 이 데이터에서 MCA로 차원을 축소하는 방법이 적절하지 않은 것 같다.

 

> mca1$var$contrib
                 Dim 1       Dim 2        Dim 3       Dim 4      Dim 5
age_group_1  5.0453438  0.40449745  0.315418099  3.12015213  4.5463645
age_group_2  5.4334472  0.43561264  0.339681029  3.36016383  4.8960848
gender_0     0.3062260  2.03821303  0.353893094  6.26522528  2.7533740
gender_1     0.6387000  4.25113003  0.738119882 13.06746986  5.7427515
x1_0         0.8125702  9.44945273 17.460120023  0.34338746  2.8616954
x1_1         8.3639689 23.51532166  0.550228216  6.01736402  0.4864590
x1_3         9.9690032  0.08845190  2.232542875  7.66103827  2.8388495
x1_4         2.5699990 12.33490690 26.522919126  4.79278233  0.4413438
x2_1         0.6070828 10.17837361 20.056710195  2.20940983  3.6472206
x2_2         4.8982310 16.04467715  0.082089314 13.79043240  1.1538547
x2_3         3.6469328  6.51039125  0.391343457  1.91955335 11.5780286
x2_4         3.9613490  0.06583345  0.009431773  6.64436611 17.4507697
x2_5         5.0865992  0.28094290  2.837667456  3.17625893  3.5070171
x2_6         2.9763919 12.87997450 26.267502773  0.88827023  0.1965182
x3_1         1.7649060  0.72613023  0.660410243  0.05238838 23.3071097
x3_2         0.4775628  0.19648230  0.178699242  0.01417568  6.3066297
x4_0         5.1285626  0.05990670  0.256291731  4.07826629  1.9618790
x4_1        12.4550807  0.14548771  0.622422775  9.90436100  4.7645632
x5_0        14.2458663  0.21718264  0.068595069  6.99396861  0.8591618
x5_1        11.6121767  0.17703123  0.055913628  5.70096601  0.7003251

 

각 dimension에 기여한 변수의 기여도를 확인할 수 있다.

Dim1에서는 x4, x5 변수가, Dim 2에서는 x1의 기여도가 높게 나타난다.

 

  • Visualization

 - Scree plot : 설명가능한 분산을 막대그래프로 확인하고 요인의 수를 결정하는데 사용한다.

library(factoextra)
# scree plot
fviz_screeplot(mca1, addlabels = T)

 

 

- Biplot : 산점도 확인, 파란점은 rows(individuals)을 나타내고 빨간점은 columns(variable categories)를 나타낸다.

library(factoextra)
# biplot
fviz_mca_biplot(mca1, repel = TRUE, ggtheme = theme_minimal())