데이터 변환 방법으로서
(3) 범주화
- 이산형화
- 이항변수화
(5) 차원 축소
- (5-2) 요인분석
의 6개 구분 중에서
등간척도(혹은 비율척도)로 측정한 두 개 이상의 다수의 변수들에 잠재되어 있는 공통인자를 찾아내는 (5-2) 요인분석(Factor Analysis)에 대해서 알아보겠습니다.
요인분석은 통계학자 Spearman이 학생들의 여러개의 시험 성적(예: Classic, French, English, Math...) 간에 상관관계 행렬을 보다가 "어떻게 하면 연관성있는 변수들을 묶어주는 내재하는 속성을 찾을 수 있을까?"를 가지고 고민하다가 유래되었다고 합니다.
요인분석을 왜 하는지에 대해서는 이전에 포스팅한 (5-1) 주성분분석의 초반부를 참고하시기 바랍니다. (바로가기 ☞ 주성분분석)
대신에 요인분석과 주성분분석의 공통점과 차이점에 대해서 정리한 다른 분의 블로그(http://ai-times.tistory.com/112) 내용을 소개하겠습니다.
요인분석 과 주성분분석의 관계는?
* 공통점
|
요인 추출 방법으로 주성분분석이 활용됩니다. 요인분석을 할 때 초기값 m을 어떻게 잡아주느냐에 따라서 계산 속도가 많이 영향을 받게 됩니다. 이때 보통은 반응변수들이 가지고 있는 변동량의 대부분들을 설명해줄 수 있는 고유값(eigenvalue)와 고객벡터(engenvector)의 수는 몇 개인가를 결정할 수 있는 주성분분석(Principal Component Analysis, PCA)를 활용해서 초기값 m을 잡게 됩니다. (지난 주성분분석 포스팅의 Scree Plot 참조)
[참고: 용어설명] - 요인점수 (Factor Score) : 각 관측치의 요인 점수는 요인 점수 계수(Standardized Scoring Coefficients)와 실제 (표준화된) 관측치의 값의 곱으로 구하며, 요인별로 이를 summation하면 요인별 요인점수가 됨. - 요인패턴 (Factor Loading) : 각 요인이 각 변수에 미치는 효과. 변수와 요인의 상관 행렬 - 공통 분산치 (Communality) : 요인에 의해 설명될 수 있는 변수의 분산량 - 요인회전 (Factor Rotation) : p개의 변수들을 m개의 요인(factor)로 묶어주기 편리하게 혹은 해석하기 쉽게하도록 축을 회전시키는 것. 직교회전에 varimax, transvarimax 등이 있고 비직교회전방법도 있으며, 보통 분산을 최대화하는 직교회전방법 varimax 를 많이 씀. |
한국신용평가정보에서 나온 '국내 증권회사의 주요 재무제표' (2007.3.31 기준)를 가지고 요인분석을 R로 해보도록 하겠습니다. (지난번 포스팅에서는 똑같은 데이터에 대해 주성분분석을 해보았습니다)
이 데이터는 18개 증권사별로 V1.총자본순이익율, V2.자기자본순이익율, V3.자기자본비율, V4.부채비율, V5.자기자본회전율 재무지표 변수로 구성되어 있습니다.
예제 데이터('국내 증권회사의 주요 재무제표' (2007.3.31 기준)) 다운로드 ☞
R로 외부 csv 데이터 불러오기, 표준화 변환, 부채비율 방향 변환, 변수 선택, 상관계수분석, 산포도행렬은 아래와 같습니다. (지난 포스팅 주성분분석 설명과 동일)
주성분분석처럼 요인분석도 변수별 scale 영향을 없애기 위해서 표준화(standardization)한 관측값을 사용합니다.
> # csv 파일 불러오기 (file importing) > secu_com_finance_2007 <- read.csv("C:/Users/user/Documents/R/secu_com_finance_2007.csv", + header = TRUE, + stringsAsFactors = FALSE) > # V1 : 총자본순이익율 > # V2 : 자기자본순이익율 > # V3 : 자기자본비율 > # V4 : 부채비율 > # V5 : 자기자본회전율 > > > # 표준화 변환 (standardization) > secu_com_finance_2007 <- transform(secu_com_finance_2007, + V1_s = scale(V1), + V2_s = scale(V2), + V3_s = scale(V3), + V4_s = scale(V4), + V5_s = scale(V5)) > > # 부채비율(V4_s)을 방향(max(V4_s)-V4_s) 변환 > secu_com_finance_2007 <- transform(secu_com_finance_2007, + V4_s2 = max(V4_s) - V4_s) > > # variable selection > secu_com_finance_2007_2 <- secu_com_finance_2007[,c("company", "V1_s", "V2_s", "V3_s", "V4_s2", "V5_s")] > > > # Correlation analysis > cor(secu_com_finance_2007_2[,-1]) V1_s V2_s V3_s V4_s2 V5_s V1_s 1.00000000 0.6165153 0.3239780 0.3553930 0.01387883 V2_s 0.61651527 1.0000000 -0.5124351 -0.4659444 0.42263462 V3_s 0.32397800 -0.5124351 1.0000000 0.9366296 -0.56340782 V4_s2 0.35539305 -0.4659444 0.9366296 1.0000000 -0.53954570 V5_s 0.01387883 0.4226346 -0.5634078 -0.5395457 1.00000000 > > round(cor(secu_com_finance_2007_2[,-1]), digits=3) # 반올림 V1_s V2_s V3_s V4_s2 V5_s V1_s 1.000 0.617 0.324 0.355 0.014 V2_s 0.617 1.000 -0.512 -0.466 0.423 V3_s 0.324 -0.512 1.000 0.937 -0.563 V4_s2 0.355 -0.466 0.937 1.000 -0.540 V5_s 0.014 0.423 -0.563 -0.540 1.000 > > > # Scatter plot matrix > plot(secu_com_finance_2007_2[,-1])
|
factanal()함수를 활용해서 R로 요인분석을 해보도록 하겠습니다.
- secu_com_finance_2007_2 : 데이터를 지정해주고 (표준화된 숫자형 변수들)
- factors = 2 : 요인의 개수 지정
- ratation = "varimax" : 회전방법 지정
- scores = "regression" : 요인점수 계산 방법 지정
해주면 되겠습니다.
지난번 포스팅의 주성분분석에서는 동일한 데이터로 했을 때 주성분을 3개(Scree plot 보고서 결정)로 해서 분석 결과 해석을 했었는데요,
> # Scree Plot
|
요인분석에서 요인 개수를 3개로 집어넣었더닌 변수 5개밖에 안되는데 요인을 3개씩이나 한다고 경고메시지가 뜨네요. ^^; 그래서 요인 2개로 집어넣었습니다.
> # 요인분석(maximum likelihood factor analysis) > # rotation = "varimax" > secu_factanal <- factanal(secu_com_finance_2007_2[,2:6], + factors = 2, + rotation = "varimax", # "varimax", "promax", "none" + scores="regression") # "regression", "Bartlett" > > print(secu_factanal) Call: factanal(x = secu_com_finance_2007_2[, 2:6], factors = 2, scores = "regression", rotation = "varimax") Uniquenesses: V1_s V2_s V3_s V4_s2 V5_s 0.005 0.026 0.036 0.083 0.660 Loadings: Factor1 Factor2 V1_s 0.252 0.965 V2_s -0.588 0.792 V3_s 0.979 V4_s2 0.950 0.120 V5_s -0.562 0.155 Factor1 Factor2 SS loadings 2.586 1.604 Proportion Var 0.517 0.321 Cumulative Var 0.517 0.838 Test of the hypothesis that 2 factors are sufficient. The chi square statistic is 1.59 on 1 degree of freedom. The p-value is 0.207
|
위에 Loadings 에 보면 Factor2의 V3_s가 숫자가 비어있는데요, 아래처럼 cutoff 를 조정해주면 모두 볼 수 있습니다.
> print(secu_factanal$loadings, cutoff=0) # display every loadings Loadings: Factor1 Factor2 V1_s 0.252 0.965 V2_s -0.588 0.792 V3_s 0.979 0.080 V4_s2 0.950 0.120 V5_s -0.562 0.155 Factor1 Factor2 SS loadings 2.586 1.604 Proportion Var 0.517 0.321 Cumulative Var 0.517 0.838 |
요인1(Factor1)은 자기자본비율(V3_s)과 (방햔변환 후의) 부채비율(V4_s2) 이 같이 묶였으며, 요인2(Factor2)는 총자본순이익율(V1_s)과 자기자본순이익율(V2_s)이 함께 묶었습니다. V5_s가 두 요인 중에서 어디에 속한다고 할지 좀 애매한데요, 요인1하고는 부호가 다르므로 요인2에 묶인다고 하겠습니다.
다음으로, 요인분석 Biplot을 그려보도록 하겠습니다. 주성분분석할 때는 prcomp() 함수로 분석하고 biplot()함수로 단 한번에 아주 쉽게 Biplot을 그렸었는데요, 요인분석에서는 biplot을 단번에 그릴 수 있는 함수를 못찾았습니다. (혹시 이 포스팅 보시는 분중에 요인분석 biplot 그릴 수 있는 패키지, 함수 알고 계신분은 댓글로 공유해주시면 감사하겠습니다. 미리 꾸벅~ ☞_☜)
> # factor scores plotting > secu_factanal$scores Factor1 Factor2 [1,] -1.01782141 -0.28535410 [2,] -0.17230586 0.08808775 [3,] -0.13294211 -0.71511403 [4,] -1.03557284 2.77950626 [5,] -0.34416962 -1.21841127 [6,] -0.01993668 0.44223954 [7,] -0.62177426 1.26909067 [8,] 1.79002399 0.28314793 [9,] 1.60353334 0.52158445 [10,] -0.55591603 -0.12331881 [11,] 0.55387868 -1.03939155 [12,] -0.93740279 -0.74332879 [13,] 0.45680247 0.06433085 [14,] -1.13490535 -0.63034122 [15,] 1.36209539 -0.98147959 [16,] 1.57141053 0.89812864 [17,] -0.56190944 0.38006982 [18,] -0.80308800 -0.98944656 > > plot(secu_factanal$scores, main="Biplot of the first 2 factors") >
> # 관측치별 이름 매핑(rownames mapping) > text(secu_factanal$scores[,1], secu_factanal$scores[,2], + labels = secu_com_finance_2007$company, + cex = 0.7, pos = 3, col = "blue") >
> # factor loadings plotting > points(secu_factanal$loadings, pch=19, col = "red") >
> # plotting lines between (0,0) and (factor loadings by Var.) > segments(0,0,secu_factanal$loadings[1,1], secu_factanal$loadings[1,2]) > segments(0,0,secu_factanal$loadings[2,1], secu_factanal$loadings[2,2]) > segments(0,0,secu_factanal$loadings[3,1], secu_factanal$loadings[3,2]) > segments(0,0,secu_factanal$loadings[4,1], secu_factanal$loadings[4,2]) > segments(0,0,secu_factanal$loadings[5,1], secu_factanal$loadings[5,2])
|
가로축 Factor1이 '안정성' (자기자본비율, 부채비율) 지표라고 했는데요, Factor1 축의 오른쪽에 위치한 한양증권, 브릿지증권, 부국증권, 유화증권사 등은 안정성이 높은 회사들이라고 해석할 수 있겠습니다.
(참고: Factor1 = 0.252*V1_s - 0.588*V2_s + 0.979*V3_s + 0.950*V4_s2 - 0.562*V5_s)
다음으로, 세로축 Factor2는 '수익성'(총자본순이익율, 자기자본순이익율, 자기자본회전율) 지표라고 했는데요, Factor2 축의 위쪽에 위치한 미래애셋증권, 한화증권, 메리츠증권, 교보증권, 삼성증권 등이 수익성이 양호한 증권사라고 해석할 수 있겠습니다.
(참고: Factor2 = 0.965*V1_s + 0.792*V2_s + 0.080*V3_s + 1.20*V4-s2 + 0.155*V5_s)
이처럼 요인분석을 활용하면 다수의 변수를 안정성과 수익성이라는 두 개의 축으로 차원을 축소해서 포지셔닝맵을 그려서 쉽게 전체 상황을 파악할 수 있겠습니다.
다음번 포스팅에서는 기계데이터, 신호데이터에서 나오는 신호를 압축 변환하는 방법에 대해서 알아보겠습니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^
'R 분석과 프로그래밍 > R 데이터 전처리' 카테고리의 다른 글
R 에서 SQL 사용 sqldf 패키지, 집계 aggregate() 함수 (3) | 2015.08.28 |
---|---|
R 데이터 변환 : (6) 시그널 데이터 변환 - FFT (Fast Fourier Transform) (9) | 2015.08.16 |
R 데이터 변환 : (5) 차원 축소 - (5-1) 주성분분석 (PCA) (59) | 2015.08.08 |
R 데이터 변환 : (4) 개수 축소 (Sampling) (14) | 2015.08.02 |
R 데이터 변환 : (3) 범주화 - (3-2) 이항변수화 (binarization), 더미변수(dummy variable) (10) | 2015.08.01 |