59doit

[ R ] 요인분석 #1 공통요인으로 변수 정제 본문

통계기반 데이터분석

[ R ] 요인분석 #1 공통요인으로 변수 정제

yul_S2 2022. 11. 26. 18:26
반응형

요인분석

변수들의 상관성을 바탕으로 변수를 정제하여 상관관계 분석이나 회귀분석에서 설명변수(독립변수)로 사용된다.

다수의 변수를 대상으로 변수 간의 관계를 분석하여 공통 차원으로 축약하는 통계기법

1) 탐색적 요인분석: 요인 분석을 할 때 사전에 어떤 변수들끼리 묶어야 한다는 전제를 두지 않고 분석하는 방법

2) 확인적 요인 분석: 사전에 묶일 것으로 기대되는 항목끼리 묶였는지를 조사하는 방법

 

타당성: 측정 도구가 측정하고자 하는 것을 정확히 측정할 수 있는 정도

논문 작성을 위한 통계분석 방법에서 인구통계학적 분석(빈도분석, 교차분석 등)을 시행한 이후 통계량 검정 이전에 구성 타당성(Construct validity)검증을 위해서 요인분석(Factor Analysis) 시행

 

 - 요인분석을 위한 전제조건

  • 하위요인으로 구성되는 데이터 셋이 준비되어 있어야 한다.
  • 분석에 사용되는 변수는 등간척도나 비율척도여야 하며, 표본의 크기는 최소 50개 이상이 바람직하다.
  • 요인 분석은 상관관계가 높은 변수들끼리 그룹화하는 것이므로 변수 간의 상관관계가 매우 낮다면(보통 ±3이하), 그 자료는 요인 분석에 적합하지 않다.

 

 - 요인분석을 수행하는 목적

  • 자료의 요약: 변인을 몇 개의 공통된 변인으로 묶음
  • 변인 구조 파악: 변인들의 상호관계 파악(독립성 등)
  • 불필요한 변인 제거: 중요도가 떨어진 변수 제거
  • 측정 도구의 타당성 검증: 변인들이 동일한 요인으로 묶이는 지를 확인

 

 - 요인 분석 결과에 대한 활용방안

  • 1. 타당성 검정: 측정도구가 정확히 측정했는지를 알아보기 위하여 측정변수들이 동일한 요인으로 묶이는지를 검정
  • 2. 변수 축소: 변수들의 상관관계가 높은 것끼리 묶어서 변수를 정제
  • 3. 변수 제거: 변수의 중요도를 나타내는 요인적재량이 0.4미만이면 설명력이 부족한 요인으로 판단하여 제거
  • 4. 활용: 요인 분석에서 얻어지는 결과를 이용하여 상관분석이나 회귀분석의 설명변수로 활용

 

 

(1) 공통요인으로 변수 정제

 

특정항목으로 묶이는데 사용되는 요인 수 결정은 주성분 분석 방법과 상관계수 행렬을 이용한 초기 고유값을 이용

ex)  변수와 데이터프레임 생성

#1 과목 변수 생성

s1 <- c(1,2,1,2,3,4,2,3,4,5)
s2 <- c(1, 3, 1, 2, 3, 4, 2, 4, 3, 4) 
s3 <- c(2, 3, 2, 3, 2, 3, 5, 3, 4, 2) 
s4 <- c(2, 4, 2, 3, 2, 3, 5, 3, 4, 1) 
s5 <- c(4, 5, 4, 5, 2, 1, 5, 2, 4, 3) 
s6 <- c(4, 3, 4, 4, 2, 1, 5, 2, 4, 2) 
name <- 1:10

 

 

#2 과목 데이터프레임 생성

subject <- data.frame(s1,s2,s3,s4,s5,s6)

str(subject)
# 'data.frame': 10 obs. of  6 variables:
#   $ s1: num  1 2 1 2 3 4 2 3 4 5
# $ s2: num  1 3 1 2 3 4 2 4 3 4
# $ s3: num  2 3 2 3 2 3 5 3 4 2
# $ s4: num  2 4 2 3 2 3 5 3 4 1
# $ s5: num  4 5 4 5 2 1 5 2 4 3
# $ s6: num  4 3 4 4 2 1 5 2 4 2

 

 

ex) 변수의 주성분 분석

주성분 분석: 변동량(분산)에 영향을 주는 주요 성분을 분석하는 방법

#1 주성분 분석으로 요인 수 알아보기

pc <- prcomp(subject)

summary(pc)
# Importance of components:
#                                       PC1     PC2      PC3       PC4       PC5      PC6
# Standard deviation     2.389 1.5532 0.87727 0.56907 0.19315 0.12434
# Proportion of Variance 0.616 0.2603 0.08305 0.03495 0.00403 0.00167
# Cumulative Proportion  0.616 0.8763 0.95936 0.99431 0.99833 1.00000


