'PCA'에 해당되는 글 1건

  1. 2015.08.08 R 데이터 변환 : (5) 차원 축소 - (5-1) 주성분분석 (PCA) (49)

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소

(5) 차원 축소

   - (5-1) 주성분분석

   - (5-2) 요인분석

(6) 시그널 데이터 압축

 

의 6개 구분 중에서 (5-1) 주성분분석(Principal Component Analysis, PCA)에 대해서 알아보겠습니다.

 

주성분분석이란 여러 변수들의 변량을 '주성분(Principal Component)'이라고 불리는, 서로 상관성이 높은 여러 변수들의 선형조합으로 만든 새로운 변수들로 요약, 축소하는 기법입니다.  첫번째 주성분으로 전체 변동을 가장 많이 설명할 수 있도록 하고, 두번째 주성분으로는 첫번째 주성분과는 상관성이 없어서(낮아서) 첫번째 주성분이 설명하지 못하는 나머지 변동을 정보의 손실없이 가장 많이 설명할 수 있도록 변수들의 선형조합을 만들게 됩니다.

 

 

 

 

주성분분석이나 요인분석은 다변량통계분석에서 배우게 되는데요, 선형대수(Linear Algebra)에 대한 기본적인 이해가 없으면 이론으로 깊이 들어가는 것이 매우 어렵습니다.  그래서 이번 포스팅에서는 수식이나 행렬 등 어려운 이론은 넘어가도록 하겠으며, 주성분분석이나 요인분석을 왜 하는지 알아보고, 분석을 위한 R script 와 결과 해석에 주안점을 두도록 하겠습니다.

 

