RyanNerd
라덕'Story
RyanNerd
  • 분류 전체보기 (70) N
    • Study Note (35) N
      • Python (3)
      • R (1)
      • Airflow (7)
      • 통계 (22) N
      • 머신러닝 (2) N
    • 빅데이터분석기사 (1)
      • 필기 (1)
    • Programmers (28)
      • Python (13)
      • SQL (15)
    • Project (3)
      • Django (3)
    • Mac (2)

블로그 메뉴

  • NaverBlog
  • 홈

최근 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
RyanNerd

라덕'Story

Study Note/통계

PCA와 비슷하지만 다른, 요인분석(Factor Analysis)의 모든 것

2025. 12. 19. 10:47

 주성분분석(PCA)이 데이터를 압축하는 기술이었다면, 오늘 다룰 요인분석(FA)은 데이터 뒤에 숨어있는 '잠재적인 원인(Latent Factor)'을 찾아내는 탐정 놀이입니다.

많은 분들이 헷갈려 하는 PCA와 FA의 결정적 차이, 그리고 분석 결과를 예쁘게 만들어주는 '회전(Rotation)' 기법까지 한 번에 정리해 보겠습니다.

 

1. 요인분석(Factor Analysis)이란?

수많은 변수들 뒤에 숨어서 데이터를 조종하는 소수의 '잠재 요인(Factor)'을 찾아내는 기법입니다.

예시: 학생들의 성적 데이터

  • 관측 변수: 국어, 영어, 수학, 과학, 사회 점수 (눈에 보이는 데이터)
  • 잠재 요인:
    • 국어, 영어, 사회 점수가 높다 $\rightarrow$ 숨겨진 요인은 '언어 능력'
    • 수학, 과학 점수가 높다 $\rightarrow$ 숨겨진 요인은 '수리 능력'
    • $\rightarrow$ 요인분석은 이 '언어 능력'과 '수리 능력'을 찾아내는 과정입니다.

 

2. PCA vs FA: 무엇이 다른가?

비슷해 보이지만 목적과 원리가 완전히 다릅니다.

구분 주성분분석(PCA) 요인분석(FA)
목적 데이터 압축 (정보 손실 최소화) 숨겨진 구조(요인) 발견 및 해석
생성원리 변수들의 조합으로 주성분을 만듦 요인이 변수를 설명함
($PC = w_1X_1 + w_2X_2$) ($X = w_1F_1 + \epsilon$)
오차($\epsilon$) 고려하지 않음 (총 분산 설명에 집중) 개별 오차(Unique Variance)를 인정함
순서 설명력이 큰 순서대로 정렬됨 ($PC_1 > PC_2$) 모든 요인이 동등한 중요도를 가짐
계수 결정 분석 후 누적 기여율을 보고 결정 분석 전에 미리 몇 개를 찾을지 정해야 함
해석 객관적인 데이터 축소 주관적인 네이밍(Naming)과 해석이 중요

 

한 줄 요약:

  • PCA: "데이터가 너무 많으니 엑기스만 뽑아서 줄이자." (머신러닝 전처리용)
  • FA: "이 데이터들이 뭉치는 이유(잠재 원인)가 뭘까?" (심리학/설문 통계용)

3. 요인의 회전 (Rotation): 해석의 마법

요인분석의 결과를 있는 그대로 보면 해석이 애매할 때가 많습니다. 이때 좌표축을 돌려서 변수들이 특정 요인에 확실하게 붙도록 만듭니다.

① 직교 회전 (Orthogonal Rotation) - Varimax

  • 특징: 요인들끼리 90도 직교(독립)를 유지하면서 회전합니다.
  • 장점: 요인 간 상관관계가 0이므로 해석이 깔끔하고 쉽습니다.
  • 단점: 현실 세계에서는 요인끼리 상관관계가 있을 수 있는데 이를 무시합니다. (예: 언어 능력이 좋으면 수리 능력도 좋을 수 있음)

② 사교 회전 (Oblique Rotation) - Promax

  • 특징: 90도 각도를 깨고 요인들끼리 상관관계를 허용하며 회전합니다.
  • 장점: 현실 데이터를 더 잘 반영합니다.
  • 단점: 해석이 조금 복잡해질 수 있습니다.

