본문 바로가기
Data Science/R 분석과 실습

R을 활용한 요인 분석(인자분석, Factor Analysis) 정리 :: Data 쿡북

by 쿡북 2017. 3. 17.

요인분석(인자분석, Factor Analysis)에 대해 조사하고 실습한 내용들을 정리한다.


| 요인분석이란

여러개의 서로 관련이 있는 변수들로 측정된 자료에서 그 변수들을 설명할 수 있는 새로운 공통변수를 파악하는 통계적 분석방법이다.

예를 들면, 학생들 100명을 대상으로 국어,영어,수학,일반사회,지리, 역사, 물리, 화학, 생물 등 9개의 시험을 실시하여 성적을 구하였을 때 9개가 아닌 공통적으로 설명할 수 있는 공통인자(변수)를 파악하는 것이다

즉, 

국어, 영어를 언어능력

수학, 물리를 수리능력

등으로 분리해 내는 것이다.


| 주성분분석(PCA)와 공통점과 차이점

주성분 분석과 요인분석은 유사하지만 다른 특성을 갖고 있다.

R을 활용한 주성분 분석은 이전 포스팅을 참고 바란다. 

(▶ http://datacookbook.co.kr/35 )


공통점

- 관측된 여러개의 변수들로 부터 소수의 새로운 변수들을 생성한다.

- 차원 축소의 방법으로 활용한다.


차이점

- PCA : 변수간의 중요성이 있다. 주로 제1주성분, 제2주성분 등으로 구분된다.  변수간의 순서가 주어진다.

    FA : 변수들은 기본적으로 대등한 관계를 갖는다. 어떤것이 더 중요하다는 것이 없다. 변수간의 순서가 없다.

- PCA : 목표 변수를 잘 분류하기 위해 변수들의 선형 결합에 의해 새로운 변수를 만든다.

    FA : 데이터가 주어지면 이에 대한 가공 인자들을 만들어 인자들간의 선형 결합으로 표현한다.


| 인자분석의 목적

요인 분석을 하는 이유는 PCA와 유사하다.  

- 차원을 축소하여 대상을 파악하기 위함

- 차원축소를 통한 다중공선성의 문제 해결

- 데이터 축소

때문이다.


| 요인모형 추정 종류 및 차이점

추정 종류는 다음과 같다

1) 주성분인자법(principal factor method)

- 관측값 X의 분산, 공분산 행렬 또는 상관계수행렬R의 고유근과 고유벡터를 이용하여 인자 부하값과 특수분산을 추정하는 방법

- 주성분 분석과 같은 과정을 가짐

2) 최우추정법(maximum likelihood method)

- X가 다변량 정규분포를 따른다는 가정이 있음. 

- 추정의 신뢰성이 높아 많이 사용되는 방법임


| 요인의 수와 유의성 판단 기준

그렇다면 요인의 수를 몇개까지 뽑아야 하며 그 결과는 어떨때 유의하다 판단할 수 있을까?

요인의 수는 다음의 기준을 따른다.

- 상관계수행렬 R의 고유값이 1이상인 경우 채택한다.  (Jolliffe는 0.7 보다 큰것만 하자고 제안하기도 했음)

요인의 유의성은 다음의 기준을 따른다.

- 수학적 근거 보다는 통상적으로 개체수 n>= 50인 경우 절대값 기준으로

요인부하값 > 0.3 : 유의함

    > 0.4 : 좀 더 유의함

    > 0.5 : 아주 유의함


| 요인 회전이란 무엇이며 왜 하는가?

요인 회전을 할 때가 있는데 이는 변수에 대한 해석을 쉽게 하고자 한다.

요인 회전을 시키는 방법은

직교회전(Orthogonal rotation)

- VARIMAX, QUARTIMAX

사각회전(oblique rotation)

- COVARIMIN, QUARTIMIN, OBLIMIN 

이 있다.

이중 OBLIMIN이 많이 활용된다.

OBLIMIN 회전은 직교가 아닐지라도 인자부하값들이 0 또는 1에 가깝도록 회전하는 사각(비스듬한)회전방법이다.



| R을 활용하여 요인분석을 해보자

medFactor.txt

데이터는 무료 검진 프로그램인 Positive Health Inventory(PHI)를 개발하여 프로그램의 유효성을 모니터링한 자료이다.

11개의 검진 항목이 있으며 128명의 자료가 있다.


여기서는 주성분 요인법을 이용한 요인분석을 해보자

> #주성분 요인법을 이용한 요인분석

> #데이터 읽기