plot(pc)


prcomp(subject)
# Standard deviations (1, .., p=6):
#   [1] 2.3891658 1.5531709 0.8772735 0.5690665 0.1931487 0.1243440

# Rotation (n x k) = (6 x 6):
#                 PC1             PC2             PC3          PC4              PC5            PC6
# s1  0.4388800 0.37888239 -0.6252247  0.3349805  0.39758995  0.05135054
# s2  0.4052159 0.36430950 -0.1094938 -0.4342054 -0.64015432  0.30456180
# s3 -0.1620675 0.57063510  0.1348825  0.2985359 -0.31870892 -0.66273477
# s4 -0.2440714 0.62374442  0.4163574 -0.1909799  0.44116006  0.38330542
# s5 -0.5412080 0.08189792 -0.5904534 -0.5507507  0.08129259 -0.20449104
# s6 -0.5142388 0.04835210 -0.2385859  0.5199331 -0.35960897  0.52597360

*

주성분 분석에서 결정된 주성분의 수를 반드시 요인 분석에서 요인의 수로 사용되지는 않는다.

고유값: 어떤 행렬로부터 유도되는 실수값 일반적으로 변화량의 합(총분산)을 기준으로 요인의 수를 결정하는데 이용된다.

*

 

#2 고유값으로 요인수 분석

en <- eigen(cor(subject))
names(en)
# "values"  "vectors"

en$values
# [1] 3.44393944 1.88761725 0.43123968 0.19932073 0.02624961 0.01163331

en$vectors
#                     [,1]               [,2]                [,3]                 [,4]               [,5]                [,6]
# [1,] -0.4062499 -0.351093036  0.63460534  0.3149622  0.45699508  0.03041553
# [2,] -0.4319311 -0.400526644  0.11564711 -0.4422216 -0.57042232  0.34452594
# [3,]  0.2542077 -0.628807884 -0.06984072  0.3339036 -0.35389906 -0.54622817
# [4,]  0.3017115 -0.566028650 -0.37734321 -0.2468016  0.50326085  0.36333366
# [5,]  0.4763815  0.008436692  0.58035475 -0.6016209  0.05643527 -0.26654314
# [6,]  0.5155637  0.021286661  0.31595023  0.4133867 -0.28995329  0.61559319


plot(en$values,type="o")

고유값이 급격하게 감소하다가 완만하게 감소할 때 급격하게 감소하는 고유값 index 수로 주성분 변수 개수 결정

 

 

ex) 변수 간의 상관관계 분석과 요인분석

#1 상관관계분석 – 변수 간의 상관성으로 공통요인 추출

cor(subject)
#                      s1                s2                  s3               s4               s5              s6
# s1  1.00000000  0.86692145 0.05847768 -0.1595953 -0.5504588 -0.6262758
# s2  0.86692145  1.00000000 0.06745441 -0.0240123 -0.6349581 -0.7968892
# s3  0.05847768  0.06745441 1.00000000  0.9239433  0.3506967  0.4428759
# s4 -0.15959528 -0.02401230 0.92394333  1.0000000  0.4207582  0.4399890
# s5 -0.55045878 -0.63495808 0.35069667  0.4207582  1.0000000  0.8733514
# s6 -0.62627585 -0.79688923 0.44287589  0.4399890  0.8733514  1.0000000

요인분석에서 요인회전법은 요인 해석이 어려운 경우 요인축을 회전시켜서 요인 해석을 용이하게 하는 방법을 의미.

대표적인 요인회전법으로는 배리맥스 회전법

요인분석에 이용되는 R함수: factanal()함수 

factanal(dataset, factors=요인수, scores=c(“none”, “regression”, “Bartlett”), rotation=”요인회전법”, …)

 

#2 요인분석 – 요인회전법 적용(Varimax회전법)

#2 - 1 주성분 분석의 가정에 의해서 2개 요인으로 분석

result <- factanal(subject, factors = 2, rotation = "varimax")
result    
# Call:
#   factanal(x = subject, factors = 2, rotation = "varimax")

# Uniquenesses:
#   s1    s2    s3    s4    s5    s6 
# 0.250 0.015 0.005 0.136 0.407 0.107 

# Loadings:
#   Factor1 Factor2
# s1  0.862         
# s2  0.988         
# s3          0.997 
# s4 -0.115   0.923 
# s5 -0.692   0.338 
# s6 -0.846   0.421 

# Factor1 Factor2
# SS loadings      2.928   2.152
# Proportion Var   0.488   0.359
# Cumulative Var   0.488   0.847