4. [실습] Python & R 코드 (요인분석 및 시각화)

시나리오: 5과목(국어, 영어, 사회, 수학, 과학) 점수 데이터를 이용해 잠재된 2가지 요인(문과/이과 성향)을 찾아냅니다.

Python Code (factor_analyzer)

Python에서는 factor_analyzer 라이브러리가 필요합니다. (pip install factor_analyzer)

import pandas as pd
import matplotlib.pyplot as plt
from factor_analyzer import FactorAnalyzer

# 1. 가상 데이터 생성 (문과/이과 성향이 뚜렷하게)
df = pd.DataFrame({
    'Korean': [90, 85, 95, 40, 50, 45],
    'English': [88, 92, 85, 45, 55, 40],
    'Society': [95, 80, 90, 50, 45, 55],
    'Math': [40, 50, 45, 90, 95, 85],
    'Science': [45, 55, 50, 92, 88, 95]
})

# 2. 요인분석 수행
# n_factors=2: 요인 개수 2개로 설정 (사전 결정)
# rotation='varimax': 직교 회전 사용
fa = FactorAnalyzer(n_factors=2, rotation='varimax')
fa.fit(df)

# 3. 결과 확인 (요인 적재량, Factor Loadings)
loadings = pd.DataFrame(fa.loadings_, 
                        index=df.columns, 
                        columns=['Factor1', 'Factor2'])

print("=== 요인 적재량 (Factor Loadings) ===")
print(loadings)

# 4. 시각화 (Heatmap)
import seaborn as sns
plt.figure(figsize=(6, 5))
sns.heatmap(loadings, annot=True, cmap='Blues', fmt='.2f')
plt.title('Factor Analysis Results')
plt.show()

 

R Code (psych 패키지)

R에서는 심리학 통계에 특화된 psych 패키지를 사용하면 아주 강력합니다.

# install.packages("psych")
library(psych)

# 1. 데이터 생성
scores <- data.frame(
  Korean = c(90, 85, 95, 40, 50, 45),
  English = c(88, 92, 85, 45, 55, 40),
  Society = c(95, 80, 90, 50, 45, 55),
  Math = c(40, 50, 45, 90, 95, 85),
  Science = c(45, 55, 50, 92, 88, 95)
)

# 2. 요인분석 수행 (fa 함수)
# nfactors=2, rotate="varimax"
# fm="minres": 최소잔차법 (일반적인 방법)
fa_result <- fa(scores, nfactors=2, rotate="varimax", fm="minres")

# 3. 결과 출력 (다이어그램 포함)
print(fa_result$loadings)

# 4. 시각화 (Path Diagram)
# 변수들이 어떤 요인으로 묶이는지 그림으로 보여줌
fa.diagram(fa_result, main="Factor Analysis Diagram")

 

요인분석 결과: 숫자가 들려주는 데이터의 속마음

R의 fa() 함수가 뱉어낸 결과표와 다이어그램을 해석해 봅시다. 이번 데이터에서는 변수들 사이에 흥미로운 역의 상관관계(음수)가 발견되었습니다.

1. 요인 적재량 (Factor Loadings) 해석

요인 적재량은 "변수와 요인 사이의 상관계수"입니다. 절댓값이 클수록 밀접한 관계가 있고, 부호(+/-)는 방향을 나타냅니다.

 

제1요인 (MR1): "사회 탐구 vs 수리 영역"

  • 높은 양의 값 (+): Society (0.848)
  • 높은 음의 값 (-): Math (-0.805), Science (-0.691)
  • 해석: MR1 수치가 높을수록 사회 점수는 높고, 수학/과학 점수는 낮아지는 경향이 있습니다.
  • Naming: 사회 과목에는 강하지만 수리에는 약한 "사회 계열 성향(Humanities Factor)"으로 정의할 수 있습니다.

제2요인 (MR2): "언어 영역 vs 과학 영역"

  • 높은 양의 값 (+): English (0.842), Korean (0.710)
  • 높은 음의 값 (-): Science (-0.718)
  • 해석: MR2 수치가 높을수록 국어/영어 점수는 높고, 과학 점수는 낮아지는 경향이 뚜렷합니다.
  • Naming: 언어 능력은 뛰어나지만 자연과학에는 약한 "어문 계열 성향(Linguistic Factor)"으로 정의할 수 있습니다.