> med.data <- read.table("D:/myTemp/mvadata/medFactor.txt", header=T)

> head(med.data)

  lung muscle liver skeleton kidneys heart step stamina stretch blow urine

1   20     16    52       10      24    23   19      20      23   29    67

2   24     16    52        7      27    16   16      15      31   33    59

3   19     21    57       18      22    23   16      19      42   40    61

4   24     21    62       12      31    25   17      17      36   36    77

5   29     18    62       14      26    27   15      20      33   29    88

6   18     19    51       15      29    23   19      20      50   37    54

> summary(med.data)

      lung           muscle          liver          skeleton        kidneys          heart      

 Min.   : 4.00   Min.   : 9.00   Min.   :26.00   Min.   : 3.00   Min.   :16.00   Min.   :11.00  

 1st Qu.:17.00   1st Qu.:16.00   1st Qu.:50.75   1st Qu.:11.00   1st Qu.:23.00   1st Qu.:22.00  

 Median :20.00   Median :19.00   Median :55.00   Median :13.00   Median :26.00   Median :23.00  

 Mean   :19.96   Mean   :18.82   Mean   :54.70   Mean   :12.87   Mean   :25.64   Mean   :23.18  

 3rd Qu.:23.00   3rd Qu.:22.00   3rd Qu.:60.25   3rd Qu.:15.00   3rd Qu.:29.00   3rd Qu.:25.00  

 Max.   :29.00   Max.   :28.00   Max.   :69.00   Max.   :19.00   Max.   :32.00   Max.   :56.00  

      step          stamina         stretch           blow           urine      

 Min.   : 4.00   Min.   : 7.00   Min.   :16.00   Min.   :17.00   Min.   : 9.00  

 1st Qu.:15.00   1st Qu.:14.00   1st Qu.:34.00   1st Qu.:32.00   1st Qu.:59.00  

 Median :17.00   Median :16.00   Median :40.00   Median :34.00   Median :67.00  

 Mean   :16.17   Mean   :15.87   Mean   :38.81   Mean   :33.54   Mean   :66.91  

 3rd Qu.:18.00   3rd Qu.:18.00   3rd Qu.:45.00   3rd Qu.:36.00   3rd Qu.:76.00  

 Max.   :20.00   Max.   :20.00   Max.   :51.00   Max.   :41.00   Max.   :93.00  

> #초기 요인분석 실행

> #install.packages(c("psych","GPArotation"))

> library(psych)

> library(GPArotation)

> med.factor <- principal(med.data, rotate="none")

> names(med.factor)

 [1] "values"       "rotation"     "n.obs"        "communality"  "loadings"     "fit"         

 [7] "fit.off"      "fn"           "Call"         "uniquenesses" "complexity"   "chi"         

[13] "EPVAL"        "R2"           "objective"    "residual"     "rms"          "factors"     

[19] "dof"          "null.dof"     "null.model"   "criteria"     "STATISTIC"    "PVAL"        

[25] "weights"      "r.scores"     "Structure"    "scores"      

> med.factor$values

 [1] 3.3791814 1.4827707 1.2506302 0.9804771 0.7688022 0.7330511 0.6403994 0.6221934 0.5283718

[10] 0.3519301 0.2621928

> plot(med.factor$values, type="b")

위에  values가 고유근을 말하는데 이 고유근이 1이상인 경우까지만 인자수로 채택하곤 한다.

위 예에서는 3까지가 1이 넘기 때문에 3개까지만 선택하는것이 좋겠다는 판단이 내려단다.


그러면 이제 위 데이터를 표현하기에 적절한 요인 개수는 추정이 되었으니 3개까지의 요인을 지정한 뒤 요인회전을 이번에는 직교회전인 varimax를 줘서 구해보자

> med.Varimax = principal(med.data, nfactors = 3, rotate="varimax")

> med.Varimax

Principal Components Analysis

Call: principal(r = med.data, nfactors = 3, rotate = "varimax")

Standardized loadings (pattern matrix) based upon correlation matrix

           RC1   RC2   RC3   h2   u2 com

lung      0.66  0.12  0.16 0.47 0.53 1.2

muscle    0.11 -0.09  0.79 0.64 0.36 1.1

liver     0.78  0.13  0.17 0.66 0.34 1.1

skeleton  0.19  0.29  0.76 0.70 0.30 1.4

kidneys   0.73  0.23 -0.14 0.61 0.39 1.3

heart     0.65 -0.11  0.19 0.46 0.54 1.2

step      0.49  0.48  0.10 0.48 0.52 2.1