(☞ 선형대수학은 본 블로그의 선형대수' 카테고리에 별도로 정리하였으니 참고하시기 바랍니다. (벡터, 행렬, 내적, 외적, 선형독립, 기저, 벡터공간, 부분공간, 생성공간, 차원, 핵, 상공간, 차원정리, 계수, 고유값, 고유벡터 등))

 

 

주성분분석, 요인분석은 왜 하는가?  어떤 분석에 연계활용되나? 

 

1. 여러 변수들 간에 내재하는 상관관계, 연관성을 이용해 소수의 주성분 또는 요인으로 차원을 축소함으로써 데이터를 이해하기 쉽고 관리하기 쉽게 해줍니다.  사람은 1차원, 2차원까지는 그래프로 그려서 직관적으로 이해를 할 수 있지만, 3차원 이상으로만 넘어가도 집단의 모습을 인식하는데 큰 어려움을 겪게 됩니다.(향후 홀로그램이 상용화되면 3차원까지는 그래도 사람이 인지하기 편할수도 있겠네요 ^^;)  만약 변수가 10개 있는데 이를 단 2개의 차원으로 요약을 했는데도 변수들이 가지는 변동을 80~90% 설명할 수 있다면 굳이 변수 10개를 모두 이용할 필요가 없겠지요.

 

 

 

 

2. 회귀분석이나 의사결정나무(decision tree) 등의 모형 개발 시 입력변수들간의 상관관계가 높은 다중공선성(multicollinearity)이 존재할 경우 모형이 잘못만들어지고 따라서 해석에도 문제가 생기게 됩니다.  다중공선성이 존재할 경우 해결 방법 중의 하나가 바로 상관도가 높은 변수들을 하나의 주성분 혹은 요인으로 축소하여 모형개발에 활용하는 것입니다.

 

3. 연관성이 높은 변수 간 주성분 또는 요인분석을 통해 차원을 축소한 후에 군집분석을 수행하면 군집화 결과, 연산속도 개선에 기여하게 됩니다.  가령, Benefit 고객세분화를 위해 survey를 하게 되면 소구점들에 대한 다수의 문항(변수)의 답변 결과에 대해서 먼저 요인분석을 한 후에 요인점수(factor score)를 가지고 군집분석(clustering)을 수행하고 세분군집을 명명(naming)하게 됩니다.

 

4. 기계에서 나오는 다수의 센서데이터를 주성분분석이나 요인분석을 하여 차원을 축소한 후에 시계열로 분포나 추세의 변화를 분석하면 기계의 고장(fatal failure) 징후를 사전에 파악하는데 활용하기도 합니다.

 

위의 몇 개 사용예처럼 다른 분석의 입력변수로 주성분분석(주성분점수)나 요인분석(요인점수)를 통해 데이터를 전처리/변환하기도 하며, 아니면 주성분분석이나 요인분석을 바로 그 자체로 바로 활용하기도 합니다. 

 

 

 주성분분석(Principal Component Analysis, PCA) R script

 

주성분분석에서는

 - 상관행렬과 공분산행렬 중 어느 것을 선택할 것인가?

 - 주성분의 개수를 몇 개로 할 것인가?

 - 주성분에 영향을 미치는 변수로 어떤 변수를 선택할 것인가?

에 대해서 결정을 해야 하는데요,

 

한국신용평가정보에서 나온 '국내 증권회사의 주요 재무제표' (2007.3.31 기준)를 가지고 주성분분석을 R로 해보도록 하겠습니다. (다음번 포스팅에서는 똑같은 데이터에 대해 요인분석을 해보겠습니다)

 

이 데이터는 18개 증권사별로 V1.총자본순이익율, V2.자기자본순이익율, V3.자기자본비율, V4.부채비율, V5.자기자본회전율 재무지표 변수로 구성되어 있습니다.

 

예제 데이터('국내 증권회사의 주요 재무제표' (2007.3.31 기준)) 다운로드 ☞

secu_com_finance_2007.csv

 

R로 외부 csv 데이터 불러오기

 

> ##----------------------------------------------------------------------
> ## 차원축소(dimension reduction) : (1) PCA(Principal Component Analysis)
> ##----------------------------------------------------------------------
> 
> # 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 : 자기자본회전율

 

 

주성분분석에서는 변수별로 단위가 다른 raw data를 사용하지 않고 평균과 표준편차를 가지고 표준화(standadization)한 데이터를 사용합니다. 그래야 scale이 다른 문제로 인한 데이터 왜곡을 피할 수 있기 때문입니다.

 

> # 표준화 변환 (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))

 

 

V1.총자본순이익율, V2.자기자본순이익율, V3.자기자본비율, V5.자기자본회전율의 네 개의 변수는 숫자가 클 수록 좋다는 뜻이지만 V4.부채비율는 높을 수록 안 좋다고 해석하게 됩니다.  즉 V1, V2, V3, V5와 V4는 반대방향으로 움직이게 되는데요, 서로 같은 방향으로 움직이게 해서 상관도가 높게 나와 같은 주성분에 반영되도록 하기 위해서 아래와 같이 V4.부채비율의 방향을 변환(표준화된 이후의 max 값에서 표준화된 이후의 관찰값을 뺌)하겠습니다. (부채비율 방향 변환 후에는 숫자가 높을 수록 좋은 회사라고 해석할 수 있습니다)  그리고 주성분분석에 필요한 변수(V4_s가 아니라 V4_s2 가져온거 유의)만 indexing해서 선별하였습니다.

 

> # 부채비율(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")]

 

 

먼저, 변수들간의 상관계수를 분석해보겠습니다.  주성분분석이 변수들 간의 상관관계가 높다는 것을 가정하고 있기 때문에 한번 확인해보도록 하겠습니다.  

 

V1_s.총자본순이익률과 V2_s.자기자본순이익율이 상관관계가 높고(상관계수 0.615), V3_s.자기자본비율과 V4_s2.(방향변환 후의)부채비율이 상관관계가 매우 높게(상관계수 0.936) 나왔습니다.  V5_s.자기자본회전율은 V2_s.자기자본순이익율과 상관관계가 있고, V3_s.자기자본비율과 V4_s2.(방향전환후의 부채비율)과는 역의 상관관계가 나왔네요.

 

> # 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) # 반올림

 

 

변수들간의 산점도 행렬도 살펴보도록 하죠.

 

> # Scatter plot matrix
> plot(secu_com_finance_2007_2[,-1])

 

 

 

 

이제 prcomp() 함수를 사용해서 주성분분석을 실시합니다.  아래 결과에 보면 누적기여율(Cummulative Proportion)에 제1주성분(PC1)이 55.23%, 제 2주성분(PC1 & PC2)까지의 누적기여율dl 87.34%로 매우 높게 나왔습니다.

 

> # 주성분분석 PCA(Principal Component Analysis) > secu_prcomp <- prcomp(secu_com_finance_2007_2[,c(2:6)]) # 첫번째 변수 회사명은 빼고 분석 > > summary(secu_prcomp) Importance of components: PC1 PC2 PC3 PC4 PC5 Standard deviation 1.6618 1.2671 0.7420 0.25311 0.13512 Proportion of Variance 0.5523 0.3211 0.1101 0.01281 0.00365 Cumulative Proportion 0.5523 0.8734 0.9835 0.99635 1.00000

 

 

아래에 주성분분석 결과를 출력해보았습니다. 제1요인이 표준편차가 1.66으로 가장 크고, 제2요인이 1.26으로 그 다음으로 큰 식으로 순서가 있습니다.

 

그리고 Rotation 후의 고유벡터(eigenvector)의 계수를 보면 제1요인(PC1)은 자기자본비율(V3_s)와 부채비율(V4_s2)와 관련이 있고, 제 2요인(PC2)은 총자본순이익율(V1_s)과 자기자본순이익율(V2_s)와 관련이 있으며, 제 3요인(PC3)은 자기자본회전율(V5_s)와 관련이 있음을 알 수 있습니다.

 

> print(secu_prcomp)
Standard deviations:
[1] 1.6617648 1.2671437 0.7419994 0.2531070 0.1351235

Rotation:
              PC1         PC2           PC3          PC4         PC5
V1_s   0.07608427 -0.77966993  0.0008915975 -0.140755404  0.60540325
V2_s  -0.39463007 -0.56541218 -0.2953216494  0.117644166 -0.65078503
V3_s   0.56970191 -0.16228156  0.2412221065 -0.637721889 -0.42921686
V4_s2  0.55982770 -0.19654293  0.2565972887  0.748094314 -0.14992183
V5_s  -0.44778451 -0.08636803  0.8881182665 -0.003668418 -0.05711464 
 

 

 

 

이처럼 변수와 주성분간 관계를 고려해서 주성분에 이름을 명명(naming)해보자면 PC1은 안정성, PC2는 수익성, PC3는 활동성이라고 할 수 있겠네요. (재무제표 배울 때 배우는 대표적인 재무평가 지표)

 

 

 

 

 

선형대수를 안배우면 용어, 이론 개념이 어려울 수 있는데요, 참고로 고유값(eigenvalue)와 고유벡터(eigenvector)에 대한 정의를 아래에 소개합니다.

 

[참고: 고유값(eigenvalue), 고유벡터(eigenvector) 용어설명]

 

 

 

주성분의 개수를 정할 때 누적기여율을 가지고 하기도 하고, 또는 고유값(eigenvalue)을 가지고 아래 처럼 Scree plot 그래프를 그려서 고유값 곡선이 꺽이는 지점의 바로 앞의 주성분 개수를 선택하기도 합니다.  아래 그래프로 보면 주성분 4개째에서 수평으로 드러누웠으므로 한개를 뺀 (4-1 = 3) 3개 주성분이 적합해 보입니다.

 

> # Scree Plot
> plot(prcomp(secu_com_finance_2007_2[,c(2:6)]), type="l",
+      sub = "Scree Plot")

 

 

 

 

주성분1점수(principal component 1 score)과 주성분2점수(principal component 2 score)를 가지고 Biplot을 그려보겠습니다.  

가로축 PC1(안정성)을 기준으로 보면 오른쪽에 V3_s, V4_s2 화살표가 향하는 쪽에 있는 부국증권, 한양증권, 유화증권사는 안정성이 높은 회사군이라고 해석을 할 수 있게 됩니다.

(참고: PC1 = 0.076*V1_s - 0.394*V2_s + 0.569*V3_s + 0.559*V4_s2 - 0.447*V5_s )

 

세로축 PC2(수익성)을 기준으로 보면 아래쪽에 있는 대우증권, 미래애셋증권사 등이 수익성이 좋은 축에 속합니다. (아래 식 부호가 (-) 라서 숫자 낮은 것이 수익성 좋다는 뜻)

(참고: PC2 = -0.779*V1_s - 0.565*V2_s - 0.162*V3_s - 0.196*V4_s2 - 0.086*V5_s )

 

> # Biplot
> biplot(prcomp(secu_com_finance_2007_2[,c(2:6)]), cex = c(0.7, 0.8))
> 
> # 관측치별 주성분1, 주성분2 점수 계산(PC1 score, PC2 score)
> secu_pc1 <- predict(secu_prcomp)[,1]
> secu_pc2 <- predict(secu_prcomp)[,2]
> 
> 
> # 관측치별 이름 매핑(rownames mapping)
> text(secu_pc1, secu_pc2, labels = secu_com_finance_2007_2$company, 
+      cex = 0.7, pos = 3, col = "blue")
 

 

 

 

 

이렇게 변환한 주성분점수를 가지고 다른 통계모형이나 데이터마이닝 모형 개발 시 input으로 활용해도 되겠습니다.  

 

 

 

참고로, 변수에 대한 설명력의 누적기여율(cummulative proportion)이 80%가 되는 주성분의 개수 k개를 찾아서, 주성분 1번부터 주성분 k번째까지의 주성분점수를 반환하는 사용자 정의함수는 아래와 같습니다. 

(Dr.Kevin 님의 댓글 덕분에 오류 잡아서 프로그램 수정하였습니다. Dr.Kevin님 감사합니다)

 

> ########################################################### > ## PCA (Principal Component Analysis) > ## User Defined Function > ## - finding PC k which Cumulative Proportion is over 0.8 > ########################################################### > > pca <- function(dataset){ + pc = prcomp(dataset, scale = TRUE) + + k = 0 + R = 0 + + while(R < 0.8) { + k = k + 1 + R = sum(pc[[1]][1:k]^2)/sum(pc[[1]]^2) + + cat("When number of Principal Component(k) is ", k, + ", Cumulative Proportion(R) is ", R, "\n", "\n", sep="") + } + + SelectedDataSet = pc[[5]][,1:k] + return(SelectedDataSet) + } > > pca(secu_com_finance_2007_2[,c(2:6)]) When number of Principal Component(k) is 1, Cumulative Proportion(R) is 0.5522924 When number of Principal Component(k) is 2, Cumulative Proportion(R) is 0.8734231 PC1 PC2 [1,] -1.4870243 0.6066594 [2,] -0.2063797 -0.0804627 [3,] 0.1968538 0.9704605 [4,] -2.3542884 -3.5056480 [5,] -0.8953707 1.4552899 [6,] -0.3682082 -0.5976313 [7,] -0.9354306 -1.4144519 [8,] 2.4129728 -0.6785064 [9,] 2.6991862 -0.7596591 [10,] -0.4050098 0.2800099 [11,] 1.3958199 1.1353513 [12,] -1.5381192 1.1576616 [13,] 0.3217681 -0.2378023 [14,] -2.0306806 0.9646122 [15,] 3.0389460 0.8841645 [16,] 2.0064063 -1.2831337 [17,] -0.4211779 -0.2987099 [18,] -1.4302634 1.4017959

 

 

 

다음 포스팅에서는 요인분석(factor analysis)에 대해서 알아보겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

 

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 2016.04.04 00:58  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  3. R Friend R_Friend 2016.04.04 09:14 신고  댓글주소  수정/삭제  댓글쓰기

    내, 한번 보내주세요. R script와 SAS script 같이 보내주시면 차이가 어디서 생기는지 찾는데 도움이 될거 같아요

  4. 2016.04.04 12:56  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. 한양대 2016.04.12 11:17  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 친절한 블로그 잘보고 있습니다.
    정말 똑같이 따라했더니 제가 그리고 싶었던 그림이 딱!!
    하지만 저같은경우 계절별 분석항목(13개)을 다루다보니
    큰 범위에 화살표를 제외하고는 중심점에 뭉쳐서 다소 글씨 보기가 힘든데...
    혹시 폰트의 위치도 조절이 가능한가요?...
    찾다보니 댓글까지 남기고 갑니다...감사합니다.

  6. kernelist 2016.05.05 20:37  댓글주소  수정/삭제  댓글쓰기

    PCA에 대해 이렇게 정리가 잘 된 블로그는 처음 봤습니다.
    요즘 R에 대해 푹 빠져 있는데 앞으로 많이 들러 열심히 보고 배우겠습니다.
    앞으로도 적극 연재 부탁 드립니다^^

  7. 김상수 2016.06.02 20:59  댓글주소  수정/삭제  댓글쓰기

    와우........정말 정말...정리가 잘 되어 있어서..감사드립니다...
    책만 보면서..정리가 안되는 부분들이 있었는데...
    속이 뻥 뚫리는 듯 하네요...
    감사드리며...열심히 배우겠습니다...

  8. 다크 2016.06.18 18:38  댓글주소  수정/삭제  댓글쓰기

    너무 감사합니다^^

  9. Dr.Kevin 2016.06.23 10:07  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 좋은 내용으로 공부 많이 했습니다.
    한가지 궁금한 게 있는데요.
    마지막에 사용자 정의 함수에서 R 값을 구할 때,
    각각 제곱을 해서 더해야 될 것 같습니다.
    왜냐하면 누적 기여도는 분산을 기준인데
    그냥 pc[[1]]로 하면 표준편차의 합이 되거든요.

    그리고 SelectedDataset을 만들 때
    cbind에 해당되는 내용을 아래와 같이 수정하는 게 맞을 듯 합니다.
    SelectedDataset = cbind(pc[[5]][,1:k], y)
    이렇게 하지 않으면 PC1만 포함되더라구요.

    • R Friend R_Friend 2016.06.23 23:43 신고  댓글주소  수정/삭제

      Dr.Kevin 님, 댓글 정말 감사합니다.
      댓글에서 말씀해주신 내용 반영해서 포스팅 본문 내용 수정하였습니다.
      덕분에 좋은 공부하였습니다. 고맙습니다. ^^

  10. 노력학생 2016.11.05 17:22  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 PCA에 대해 정말 잘 배우고 갑니다. 혹시 마지막 그림에 대한 R코딩은 어떻게 되는지요
    plot(pc1,pc2)를 그리고 text매핑까지는 나와있는데 빨간색으로 변수의 위치와 방향을 표시하는 것은 어떻게 하는지요?

    biplot을 이용해서 개체는 파란색, 변수는 빨간색으로 표기할수있나요?

    ............"이렇게 변환한 주성분점수를 가지고 다른 통계모형이나 데이터마이닝 모형 개발 시 input으로 활용해도 되겠습니다."이 글의 바로 윗부분의 코딩이 궁금합니다.

    감사합니다.

  11. sokys 2017.04.02 23:11  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    한가지 질문이 있어서 댓글 남깁니다.

    biplot에서 숫자는 predict한 개체들의 순서에 의해 나온 것 같고, 그 후에 text()를 통해 맵핑을 한 것 같은데 숫자와 글자 간 거리가 차이가 꽤 커서요..
    숫자 바로 옆에 글자가 뜨도록 할 수는 없나요?

    • R Friend R_Friend 2017.04.04 17:22 신고  댓글주소  수정/삭제

      rfriend.tistory.com/157. 참고하세요.

      text() 함수로 좌표를 한개씩 일일이 매핑해주면 되긴 할텐데요, 마음에 드는 위치로 매핑하려면 trial & error 해보면서 적정 위치 좌표를 계속 탐색해보셔야 할거예요.

  12. 2017.05.27 17:54  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  13. 조정호 2017.06.29 19:21  댓글주소  수정/삭제  댓글쓰기

    V1.총자본순이익율, V2.자기자본순이익율, V3.자기자본비율, V5.자기자본회전율의 네 개의 변수는 숫자가 클 수록 좋다는 뜻이지만 V4.부채비율는 높을 수록 안 좋다고 해석하게 됩니다. 즉 V1, V2, V3, V5와 V4는 반대방향으로 움직이게 되는데요, 서로 같은 방향으로 움직이게 해서 상관도가 높게 나와 같은 주성분에 반영되도록 하기 위해서 아래와 같이 V4.부채비율의 방향을 변환(표준화된 이후의 max 값에서 표준화된 이후의 관찰값을 뺌)하겠습니다. (부채비율 방향 변환 후에는 숫자가 높을 수록 좋은 회사라고 해석할 수 있습니다) 그리고 주성분분석에 필요한 변수(V4_s가 아니라 V4_s2 가져온거 유의)만 indexing해서 선별하였습니다.

    이 부분 해석하신 부분에서 모르겠는 것이 있어 이렇게 글을 남기게 되었습니다.
    변수를 scale하고 나서 왜 V1,V2,V3,V5변수를 제외한 V4는 반대방향으로 움직인다고 적어놓으신건지 이해가 가지 않습니다. 답변 부탁드립니다.

    그리고 V4의 최대값에서 표준화한 관찰값을 빼는 것이 방향변수를 바꾸는 것이라고 하는 것인지 이해가 안갑니다. 설명 부탁드려요

    • R Friend R_Friend 2017.06.30 19:55 신고  댓글주소  수정/삭제

      안녕하세요 조정호님.

      답변 늦어서 죄송합니다.

      블로그 본문에 적어놓은 것처럼 ‘V1.총자본순이익율, V2.자기자본순이익율, V3.자기자본비율, V5.자기자본회전율’의 4개 변수는 높을 수록 회사가 재무상태가 좋다는 뜻이고, ‘V4.부채비율’만 높을 수록 재무상태가 안좋다는 뜻이므로, 회사별로 V1~V5의 데이터를 모아보면 짐작컨데 재무상태가 좋은 회사들은 V1, V2, V3, V5는 높고, V4는 낮을 것입니다. 반대로 재무상태가 나쁜 회사는 정반대일 것이구요. 예로 들어놓은 데이터의 산점도 행렬 그래프를 보면 V3와 V4가 정반대, 음의 상관관계로 나왔음을 확인할 수 있습니다. V4만 반대방향으로 움직인다는 것은 이 뜻이었습니다.

      그럼, 주성분분석할 때 V4의 방향을 꼭 반대로 바꿔줘야 하면, 그렇지는 않습니다. V4를 표준화해서 그냥 표준화한 변수로 주성분분석해도 결과는 동일합니다. 다만 주성분점수 구하는 수식에 부호가 제가 블로그에 쓴 것이랑 반대로 되어있을 겁니다. 그리고 Bi-Plot을 그렸을 때 V3랑 V4가 화살표가 서로 반대 방향으로 그려질겁니다. 제가 V4를 방향을 바꾸어주었던건 나중에 해석할 때 V3랑 V4가 ‘(재무)안정성’(‘주성분 1번’에 기여를 많이 하게끔 선형결합으로 묶임 )이라는 잠재변수로 묶일 때 해석하기 편하라고, 그리고 Bi-plot 그렸을 때도 보기 편하라고 그렇게 변수 변환했었던 거예요. 다시 한번 말씀드리자면, V4를 표준화한 상태에서 그냥 쓰셔도 주성분 점수는 똑같습니다. 안해도 되는 것을 왜 했나 싶어서 질문을 주신 것으로 이해합니다.

      V4 방향을 바꾸기 위해 표준화 이후의 값의 max에서 표준화한 값을 빼줬는데요, (-) 부호를 붙여줘도 됩니다. 요점은 scaling 이후에 그 범위를 유지한 상태에서 부호를 반대로 바꿔주는 것으로 해야 주성분점수 계산하는 수식에 영향이 없어서 그렇게 했습니다.

      질문을 받고 보니 제가 굳이 안 해도 되는 변환을 해서 혼선을 드린 것도 같습니다. ^^; scaling만 잘 챙겨서 주성분분석 진행하시면 됩니다.

  14. 조정호 2017.07.02 16:32  댓글주소  수정/삭제  댓글쓰기

    친절하게 답변해주셔서 감사합니다

  15. 최대식 2017.08.08 11:08  댓글주소  수정/삭제  댓글쓰기

    정말 깔끔한 정리 감사합니다. 한가지 여쭤볼 것이 있어서 댓글 남깁니다.
    몇몇 글들에서 주성분 분석을 하기 전 KMO, Bartlett 검증을 하는데 이 예시에서는 할 필요가 없는건가요?
    감사합니다.

    • R Friend R_Friend 2017.08.09 23:46 신고  댓글주소  수정/삭제

      안녕하세요 최대식님,
      댓글로 남겨주신 KMO, bartlet 검정을 주성분분석, 요인분석 적정여부를 판단하는데 사용한다는 것을 댓글을 보고 나서 검색해보고 나서 처음 알았습니다.

      시간 여유가 날때 포스팅 업데이트 해야겠네요. R script랑요.

      댓글 감사합니다.

      [참고 블로그]
      http://m.blog.daum.net/_blog/_m/articleView.do?blogid=0I69R&articleno=381378

  16. 2017.10.09 10:36  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend R_Friend 2017.10.09 15:01 신고  댓글주소  수정/삭제

      안녕하세요. 반갑습니다. 통계 전공이시면 전도유망한 전공이시네요.

      R과 Python 같이 사용하시나봐요!
      요즘 tensorflow 덕분인지 Python 열기거 뜨겁네요.

      Python script 댓글로 남겨주시면 유용하게 참고하겠습니다.

      감사합니다.

  17. 2017.10.31 10:26  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  18. 김석호 2017.12.19 16:24  댓글주소  수정/삭제  댓글쓰기

    올려주신 글 중에 PC1을 구하는 참고식에 SK증권의 5가지 값을 넣어보니 -0.6148862가 나옵니다.
    PC1의 [1,]값은 -1.4870243으로 나오는데 두 값은 다른건가요?
    같은 의미인줄 알았는데 다르네요..

    • R Friend R_Friend 2017.12.19 16:38 신고  댓글주소  수정/삭제

      제가 bl-plot 보기에 편하라고 V4 방향으로 바꾸어서 V4-s2 변수를 사용했습니다. V4-! 변수 그대로 사용하면 PC수식 부호가 바뀔텐데요, 부호를 바꾸엇 V4-s 값 이력하시면 아마 계산하신 값이랑 같을거 같습니다.

    • 김석호 2017.12.19 16:55  댓글주소  수정/삭제

      그렇네요 ^.^ 감사합니다~!
      그럼 만약에 모델에서 train / test 로 나눠서 해본다고 할때
      train에서 구한 PC식을 test 데이터의 관측치에 적용하여 사용을 하여야겠네요?

    • R Friend R_Friend 2017.12.19 17:07 신고  댓글주소  수정/삭제

      PCA는 unsupervised learning이어서 training set, test set 개념 적용 안하셔도 됩니다.

    • 김석호 2017.12.19 17:27  댓글주소  수정/삭제

      빠른 답변 감사합니다. 저는 지도학습 시 변수의 수가 많아 PCA를 통해 변수 축소 후 분석에 활용 가능한지에 대해 질문드린거에요!

    • R Friend R_Friend 2017.12.19 17:28 신고  댓글주소  수정/삭제

      아, 그런 경우라면 질문하신 방법대로 하시면 됩니다. ^^

    • 김석호 2017.12.19 17:35  댓글주소  수정/삭제

      네 감사합니다! 늘 포스팅 잘 보고있습니다. 많은 도움 주셔서 감사해요 ^^

  19. korea 2018.02.02 10:48  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 포스팅 너무 끝내주게 멋있습니다.

    그만큼 PCA에 대해서 쉽고, 이해하기 좋게 글을 써주신거 같아요

    질문이 있습니다. ^^

    똑같긴 하지만, 만든 function가지고 돌릴때, 아래와 같은 결과가 나오게 되는데요.
    해당 증권사 [1,],[2,],[3,]의 명칭을 붙이고 싶은데요.
    어떻게 해야 할까요?
    원하는 거는 [1,SK증권] , [2,교보증권] ... 이렇게요..

    pca(secu_com_finance_2007_2[,c(2:6)])
    When number of Principal Component(k) is 1, Cummulative Proportion(R) is 0.5522924

    When number of Principal Component(k) is 2, Cummulative Proportion(R) is 0.8734231

    PC1 PC2
    [1,] -1.4870243 0.6066594
    [2,] -0.2063797 -0.0804627
    [3,] 0.1968538 0.9704605
    [4,] -2.3542884 -3.5056480
    [5,] -0.8953707 1.4552899
    [6,] -0.3682082 -0.5976313
    [7,] -0.9354306 -1.4144519
    [8,] 2.4129728 -0.6785064
    [9,] 2.6991862 -0.7596591
    [10,] -0.4050098 0.2800099
    [11,] 1.3958199 1.1353513
    [12,] -1.5381192 1.1576616
    [13,] 0.3217681 -0.2378023
    [14,] -2.0306806 0.9646122
    [15,] 3.0389460 0.8841645
    [16,] 2.0064063 -1.2831337
    [17,] -0.4211779 -0.2987099
    [18,] -1.4302634 1.4017959

    • R Friend R_Friend 2018.02.03 00:10 신고  댓글주소  수정/삭제

      안녕하세요.
      블로그 좋게 봐주셔서 감사합니다. ^^

      원하시는 형태로 출력이 되게 하려면 아래 코드처럼 일부 변경을 해주면 됩니다. 회사이름(company)를 가져와서 DataFrame으로 묶어주고 나서 이를 반환하라고 수정해주었습니다.

      pca <- function(dataset){
      pc = prcomp(dataset[,c(2:ncol(dataset))], scale = TRUE)

      k = 0
      R = 0

      while(R < 0.8) {
      k = k + 1
      R = sum(pc[[1]][1:k]^2)/sum(pc[[1]]^2)

      cat("When number of Principal Component(k) is ", k,
      ", Cummulative Proportion(R) is ", R, "\n", "\n", sep="")
      }

      SelectedDataSet = data.frame(company=dataset[,1], pc[[5]][,1:k])
      return(SelectedDataSet)
      }

      pca(secu_com_finance_2007_2)

      ##=== 실행 결과
      When number of Principal Component(k) is 1, Cumulative Proportion(R) is 0.5522924

      When number of Principal Component(k) is 2, Cumulative Proportion(R) is 0.8734231

      company PC1 PC2
      1 SK증권 -1.4870243 0.6066594
      2 교보증권 -0.2063797 -0.0804627
      3 대신증권 0.1968538 0.9704605
      4 대우증권 -2.3542884 -3.5056480
      5 동부증권 -0.8953707 1.4552899
      6 메리츠증권 -0.3682082 -0.5976313
      7 미래에셋증권 -0.9354306 -1.4144519
      8 부국증권 2.4129728 -0.6785064
      9 브릿지증권 2.6991862 -0.7596591
      10 삼성증권 -0.4050098 0.2800099
      11 서울증권 1.3958199 1.1353513
      12 신영증권 -1.5381192 1.1576616
      13 신흥증권 0.3217681 -0.2378023
      14 우리투자증권 -2.0306806 0.9646122
      15 유화증권 3.0389460 0.8841645
      16 한양증권 2.0064063 -1.2831337
      17 한화증권 -0.4211779 -0.2987099
      18 현대증권 -1.4302634 1.4017959

  20. 감사합니다 2018.05.02 11:14  댓글주소  수정/삭제  댓글쓰기

    PCA 개념이 잡히네요.
    주성분하고 요인분석에서 다소 막혔었는데, 어떻게 공부해야 하고 어떤 분석을 해야하는지 알게되어 참 감사드려요.
    정말 감사드립니다 :D

  21. 감사합니다. 2018.09.11 17:23  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 일단 여러 게시물을 보고 공부를 많이 하게 되어 감사하다는 말씀 드리고 싶습니다.
    제가 공모전을 준비하다가 주성분분석을 공부하게 되었는데 궁금한 점이 몇가지 있어 여쭙습니다.
    차원을 줄이고 다중공선성을 해결하고자 주성분분석을 쓰려하는데 이렇게 해서 나온 주성분을 써도 되는지 검증하는 방법이 있나요?(예측에 도움이 될지 확인하는 방법)
    (댓글을 보다가 bartlett.test를 알게되어 써보았는데 pvalue가 유의수준보다 낮게 나왔는데 이것이 의미하는 바를 찾아봐도 잘모르겠어서 여쭙습니다.)
    (클러스터링을 통해 변수를 축소한것이 얼마나 이득인지 알수있는 방법이 있다는데 혹시 어떤건지 아시나요??)