1 요인분석(factor analysis) 1 2 3

1904년에 찰스 스피어만(C.Spearman)에 의해 개발되었으며, 어떤 변인 (질문 문항, 측정 대상)들 간에 공통적인 요인이 있다고 가정하고, 그 변수들 간의 상호 관련성을 소수의 잠재 요인으로 집약하는 방법이다.

\[X = \Lambda f + \epsilon\]

1.1 요인분석 데이터 생성

요인분석 수식

  • X_mat : \(N \times P\) 행렬(\(200 \times 6\))
  • lambda: \(\Lambda\), 요인적재(factor loading) \(P \times Q\) 행렬(\(6 \times 2\))
  • FF: 요인점수(Factor Score), \(N \times Q\) 행렬(\(200 \times 2\)) 행렬.
  • E: 오차 행렬, \(N \times P\) 행렬(\(200 \times 6\))
# 0. 환경설정 -----
library(tidyverse)
library(psych)
library(GPArotation)
library(mvtnorm)

# 1. 요인분석 데이터 생성 -----

N <- 200
P <- 6
Q <- 2
lambda <- matrix(c(0.7,-0.4, 0.8,0, -0.2,0.9, -0.3,0.4, 0.3,0.7, -0.8,0.1),
                  nrow=P, ncol=Q, byrow=TRUE)

FF <- rmvnorm(N, mean = c(5, 15), sigma=diag(Q)) # 요인점수(factor score)
E  <- rmvnorm(N, mean = rep(0, P), sigma=diag(P))
X_mat  <- FF %*% t(lambda) + E

1.2 모의실험 요인분석

가장 먼저 요인 갯수를 선정한다. 이를 위해서 scree() 함수를 사용해서 팔꿈치가 꺾어지는 지점 요인 2개로 선정한다.

# 2. 요인분석 -----
## 2.1. 요인수 결정 -----
X_cor <- cor(X_mat, use = "pairwise.complete.obs")

scree(X_cor, factors = FALSE)

psych 팩키지 fa() 함수를 사용해서 nfactors=2로 지정한 후에 요인분석 모형 적합을 시도한다. RMSEA, TLI 값을 통해 적합성을 확인한다.

## 2.2. 요인분석 모형 적합 -----

X_fa <- fa(X_mat, nfactors=2, n.obs=N, rotate="varimax")

X_fa$RMSEA
     RMSEA      lower      upper confidence 
0.06302048 0.00000000 0.13520388 0.90000000 
X_fa$TLI
[1] 0.9324473

fa.plot() 함수를 통해 6개 변수를 2개 요인으로 축약하는데 각 변수별 요인에 대한 기여분을 시각화한다.

## 2.3. 요인분석 모형 -----
fa.plot(X_fa)

print(X_fa$loadings, cutoff = 0.2)

Loadings:
     MR1    MR2   
[1,]  0.594 -0.289
[2,]  0.740       
[3,]         0.510
[4,] -0.259  0.325
[5,]         0.695
[6,] -0.665       

                 MR1   MR2
SS loadings    1.467 0.934
Proportion Var 0.245 0.156
Cumulative Var 0.245 0.400

커뮤니케이션을 위해서 측정변수와 요인(Factor)의 관계를 시각적으로 표현한다.

colnames(X_fa$loadings) <- c("FactorA", "FactorB")

fa.diagram(X_fa)

2 요인분석 사례

Exploratory Factor Analysis in R 요인분석에 사용된 사례를 준용하여 자동차 구입에 중요한 요인을 추출해보자.

2.1 자동차 설문 데이터

탐색적 요인분석을 위한 데이터를 다운로드해서 살펴본다. EFA.csv 파일을 다운로드 받아 로컬 파일에 저장하는 것도 가능하고, 아니면 직접 read_csv() 함수로 데이터를 가져온다.

# 0. 환경설정 -----
library(tidyverse)
library(psych)
library(GPArotation)

# 1. 데이터 -----
download.file(url="https://www.promptcloud.com/wp-content/uploads/2017/02/EFA.csv", destfile = "data/EFA.csv")

car_df <- read_csv("https://www.promptcloud.com/wp-content/uploads/2017/02/EFA.csv")
DT::datatable( options = list(scrollX = TRUE), car_df)

2.2 요인수 결정

요인분석에서 가장 답이 없지만 중요한 방식이 적정한 요인수를 결정하는 것이다. 원데이터에서 상관관계 행렬을 추출한 후에 scree() 함수로 요인수를 결정하거나, fa.parallel() 함수를 활용해서 적절한 요인수를 결정한다. 시각적으로 2~5개 요인이 적절해 보인다.

# 2. 요인분석 -----
## 2.1. 요인수 결정 -----
### 2.1.1. 탐색적 요인수 결정 -----
car_cor <- cor(car_df, use = "pairwise.complete.obs")
scree(car_cor, factors = FALSE)

