본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Factor Analysis; 인자 분석
관측된 여러 변수 사이의 상관관계를, 직접 관측되지 않는 소수의 공통 요인(잠재 변수)으로 설명하는 다변량 분석 기법

예를 들어 수학·물리·화학 점수가 서로 높은 상관을 보이면, 그 뒤에 "이과 능력"이라는 보이지 않는 요인이 있다고 보고 이를 찾아내는 방법이다. 설문 문항을 몇 개의 개념으로 묶거나, 변수 수를 줄여 이후 분석에 쓰는 차원 축소 용도로 쓴다.

p개의 표준화 변수 X를 m개(m < p)의 공통요인 F와 고유요인 ε로 나타낸다.

Xi=λi1F1+λi2F2+⋯+λimFm+εi,i=1,…,p

  • λij를 요인 적재량(factor loading)이라 한다. 변수 i와 요인 j의 상관 정도를 나타낸다(직교 요인일 때 상관계수와 같다).
  • 공통성(communality) hi2=∑j=1mλij2은 변수 i의 분산 가운데 공통요인으로 설명되는 비율이다. 나머지 1 − hi2는 고유분산(uniqueness)이다.
  • 가정: 요인과 고유요인은 서로 독립이고, 고유요인끼리도 서로 상관이 없다. 변수들이 연속형이고 서로 선형 상관이 있어야 의미가 있다.

탐색적 요인 분석과 확인적 요인 분석

편집 원본 편집
구분 탐색적 요인 분석(EFA) 확인적 요인 분석(CFA)
목적 변수들 속에 몇 개의 요인이 있고 어떤 변수가 어디에 묶이는지 찾는다 이론으로 정한 요인 구조가 자료에 맞는지 검증한다
요인 구조 자료에서 결정한다. 모든 변수가 모든 요인에 적재될 수 있다 어떤 변수가 어떤 요인에 적재되는지 미리 지정한다
주요 결과 요인 수, 회전된 요인 적재량 모형 적합도 지수(카이제곱, CFI, RMSEA 등)
도구 R factanal(), psych::fa(), Python factor_analyzer.FactorAnalyzer R lavaan::cfa(), Python ConfirmatoryFactorAnalyzer

주성분 분석과 비교

편집 원본 편집
구분 주성분 분석(PCA) 요인 분석(FA)
방향 변수의 선형결합으로 성분을 만든다(변수 → 성분) 요인이 변수를 만든다고 보는 모형이다(요인 → 변수)
다루는 분산 전체 분산 공통분산(고유분산은 따로 둔다)
목적 정보 손실을 최소로 하는 차원 축소 잠재 구조의 해석
결과의 유일성 성분이 유일하게 정해진다(분산 크기 순) 회전에 따라 적재량이 달라진다
이름 붙이기 보통 하지 않는다 적재량을 보고 요인에 의미 있는 이름을 붙인다
  1. 적합성 확인: KMO(Kaiser-Meyer-Olkin) 표본 적합도는 편상관에 비해 상관이 얼마나 큰지를 0~1로 나타낸다. 1에 가까울수록 요인 분석에 알맞고, Kaiser(1974)는 0.5 미만을 받아들일 수 없는 수준으로 보았다. Bartlett 구형성 검정은 "상관행렬이 단위행렬이다(변수끼리 상관이 없다)"를 귀무가설로 하며, 기각되어야 요인 분석을 할 의미가 있다.
  2. 요인 추출: 최대우도법(ML), 주축 요인법(principal axis), 주성분법 등으로 적재량을 추정한다.
  3. 요인 수 결정: 상관행렬의 고유값이 1보다 큰 요인만 남기는 Kaiser 기준, 고유값을 차례로 그린 스크리 도표(scree plot)에서 꺾이는 지점(elbow) 앞까지 남기는 방법, 누적 설명 분산 비율, 평행 분석(parallel analysis)을 함께 본다.
  4. 요인 회전: 적재량을 해석하기 쉽게 축을 돌린다. 직교 회전인 varimax는 요인끼리 상관이 없다고 두고 요인별 적재량 제곱의 분산을 최대화한다. 사각(oblique) 회전인 promax와 oblimin은 요인 사이의 상관을 허용한다.
  5. 해석: 변수별로 적재량이 큰 요인(흔히 절댓값 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는 사각 회전이다.
  • 실기에서는 적재량 표를 보고 변수를 요인으로 묶고 요인 이름을 붙이는 해석 서술이 핵심이다.