분석가의 Insight: 요인분석에서 음수(-)가 나왔다고 당황하지 마세요! 이는 "서로 반대되는 성향"을 의미합니다. 즉, 이 데이터 속 학생들은 문과 성향이 강하면 이과 성향이 떨어지는 뚜렷한 대립 구조를 가지고 있습니다.

2. 다이어그램 (Diagram) 읽는 법

R의 fa.diagram이 그려준 그림은 위 해석을 시각적으로 증명해 줍니다.

 

  • MR1 (동그라미): Society와는 검은 실선(양의 관계)으로 연결되어 있고, Math와는 빨간 점선(음의 관계)으로 연결되어 있습니다.
  • MR2 (동그라미): English, Korean과는 검은 실선으로, Science와는 빨간 점선으로 강하게 연결되어 있습니다.
  • 선 위의 숫자: 우리가 위에서 본 요인 적재량(Loadings)입니다. 숫자가 클수록, 선이 굵을수록 영향력이 큽니다.

3. 설명력 (Variance) 확인

이 모델이 데이터를 얼마나 잘 설명하는지 성적표를 확인해 봅시다.

 

Cumulative Var (0.990):

  • 누적 설명력이 무려 99%입니다!
  • 원래 5개의 변수(국/영/수/사/과)가 가진 정보의 99%를 단 2개의 요인(MR1, MR2)만으로 완벽하게 설명해 냈습니다. 정보 손실이 거의 없는 매우 성공적인 차원 축소입니다.

[최종 정리] 요인분석(Factor Analysis)을 마치며

지금까지 우리는 5과목의 점수 데이터를 통해 요인분석을 수행했습니다. 과정을 요약하면 다음과 같습니다.

  1. 목표 설정: 겉으로 드러난 점수(변수)들 뒤에 숨겨진 '잠재 능력(Factor)'을 찾고 싶다.
  2. 분석 수행: R의 fa() 함수를 이용해 요인을 추출하고, 해석하기 쉽도록 varimax 회전을 적용했다.
  3. 결과 해석 (Naming):
    • Factor 1 $\rightarrow$ 사회 점수는 높고 수학은 낮은 '사회 계열 성향'
    • Factor 2 $\rightarrow$ 언어 점수는 높고 과학은 낮은 '어문 계열 성향'
  4. 검증: 누적 분산 비율(Cumulative Variance)이 99%로, 이 두 가지 요인만으로 학생들의 성적 패턴을 완벽히 설명할 수 있음을 확인했다.

이 기법을 병원 데이터에 적용한다면  수십 개의 혈액 검사 수치(변수)를 요인분석에 넣었을 때, '염증 반응 요인', '간 기능 저하 요인', '영양 결핍 요인' 같은 숨겨진 환자의 상태를 찾아낼 수 있습니다.

복잡한 변수의 숲에서 길을 잃지 않고 핵심 원인을 찾아내는 힘, 그것이 바로 요인분석입니다.

'Study Note > 통계' 카테고리의 다른 글

최적의 선택을 찾아라: 마르코프 의사결정 과정 (MDP)  (0) 2025.12.19
어제는 잊어라, 오직 오늘만 본다: 마르코프 연쇄 (Markov Chain)  (0) 2025.12.19
PCA 활용: 복잡한 데이터를 한눈에 보는 법 (차원 축소 & 시각화)  (0) 2025.12.18
차원 축소의 핵심, 주성분분석(PCA) 완벽 가이드  (0) 2025.12.18
정확도(Accuracy)의 함정: 민감도, 특이도, 그리고 베이즈 정리  (0) 2025.12.17
    'Study Note/통계' 카테고리의 다른 글
    • 최적의 선택을 찾아라: 마르코프 의사결정 과정 (MDP)
    • 어제는 잊어라, 오직 오늘만 본다: 마르코프 연쇄 (Markov Chain)
    • PCA 활용: 복잡한 데이터를 한눈에 보는 법 (차원 축소 & 시각화)
    • 차원 축소의 핵심, 주성분분석(PCA) 완벽 가이드
    RyanNerd
    RyanNerd
    라이언 덕후의 일상 스토리~

    티스토리툴바