News & Events
이 튜토리얼에서는 요인 분석의 기초와 이를 파이썬으로 구현하는 방법을 배울 것이다.
요인 분석(Factor Analysis, FA)은 관측된 변수 집합에서 영향력 있는 기본 요인 또는 잠재 요인을 검색하는 데 사용되는 탐색적 데이터 분석 방법이다. 전체 데이터를 설명하는 변수의 수를 줄여 데이터 해석에 도움이 된다. 모든 변수에서 최대 공통 분산을 추출하여 공통 점수에 넣는다.
요인 분석은 시장 조사, 광고, 심리, 금융 및 운영 연구에 널리 사용된다. 마켓 리서처는 가격에 민감한 고객을 파악하고, 소비자 선택에 영향을 미치는 브랜드 특징을 식별하며, 유통 채널의 채널 선택 기준을 이해하는 데 도움을 준다.
이 튜토리얼에서는 다음과 같은 주제를 다룬다.
- 요인 분석
- 요인 분석 유형
- 요인 수 결정
- 요인 분석: 주성분 분석
- 파이썬의 요인 분석
- 적합성 검정
- 결과 해석
- 요인 분석의 장단점
- 결론
요인 분석(Factor Analysis)
요인 분석은 선형 통계 모형이다. 관측 변수 간의 분산을 설명하고 관측 변수 집합을 요인이라고 하는 관측되지 않은 변수로 압축하는 데 사용된다. 관측 변수는 요인 및 오차항(출처)의 선형 조합으로 모형화된다. 요인 또는 잠재 변수는 공통적인 반응 패턴을 갖는 여러 관측 변수와 관련이 있다. 각 요인은 관측된 변수의 특정 분산 양을 설명한다. 변수의 수를 줄여서 데이터 해석에 도움이 된다.
요인 분석은 관심 있는 변수 X1, X2,…. Xl이 관측할 수 없는 적은 수의 요인 F1, F2.……, Fk과 선형 관계에 있는지 여부를 조사하는 방법이다.
출처: 요인 분석 노트의 이미지에서 가공된 이미지이다. 영상에는 요인 분석의 전체 보기가 가능하다.
가정:
- 데이터에는 특이치가 없다.
- 표본 크기는 요인보다 커야 한다.
- 완벽한 다중 공선성은 없어야 한다.
- 변수들 사이에 동질성이 있어서는 안 된다.
요인 분석 유형
- 탐색적 요인 분석: 사회 및 경영 연구에 주로 사용되는 요인 분석 접근법이다. 기본적인 가정은 관측 변수가 어떤 요인과 직접적으로 연관되어 있다는 것이다.
- 확인적 요인 분석(CFA): 기본 가정은 각 요인이 특정 관측 변수 집합과 연관되어 있다는 것이다. CFA는 기본적으로 기대되는 것을 확인한다.
요인 분석은 어떻게 작동할까?
요인 분석의 주요 목적은 관측 변수의 수를 줄이고 관측할 수 없는 변수를 찾는 것이다. 이러한 관측되지 않은 변수는 시장 리서처가 조사를 마무리하는 데 도움이 된다. 관측 변수를 관측되지 않은 변수로 변환하는 작업은 두 가지 단계를 통해 수행할 수 있다.
- 요인 추출: 이 단계에서는 주성분 분석 및 공통 요인 분석과 같은 분산 분할 방법을 사용하여 선택된 요인 수 및 추출 방법을 사용한다.
- 요인 회전: 이 단계에서 회전은 요인을 상관 관계가 없는 요인으로 변환하려고 시도한다. 이 단계의 목표는 전체적인 해석 능력을 향상시키기 위한 것이다. 회전 방법에는 Varimax 회전 방법, Quartimax 회전 방법, Promax 회전 방법 등이 있다.
용어.
요인이란 무엇인가?
요인은 관측된 변수의 수 사이의 연관성을 설명하는 잠재 변수이다. 요인의 최대 수는 관측된 변수의 수와 같다. 모든 요인은 관측된 변수의 특정 분산을 설명한다. 분산의 양이 가장 적은 요인은 제거된다. 요인은 잠재 변수 또는 숨겨진 변수 또는 관측되지 않은 변수 또는 가상 변수라고도 한다.
요인 적재량이란?
요인 적재량은 각 변수와 잠재 요인과의 관계를 보여주는 행렬이다. 관측된 변수와 요인에 대한 상관 계수가 표시된다. 관측된 변수에 의해 설명되는 분산을 보여준다.
고유값이란?
고유값은 전체 분산에서 각 요인을 설명한다.
공통분이란?
공통분은 각 변수의 적재량 제곱의 합이다. 이것은 공통 분산을 나타낸다. 범위는 0-1이고 1에 가까운 값은 더 많은 분산을 나타낸다.
요인 회전이란?
회전은 요인 분석을 더 잘 해석하기 위한 도구이다. 회전은 직각 또는 사선일 수 있다. 명확한 적재량 패턴으로 공통분을 재배포한다.
요인 수 선택
카이저 기준은 분석적 접근법으로, 요인별로 설명되는 더 유의미한 분산 비율을 기준으로 선택한다. 고유값은 요인 수를 결정하는 데 좋은 기준이다. 일반적으로 1보다 큰 고유값은 피쳐의 선택 기준으로 간주된다.
그래픽 접근법은 스크리 플롯이라고도 하는 요인의 고유값을 시각적으로 표현한 것에 기초한다. 이 스크리 그림은 곡선이 엘보우를 만드는 요인의 수를 결정하는 데 도움이 된다.
요인 분석 vs 주성분 분석(PCA)
- PCA는 최대 분산 양을 설명하는 반면 요인 분석은 데이터의 공분산을 설명한다.
- PCA는 서로 완전히 직교하지만 요인 분석에서는 요인이 직교할 필요가 없다.
- PCA는 관측된 변수의 선형 조합인 반면 요인 분석에서 관측된 변수는 관측되지 않은 변수 또는 요인의 선형 조합이다.
- PCA 구성 요소는 해석할 수 없는 반면 요인 분석에서 기본 요인은 레이블링 및 해석 가능하다.
- PCA는 일종의 차원 축소 방법인 반면 요인 분석은 잠재 변수 방법이다.
- PCA는 요인 분석의 한 유형이다. FA는 모델링 기술인 반면 PCA는 관찰 기술이다.
factor_analyzer 패키지를 이용한 파이썬의 요인 분석
필수 라이브러리 가져오기
# Import required libraries
import pandas as pd
from sklearn.datasets import load_iris
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
데이터 로드
매우 부정확 1점, 약간 부정확 2점, 약간 정확 3점, 중간 정확 5점, 매우 정확 6점의 응답 척도를 사용하여 수집된 BFI(인성 평가 프로젝트 기반 데이터 세트)에 대한 인자 분석을 수행해보자. 다음 링크에서도 이 데이터 세트를 다운로드할 수 있다.
https://vincentarelbundock.github.io/Rdatasets/datasets.html
df= pd.read_csv(“bfi.csv”)
데이터 전처리
df.columns
Index([‘A1’, ‘A2’, ‘A3’, ‘A4’, ‘A5’, ‘C1’, ‘C2’, ‘C3’, ‘C4’, ‘C5’, ‘E1’, ‘E2’,
‘E3’, ‘E4’, ‘E5’, ‘N1’, ‘N2’, ‘N3’, ‘N4’, ‘N5’, ‘O1’, ‘O2’, ‘O3’, ‘O4’,
‘O5’, ‘gender’, ‘education’, ‘age’],
dtype=’object’)
# Dropping unnecessary columns
df.drop([‘gender’, ‘education’, ‘age’],axis=1,inplace=True)
# Dropping missing values rows
df.dropna(inplace=True)
df.info()
<class ‘pandas.core.frame.DataFrame’>
Int64Index: 2436 entries, 0 to 2799
Data columns (total 25 columns):
A1 2436 non-null float64
A2 2436 non-null float64
A3 2436 non-null float64
A4 2436 non-null float64
A5 2436 non-null float64
C1 2436 non-null float64
C2 2436 non-null float64
C3 2436 non-null float64
C4 2436 non-null float64
C5 2436 non-null float64
E1 2436 non-null float64
E2 2436 non-null float64
E3 2436 non-null float64
E4 2436 non-null float64
E5 2436 non-null float64
N1 2436 non-null float64
N2 2436 non-null float64
N3 2436 non-null float64
N4 2436 non-null float64
N5 2436 non-null float64
O1 2436 non-null float64
O2 2436 non-null int64
O3 2436 non-null float64
O4 2436 non-null float64
O5 2436 non-null float64
dtypes: float64(24), int64(1)
memory usage: 494.8 KB
df.head()
A1 | A2 | A3 | A4 | A5 | C1 | C2 | C3 | C4 | C5 | … | N1 | N2 | N3 | N4 | N5 | O1 | O2 | O3 | O4 | O5 | |
0 | 2.0 | 4.0 | 3.0 | 4.0 | 4.0 | 2.0 | 3.0 | 3.0 | 4.0 | 4.0 | … | 3.0 | 4.0 | 2.0 | 2.0 | 3.0 | 3.0 | 6 | 3.0 | 4.0 | 3.0 |
1 | 2.0 | 4.0 | 5.0 | 2.0 | 5.0 | 5.0 | 4.0 | 4.0 | 3.0 | 4.0 | … | 3.0 | 3.0 | 3.0 | 5.0 | 5.0 | 4.0 | 2 | 4.0 | 3.0 | 3.0 |
2 | 5.0 | 4.0 | 5.0 | 4.0 | 4.0 | 4.0 | 5.0 | 4.0 | 2.0 | 5.0 | … | 4.0 | 5.0 | 4.0 | 2.0 | 3.0 | 4.0 | 2 | 5.0 | 5.0 | 2.0 |
3 | 4.0 | 4.0 | 6.0 | 5.0 | 5.0 | 4.0 | 4.0 | 3.0 | 5.0 | 5.0 | … | 2.0 | 5.0 | 2.0 | 4.0 | 1.0 | 3.0 | 3 | 4.0 | 3.0 | 5.0 |
4 | 2.0 | 3.0 | 3.0 | 4.0 | 5.0 | 4.0 | 4.0 | 5.0 | 3.0 | 2.0 | … | 2.0 | 3.0 | 4.0 | 4.0 | 3.0 | 3.0 | 3 | 4.0 | 3.0 | 3.0 |
5행 × 25열
적합성 검정
요인 분석을 수행하기 전에 데이터 세트의 “인자 가능성”을 평가해야 합니다. 요인 분석 가능성은 “데이터 세트에서 요인을 찾을 수 있는가?”를 의미한다. 요인 분석 가능성 또는 표본 추출 적합성을 확인하는 두 가지 방법이 있다.
- 바틀렛 테스트
- KMO(Kaiser-Meyer-Olkin) 테스트
바틀렛의 구면성 검정에서는 관측된 상관 행렬을 사용하여 관측된 변수가 단위 행렬과 상호 관련되는지 여부를 확인한다. 검정에서 통계적으로 유의하지 않은 것으로 판명되면 요인 분석을 사용하지 말아야 한다.
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value,p_value=calculate_bartlett_sphericity(df)
chi_square_value, p_value
(18146.065577234807, 0.0)
바틀렛의 구면성 검정에서는 관측된 상관 행렬을 사용하여 관측된 변수가 단위 행렬과 상호 관련되는지 여부를 확인한다. 검정에서 통계적으로 유의하지 않은 것으로 판명되면 요인 분석을 사용하지 말아야 한다.
KMO(Kaiser-Meyer-Olkin) 검정은 요인 분석에 대한 데이터의 적합성을 측정한다. 각 관측 변수와 전체 모형에 대한 적합성을 결정한다. KMO는 모든 관측 변수 간의 분산 비율을 추정한다. KMO 값의 범위는 0에서 1 사이이다. 0.6 미만의 KMO 값은 부적합한 것으로 간주된다.
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_model
0.8486452309468382
우리 데이터의 전체 KMO는 0.84로 훌륭하다. 이 값은 요인 분석을 계속할 수 있음을 나타낸다.
요인 수 선택
요인 수를 선택하는 데 카이저 기준과 스크리 플랏을 사용할 수 있다. 둘 다 고유값을 기반으로 한다.
# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 25, rotation=None)
# Check Eigenvalues
ev, v = fa.get_eigenvalues()
ev
Original_Eigenvalues | |
0 | 5.134311 |
1 | 2.751887 |
2 | 2.142702 |
3 | 1.852328 |
4 | 1.548163 |
5 | 1.073582 |
6 | 0.839539 |
7 | 0.799206 |
8 | 0.718989 |
9 | 0.688089 |
10 | 0.676373 |
11 | 0.651800 |
12 | 0.623253 |
13 | 0.596563 |
14 | 0.563091 |
15 | 0.543305 |
16 | 0.514518 |
17 | 0.494503 |
18 | 0.482640 |
19 | 0.448921 |
20 | 0.423366 |
21 | 0.400671 |
22 | 0.387804 |
23 | 0.381857 |
24 | 0.262539 |
여기서는 요인 6개의 고유값만이 1보다 큰 것을 볼 수 있다. 즉, 6개의 요인(또는 관측되지 않은 변수)만 선택해야 한다.
# Create scree plot using matplotlib
plt.scatter(range(1,df.shape[1]+1),ev)
plt.plot(range(1,df.shape[1]+1),ev)
plt.title(‘Scree Plot’)
plt.xlabel(‘Factors’)
plt.ylabel(‘Eigenvalue’)
plt.grid()
plt.show()
스크리 플랏 방법은 각 요인과 고유값에 대해 직선을 그린다. 요인 수로 간주되는 고유값 수가 1보다 크다.
여기서도 요인 6개의 고유값이 1보다 큰 것을 볼 수 있다. 즉, 6개의 요인(또는 관측되지 않은 변수)만 선택해야 한다.
요인 분석 수행
# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 6, rotation=”varimax”)
fa.loadings
Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | Factor6 | |
A1 | 0.040783 | 0.095220 | 0.048734 | -0.113057 | -0.530987 | 0.161216 |
A2 | 0.235538 | 0.033131 | 0.133714 | 0.063734 | 0.661141 | -0.006244 |
A3 | 0.343008 | -0.009621 | 0.121353 | 0.033990 | 0.605933 | 0.160106 |
A4 | 0.219717 | -0.081518 | 0.235140 | -0.125338 | 0.404594 | 0.086356 |
A5 | 0.414458 | -0.149616 | 0.106382 | 0.030977 | 0.469698 | 0.236519 |
C1 | 0.077248 | -0.004358 | 0.554582 | 0.190124 | 0.007511 | 0.095035 |
C2 | 0.038370 | 0.068330 | 0.674545 | 0.087593 | 0.057055 | 0.152775 |
C3 | 0.031867 | -0.039994 | 0.551164 | -0.011338 | 0.101282 | 0.008996 |
C4 | -0.066241 | 0.216283 | -0.638475 | -0.143846 | -0.102617 | 0.318359 |
C5 | -0.180812 | 0.284187 | -0.544838 | 0.025837 | -0.059955 | 0.132423 |
E1 | -0.590451 | 0.022280 | 0.053915 | -0.071205 | -0.130851 | 0.156583 |
E2 | -0.684578 | 0.233624 | -0.088497 | -0.045561 | -0.116716 | 0.115065 |
E3 | 0.556774 | -0.000895 | 0.103390 | 0.241180 | 0.179396 | 0.267291 |
E4 | 0.658395 | -0.136788 | 0.113798 | -0.107808 | 0.241143 | 0.158513 |
E5 | 0.507535 | 0.034490 | 0.309813 | 0.200821 | 0.078804 | 0.008747 |
N1 | 0.068011 | 0.805806 | -0.051264 | -0.074977 | -0.174849 | -0.096266 |
N2 | 0.022958 | 0.789832 | -0.037477 | 0.006726 | -0.141134 | -0.139823 |
N3 | -0.065687 | 0.725081 | -0.059039 | -0.010664 | -0.019184 | 0.062495 |
N4 | -0.345072 | 0.578319 | -0.162174 | 0.062916 | 0.000403 | 0.147551 |
N5 | -0.161675 | 0.523097 | -0.025305 | -0.161892 | 0.090125 | 0.120049 |
O1 | 0.225339 | -0.020004 | 0.133201 | 0.479477 | 0.005178 | 0.218690 |
O2 | -0.001982 | 0.156230 | -0.086047 | -0.496640 | 0.043989 | 0.134693 |
O3 | 0.325954 | 0.011851 | 0.093880 | 0.566128 | 0.076642 | 0.210777 |
O4 | -0.177746 | 0.207281 | -0.005671 | 0.349227 | 0.133656 | 0.178068 |
O5 | -0.014221 | 0.063234 | -0.047059 | -0.576743 | -0.057561 | 0.135936 |
- 요인 1의 E1, E2, E3, E4 및 E5에 대한 요인 적재량이 높다(Extraversion).
- 요인 2는 N1, N2, N3, N4 및 N5에 대해 높은 요인 적재량를 갖는다(Neuroticism).
- 요인 3의 C1, C2, C3, C4 및 C5에 대한 높은 요인 적재랑이 있다(Conscientiousness).
- 요인 4는 O1, O2, O3, O4 및 O5에 대한 요인 적재량이 높다. (Opennness)
- 요인 5는 A1, A2, A3, A4 및 A5에 대해 높은 요인 적재량을 갖는다(Agreeableness).
- 요인 6은 변수에 대해 높은 로깅이 없으며 쉽게 해석할 수 없다. 다섯 가지 요소만 취해도 좋다.
5개 요인에 대해 요인 분석을 수행해보자.
# Create factor analysis object and perform factor analysis using 5 factors
fa = FactorAnalyzer()
fa.analyze(df, 5, rotation=”varimax”)
fa.loadings
Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | |
A1 | 0.040465 | 0.111126 | 0.022798 | -0.077931 | -0.428166 |
A2 | 0.213716 | 0.029588 | 0.139037 | 0.062139 | 0.626946 |
A3 | 0.317848 | 0.009357 | 0.109331 | 0.056196 | 0.650743 |
A4 | 0.204566 | -0.066476 | 0.230584 | -0.112700 | 0.435624 |
A5 | 0.393034 | -0.122113 | 0.087869 | 0.066708 | 0.537087 |
C1 | 0.070184 | 0.010416 | 0.545824 | 0.209584 | 0.038878 |
C2 | 0.033270 | 0.089574 | 0.648731 | 0.115434 | 0.102782 |
C3 | 0.023907 | -0.030855 | 0.557036 | -0.005183 | 0.111578 |
C4 | -0.064984 | 0.240410 | -0.633806 | -0.107535 | -0.037498 |
C5 | -0.176395 | 0.290318 | -0.562467 | 0.036822 | -0.047525 |
E1 | -0.574835 | 0.042819 | 0.033144 | -0.058795 | -0.104813 |
E2 | -0.678731 | 0.244743 | -0.102483 | -0.042010 | -0.112517 |
E3 | 0.536816 | 0.024180 | 0.083010 | 0.280877 | 0.257906 |
E4 | 0.646833 | -0.115614 | 0.102023 | -0.073422 | 0.306101 |
E5 | 0.504069 | 0.036145 | 0.312899 | 0.213739 | 0.090354 |
N1 | 0.078923 | 0.786807 | -0.045997 | -0.084704 | -0.216363 |
N2 | 0.027301 | 0.754109 | -0.030568 | -0.010304 | -0.193744 |
N3 | -0.061430 | 0.731721 | -0.067084 | -0.004217 | -0.027712 |
N4 | -0.345388 | 0.590602 | -0.178902 | 0.075225 | 0.005886 |
N5 | -0.161291 | 0.537858 | -0.037309 | -0.149769 | 0.100931 |
O1 | 0.213005 | -0.002224 | 0.115080 | 0.504907 | 0.061550 |
O2 | 0.004560 | 0.175788 | -0.099729 | -0.468925 | 0.081809 |
O3 | 0.310956 | 0.026736 | 0.076873 | 0.596007 | 0.126889 |
O4 | -0.191196 | 0.220582 | -0.021906 | 0.369012 | 0.155475 |
O5 | -0.005347 | 0.085401 | -0.062730 | -0.533778 | -0.010384 |
# Get variance of each factors
fa.get_factor_variance()
Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | |
SS Loadings | 2.473090 | 2.709633 | 2.041106 | 1.522153 | 1.844498 |
Proportion Var | 0.098924 | 0.108385 | 0.081644 | 0.060886 | 0.073780 |
Cumulative Var | 0.098924 | 0.207309 | 0.288953 | 0.349839 | 0.423619 |
5가지 요인에 의해 설명되는 총 42%의 누적 분산이다.
요인 분석의 장단점
요인 분석은 대규모 데이터 세트를 탐색하고 상호 연결된 연관성을 찾는다. 관찰된 변수를 관찰되지 않은 몇 가지 변수로 축소하거나 상호 관련 변수 그룹을 식별하여 시장 리서처가 시장 상황을 압축하고 소비자 취향, 선호도 및 문화적 영향 사이의 숨겨진 관계를 찾는 데 도움이 된다. 또한 향후 설문조사를 위한 설문지 개선에도 도움이 된다. 요인은 더 자연스러운 데이터 해석을 가능하게 한다.
요인 분석의 결과는 논란의 여지가 있다. 둘 이상의 해석이 동일한 데이터 요인으로 이루어질 수 있기 때문에 해석은 논쟁의 여지가 있을 수 있다. 요인 식별 및 요인 이름 지정 후 도메인 지식이 필요하다.
결론
이 튜토리얼에서는 요인 분석이 무엇인지 배웠다. 요인 분석의 다양한 유형, 요인 분석의 작동 방식, 기본 요인 분석 용어, 요인 수 선택, 주성분 분석과 요인 분석의 비교, 요인 분석 패키지를 사용한 파이썬에서의 구현, 요인 분석의 장단점 등을 살펴보았다.
Python의 요인 분석에 대해 자세히 알아보려면 DataCamp의 Python 비지도 학습 과정을 수강하는 것을 추천한다.
번역 – 핀인사이트 인턴연구원 강지윤(shety0427@gmail.com)
원문 보러가기>
https://www.datacamp.com/community/tutorials/introduction-factor-analysis
오늘 배운 요인 분석은 [동영상] 요인모형과 포트폴리오 및 딥러닝과 요인모형
강의를 통해 심화하여 학습할 수 있습니다.
뿐만 아니라 금융 시계열 분석, Tensorflow, 회귀분석, 인공신경망과 딥러닝, Generative Adversarial Nets (GAN), Recurrent Neural Network (RNN), Convolutional Neural Network (CNN), Labeling, 주가 시계열 시뮬레이션, 강화 학습과 Deep Q-Network (DQN)에 대한 모든 내용들을 배워보실 수 있습니다.