데이터 변환 방법으로서
(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) (8) | 2015.08.16 |
R 데이터변환 : (5) 차원 축소 - (5-2) 요인분석(factor analysis) (8) | 2015.08.08 |
R 데이터 변환 : (5) 차원 축소 - (5-1) 주성분분석 (PCA) (58) | 2015.08.08 |
R 데이터 변환 : (4) 개수 축소 (Sampling) (6) | 2015.08.02 |
R 데이터 변환 : (3) 범주화 - (3-2) 이항변수화 (binarization), 더미변수(dummy variable) (10) | 2015.08.01 |
댓글을 달아 주세요
블로그 잘 보고 있습니다.
하지만 요인분석 시 베리멕스는 요인 간 상관을 0으로 제약한 방식이기 때문에 요인 구조를 적절하게 나타내지 못합니다(왜냐면 요인을 뽑는다는 것 자체가 또 다른 공통된 상위 요인을 가지고 있는 경우가 많아 상관이 안 생길 수가 없음. 요인분석이 주성분 분석과 완전히 다른 이유이기도 함).
처음 요인분석이 발전할 때, 계산 기술의 한계로 요인 상관을 제약할 수밖에 없었는데, 이제는 전혀 문제가 되지 않기 때문에, 베리멕스가 아닌 오블리민(사각회전)을 주로 사용합니다.
혹시 이 블로그를 오시는 많은 분들이 잘못생각하실 것 같아 적습니다.
r 포스팅 감사합니다.
pagas님, 좋은 댓글 감사합니다.
저도 덕분에 배웠습니다.
괜찮으시다면 댓글에 남겨주신 내용을 여러 사람들이 보고 참고할 수 있도록 블로그 본문에 인용해서 써넣어도 될런지요?
좋은 정보 다시 한번 감사드려요.
안녕하세요. 블로그 글 잘 보고 있습니다.
만약 5개의 차원 데이터를 두 개의 변수 PC1, PC2로 축소해 나타낸다고 했을 때 이를 이용해 어떤 분석을 진행하게 되면, 기존 변수를 이용한 해석은 불가능하게 되는건가요?
예를 들어 5개의 재무 관련 변수를 앞서 하신 대로 안정성, 수익성으로 축소했고 둘을 이용한 회귀방정식이 나왔다고 했을 때, 단지 'a 개체(회사)는 안정성이 좋고, 수익성은 나쁘다'라고만 해석하고 기존의 5개 변수는 사용할 수 없게 되나요?
쓰다보니 거의 PCA 관련 질문이 되어버렸네요 ㅎㅎ;
기존 5개 변수를 모두 사용하는건 아니지만, 기존 변수의 정보손실(information loss)를 최소화하는 방향으로 차원을 축약한 잠재변수 2개를 가지고 대신 사용하는 것이지요. 2개의 요인만 봐도 기존 변수의 변동의 상당부분을 설명할 수 있다면 말이지요.
안녕하세요 좋은 자료 올려주신 덕분에 잘 공부하고 있습니다.
FA biplot 패키지를 찾아보니 올려주신 것과 동일하진 않지만
biplot 만들어주는 패키지 찾아서 덧글 남김니다.
FA <- factanal(Full_FinData[,-1],
factors = 2,
rotation = "varimax",
scores = "regression")
install.packages("psych")
library(psych)
biplot.psych(FA, labels = Full_FinData[,1])
와우, 댓글 감사합니다. ^^b
FA 분석 결과에서 p-value
secu_factanal <- factanal(secu_com_finance_2007_2[,2:6], factors=2, rotation="varimax",scores = "regression")
print(secu_factanal)
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
귀무가설이 뭔지 모르겠어요. '=';
카이제곱 결과에 따르면, 두 팩터가 동질하다고 할 수 없다. 이렇게 보는게 맞나요..?
감사합니다!
저도 공부하고 있는 학생이어서 정확히는 모르지만,
"귀무가설 : 현재 추출된 요인이 측정 변수 사이의 관계를 정확히 설명한다
대립가설 : 현재 추출된 요인보다 더 많은 요인이 필요하다"
로 알고 있습니다.
즉 귀무가설이 기각된다면, 현재 사용하는 요인분석은 유의미하지 못하다고 생각할 수 있을 것 같습니다.