car_parallel <- fa.parallel(car_df, fm = 'minres', fa = 'fa')

Parallel analysis suggests that the number of factors =  5  and the number of components =  NA 

시각적인 방식을 참조하여 잠정적인 요인수를 결정하고 나서, 각 요인수에 맞춰 요인분석을 실행한 후에 anova() 함수로 요인수에 따른 모형의 차이가 있는지 검정한다. 4개 요인이 적절해 보인다.

### 2.1.2. 요인 수 결정 -----
car_two_fa   <- fa(car_df, nfactors=2, n.obs=N, rotate="varimax")
car_three_fa <- fa(car_df, nfactors=3, n.obs=N, rotate="varimax")
car_four_fa  <- fa(car_df, nfactors=4, n.obs=N, rotate="varimax")
car_five_fa  <- fa(car_df, nfactors=5, n.obs=N, rotate="varimax")

anova(car_two_fa, car_three_fa)
ANOVA Test for Difference Between Models

             Model Df ML Chisq Delta Df Delta Chisq Pr(> Delta Chisq)
car_two_fa         64   95.273                                       
car_three_fa       52   68.463       12       26.81         0.0082298
             Emp Chisq  Delta Emp Chisq Pr(> Emp.Delta Chisq)     BIC
car_two_fa      117.75                                        -192.72
car_three_fa     71.69           46.061            6.7716e-06 -165.53
             Delta BIC
car_two_fa            
car_three_fa    27.188
anova(car_three_fa, car_four_fa)
ANOVA Test for Difference Between Models

             Model Df ML Chisq Delta Df Delta Chisq Pr(> Delta Chisq)
car_three_fa       52   68.463                                       
car_four_fa        41   46.201       11      22.262          0.022419
             Emp Chisq  Delta Emp Chisq Pr(> Emp.Delta Chisq)     BIC
car_three_fa    71.690                                        -165.53
car_four_fa     38.461           33.229            0.00048305 -138.29
             Delta BIC
car_three_fa          
car_four_fa     27.236
anova(car_four_fa, car_five_fa)
ANOVA Test for Difference Between Models

            Model Df ML Chisq Delta Df Delta Chisq Pr(> Delta Chisq)
car_four_fa       41   46.201                                       
car_five_fa       31   27.439       10      18.762          0.043393
            Emp Chisq  Delta Emp Chisq Pr(> Emp.Delta Chisq)     BIC
car_four_fa    38.461                                        -138.29
car_five_fa    20.204           18.257              0.050777 -112.06
            Delta BIC
car_four_fa          
car_five_fa    26.236

2.3 요인분석 적합

요인 4개를 선정한 모형을 최종모형으로 하고 RMSEA, TLI 지표를 바탕으로 탐색적 요인분석 모형의 적합성을 확인한다.

## 2.2. 요인모형 적합 -----
car_fa <- fa(car_df, nfactors = 4, rotate = "oblimin", fm="minres")

car_fa$RMSEA
     RMSEA      lower      upper confidence 
0.05200437 0.00000000 0.08459318 0.90000000 
car_fa$TLI
[1] 0.9224231

2.4 요인분석 커뮤니케이션

선정된 요인 4개를 설문조사 문항과 결합하여 4개 요인에 대한 요인 명칭부여 작업을 수행한다.

  • 외관: “Exterior_Looks”, “Color”
  • 기능: “Space_comfort”, “Technology”, “Safety”, “After_Sales_Service”, “Fuel_Type”
  • 가성비: “Price”, “Maintenance”, “Resale_Value”, “Fuel_Efficiency”
  • 신뢰성: “Product_reviews”, “Testimonials”, “Test_drive”
## 2.3. 요인모형 시각화 -----
colnames(car_fa$loadings) <- c("Factor_1", "Factor_2", "Factor_3", "Factor_4")
print(car_fa$loadings, cutoff = 0.3)

Loadings:
                    Factor_1 Factor_2 Factor_3 Factor_4
Price                0.544                             
Safety              -0.331    0.358                    
Exterior_Looks                        -0.548           
Space_comfort                 0.782                    
Technology                    0.358                    
After_Sales_Service           0.537                    
Resale_Value         0.729                             
Fuel_Type                     0.575                    
Fuel_Efficiency      0.434             0.308           
Color                                  0.731           
Maintenance          0.562                             
Test_drive                                      0.365  
Product_reviews      0.345                      0.364  
Testimonials                                    0.685  

               Factor_1 Factor_2 Factor_3 Factor_4
SS loadings       1.639    1.637    1.053    0.968
Proportion Var    0.117    0.117    0.075    0.069
Cumulative Var    0.117    0.234    0.309    0.378
fa.diagram(car_fa)