# Test of the hypothesis that 2 factors are sufficient.
# The chi square statistic is 11.32 on 4 degrees of freedom.
# The p-value is 0.0232

* 요인 분석 결과에서 만약 p-value값이 0.05미만이면 요인수가 부족하다는 의미로 요인수를 늘려서 다시 분석을 수행해야 한다.

 

 

#2 - 2 고유값으로 가정한 3개 요인으로 분석

result <- factanal(subject, factor=3, rotation = "varimax", scores = "regression")
result
# Call:
#   factanal(x = subject, factors = 3, scores = "regression", rotation = "varimax")

Uniquenesses:
#   s1    s2    s3    s4    s5    s6 
# 0.005 0.056 0.051 0.005 0.240 0.005 

Loadings:
#   Factor1 Factor2 Factor3
# s1 -0.379           0.923 
# s2 -0.710   0.140   0.649 
# s3  0.236   0.931   0.166 
# s4  0.120   0.983  -0.118 
# s5  0.771   0.297  -0.278 
# s6  0.900   0.301  -0.307 

#                      Factor1 Factor2 Factor3
# SS loadings      2.122   2.031   1.486
# Proportion Var   0.354   0.339   0.248
# Cumulative Var   0.354   0.692   0.940

# The degrees of freedom for the model is 0 and the fit was 0.7745 

 

# Result

 

Uniquenesses항목: 유효성을 판단하여 제시한 값으로 통상 0.5이하이면 유효한 것으로 본다.

Loadings 항목은 요인 적재값(Loading)을 보여주는 항목으로 각 변수와 해당 요인간의 상관관계 계수를 나타낸다.

요인적재값(요인부하량)이 통상 +0.4이상이면 유의하다고 볼 수 있다.

만약 +0.4미만이면 설명력이 부족한 요인(중요도가 낮은 변수)으로 판단할 수 있다.

요인적재값(Loading)이 높게 나타났다는 의미는 해당 변수들이 해당 요인으로 잘 설명된다는 의미

SS loadings 항목: 각 요인 적재값의 제곱의 합을 제시한 값. 각 요인의 설명력을 보여준다.

Proportion Var 항목: 설명된 요인의 분산 비율로 각 요인이 차지하는 설명력의 비율

Cumulative Var 항목: 누적 분산 비율. 요인의 분산 비율을 누적하여 제시한 값.

현재 정보손실은 1-0.94 = 0.06으로 적정한 상태. 만약 정보손실이 너무 크면 요인 분석의 의미가 없어진다.

 

#3 다양한 방법으로 요인적재량 보기

attributes(result)
# $names
# [1] "converged"    "loadings"     "uniquenesses" "correlation"  "criteria"     "factors"     
# [7] "dof"          "method"       "rotmat"       "scores"       "n.obs"        "call"        

# $class
# [1] "factanal"

result$loadings
# Loadings:
#   Factor1 Factor2 Factor3
# s1 -0.379           0.923 
# s2 -0.710   0.140   0.649 
# s3  0.236   0.931   0.166 
# s4  0.120   0.983  -0.118 
# s5  0.771   0.297  -0.278 
# s6  0.900   0.301  -0.307 

# Factor1 Factor2 Factor3
# SS loadings      2.122   2.031   1.486
# Proportion Var   0.354   0.339   0.248
# Cumulative Var   0.354   0.692   0.940

print(result, digits = 2, cutoff = 0.5) 
# Call:
#   factanal(x = subject, factors = 3, scores = "regression", rotation = "varimax")

# Uniquenesses:
#     s1    s2    s3    s4    s5    s6 
# 0.00 0.06 0.05 0.00 0.24 0.00 

# Loadings:
#   Factor1 Factor2 Factor3
# s1                  0.92  
# s2 -0.71            0.65  
# s3          0.93          
# s4          0.98          
# s5  0.77                  
# s6  0.90                  

#                    Factor1 Factor2 Factor3
# SS loadings       2.12    2.03    1.49
# Proportion Var    0.35    0.34    0.25
# Cumulative Var    0.35    0.69    0.94

# The degrees of freedom for the model is 0 and the fit was 0.7745 

print(result$loadings, cutoff = 0)
# Loadings:
#   Factor1 Factor2 Factor3
# s1 -0.379  -0.005   0.923 
# s2 -0.710   0.140   0.649 
# s3  0.236   0.931   0.166 
# s4  0.120   0.983  -0.118 
# s5  0.771   0.297  -0.278 
# s6  0.900   0.301  -0.307 

#                      Factor1 Factor2 Factor3
# SS loadings      2.122   2.031   1.486
# Proportion Var   0.354   0.339   0.248
# Cumulative Var   0.354   0.692   0.940

 

 

 

반응형
Comments