38.차원분석 - 요인분석(FA).Rmd
0.03MB
38.차원분석---요인분석-FA-.html
2.42MB
37.통계데이터분석 - 차원분석 - 요인분석(FA)
2022-11-27
https://www.youtube.com/watch?v=QBg9R0uIBKY&list=PLY0OaF78qqGAxKX91WuRigHpwBU0C2SB_&index=38
목표: 요인분석 이해
\(PC_1 = a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + a_{14}x_4 + a_{15}x_5\)
1. 요인분석 개요
- 요인분석 개요
- 요인분석은 관측 가능한 여러 변수로부터 소수의 요인을 추출하여 이 요인들로 통해 변수 간 관련성을 설명하려는 통계 데이터 분석기법임
- 제품에 대한 소비자 평가를 위한 다수의 제품 평가 설문항목을 만들어 소비자로부터 데이터를 수집한 후 그 데이터를 바탕으로 다수의 항목을 소수의 요인으로 축약해서 나타낼 수 있음
- 이 경우, 20개 제품평가 항목을 품질·비스·가치 등과 같은 3가지 잠재요인의 함수로 표현가능
- 요인분석은 관측 가능한 여러 변수로부터 소수의 요인을 추출하여 이 요인들로 통해 변수 간 관련성을 설명하려는 통계 데이터 분석기법임
- 요인분석 산출값
- 요인분석은 여러 관측변수로부터 직접적으로 관측이 불가한 공통의 요인 추출에 이용됨
- 요인분석을 수행하면 요인과 변수 간의 관계를 보여주는 요인적재값이 산출됨
- 또한 변수들의 선형결합으로 산출되는 요인점수도 구할 수 있음
- 주성분분석 - 요인분석 비교
- 요인적재값과 요인점수는 각각 주성분분석에서의 성분적재값과 성분점수에 대응 됨
- 이런 점에서 요인분석은 그 결과만 보면 주성분분석과 유사함
- 하지만 주성분분석과 달리 요인분석은 측정가능한 변수들로부터 그 안에 잠재되어 있는 해석 가능한 소수의 요인을 찾는 것을 주요 목적으로 함
- 이를 위해 요인과 변수 간의 관계가 명확히 드러나도록 요인의 축을 회전시키는 방법을 사용함
- 요인의 축을 회전시키면
- 각 요인은 몇몇 변수와의 요인적재값이 커지는 반면
- 다른 변수와의 요인적재값은 작아지게 됨
- 그렇게 되면 요인적재값이 큰 변수들로
- 각 요인을 의미있게 해석하는 것이 가능해지고
- 각 요인들은 서로 쉽게 구별될 수 있음
- 요인의 축을 회전시키면
2. 요인분석을 위한 개념적 모델
- 슬라이드 설명
- 여기서 F1과 F2는 우리가 찾고자 하는 잠재요인임
- \(x_1\) \(x_2\) \(x_3\) \(x_4\) \(x_5\) 는 실제 관측된 변수임
- 제품평가의 예에서 본다면 F1과 F2는 품질·서비스·가치 등에 해당 됨
- \(x_1\) \(\sim\) \(x_5\) 까지는 실제 제품 평가를 위해 사용한 설문항목에 해당 됨
- 요인 설명
- 요인 F1가 F2는 변수 \(x_1\) \(\sim\) \(x_5\) 기저에 내재돼 있는 것으로 가정함
- 따라서 잠재된 요인은 관측된 변수를 설명하는 것으로 가정함
- 위 그림에서도 요인은 변수에 영향을 미치는 것으로 화살표로 표시돼 있음
- 오차 설명
- \(U_1\) \(\sim\) \(U_5\)는 오차를 나타냄
- 이 오차들은 요인에 의해서 설명되지 않는 관측변수의 분산을 나타냄
- 요인과 오차 추정
- 관측변수를 제외한 요인과 오차는 직접 측정이 불가하여 변수 간 상관관계를 통해 간접 추정
- 여기서 요인 간의 곡선은 두 요인이 상관관계를 갖는다는 것을 나타냄
- 요인추출 방법에 따라 요인간의 상관관계를 그림처럼 허용할 수도 있고 그렇지 않을 수도 있음
- 요인과 변수와 오차 간 관계를 수식으로 표현
- 요인과 변수와 오차 간 관계는 아래와 같은 수식으로 표현 가능
- \(x_1 = b_{11} \,×\, F1 \,+\, b_{12} \,×\, F_2 \,+\, U_1\)
- 변수 \(x_1\)은 \(b_{11}\)과 \(b_{12}\) 2개의 가중치에 의해 두 요인의 선형결합으로 설명됨
- 두 요인의 의해서 설명되지 않는 부분은 오차항으로서 \(U_1\)으로 표현됨
- 이 수식에는 두가지 종류의 요인이 있음
-
- 공통요인: \(F_1\)과 \(F_2\)가 해당되고, 모든 변수는 이 두 요인의 함수로서 표현될 수 있음
-
- 고유요인: \(U_1\)으로 공통요인에서 설명될 수 없는 변수 고유의 성분과 오차를 나타냄
-
- 이 수식을 i번째 변수에 대해서 일반화한 수식은 아래와 같음
- 요인적재값
- 여기서 요인을 결합하기 위해 사용한 계수 \(b_{ik}\)를 요인적재값이라고 함
- 요인적재값은 각 요인에 할당된 가중치로써의 역할을 수행함
- 요인적재값
- \(x_i = b_{i1}F1 \,+\, b_{i2}F_2 \,+\, \dots \,+\, b_{ik}F_k \,+\, U_i\)
- 요인 산출
- 요인은 직접 측정이 불가하여 관측된 변수로부터 추론되며 변수들의 선형결합으로 추정됨
- 예) \(F_1\)요인은 5개 변수에 의해 이와 같이 표현될 수 있음
- \(F_1 = w_{11} \,×\, x_1 \,+\, w_{12} \,×\, x_2 \,+\, w_{13} \,×\, x_3 \,+\, w_{14} \,×\, x_4\,+\, w_{15} \,×\, x_5\)
- 5개 변수 모두가 F1요인 추정에 기여할 수 있음
- 하지만 요인의 특성이 명확히 드러가기 위해서는 해당 요인과 밀접한 관련을 갖는 일부 변수만이 높은 가중치를 갖는 것이 바람직함
- 이 수식을 j번째 요인에 대해서 일반화하면 아래와 같이 나타낼 수 있음
- \(F_j = w_{j1}x_1 \,+\, w_{j2}x_2 \,+\, \dots \,+\, w_{jp}x_p\)
- 요인점수 계수
- 여기서 변수들을 선형결합하기 위해 사용한 변수 \(w_{jp}\)는 요인점수 계수 라고 함
- 요인점수 산출
- 각 케이스에 대한 요인점수는 위 수식을 바탕으로 변수의 표준화값과 요인점수 계수로 계산됨
- 이렇게 산출된 요인점수는 다수의 변수를 소수의 요인으로 축약할 때 실제 관측값을 대신하여 각종 분석에 사용될 수 있음
3. 요인분석 수행절차
3-1. 데이터셋 설명
- ade4 패키지 olympic데이터셋 설명
- 올림픽 데이터셋에는 올림픽 육상 10종 경기에 참가한 33명 선수 기록이 리스트 형식으로 저장됨
- tab원소에는 10개 종목에 대한 선수별 기록이 데이터프레임 형식으로 저장돼 있음
- score원소에는 최종 점수가 벡터 형식으로 저장되어 있음
library(ade4)
data(olympic)
str(olympic)
## List of 2
## $ tab :'data.frame': 33 obs. of 10 variables:
## ..$ 100 : num [1:33] 11.2 10.9 11.2 10.6 11 ...
## ..$ long: num [1:33] 7.43 7.45 7.44 7.38 7.43 7.72 7.05 6.95 7.12 7.28 ...
## ..$ poid: num [1:33] 15.5 15 14.2 15 12.9 ...
## ..$ haut: num [1:33] 2.27 1.97 1.97 2.03 1.97 2.12 2.06 2 2.03 1.97 ...
## ..$ 400 : num [1:33] 48.9 47.7 48.3 49.1 47.4 ...
## ..$ 110 : num [1:33] 15.1 14.5 14.8 14.7 14.4 ...
## ..$ disq: num [1:33] 49.3 44.4 43.7 44.8 41.2 ...
## ..$ perc: num [1:33] 4.7 5.1 5.2 4.9 5.2 4.9 5.7 4.8 4.9 5.2 ...
## ..$ jave: num [1:33] 61.3 61.8 64.2 64 57.5 ...
## ..$ 1500: num [1:33] 269 273 263 285 257 ...
## $ score: num [1:33] 8488 8399 8328 8306 8286 ...
- tab원소에 포함된 10개 변수와 각 변수가 나타내는 종목은 데이터셋 도움말로 확인가능
?olympic
- 올림픽 데이터셋 도움말을 보면 10개 변수에 대한 설명이 포함돼 있음
- 100: 100m 경기 / long: 멀리뛰기 경기 / poid: 포환던지기 / haut: 높이뛰기
- 400: 400m 경기 / 110: 110m 장애물 경기 / disq: 원반 던지기 / perc: 장대 높이뛰기
- jave: 창던지기 / 1500: 1500m 경기
- 10개의 변수로부터 요인분석을 이용해서 요인을 추출할 것임
3-2. 요인 개수 결정
- 요인분석에서 우선 해야할 일은 추출할 요인의 개수를 결정하는 것임
- 가능한 많은 분산을 설명하는 최소한의 요인을 추출함 (요인분석 주요 목적이 데이터 복잡성을 줄이면서 해석 가능한 요인을 추출하는 것이기 때문)
- 몇가지 기준으로 요인개수를 결정할 수 있음
- #1 고유값 이용
- 가장 많이 사용하는 요인개수 결정 기준으로
- 여기서 고유값은 요인이 설명하는 분산의 양을 나타냄
- 고유값 기준에 의하면
- 1보다 큰 고유값을 갖는 요인의 개수만큼 추출함
- 1보다 작은 고유값을 갖는 요인은 원래의 개별변수가 갖고 있는 분산 1 보다도 작기 때문에 이를 새로운 변수로 추출하는 것은 의미가 없음
- 왜냐하면 새로 추출된 요인에 의해 설명되는 분산이 기존 변수 1개의 분산에도 못 미치기 때문임
- #2 스크리도표(scree plot) 이용
- 고유값과 대응되는 요인 간의 관계를 시각적으로 확인하여 이를 통해 요인개수 결정 가능
- 급격한 경사 이후 완만한 경사가 나타나는 굴절이 생기는 곳 주변에서 요인의 개수를 결정
- #3 시뮬레이션 이용
- 시뮬레이션을 통해 요인의 개수를 결정할 수도 있음
- 원래의 데이트셋과 동일한 표본크기를 갖는 무작위 데이터 행렬로부터 고유값을 추출하는 방식으로 시뮬레이션을 수행함하여 요인개수를 결정할 수 있음
- 실제 데이터로 계산한 고유값이 무작위 데이터 행렬을 반복 생성하여 계산한 고유값 평균보다 큰 지점에서 요인개수 결정
- #4 요인에 의해 설명되는 분산의 비율 이용
- 요인에 의해 설명되는 분산의 비율을 바탕으로 요인개수를 결정할 수도 있음
- 설명되는 누적분산비율과 그에 대응되는 요인개수를 검토해
- 가능한 작은 수의 요인으로,
- 될 수 있는 대로 많은 분산을 설명하는 적정 요인의 개수를 결정함
- 일반적으로 추출된 요인들이 총 분산의 60% 이상 설명할 수 있으면 적절하다고 얘기함
- 하지만 이 기준은 절대적인 것은 아니고 분석하는 문제의 성격에 따라 달라질 수 있음
- #1 고유값 이용
3-3. 요인 개수 결정 함수 - fa.parallel()
- fa.parallel()로 추출할 요인의 개수를 결정하기 위한 위의 방식을 동시에 비교 평가 가능
library(psych)
?fa.parallel
- fa.parallel() 인수설명
- 1st: 데이터 프레임이나 행렬 형식의 사용할 데이터셋을 지정
- fm: 요인추출 방법 지정. 아래 여러 사용가능한 요인추출 방식으로 지정 가능
- minres가 기본값으로 ml, uls, wls, gls, pa 사용가능
- 여기서는 비교적 사용빈도가 높은 ml(maximum likelihood, 최대우도법) 방식으로 요인추출
- fa: 요인분석을 위해서는 fa로 지정함
- n.iter: 시뮬레이션 횟수를 지정함. 여기서는 100으로 지정함
fa.parallel(olympic$tab, fm="ml", fa="fa", n.iter=100)
## Parallel analysis suggests that the number of factors = 2 and the number of components = NA
- 결과
- 스크리도표를 얻을 수 있음
- 실제 고유값을 바탕으로 한 스크리 테스트 결과는 실선으로 그려짐
- 그리고 가상의 무작위 데이터를 기반으로 계산한 고유값 평균은 점선으로 나타남
- 적정요인 개수 결정
- 고유값 이용
- 고유값 기준에 의하면 1보다 큰 고유값을 갖는 요인의 개수만큼 추출함
- 여기서는 2개의 요인이 1보다 큰 고유값을 갖고 있어 2개를 선택하는 것이 적절해 보임
- 스크리 도표 이용
- 스크리 도표 상 급격한 경사 이후 완만한 경사가 나타나는 굴절 주변에서 요인개수 결정
- 이 기준에 따르면 여기서는 3개 요인을 선택하는 것이 적절해 보임
- 시뮬레이션 이용
- 실제 데이터를 이용하여 계산한 고유값이 무작위 데이터 행렬을 반복 생성하여 계산한 고유값 평균보다 큰 지점에서 요인개수 결정 가능
- 이 기준에 따르면 여기서는 파란 실선이 빨간 점선 위쪽에 있는 부분에서 요인개수 결정 가능
- 따라서 2개 요인을 선택하는 것이 적절해 보임
- 따라서 위 기준들을 바탕으로 적정 요인의 개수를 결정하면 2~3개의 요인이 됨
- 고유값 이용
3-4. 요인 개수 결정 함수 - nScree()
- ntfs패키지 nScree()는 복수의 방법을 적용해 스크리테스트로 적정 요인개수를 추정함
- 여기서는 4가지 방법이 적정요인의 개수를 추정하는데 사용됨
library(nFactors)
nScree(olympic$tab)
## noc naf nparallel nkaiser
## 1 2 2 2 2
- 결과: 4방법 모두 2개 요인을 적정 요인개수로 추천하고 있음
3-5. 고유값 산출 함수 - eigen()
- eigen()로 상관계수 행렬로부터 직접 고유값을 구해 볼 수 있음
eigen(cor(olympic$tab))
## eigen() decomposition
## $values
## [1] 3.4182381 2.6063931 0.9432964 0.8780212 0.5566267 0.4912275 0.4305952
## [8] 0.3067981 0.2669494 0.1018542
##
## $vectors
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.4158823 0.1488081 0.26747198 0.08833244 -0.442314456 0.03071237
## [2,] -0.3940515 -0.1520815 0.16894945 0.24424963 0.368913901 -0.09378242
## [3,] -0.2691057 0.4835374 -0.09853273 0.10776276 -0.009754680 0.23002054
## [4,] -0.2122818 0.0278985 0.85498656 -0.38794393 -0.001876311 0.07454380
## [5,] 0.3558474 0.3521598 0.18949642 -0.08057457 0.146965351 -0.32692886
## [6,] 0.4334816 0.0695682 0.12616012 0.38229029 -0.088802794 0.21049130
## [7,] -0.1757923 0.5033347 -0.04609969 -0.02558404 0.019358607 0.61491241
## [8,] -0.3840821 0.1495820 -0.13687235 -0.14396548 -0.716743474 -0.34776037
## [9,] -0.1799436 0.3719570 0.19232803 0.60046566 0.095582043 -0.43744387
## [10,] 0.1701426 0.4209653 -0.22255233 -0.48564231 0.339772188 -0.30032419
## [,7] [,8] [,9] [,10]
## [1,] 0.2543985 0.663712826 -0.10839531 -0.10948045
## [2,] 0.7505343 0.141264141 0.04613910 -0.05580431
## [3,] -0.1106637 0.072505560 0.42247611 -0.65073655
## [4,] -0.1351242 -0.155435871 -0.10206505 -0.11941181
## [5,] 0.1413388 -0.146839303 0.65076229 0.33681395
## [6,] 0.2725296 -0.639003579 -0.20723854 -0.25971800
## [7,] 0.1439726 0.009400445 -0.16724055 0.53450315
## [8,] 0.2732665 -0.276873049 -0.01766443 0.06589572
## [9,] -0.3419099 0.058519366 -0.30619617 0.13093187
## [10,] 0.1868704 0.007310045 -0.45688227 -0.24311846
- 1보다 큰 고유값을 확인하여 요인의 개수를 결정함
- 여기서는 처음 2개의 고유값이 1보다 크기 때문에 두 개의 요인이 적정 요인개수로 선택될 수 있음. [1] 3.4182381 2.6063931
- 다양한 방법으로 적정 요인의 개수를 추정하였지만 최종 결정은 그러한 선택의 결과 추출한 요인들이 얼마나 분석에 유용한 지에 달려 있음
- 따라서 고유값, 스크리도표 시뮬레이션 방식 등에 따라 제안된 적정요인 개수 이외에 추가로 몇 개의 선택대안에 대한 요인분석을 수행 후 가장 의미있는 해석이 가능한 모델을 선택하는 것이 바람직함
3-5. 요인분석 수행 - factanal()
- 요인분석은 factanal()로 수행할 수 있음
- factanal()은 최대우도법에 의해 요인을 추출하고 요인적재값을 추정함
- factanal() 인수설명
- 1st인수: 요인분석에 사용할 데이터셋 지정
- factors: 추출할 요인의 개수를 지정함. 여기서는 2개의 요인을 추출함
- scores: 요인점수를 계산할 때 사용할 방법을 지정할 수 있음. “regression”과 “Bartlett” 두 가지 방법을 지정할 수 있음
- 아무것도 지정하지 않으면 기본값으로 none이 지정돼 요인점수를 계산 하지 않음. 여기서는 “regression”을 지정해 회귀분석 방법으로 요인점수 추정함
fa <- factanal(olympic$tab, factors=2, scores="regression" )
fa
##
## Call:
## factanal(x = olympic$tab, factors = 2, scores = "regression")
##
## Uniquenesses:
## 100 long poid haut 400 110 disq perc jave 1500
## 0.396 0.547 0.022 0.933 0.287 0.420 0.318 0.575 0.638 0.631
##
## Loadings:
## Factor1 Factor2
## 100 0.772
## long -0.672
## poid -0.155 0.977
## haut -0.241
## 400 0.814 0.226
## 110 0.739 -0.185
## disq 0.826
## perc -0.505 0.413
## jave 0.600
## 1500 0.488 0.362
##
## Factor1 Factor2
## SS loadings 2.834 2.401
## Proportion Var 0.283 0.240
## Cumulative Var 0.283 0.523
##
## Test of the hypothesis that 2 factors are sufficient.
## The chi square statistic is 19.12 on 26 degrees of freedom.
## The p-value is 0.831
- 결과
- Loadings이하의 숫자는 요인과 변수 간 관련성을 보여주는 요인적재값을 나타냄
- 요인적재값은 요인분석 객체 loadings원소 에서도 바로 출력 가능
fa$loadings
##
## Loadings:
## Factor1 Factor2
## 100 0.772
## long -0.672
## poid -0.155 0.977
## haut -0.241
## 400 0.814 0.226
## 110 0.739 -0.185
## disq 0.826
## perc -0.505 0.413
## jave 0.600
## 1500 0.488 0.362
##
## Factor1 Factor2
## SS loadings 2.834 2.401
## Proportion Var 0.283 0.240
## Cumulative Var 0.283 0.523
- 결과
- 숫자가 나오지 않는 부분이 있는데 이는 큰 요인적재값의 패턴이 보다 잘 드러나도록 하기 위해서 기본적으로 작은 요인적재값은 출력되지 않음
- 기본적으로 0.1보다 작은 값들은 출력되지 않음
- 모든 숫자를 다 출력하고 싶으면 print()로 출력할 최소 요인적재값 변경가능
- print() cutoff인수에 출력할 최소 요인적재값을 지정함
- 예를 들어 0.001 같이 작은 숫자 모든 숫자를 화면에 출력시킬 수 있음
print(fa$loadings, cutoff=0.001)
##
## Loadings:
## Factor1 Factor2
## 100 0.772 -0.089
## long -0.672 0.041
## poid -0.155 0.977
## haut -0.241 0.095
## 400 0.814 0.226
## 110 0.739 -0.185
## disq 0.007 0.826
## perc -0.505 0.413
## jave -0.049 0.600
## 1500 0.488 0.362
##
## Factor1 Factor2
## SS loadings 2.834 2.401
## Proportion Var 0.283 0.240
## Cumulative Var 0.283 0.523
3-6. 공통성
- 데이터셋에 포함된 이들 10개의 변수는 요인적재값을 가중치로 2개의 공통요인, 즉 Factor1과 Factor2의 선형결합으로 나타낼 수 있음
- 예) 첫 두 변수 100변수와 long변수는 Factor1과 Factor2로 아래와 같이 표현가능
- \(100 = 0.772×Factor1-(0.089)×Factor2+U_{100} \; \to \; 0.772^2+(-0.089)^2 = 0.604\)
- \(long = (-0.672)×Factor1+0.041×Factor2+U_{long} \; \to \; (-0.672)^2+0.041^2 = 0.453\)
- 공통성 측정방법 1)
- 추출된 두 요인이 각 변수를 얼마나 잘 설명하는지 평가하기 위해, 공통요인들에 의해 설명되는 각 변수의 분산비율을 파악함
- 요인적재값은 요인과 변수 간의 상관계수를 나타내기 때문에 각 요인으로 설명되는 분산비율 합은 이들 요인적재값의 제곱합으로 구함
- 100변수의 분산비율 설명
- 100 변수의 분산은 \(Factor1\)에 의해 \(0.772^2\)만큼 설명되고 \(Factor2\)에 의해 \(-0.089^2\)만큼 설명됨
- 이를 모두 합한 60.4%(0.604)는 \(Factor1\)과 \(Factor2\)에 의해 설명되는 100변수의 분산비율을 나타냄. 즉, 두 요인에 의해 60.4%가 설명됨
- long변수의 분산비율 설명
- long 변수의 분산은 \(Factor1\)에 의해 \(-0.672^2\)만큼 설명되고 \(Factor2\)에 의해 \(0.041^2\)만큼 설명됨
- 이를 모두 합한 45.3%(0.453)는 \(Factor1\)과 \(Factor2\)에 의해 설명되는 long변수의 분산비율을 나타냄. 즉, 두 요인에 의해 45.3%가 설명됨
- 60.4%, 45.3% 이 두 수치를 100변수와 long변수의 공통성이라고 함
- 공통성은 공통요인으로 설명되는 분산의 비율로 추출된 요인이 각 변수를 얼마나 잘 설명하는지 평가함
- 따라서 100변수는 long변수에 비해 두 요인으로 더 잘 설명되고 있음
- 100변수의 분산비율 설명
- 공통성 해석
- 공통성은 0과 1 사이의 값을 가짐
- 공통성이 0일 때: 공통요인이 변수의 분산을 전혀 설명하지 못한다는 의미
- 공통성이 1일 때: 공통요인이 변수의 분산을 100% 완전히 설명한다는 의미
- 공통요인에 의해 설명되지 않는 분산은 고유요인에 의해 설명되는 것으로 가정함
- 각 변수에 대한 공통성이 크면 클수록
- 요인추출이 성공적이라는 의미임
- 각 변수에 대한 공통성이 작은 변수는
- 공통요인으로 적절히 설명될 수 없다는 의미로
- 만일 공통성의 값이 지나치게 작다면 해당 변수를 분석에서 제외할 필요가 있음
- 왜냐하면 이러한 변수는 나머지 다른 변수들과 관련성이 작기 때문임
- 이런 공통성의 특성은 설문서의 설문항목 가운데서 다른 항목들과 관련성이 작은 항목을 찾아 내는데 효과적으로 활용할 수 있음
- 공통성은 0과 1 사이의 값을 가짐
- 고유요인 해석
- 고유요인으로 설명되는 분산은 factanal() 출력결과에서 Uniquenesses 이하의 값임
- 똑같은 정보를 요인분석 객체의 uniquenesses 원소에서 출력 가능
round(fa$uniquenesses, 3)
## 100 long poid haut 400 110 disq perc jave 1500
## 0.396 0.547 0.022 0.933 0.287 0.420 0.318 0.575 0.638 0.631
- 공통성 측정방법 2)
- 공통성은 1) 각 요인으로 설명되는 분산비율 합 외에도 2) (1-고유요인에 의해 설명되는 분산)으로 측정 가능
1-round(fa$uniquenesses, 3)
## 100 long poid haut 400 110 disq perc jave 1500
## 0.604 0.453 0.978 0.067 0.713 0.580 0.682 0.425 0.362 0.369
- 결과
- 위 슬라이드에서 확인한 long변수(0.604)와 100변수(0.453)의 공통성과 동일 결과임
- 공통성의 값을 비교하면
- haut(0.067), jave(0.362), 1500(0.369)변수는 공통성의 값이 작은 것을 볼 때
- 다른 변수들에 비해 추출한 두 요인이 잘 설명하지 못하는 것으로 보임
4. 요인적재값과 요인-변수 간 관련성
4-1. 요인적재값과 요인-변수 간 관련성 해석
- 높은 요인적재값은 해당 변수의 요인이 서로 밀접한 관계가 있다는 것을 의미함
- 그래서 이러한 개념적 관련성을 통해 요인의 의미를 해석할 수 있음
print(fa$loadings, cutoff=0.001)
##
## Loadings:
## Factor1 Factor2
## 100 0.772 -0.089
## long -0.672 0.041
## poid -0.155 0.977
## haut -0.241 0.095
## 400 0.814 0.226
## 110 0.739 -0.185
## disq 0.007 0.826
## perc -0.505 0.413
## jave -0.049 0.600
## 1500 0.488 0.362
##
## Factor1 Factor2
## SS loadings 2.834 2.401
## Proportion Var 0.283 0.240
## Cumulative Var 0.283 0.523
- 위의 요인적재값을 다시 살펴보면,
- 요인 \(Factor1\)은 100, long, 400, 110변수와 상대적으로 높은 관련성을 같음
- 요인 \(Factor2\)은 poid, disq, jave와 밀접한 관련을 가짐
- perc와 1500변수는 두 요인 모두와 관련성을 가지나 \(Factor1\)과 상대적으로 더 큰 관련성을 가짐
- haut변수는 어느 요인과도 큰 관련성 갖지 않지만 두 요인 중 \(Factor1\)과 조금 더 관련이 깊어 보임
- 변수와 요인간 관계를 볼 때, \(Factor1\)은 달리기/\(Factor2\)은 던지기 종목과 높은 연관성을 가짐
- \(Factor1\)과 밀접한 관련을 갖고 있는 4개 변수를 보면 모두 달리기와 관련된 변수임
- 100: 100m 달리기, long: 멀리뛰기, 400: 400m 달리기, 110: 110m 장애물 경기임
- \(Factor2\)과 밀접한 관련을 갖고 있는 3개 변수를 보면 모두 던지기와 관련된 종목임
- poid: 포환 던지기, disq: 원반 던지기, jave: 창던지기 경기임
- \(Factor1\)과 밀접한 관련을 갖고 있는 4개 변수를 보면 모두 달리기와 관련된 변수임
4-2. 요인-변수 간 관련성의 시각적 표현 - fractor.plot()
- 요인과 변수 간 관련성을 .plot 를 이용하여 그래프로 표현할 수 있음
- fractor.plot() 인수설
- 1st: 요인분석 객체를 인수로 지정함
- lables: 변수 이름을 지정 하여 변수 이름을 함께 출력함
- pos: 텍스트의 위치를 지정. 1은 아래쪽, 2는 왼쪽, 3은 위쪽, 4는 오른쪽에 출력. 여기서는 4를 지정해 오른쪽에 출력함
- title: 그래프의 제목을 지정함
factor.plot(fa, labels=colnames(olympic$tab),
pos=4, title="Factor Plot")
- 결과
- 던지기 종목인 poid disq jave는 Factor2축에 상대적으로 가까이 위치하며 perc haut 1500을 제외한 나머지인 달리기 종목 변수 100 long 400 110은 Factor1축에 비교적 가까이 위치함
4-3. 요인-변수 간 관련성의 시각적 표현 - heatmap.2()
- gplots패키지 heatmap.2()으로 히트맵을 통한 요인과 변수 간의 관계를 시각화
- 히트맵은 값의 강도에 따라 데이터를 색깔로 구분하여 표현하여 변수 간 관련성을 시각적으로 나타내는 데에도 유용하게 활용할 수 있음
- gplots패키지 heatmap.2() 시각화
- 히트맵 사용 색상을 RColorBrewer패키지 제공 색상을 사용함
- heatmap.2() 인수설명
- 1st: 행렬이나 데이터프레임 데이터셋 지정. 여기선 요인적재값 행렬지정
- 그런데 요인적재값 부호는 중요하지 않고 크기만이 관심 대상이기 때문에 abs()로 요인적재값 행렬을 절대값으로 변환함
- col: 색상을 지정함. RColorBrewer패키지 파란색 팔레트 이용하며, Blues팔레트로부터 9개 색상을 추출해 히트맵 색상으로 이용함
- trace=“none”, key=FALSE, dendrogram=“none”: 그밖에 불필요한 옵션은 비활성화 시키겠음
- cexCol=1.2: 히트맵 열에는 요인이름이 출력됨. 요인이름 글자크기를 표준크기보다 약간 크게 출력함
- main: 히트맵 제목 지정
- 1st: 행렬이나 데이터프레임 데이터셋 지정. 여기선 요인적재값 행렬지정
library(gplots)
library(RColorBrewer)
heatmap.2(abs(fa$loadings), col=brewer.pal(9, "Blues"),
trace="none", key=FALSE, dendrogram="none",
cexCol=1.2, main="Factor Loadings" )
- 결과
- 요인과 변수 간 관련성이 클수록 짙은 색으로 표현 됨
- Factor1과 밀접한 관련을 갖는 4개 변수가 짙은 파란색으로 표현되고
- Factor2와 밀접한 관련을 갖는 3개 변수가 짙은 파란색으로 표현되었음
- 앞서 살펴본 대로 Factor1과 밀접한 관련을 갖는 4개 변수는 달리기 종목이고 Factor2와 밀접한 관련을 갖는 3개 변수는 던지기 종목임
- 요인과 변수 간 관련성이 클수록 짙은 색으로 표현 됨
4-4. 요인-변수 간 관련성의 시각적 표현 - semPaths(): 경로도
- 추출요인과 개별변수 간 연결 관계를 더 명확히 시각적으로 보고자 할 때 경로도 이용
- 경로도는 요인과 개별변수 간 연결 관계를 요인적재값과 함께 보여줌
- semPlot패키지 semPaths()로 경로도를 시각화할 수 있음
- semPaths() 인수설명
- 1st: 요인분석 객체
- what: 경로 상 요인적재값을 나타내기 위해 estimate을 의미하는 est를 지정함
- residuals
- 관측변수에 대한 잔차, 즉 오차를 그래프 상에 표현할 지 여부를 지정함
- 여기서는 FALSE를 지정해 관측변수에 대한 잔차를 그래프 상에서 생략함
- cut, posCol, negCol:
- 일정 기준값보다 작거나 큰 요인적재값을 갖는 경로에 대해 각각 다른 색상을 지정 가능
- 이렇게 함으로써 중요 경로를 좀 더 시각적으로 명확히 표현할 수 있음
- posCol: 정(+)의 요인적재값을 갖는 경로에 대해 색상 지정
- negCol: 부(-)의 요인적재값을 갖는 경로에 대해 색상 지정
- posCol, negCol는 각각 2개의 색상을 지정해,
- 1st는 cut인수 지정값보다 (절대값 기준) 작은 요인적재값 갖는 경로에 적용
- 2nd는 cut인수 지정값보다 (절대값 기준) 큰 요인적재값 갖는 경로에 적용
- 여기서는 1st색상으로 white를 지정해, cut인수 지정 요인적재값보다 작은 요인적재값을 갖는 경로는 흰색으로 표현돼 그래프 상 보이지 않게 됨
- edge.label.cex: 요인적재값의 텍스트 크기 지정. 여기서는 0.75로 표준크기보다 약간 작은 값으로 지정
library(semPlot)
semPaths(fa, what="est", residuals=FALSE,
cut=0.3, posCol=c("white", "darkgreen"),
negCol=c("white", "red"),
edge.label.cex=0.75)
- 결과
- +의 요인적재값은 녹색, -의 요인적재값은 빨간색으로 표현됨
- cut인수에 지정된 0.3보다 작은 요인적재값을 갖는 경로는 그래프 상 표현되지 않음
- 선 굵기는 요인적재값 크기에 비례해, 절대값 기준 요인적재값이 클수록 더 굵은 선으로 표현됨
5. 요인점수 산출
5-1. 요인점수 산출방법
- 요인분석은
- 요인과 변수 간의 구조를 보여주는 요인적재값의 추정과 함께
- 개별 관측값에 대한 요인점수를 산출함
- factanal()로 요인점수를 산출하기 위해 scores인수에 요인점수 추정 방법을 지정함
- 추정방법으로 regression과 Bartlett을 지정할 수 있음
factanal(olympic$tab, factors=2, scores="regression")
##
## Call:
## factanal(x = olympic$tab, factors = 2, scores = "regression")
##
## Uniquenesses:
## 100 long poid haut 400 110 disq perc jave 1500
## 0.396 0.547 0.022 0.933 0.287 0.420 0.318 0.575 0.638 0.631
##
## Loadings:
## Factor1 Factor2
## 100 0.772
## long -0.672
## poid -0.155 0.977
## haut -0.241
## 400 0.814 0.226
## 110 0.739 -0.185
## disq 0.826
## perc -0.505 0.413
## jave 0.600
## 1500 0.488 0.362
##
## Factor1 Factor2
## SS loadings 2.834 2.401
## Proportion Var 0.283 0.240
## Cumulative Var 0.283 0.523
##
## Test of the hypothesis that 2 factors are sufficient.
## The chi square statistic is 19.12 on 26 degrees of freedom.
## The p-value is 0.831
# scores는 요인점수 산출 인수로 "none"(기본값), "regression", "Bartlett"을 지정할 수 있음
- 요인점수는 요인분석을 수행하고 생성된 요인분석 객체의 scores원소에 저장되어 있음
- 요인점수를 출력하면 아래와 같음
fa.scores <- fa$scores
fa.scores
## Factor1 Factor2
## 1 -0.32438162 1.09966564
## 2 -1.43285690 0.52945579
## 3 -0.83737201 0.07079052
## 4 -0.92545629 0.67625571
## 5 -1.47986390 -0.98161177
## 6 -1.43948474 -0.47974194
## 7 -0.43152666 0.10711832
## 8 -0.90933792 0.80639017
## 9 -0.38386847 0.35666753
## 10 -0.39862118 0.94195081
## 11 -0.45600653 0.95288639
## 12 -0.32739908 0.30836290
## 13 -0.89032906 -0.92744296
## 14 -0.84771394 -0.36677942
## 15 -0.34600868 0.09442616
## 16 -0.12410501 0.37552335
## 17 1.77444897 1.91567694
## 18 0.56578762 1.99010221
## 19 -0.59905478 -0.57927673
## 20 -0.02998775 1.34981691
## 21 0.64928278 0.01628170
## 22 0.74255026 -0.05937437
## 23 0.60790677 0.36002212
## 24 0.55881285 -0.50923656
## 25 -0.01245654 -0.65228036
## 26 0.15075960 -1.73056050
## 27 -0.25240771 -1.05946516
## 28 1.38705005 0.41266570
## 29 0.18387745 -1.20153617
## 30 0.85528925 -0.63332096
## 31 1.99768998 0.35767656
## 32 1.37894365 -1.01797632
## 33 1.59583955 -2.52313220
- 결과
- 33명 운동선수의 10개 종목의 성적이 2개의 요인으로 축약돼서 표현됨
- 이처럼 요인점수를 통해 개별변수 대신 더 적은 수의 요인으로 각 케이스 설명가능
5-1. 요인점수 시각화 - heatmap.2()
- 운동선수별 요인점수를 그래프로 표현해 보겠음
- 우선 Factor1, Factor2로 돼 있는 요인 이름을 좀 더 의미있는 이름으로 변경함
- 달리기 능력과 밀접한 관련이 있는 Factor1은 Run으로 이름을 부여하고
- 던지기 능력과 높은 연관을 갖는 Factor2는 Throw로 이름을 변경함
- colnames(fa.scores) <- c(“Run”, “Throw)
- 그 다음 heatmap.2()로 운동선수별 요인점수를 히트맵 그래프로 표현
- 앞서 사용한 heatmap.2()를 재활용을 하고,
- 색상은 Green -> Blue로 변해가는 팔레트인 RColorBrewer패키지 GnBu팔레트 사용
- 녹색은 작은 값, 파란색은 큰 값을 나타내도록 함
- 옅은 색은 중간 범위의 값을 나타냄
heatmap.2(fa.scores, col=brewer.pal(9, "GnBu"),
trace="none", key=FALSE, dendrogram="none",
cexCol=1.2, main="Factor Scores by Athletes" )
- 결과: 히트맵에서 33명 운동선수들이 어느 요인과 높은 관련성을 갖는지 색상으로 확인됨