요인 분석
IT 위키
더 많은 작업
- Factor Analysis; 인자 분석
- 관측된 여러 변수 사이의 상관관계를, 직접 관측되지 않는 소수의 공통 요인(잠재 변수)으로 설명하는 다변량 분석 기법
예를 들어 수학·물리·화학 점수가 서로 높은 상관을 보이면, 그 뒤에 "이과 능력"이라는 보이지 않는 요인이 있다고 보고 이를 찾아내는 방법이다. 설문 문항을 몇 개의 개념으로 묶거나, 변수 수를 줄여 이후 분석에 쓰는 차원 축소 용도로 쓴다.
p개의 표준화 변수 X를 m개(m < p)의 공통요인 F와 고유요인 ε로 나타낸다.
- λij를 요인 적재량(factor loading)이라 한다. 변수 i와 요인 j의 상관 정도를 나타낸다(직교 요인일 때 상관계수와 같다).
- 공통성(communality) 은 변수 i의 분산 가운데 공통요인으로 설명되는 비율이다. 나머지 1 − hi2는 고유분산(uniqueness)이다.
- 가정: 요인과 고유요인은 서로 독립이고, 고유요인끼리도 서로 상관이 없다. 변수들이 연속형이고 서로 선형 상관이 있어야 의미가 있다.
| 구분 | 탐색적 요인 분석(EFA) | 확인적 요인 분석(CFA) |
|---|---|---|
| 목적 | 변수들 속에 몇 개의 요인이 있고 어떤 변수가 어디에 묶이는지 찾는다 | 이론으로 정한 요인 구조가 자료에 맞는지 검증한다 |
| 요인 구조 | 자료에서 결정한다. 모든 변수가 모든 요인에 적재될 수 있다 | 어떤 변수가 어떤 요인에 적재되는지 미리 지정한다 |
| 주요 결과 | 요인 수, 회전된 요인 적재량 | 모형 적합도 지수(카이제곱, CFI, RMSEA 등) |
| 도구 | R factanal(), psych::fa(), Python factor_analyzer.FactorAnalyzer |
R lavaan::cfa(), Python ConfirmatoryFactorAnalyzer
|
| 구분 | 주성분 분석(PCA) | 요인 분석(FA) |
|---|---|---|
| 방향 | 변수의 선형결합으로 성분을 만든다(변수 → 성분) | 요인이 변수를 만든다고 보는 모형이다(요인 → 변수) |
| 다루는 분산 | 전체 분산 | 공통분산(고유분산은 따로 둔다) |
| 목적 | 정보 손실을 최소로 하는 차원 축소 | 잠재 구조의 해석 |
| 결과의 유일성 | 성분이 유일하게 정해진다(분산 크기 순) | 회전에 따라 적재량이 달라진다 |
| 이름 붙이기 | 보통 하지 않는다 | 적재량을 보고 요인에 의미 있는 이름을 붙인다 |
- 적합성 확인: KMO(Kaiser-Meyer-Olkin) 표본 적합도는 편상관에 비해 상관이 얼마나 큰지를 0~1로 나타낸다. 1에 가까울수록 요인 분석에 알맞고, Kaiser(1974)는 0.5 미만을 받아들일 수 없는 수준으로 보았다. Bartlett 구형성 검정은 "상관행렬이 단위행렬이다(변수끼리 상관이 없다)"를 귀무가설로 하며, 기각되어야 요인 분석을 할 의미가 있다.
- 요인 추출: 최대우도법(ML), 주축 요인법(principal axis), 주성분법 등으로 적재량을 추정한다.
- 요인 수 결정: 상관행렬의 고유값이 1보다 큰 요인만 남기는 Kaiser 기준, 고유값을 차례로 그린 스크리 도표(scree plot)에서 꺾이는 지점(elbow) 앞까지 남기는 방법, 누적 설명 분산 비율, 평행 분석(parallel analysis)을 함께 본다.
- 요인 회전: 적재량을 해석하기 쉽게 축을 돌린다. 직교 회전인 varimax는 요인끼리 상관이 없다고 두고 요인별 적재량 제곱의 분산을 최대화한다. 사각(oblique) 회전인 promax와 oblimin은 요인 사이의 상관을 허용한다.
- 해석: 변수별로 적재량이 큰 요인(흔히 절댓값 0.4~0.5 이상을 기준으로 삼는다)에 묶고, 묶인 변수를 보고 요인 이름을 붙인다. 여러 요인에 비슷하게 적재된 변수는 제거를 검토한다.
library(psych)
KMO(df) # KMO 표본 적합도
cortest.bartlett(cor(df), n = nrow(df)) # Bartlett 구형성 검정
scree(df) # 스크리 도표
fa.parallel(df) # 평행 분석
fit <- factanal(df, factors = 2, rotation = "varimax") # 최대우도 요인 분석
print(fit$loadings, cutoff = 0.4)
factanal(df, factors = 2, rotation = "promax") # 사각 회전
library(lavaan) # 확인적 요인 분석
model <- 'sci =~ math + physics + chem
lang =~ korean + english + history'
summary(cfa(model, data = df), fit.measures = TRUE)
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
import numpy as np
import pandas as pd
from factor_analyzer import FactorAnalyzer
from factor_analyzer.factor_analyzer import calculate_kmo, calculate_bartlett_sphericity
# 이과 능력(f1)과 문과 능력(f2) 두 잠재요인에서 만든 가상 성적 200명
rng = np.random.default_rng(0)
n = 200
f1, f2 = rng.normal(size=n), rng.normal(size=n)
noise = lambda: rng.normal(scale=0.6, size=n)
df = pd.DataFrame({
"math": 0.8 * f1 + noise(), "physics": 0.7 * f1 + noise(), "chem": 0.6 * f1 + noise(),
"korean": 0.8 * f2 + noise(), "english": 0.7 * f2 + noise(), "history": 0.6 * f2 + noise(),
})
chi2, p = calculate_bartlett_sphericity(df)
kmo_per_var, kmo_total = calculate_kmo(df)
print(f"Bartlett 구형성: chi2={chi2:.1f}, p={p:.3g}")
print(f"KMO 전체={kmo_total:.3f}")
fa0 = FactorAnalyzer(rotation=None)
fa0.fit(df)
ev, _ = fa0.get_eigenvalues()
print("고유값:", np.round(ev, 3))
fa = FactorAnalyzer(n_factors=2, rotation="varimax", method="ml")
fa.fit(df)
print(pd.DataFrame(fa.loadings_, index=df.columns, columns=["F1", "F2"]).round(3))
print("공통성:", np.round(fa.get_communalities(), 3))
print("누적 설명 분산 비율:", np.round(fa.get_factor_variance()[2], 3))
실행 결과:
Bartlett 구형성: chi2=415.5, p=3.79e-79
KMO 전체=0.707
고유값: [2.301 2.089 0.5 0.406 0.381 0.324]
F1 F2
math 0.070 0.801
physics 0.078 0.729
chem 0.060 0.765
korean 0.835 -0.054
english 0.802 -0.017
history 0.697 -0.003
공통성: [0.647 0.538 0.588 0.699 0.643 0.486]
누적 설명 분산 비율: [0.307 0.6 ]
- Bartlett 구형성 검정의 p-값이 매우 작아 "변수끼리 상관이 없다"는 귀무가설을 기각한다. KMO가 0.707로 0.5를 넘으므로 요인 분석을 진행할 수 있다.
- 고유값이 1보다 큰 것은 두 개(2.301, 2.089)이고 세 번째부터 0.5 이하로 급격히 떨어지므로, Kaiser 기준과 스크리 도표 모두 요인 2개를 가리킨다.
- varimax 회전 후 korean·english·history는 F1에, math·physics·chem은 F2에 0.69 이상으로 적재되고 다른 요인에는 0.1 미만이다. F1은 "문과 능력", F2는 "이과 능력"으로 이름 붙일 수 있다. 요인의 순서는 자료를 만든 순서와 다를 수 있다.
- 두 요인이 전체 분산의 약 60%를 설명한다. 공통성이 가장 낮은 history(0.486)는 고유분산이 가장 크다.
- 주성분 분석과 요인 분석의 차이(전체 분산 대 공통분산, 변수의 결합 대 잠재 요인 모형, 회전 여부)를 표로 정리해 둔다.
- KMO와 Bartlett 구형성 검정은 요인 분석의 적합성 확인 단계이며, Bartlett 검정은 기각되어야 분석이 의미 있다.
- 요인 수는 고유값 1 이상(Kaiser 기준)과 스크리 도표로 정하고, varimax는 직교 회전, promax는 사각 회전이다.
- 실기에서는 적재량 표를 보고 변수를 요인으로 묶고 요인 이름을 붙이는 해석 서술이 핵심이다.
- R Documentation - factanal
- R Documentation - varimax, promax
- CRAN - psych reference manual (KMO, cortest.bartlett, fa.parallel)
- CRAN - lavaan reference manual (cfa)
- factor_analyzer documentation
- NIST/SEMATECH e-Handbook of Statistical Methods, 6.5.5 Principal Components
- Kaiser, H. F. (1958). The varimax criterion for analytic rotation in factor analysis. Psychometrika 23(3), 187-200
- Kaiser, H. F. (1974). An index of factorial simplicity. Psychometrika 39(1), 31-36