1. 요인분석의 이론적 이해
1. 요인분석 개요 및 목적
- 정의: 여러 변수들의 **상관관계**를 바탕으로, 서로 관련성이 높은 변수들을 묶어 몇 개의 공통된 요인으로 축약하는 통계 기법
- 필요성
- 변수가 많을 때 복잡한 데이터를 단순화
- 중요한 숨겨진 구조(잠재 요인)를 발견 가능
- 활용 예시
- 소비자 만족도 조사(가격, 품질, 디자인 → "제품만족 요인")
- 직무태도 조사(급여, 승진, 복지 → "직무만족 요인")
2. 요인분석에 필요한 자료 조건
- **측정 수준**
- 변수가 **등간척도/비율척도**여야 함
- 설문에서는 주로 **5점 척도, 7점 척도** 자료 활용
- **변수 간 상관관계**
- 요인분석은 상관관계를 기반으로 하기 때문에, 변수들 사이에 일정 수준의 상관성이 있어야 함
- **적합성 검정**
- **KMO(Kaiser-Meyer-Olkin) 지수**: 표본 적합성 측정 (0.6 이상 권장)
- **Bartlett의 구형성 검정**: 상관행렬이 단위행렬과 다른지 확인 → p < 0.05면 요인분석 가능
👉 Python에서도 `factor_analyzer` 패키지로 KMO와 Bartlett 검정을 수행할 수 있음
3. 요인 추출과 분산 개념
- **총 분산의 분해**
- **고유분산(Unique variance)**: 해당 변수만이 가진 특수한 분산
- **공통분산(Common variance)**: 요인과 공유하는 부분
- **오차분산(Error variance)**: 측정 오류
- **요인 추출 방법**
- **주성분분석(PCA, Principal Component Analysis)**
- 변수들의 총 분산을 최대한 설명하는 요인 추출
- 가장 널리 사용됨
- **공통요인분석(CFA, Common Factor Analysis)**
- 변수들 간의 공통된 분산만을 추출
- 이론적 연구에서 자주 활용
- **주성분분석(PCA, Principal Component Analysis)**
✅ 수업 정리
- 요인분석은 **변수 축약과 잠재 요인 발견**에 유용
- 자료 조건: 척도(등간/비율), 변수 간 상관관계 필요
- 적합성 검정: **KMO, Bartlett 검정**으로 가능 여부 확인
- 요인 추출 방법: **PCA(실무에 많이 사용)**, **CFA(이론 연구에 활용)**
2. 요인의 수 결정 및 회전
1. 요인의 수 결정 방법
- **고유값(Eigenvalue) 기준**
- 요인 적재량 제곱합 = 고유값
- 일반적으로 **고유값 ≥ 1**인 요인만 추출
- 고유값이 클수록 → 변수들의 분산 설명력이 큼
- **스크리 도표(Scree Plot)**
- 요인 수에 따른 고유값을 그래프로 나타냄
- 그래프가 급격히 감소하다가 완만해지는 “팔꿈치 지점(elbow point)”에서 요인 수 결정
- **전체 설명력 기준**
- 사회과학 연구에서는 전체 분산 설명력이 **60% 이상**이면 적절
- 예: 요인 3개를 추출했을 때 누적 설명력이 65% → 적절한 모형
👉 **요인 수 결정은 단일 기준이 아니라, 고유값·스크리 도표·설명력 세 가지를 종합적으로 고려**
2. 요인의 회전
- **필요성**
- 추출된 요인과 원래 변수의 관계를 명확히 파악하기 위함
- 회전 후 요인 적재량(loading)이 더 극명해져 해석 용이
- **회전 방법**
- **직각 회전 (Orthogonal Rotation)**
- 요인 간 **독립성 유지**
- 대표 방법: **Varimax**
- 장점: 해석이 단순, 요인 간 중복 없음
- 단점: 실제 현상에서 요인들이 완전히 독립적일 가능성은 낮음
- **비직각 회전 (Oblique Rotation)**
- 요인 간 **상관 허용**
- 대표 방법: **Promax**
- 장점: 현실적, 사회과학 데이터 적합
- 단점: 해석이 다소 복잡
- **직각 회전 (Orthogonal Rotation)**
✅ 수업 정리 & 토론
- **정리**
- 요인의 수 결정 → 고유값 ≥ 1, 스크리 도표, 누적 설명력 기준 활용
- 요인 회전 → Varimax(독립), Promax(상관 허용)
- **토론 질문**
- 연구 데이터에서 요인이 서로 독립적이지 않은 경우, 어떤 회전 방법을 선택해야 할까?
- 스크리 도표에서 명확한 “팔꿈치”가 보이지 않는다면 어떤 기준으로 요인 수를 정할 수 있을까?
3. Python 실습: 요인분석
0) 패키지
!pip -q install factor_analyzer
1) 데이터·검정·표준화
import pandas as pd, numpy as np, matplotlib.pyplot as plt
from factor_analyzer import FactorAnalyzer
from factor_analyzer.factor_analyzer import calculate_kmo, calculate_bartlett_sphericity
from sklearn.preprocessing import StandardScaler
# 1) 가상 데이터 (10문항, 5점 척도)
df = pd.DataFrame({
'급여':[4,5,3,4,2,5,4,3,5,4],
'직장안정성':[5,5,4,5,3,4,5,4,4,5],
'회사규모':[3,4,4,4,2,3,3,5,4,4],
'전공관련성':[2,3,5,4,5,2,3,5,4,3],
'업무내용':[3,4,5,5,4,3,4,5,5,4],
'발전가능성':[2,3,5,5,4,2,3,5,5,4],
'미래전망':[4,5,5,4,5,4,5,5,4,5],
'근로시간':[5,4,2,3,2,5,4,3,2,3],
'근무환경':[4,5,3,4,3,5,5,4,3,4],
'출퇴근거리':[5,4,2,3,2,4,3,2,3,4]
})
# 2) 요인분석 적합성: KMO & Bartlett
kmo_all, kmo_model = calculate_kmo(df)
chi2, p_bart = calculate_bartlett_sphericity(df)
print(f"KMO = {kmo_model:.2f} (권장: ≥0.60)")
print(f"Bartlett p = {p_bart:.4f} (권장: <0.05)")
# 3) 표준화(권장)
Z = pd.DataFrame(StandardScaler().fit_transform(df), columns=df.columns)
2) 고유값·스크리 플롯(요인 수 결정)
# 초기 요인 수 넉넉하게 넣어 고유값 확인
fa0 = FactorAnalyzer(n_factors=df.shape[1], rotation=None)
fa0.fit(Z)
eigs, _ = fa0.get_eigenvalues()
print("\n[고유값]")
for i, ev in enumerate(eigs, start=1):
print(f"요인{i}: {ev:.3f}")
# 스크리 플롯
plt.figure(figsize=(7,5))
plt.plot(range(1, len(eigs)+1), eigs, marker='o')
plt.axhline(1, ls='--', c='gray') # Kaiser 기준선
plt.title("Scree Plot")
plt.xlabel("요인 순서")
plt.ylabel("고유값")
plt.grid(True)
plt.show()
# Kaiser 기준(고유값≥1) 가정: 예시로 3개 선택
n_factors = 3
3) 회전 및 결과표(Varimax/Promax 비교)
# 1) Varimax(직각 회전: 요인 독립 가정)
fa_v = FactorAnalyzer(n_factors=n_factors, rotation='varimax')
fa_v.fit(Z)
# 2) Promax(비직각 회전: 요인 상관 허용)
fa_p = FactorAnalyzer(n_factors=n_factors, rotation='promax')
fa_p.fit(Z)
def tidy_results(fa, name):
load = pd.DataFrame(fa.loadings_, index=Z.columns,
columns=[f"{name}_요인{i+1}" for i in range(n_factors)])
comm = pd.Series(fa.get_communalities(), index=Z.columns, name=f"{name}_공통성")
var = pd.DataFrame({
'고유값': fa.get_factor_variance()[0],
'비율': fa.get_factor_variance()[1],
'누적비율': fa.get_factor_variance()[2]
}, index=[f"{name}_요인{i+1}" for i in range(n_factors)])
return load, comm, var
load_v, comm_v, var_v = tidy_results(fa_v, "Varimax")
load_p, comm_p, var_p = tidy_results(fa_p, "Promax")
print("\n[Varimax 적재량]")
print(load_v.round(3))
print("\n[Varimax 공통성]")
print(comm_v.round(3))
print("\n[Varimax 설명력]")
print(var_v.round(3))
print("\n[Promax 적재량]")
print(load_p.round(3))
print("\n[Promax 공통성]")
print(comm_p.round(3))
print("\n[Promax 설명력]")
print(var_p.round(3))
해석 체크리스트
- **적재량(loading)** 기준: 일반적으로 |loading| ≥ **0.40**를 “의미 있음”으로 봄
- **교차적재**: 한 문항이 2개 이상 요인에 0.40 이상 적재하면 **구조 모호** → 문항 수정/삭제 고려
- **공통성(communalities)**: 문항이 요인들로 설명되는 비율(권장 **≥ 0.40**)
- **누적 설명력**: 사회과학 맥락에서 **≥ 60%**면 보통 양호
4) 요인점수 산출 & 해석(이름 붙이기)
# 요인점수(관찰치별 요인 수준) 계산
# factor_analyzer는 점수 추정을 내부적으로 수행(회귀법). transform 사용.
scores_v = pd.DataFrame(fa_v.transform(Z), columns=[f"F{i+1}_V" for i in range(n_factors)])
scores_p = pd.DataFrame(fa_p.transform(Z), columns=[f"F{i+1}_P" for i in range(n_factors)])
print("\n[요인점수(Varimax) 상위 3행]")
print(scores_v.head(3).round(3))
요인 명명 가이드(예시)
- **요인1**: ‘급여, 직장안정성, 회사규모’가 높게 적재 → **“일자리 특성”**
- **요인2**: ‘전공관련성, 업무내용, 발전가능성, 미래전망’ → **“직무 내용/발전”**
- **요인3**: ‘근로시간, 근무환경, 출퇴근거리’ → **“근로 조건”**
수업 마무리(요약 & 팁)
- **요인 수 결정**: 고유값(≥1), 스크리 플롯, 누적 설명력(≥60%)을 **종합 판단**
- **회전 선택**:
- 요인 독립 가정 → **Varimax**
- 요인 상관 허용(현실적) → **Promax**
- **품질 기준**: 적재량≥0.40, 공통성≥0.40, 교차적재 지양
- **주의**: 본 예시는 n=10으로 **실증 연구에 부적합**. 실제 분석에선 표본을 충분히 확보하세요(문항 수×5~10명+).
(선택 과제) 더 탄탄하게 만들기
- **평행분석(Parallel Analysis)**로 요인 수를 더 보수적으로 결정
- Promax 회전 시 **요인 간 상관행렬**까지 확인
- 신뢰도(크론바흐 α)로 요인별 내부일관성 검토 → 하위척도 구성
4. 질의응답 및 요약
1. 최종 정리
요인분석의 목적
- 여러 변수의 **상관관계 구조**를 바탕으로 공통된 요인으로 축약
- 복잡한 데이터를 단순화하고 **잠재 요인**을 파악
- 연구·실무에서 **설문조사 분석, 척도 개발, 시장세분화** 등에 활용
요인분석 과정 복습
- **적합성 검정**
- KMO ≥ 0.6, Bartlett p < 0.05 → 요인분석 가능
- **요인 수 결정**
- 고유값 ≥ 1, Scree Plot “팔꿈치 지점”, 누적 설명력 ≥ 60%
- **요인 회전**
- Varimax(직각): 요인 독립 가정
- Promax(비직각): 요인 간 상관 허용
- **결과 해석**
- 요인 적재량 ≥ 0.4 의미 있음
- 교차적재 피하기, 공통성 ≥ 0.4 권장
- **요인 명명**
- 적재량 패턴을 보고 요인에 의미 있는 이름 부여
Python 실습 핵심
- `factor_analyzer`로 KMO, Bartlett, 요인분석 수행
- `get_eigenvalues()` → 고유값 확인, Scree Plot 작성
- `rotation='varimax'` 또는 `'promax'`로 회전
- 결과: 요인 적재량, 공통성, 누적 설명력, 요인점수 계산
2. 질의응답
- **예상 질문 예시**
- “요인 수가 애매할 때 어떤 기준을 더 신뢰해야 하나요?”
→ 평행분석(Parallel Analysis) 같은 추가 검정 권장 - “Varimax와 Promax 중 언제 무엇을 쓰나요?”
→ 요인 간 상관을 허용할지 여부에 따라 선택 - “적재량이 0.3~0.4인 문항은 어떻게 처리하나요?”
→ 연구 목적에 따라 삭제·수정 검토, 크론바흐 α 신뢰도 확인
- “요인 수가 애매할 때 어떤 기준을 더 신뢰해야 하나요?”