1904년에 찰스 스피어만(C.Spearman)에 의해 개발되었으며, 어떤 변인 (질문 문항, 측정 대상)들 간에 공통적인 요인이 있다고 가정하고, 그 변수들 간의 상호 관련성을 소수의 잠재 요인으로 집약하는 방법이다.
\[X = \Lambda f + \epsilon\]
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
가장 먼저 요인 갯수를 선정한다. 이를 위해서 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)
Exploratory Factor Analysis in R 요인분석에 사용된 사례를 준용하여 자동차 구입에 중요한 요인을 추출해보자.
탐색적 요인분석을 위한 데이터를 다운로드해서 살펴본다. 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)
요인분석에서 가장 답이 없지만 중요한 방식이 적정한 요인수를 결정하는 것이다. 원데이터에서 상관관계 행렬을 추출한 후에 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
요인 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
선정된 요인 4개를 설문조사 문항과 결합하여 4개 요인에 대한 요인 명칭부여 작업을 수행한다.
## 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)