stamina   0.02  0.62  0.29 0.47 0.53 1.4

stretch   0.18  0.65  0.34 0.57 0.43 1.7

blow      0.26  0.70 -0.04 0.56 0.44 1.3

urine    -0.07  0.65 -0.28 0.50 0.50 1.4


                       RC1  RC2  RC3

SS loadings           2.39 2.13 1.59

Proportion Var        0.22 0.19 0.14

Cumulative Var        0.22 0.41 0.56

Proportion Explained  0.39 0.35 0.26

Cumulative Proportion 0.39 0.74 1.00


Mean item complexity =  1.4

Test of the hypothesis that 3 components are sufficient.


The root mean square of the residuals (RMSR) is  0.1 

 with the empirical chi square  142.78  with prob <  1.8e-18 


Fit based upon off diagonal values = 0.85

해석을 하면

h2는 각변수의 공통성(communality),  u2는 고유분산을 말하는데

공통성의 수치는 다른 변수들과의 공통성을 말하는 것으로 저 수치가 통상 0.3 보다 아래이면 다른 변수들과 공통점이 별로 없는 것으로 판단할 수 있다.

Proportion var는 각 요인이 설명하는 총 분산의 비율을 말하는 것으로 RC1이 총 분산의 22%, RC2가 29%, RC3이 14%로 이 세 요인이 총 변동의 56%를 설명한다 해석할 수 있다. 


그리고 RC1, RC2, RC3의 수치를 볼 때

RC1은 lung, liver, kidney, heart가 높은 값을 가지고, 

RC2는 stamina,stretch, blow, urine이 높은 값을 가지고

RC3은 muscle과 skeleton에서 높은 값을 가진다. 

이 세개에 가장 높은 값을 가진것들을 바탕으로 이름을 붙이면

RC1은 생물의학,  RC2는 인체기능, RC3은 근육골계통력  으로 이름 붙일 수 있다. 


이를 biplot으로 도출해보면 다음과 같은 plot을 구할 수 있다.


이를 RC1과 RC2만 그려서 자세히 다시 뽑으면

> med.Varimax = principal(med.data, nfactors = 2, rotate="varimax")

> biplot(med.Varimax)


RC1과 RC2의 크기와 함께 각 성분들의 방향이 표기되어 나타난다.



이번에는 최우추정법으로 같은 데이터를 가지고 분석해보자

회전은 많이 쓴다는 사각회전의 OBLIMIN을 썼다.

> stats.fact <- factanal(med.data, factors = 3, rotation="oblimin")

> stats.fact


Call:

factanal(x = med.data, factors = 3, rotation = "oblimin")


Uniquenesses:

    lung   muscle    liver skeleton  kidneys    heart     step  stamina  stretch 

   0.597    0.802    0.152    0.005    0.697    0.824    0.668    0.764    0.545 

    blow    urine 

   0.457    0.805 


Loadings:

         Factor1 Factor2 Factor3

lung      0.588           0.107 

muscle    0.186  -0.169   0.389 

liver     0.935                 

skeleton                  0.999 

kidneys   0.402   0.262         

heart     0.324           0.199 

step      0.291   0.369         

stamina           0.394   0.182 

stretch           0.486   0.304 

blow              0.739         

urine    -0.162   0.482         


               Factor1 Factor2 Factor3

SS loadings      1.639   1.403   1.342

Proportion Var   0.149   0.128   0.122

Cumulative Var   0.149   0.277   0.399


Factor Correlations:

        Factor1 Factor2 Factor3

Factor1   1.000   0.289   0.274

Factor2   0.289   1.000   0.361

Factor3   0.274   0.361   1.000


Test of the hypothesis that 3 factors are sufficient.

The chi square statistic is 45.28 on 25 degrees of freedom.

The p-value is 0.00777 

여기서도 보면 Factor1~3까지의 주요 지표들이 이전에 주성분 요인법과 같은 변수들에 대해 설명력이 높다는 것을 알 수 있다.

참고로 최우추정법의  factanal의 함수를 가지고 biplot이 그려지지 않는데 이 부분은 아래 링크를 참조해도 될 것 같다

http://rfriend.tistory.com/62



| 정리

요인분석에 대해 알아봤다.

요인분석도 결국 전에 변수를 다 쓰지 말고 유의미한 것 끼리 묶어서 새로운 변수를 만들어 내는 것이다.



[참고]

http://ai-times.tistory.com/112

http://rfriend.tistory.com/62

방송통신대학교 교재






댓글