데이터 변환 방법으로서

(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) 용어설명]

 

 

 

PCA 로 차원축소 할 때 몇 개의 PCs 를 선택할 것인가에 대해 학문적으로 정의된 정답(universal rule)은 없으며, 많이 사용되는 '경험에서 나온 법칙(rule of thumb)'은 3가지 있습니다.


(1) 누적기여율(설명된 분산의 누적 비율)이 최소 (at least) 0.8 이상일 것.


(2) 단지 평균 분산보다 큰 PC만 선별할 것.

(만약 표준화한 데이터에 대한 상관관계행렬을 사용할 경우 고유값(eigenvalue)이 최소 1보다 큰 PC)


(3) Scree plot 을 그려봤을 때 꺽이는 부분 (elbow)이 있다면 elbow 지점 앞의 PC 개수 선택.


* source: Prof. Dr. Fabio Sigrist, Applied Multivariate Statistics



만약 PCA를 통해 계산한 PC score를 가지고 지도학습모형 (가령, 선형회귀모형)을 학습한다면 PCs 의 개수를 늘려가면서 Cross-validation을 해서 Loss function의 score를 최소로 하는 PC의 개수를 구하는 방법도 있습니다.


아래 예느 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)에 대해서 알아보겠습니다.

 

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

 

 

 

 

728x90
반응형
Posted by Rfriend
,

前 ITT CEO 해럴드 제닌이 지은 책 『프로페셔널 CEO』, 예전에 읽었던 책인데요, 리뷰글 올립니다.  

 

이 책을 읽으면서 회사를 경영한다는 것이 무엇인지에 대해서 실질적인 고민을 해볼 수 있는 기회를 가졌습니다.  아직 읽어보지 않으신 분이라면 추천합니다.  그리고 직장에서, 삶 속에서 의미있는 성과를 창출하시고 인정받는 삶 사시기를 기원합니다.

 

 

이 책을 가장 잘 요약하자면 저자가 14장에 짧게 쓴 글이 제격일 듯 싶습니다.

 말은 말이고 설명은 설명이며 약속은 약속일 뿐이다. 그러나 성과만은 현실이다. 나는 이것이 비즈니스 불변의 법칙이라고 생각한다. 오직 성과만이 나의 자신감, 능력, 그리고 용기를 측정할 수 있는 최상의 척도다. 그리고 오직 성과만이 나에게 나 자신으로서 성장할 수 있는 자유를 준다.

 

 성과가 당신의 현실이라는 점만 기억하라. 그 외에 다른 모든 것은 잊어라. 바로 이런 이유로 나는 경영자를 성과를 내는 사람이라고 정의한다. 중요한 것은 말이 아니라 이룩하는 일이다. 변명은 필요 없다. 그리고 당신이 뛰어난 성과를 올리면 세상은 다른 모든 것은 잊어도 성과만은 기억할 것이다. 그리고 무엇보다 당신 역시 성과만을 기억할 것이다.

구차한 변명할 것 없이 성과를 내라고 저자는 재차, 삼차, 사차....누차 강조에 강조를 하고 있습니다.  이 방법을 써서 안되면 저 방법을 쓰고, 또 안되면 다른 방법을 찾아서 성과를 내라고, manage, manage, manage 하는게 경영자의 본분이라고 말입니다.

 

 

 

이쯤 되면 저자는 도대체 어떤 성과를 내었길에 이리 자신만만하게 '성과' 타령을 하나 궁금해지지요?  위기에 빠진 ITT에 CEO로 취임하여 무려 58분기 연속 전년 대비 수익증가라는 미국 기업 역사상 전대미문의 실적을 달성했답니다.  일회성으로 전년 대비 수익증가를 하는 것은 마음만 먹으면 쉽습니다. 장기 성장의 씨앗들, 가령 R&D나 인력충원/교육 등의 비용을 삭감하면 당장 당기순이익이 올라갈테니깐요. 회계가지고 감상비 등으로 장난을 칠 수도 있겠고요.  하지만 이래가지고는 지속적인 성장을 이루는 것은 어림도 없겠지요.  저자의 주장 "경영자는 경영을 해야 한다!  경영자는 경영을 해야 한다! 경영자는 경영을 해야 한다! 도대체 몇 번을 말해야 알아듣겠나?"라는 말이 허트루 들리지 않는 이유입니다.  무려 58분기 연속 전년 대비 수익증가를 이루어낸 경영자의 말이기 때문입니다.

 

 

저자는 "한때는 풍미했던 경영이론들이 지금은 어디로 사라졌는가?"라면서 교과서 속의 죽어있는 경영이론에 대해서 회의적인 태도를 취하고 있습니다.  가령 Portfolio Mgmt.의 사고틀인 BCG Matrix에 대해서 저자가 하는 말을 들어보시지요.

 

 만약 "캐시카우" 이론이 매력적으로 보인다면 스스로에게 물어보자. 당신이라면 "캐시카우"에서 일하고 싶은가. "캐시카우"라는 딱지가 붙여진 채 앞으로 성장 가능성도없으면서 기껏 벌어놓은 돈으로 남 좋은 일만 시키는 회사나 부서를 위해 일하겠다고 나서겠는가? 캐시카우란 달이 보면 우수한 경영진이 꾸리고 있으며, 꾸준히 수익을 올리는 건실한 사업부이다. 그렇다면 더더욱 힘을 실어주고 확장시켜야 하지 반드시 하늘로 오르리라는 보장도 없는 소위 "스타"를 위한 제물이 되어서는 곤란하다.

 

"도그"도 그렇다. 최소한 그딜이 어떻게 해서 도그가 되었는지, 그렇다면 명견으로 바꿀 수 있는 방법은 없는지 해결책을 찾는 일이 경영진의 임무이다. 잡견 상태로 시장에 내놓으면 누가 돈 주고 사려고 하겠는가. 불가피하게 팔아야 할 때도 우선 개를 훈련시켜 똥개가 아닌 그레이하운드로 시장에 내놓아야 한다. (p47)

경영전략 교과서에는 어김없이 들어가있는 이 유명한 BCG Matrix를 이처럼 통쾌하고 유쾌하게 딴지를 걸 수 있는 사람이 세상에 몇이나 될까 싶습니다. 사람의 심리와 조직의 생리를 몸으로 겪어보고 소위 말하는 경영이론들을 교과서적으로 적용한 것이 아니라 나름의 철학과 주관을 가지고 적용해본 백전노장의 일침이 아니고 무엇이겠습니까.

 

 

저자는 경영 강좌를 세 문장으로 표현할 수 있다고도 말하고 있습니다. 그 세 문장이란 바로 이렇습니다.

 

책은 첫 페이지부터 읽어나간다.

그러나 사업 운영은 반대로 한다.

즉 끝에서부터 시작한 다음 최종 목적지에 이르기 위해 필요한 일을 하나도 남김없이 처리한다.

해럴드 제닌의 경영방법을 "목표에 의한 경영"이라고도 하던데요, 바로 위의 세 문장의 경영강좌를 두고 하는 말이겠지요.  (이는 '전략의 탄생'에서 두 공저자가 강조했던 전략적 사고의 핵심 "역뱡항 추론"과 일맥상통!)

 

해럴드 제닌은 그럼 목표를 어떻게 잡았을지도 궁금해지지요?

 

 대부분의 성과는 수치로 측정되기 때문에 나는 ITT에서의 내 목표를 연 10%의 주당 수익 증가로 잡았다. 이것이 나의 최종 목표였다.

 

 나는 어떻게 임의로 이런 결정에 도달한 것일까? 먼저 당시의 경기 상황에서 유사기업들은 어떻게 하고 있는지 살폈다. 당시 물가상승률은 2%였다. (나중에 그렇게 되었지만, 만약 물가상승률이 10%였다면 성장률은 18%정도로 잡았을 것이다). RCA와 Westinghouse 같은 다른 기업들은 운 좋게도 1959년에 주당 5%의 성장률을 보였다. 대부분은 3% 수준이었다.

 

 나에게 있어 연(매년) 10%의 성장은 "도전적 목표(Stretch target)"였다.

최종목표는 재무성과로 잡았네요.  물가상승률과 Peer 기업의 성과를 고려해서 Stretch Target을

잡았네요. 

 

성장을 위한 방법론으로 맨땅에서 새로 신규사업을 시작하는 것보다는 M&A를 주로 했다는 얘기가 나오는데요, 이 방법론의 효과에 대해서는 저도 동의합니다.  M&A 대상기업을 선정하는데 있어서 MBA 나온 직원들의 접근 방법을 예로 들면서 약간 비꼬는 장면이 나와요.  그런데 가만히 보니 저자가 '이렇게 하면 실패한다'고 예시한 방법론이 제가 사용했었을 법한 접근법이더군요. 만약 저한테 누군가 일을 시켰으면 MBA 나온 직원처럼 했었을 거 같거든요. 그런데 저자는 "누구나 다 똑같이 생각하면 매물 가격만 잔뜩 올라간 기업을 사게 되어 결국 실패한다"고 말하고 있네요.  참.... 어렵습니다. ^^;

 

저자는 복합기업의 이점에 대해서도 적극 옹호하고 있는 편이예요.  그런데 저는 이게 좀 알듯말듯 하네요.  저자는 복합기업의 이점이 리스크 헤징에 좋다는 점을 들고 있는데요, 관련도 없는 기업군들을 무더기로 M&A하든 새로 build-up하든 다방면의 기업을 거닐게 되면 경영층의 귀중한 관심, 시간이 분산이 될 터이고, 올바른 의사결정을 하려면 시행착오와 학습시간이 필요할테고.... 저자야 ITT 그룹을 복합기업으로 일구면서 58분기 연속 수익률 증가라는 신화를 일궈냈으니 제가 저자가 틀렸다고 감히 말할 처지는 못되지만서도... 그렇다고 온전히 수긍이 가는 것도 아닌거 있지요.  참... 어렵습니다. ^^;

 

저자가 첫장에서 말하는 "G이론"의 정의가 무엇인고 하니 "이론만으로는 기업은 물론 그 어떤 것도 경영할 수 없다."는 것입니다.  위에서 BCG Matrix를 가지고 저자가 인정사정없이 깐 예를 보셨지요?  저자는 유행햐는 이론에 휘둘릴 필요없다고 말하고 있는데요, 저같은 범인은 기업을, 세상을 보고 재단하고 가늠할 수 있는 이론적 틀과 창을 제공해주는 이론이 고마울 때가 많습니다.  이론을 적용해서 가설을 가지고 문제에 덤비는 게 무대뽀로 문제에 덤비는 것보다는 더 낫다고 생각하는 편인데요... 참... 어렵습니다. ^^;

 

어찌되었든, 짜릿한 즐거움 만끽하면서 읽은 책이었네요. 일독을 추천합니다.

 

아래에 인상깊었던 구절 몇 개 더 소개하는 걸로 리뷰 마칩니다.

 

 

"우리는 우리가 기대하는 만큼 얻는다. 기대치를 넘어서 목표를 달성하는 경우는 아주 드물다" (p146)

 

 

"어떤 기준을 정하느냐에 딸, 그 기준을 충족시키기 위해 어떻게 하느냐에 따라 경영자와 경영자 아닌 사람이 갈린다. 내가 경영자로서 ITT에 한 진정한 공헌은, 대다수 사람들의 예상을 뛰어넘어 경영 기준을 높게 잡은 것이다.  내가 요구한 성취 수준은 전체 회사로 파급되었다. 우리는 계속 목표를 크게 잡았으며 결국 목표를 달성했다.  그렇게 경영했고 원하던 것을 이뤘다. 그리고 우리는 이에 대해 만족했다." (p163)

 

 

"리더십은 경영의 정수이자 핵심이다. .....(중략) .... 비즈니스에서 당신이 경영하는 것은 다름 아닌 사람이다....(중략).... 각 개별 기업이 다른 기업과 구별되는 이유는 리더십 때문이며, 리더십에는 최고경영자와 그가 이끄는 최고경영진의 성격과 특성이 반영된다. 리더십의 질이야말로 비즈니스의 성패를 결정짓는 단 하나의 가장 중요한 요소라는 것이 내 판단이다" (p167) 

 

"리더십은 말보다는 태도와 행동을 통해 발휘된다. ....(중략) .... 관리계층의 위에서든 아래에서든 간부가 부하직원을 한번 배반하면, 즉 평시에 했던 말과 위기시의 행동이 다르면 그는 그 직원의 존경과 충성심을 영원히 잃게 된다." (p185)

ps. 책 표지에 보면 인물 사진 나오는데요, 저자인 前 ITT CEO 해럴드 제닌이 아니라 이 책을 감명갚게 읽었다는 유니클로 회장 야나이 다다시라고 하네요.

 

ps2. 이 책 읽을 때는 일중독 주의!  work-life balance에 대한 고민도 함께!

 

 

728x90
반응형
Posted by Rfriend
,

애비너시 딕시트(Avinash K. Dixit) 프린스턴 경제학 교수와 배리 네일버프(Barry J. Nalebuf) 예일대 경영대학원 교수의 책 『전략의 탄생 』을 읽었습니다.  이 책 꽤 유익하고 또 재미있네요.

 

영어 원제목은 'Art of Strategy' 인데요, 국내 번역서 제목으로는 '전략의 탄생'이라고 했네요.  에리히 프롬의 'Art of Love'를 '사랑의 기술'로 번역을 했는데, 'Art'를 '기술'로 번역했었어야 했나...더 좋은 말 없나...싶은데요, 이 책도 '전략의 기술'이라고 번역하기는 좀 그랬나 봅니다.  그렇다고 '전략의 탄생'이라고 번역한 것도 좀...탄생은 아닌데...음...  암튼, Science of Strategy가 아니라 Art of Strategy 인데요, 저자들 왈 'Science of Strategy'를 알려줄테니 독자들에게 'Art of Strategy'로 승화시켜달라는 주문을 하고 있습니다.

 

 

 경제학과 경영학 교수들이 공저를 했기에 '전략'이라고 했을 때 저는 처음에 '경영전략'을 말하는 것인줄로 예상을 했었습니다.  하지만 막상 책을 읽어보니 비단 회사경영 뿐만이 아니라 다루는 범위가 정말 넓더군요.  회사 경영 관련 내용 뿐 아니라 예로 드는 것에는 스포츠, 전쟁, 핵무기협상, 주파수 협상, 경매, 보험 역선택과 모럴 해저드, 선거/투표, 인센티브 설계 등 무지 많습니다. 

 

 서바이버 TV시리즈, 섹스피어 문학작품, LA컨피덴셀 영화 등 일상 주변에서 쉽게 접할 수 있는 내용을 끌어다가 전략의 개념을 소개시켜주고 있어서 재미있기도 하고, '어, 여기에도 전략이 있었네'하고 무릎을 치게 하기도 하더군요.  저자들의 유머감각도 솔찬합니다. 

 

이 책이 워낙 두꺼워서 (600 페이지가 넘음 -_-;) 다 읽는데 2주나 걸렸습니다.  덕분에 앞에 부분 내용이 가물가물하기도 해서 리뷰글 쓰려니 좀 힘드네요.  일단 기억을 되살리기 위해 목차를 아래에 적어보겠습니다.

 

[ 전략의 탄생 ] 목차 


1. '전략'을 제대로 이해하기 위한 10가지 기본 룰
2. 역뱡향 추론_'So What?' 그래서 내겐 뭐가 돌아오는가?
3. 죄수들의 딜레마_때로는 눈앞의 이익이 치명적인 독이 될 수도 있다!
4. 아름다운 평형_상대와 나의 이해관계가 만나는 최적점은 어디인가?
5. 선택과 확률_불확실성의 상황에서 어떤 전략이 유효한가?
6. 전략적 수_상대를 꼼짝 못하게 하는 선점의 기술
7. 공약_나의 전략이 먹혀들게 하는 8가지 방법
8. 정보획득_상대의 속셈이 오리무중이어도 방법은 있다!
9. 협력과 조정_'내가 이쪽으로 갈 것'이라고 상대를 확신시켜라!
10. 경쟁과 입찰_너무 흥분하거나 너무 기다리는 것의 함정
11. 협상_어디까지 용인하고 어디까지 밀어붙일 것인가?
12. 의사관철_의제 순서를 바꾸는 것만으로도 결과가 달라진다
13. 인센티브_무엇이 사람들을 움직이게 하는가?
 

 

 

이 책을 한줄로 요약해보라면 "게임이론과 행동경제학의 최신 이론을 기반으로 한 전략적 사고의 길잡이"이라고 말하고 싶네요. 

 

 

(1) 저자들이 중요하게 생각하며 여러분 강조하는 내용이 "역방향 추론"입니다.  끝을 미리 생각해보고 거꾸로 추론을 해오면서 '미래의 좋은 결과를 위해 현재는 그럼 어떻게 의사결정/선택해야 하는가?'를 생각하는 방법이 역방향 추론입니다.  '하노이 성' 옮기기 게임 아시지요?  그게 보니깐 전략적 사고의 핵심인 '역방향 추론'의 축소판 예시가 되겠습니다. 

 

 

(2) 더불어 저자들이 침튀겨가면서 강조하는 부분이, 우리 사람이 살면서 겪게 되는 전략적 사고가 필요한 상황을 보면 절대 다수가 "상대방이 존재하는, 작용과 반작용이 존재하는 동적인 게임"이라는 점입니다.  축구나 야구, 체스나 바둑과 같이 경쟁상대가 있는 게임부터 시작해서, 부모와 자녀의 공부/놀이시간 협상, 노사간 임금협상, 구매자와 상인간 거래....등 산다는 것 자체가 상대가 있는 밀고 당기는 게임의 연속이라는 것입니다.  따라서 "나의 선택과 행동이 상대방에게 영향을 주게 된다는 점, 상대방은 어떻게 나를 보고 있고 앞으로 어떻게 선택/행동할지를 예측해서 그에 대응해야 한다는 점"이 전략의 핵심이라고 얘기하고 있습니다.  이는 손자병법에 '知彼知己 百戰不殆'라는 유명한 말과 일맥상통하는것 같습니다.

 

[손자병법 모공편]

知彼知己 百戰不殆 不知彼而知己 一勝一負 不知彼不知己 每戰必殆

(지피지기 백전불태 부지피이지기 일승일부 부지피부지기 매전필태)

 

적을 알고 나를 알면 백번 싸워도 위태로울 것이 없으나 나를 알고 적을 모르면 승과 패를 각각 주고 받을 것이며 적을 모르는 상황에서 나조차도 모르면 싸움에서 반드시 위태롭다

 

경제학 수업을 들은 분이라면 그 유명한 "죄수의 딜레마 (Not 죄수의 딜레마)"를 기억하실 겁니다.  죄수 각자에게는 이기적으로 한 최선의 선택(범행 자백 후 형량 경감)이 죄수 전체에게는 재앙(죄수 둘다 최고 형량 받음)이 되는 딜레마 말입니다.  경제학의 아버지 아담 스미스에게 빅엿을 선사한 이론인데요, 이게 현실세계에서 보면 잘 들어맞습니다.  가령, 며칠전 '배달의 민족'이 결제 수수료를 '0%'로 인하하니깐 '요기요'가 그 다음날 똑같이 수수료를 '0%'로 인하했죠.  두 명의 죄수 (배달의 민족과 요기요)가 결국 얻은 건 없고, 결국 검사 (배달앱 사용 소비자, 가맹점) 만 이득이 취하게 된 경우이지요.

 

 

(3)  인간의 불완전성과 비합리성에 따른 의사결정의 제한성에 대해서도 충분히 고려를 하고 있고, 행동경제학의 최신의 연구결과를 적극 채용, 소개하고 있습니다.  의제 순서를 바꾼다거나 선거 방식을 바꾸는 것만으로도 결과가 뒤바뀔 수 있다면 믿으시겠습니까?  만약 '10만원을 A 사람이 B 사람에게 어떻게 서로 나눌지 제시하고, B 사람은 이를 수용할지 거부할지(거부하면 둘다 '0'원 수령) 선택하는' 게임 (행동경제학에서는 이를 Untimatum game 이라고 함)을 한다고 했을 때, 경제학 이론에 따르면 A사람은 9만9천9백9십원을 A가 가지고 10원을 B에게 주겠다고 했을 때에라도 B는 이를 수용하는게 하나도 못 받는것보다는 나으므로 수용해야 하지만 (이론 상으로는 말이지요), 실제 실험을 해보니 B사람은 욕심쟁이 A를 처벌하기 위해 이런 부도덕한(?) 제안은 가차없이 거절하더라는 겁니다.  인간을 이론속의 지고지상하고 컴퓨터처럼 계산에 따라 정확하게 움직이는 기계로 본 것이 아니라, 사람들이 실제 어떻게 생각하고 행동하는지를 관찰하면서 인간의 진짜 모습에 대해 탐구하는 행동경제학을 '전략적 사고의 적'이 아니라 '전략적 사고의 확장을 도와주는 조력자'라고 저자들은 반기고 있습니다.

 

이런 이유로  이 책을 "게임이론과 행동경제학의 최신 이론을 기반으로 한 전략적 사고의 길잡이"라고 말씀드린겁니다.  그런데, 초반에 말씀드렸듯이 이 책이 600 페이지가 넘습니다.  블로그 리뷰에 이 책의 내용을 속속들이 소개하기란 애초 불가능할 것 같습니다.  ^^"

 

마지막으로, '8장 정보획득_상대의 속셈이 오리무중이어도, 방법은 있다!' 편에 나오는 시그널링과 스크리닝 내용을 짧게 소개하는 것으로 이번 포스팅을 마칠까 합니다.  상당히 인상적이었고 현실 세상에서 유용하게 써먹을 수 있을 것 같아서요.  저자들은 '있는 그대로 이야기 한다'는 것의 말에 현혹되지 말고 '행동'에 초점을 맞추라고 합니다.  솔로몬의 재판을 예로 들었는데요, 두 명의 여자가 아이 한 명을 두고 "제가 아기의 엄마예요"라고 로 주장 합니다.  이에 솔로몬은 "칼로 아이들 둘로 갈라서 저 여자들에게 주어라!"고 판결을 내리죠.  그리고 진짜 엄마가 아이를 저 여자에게 주고 아기를 살려달라고 하자, 솔로몬은 진짜 엄마를 찾아낼 수 있었다는 이야기 다 아시지요?  "제가 아기의 엄마예요"라는 두 여자의 말보다 행동을 보면, 나는 가지고 있지 않지만 상대방 플레이어가 가지고 있는 '정보'를 알 수 있는 시그널링이 있으며, 원하는 바를 얻기 위해 잘 설계된 스크리닝 체계를 수립하는 것이 중요하다고 말하고 있습니다. 

 

책을 몇 개 주제로 나눠서 2권 내지 3권으로 만들었어도 됐을 법 한데요, 굳이 600여 페이지의 무식한 한 권으로 펴낸게 혹시 저자들이 끈기 없고 생각하기 싫어하는 어설픈 독자를 스크리닝하기 위한 전략이 아니었을까, 책을 한번 읽었으면 들이 시간과 돈이 아까워서 저 처럼 포스팅을 하지 않고는 못배기게끔 하려는 고도의 인센티브가 아니었을까 하는 억측을 해보면서 이번 포스팅은 여기서 마무으~리!

 

 

 

728x90
반응형
Posted by Rfriend
,

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소 (Sampling)

(5) 차원 축소

   - 주성분분석

   - 요인분석

(6) 시그널 데이터 압축

의 6개 구분 중에서

 

(4) 개수 축소 (Sampling)에 대해서 알아보겠습니다.

 

통계를 크게 두 축으로 나누자면 모집단으로 부터 표본을 추출해서 표본의 분포와 데이터 특성을 파악하는 기술통계(descriptive statistics)와 표본집단의 통계량을 통해 모집단의 모수(parameter)를 추정하고 가설을 검정(test)하는 추론통계(inferential statistics)로 구분합니다.  기술통계의 시작은 표본 추출 (Sampling)이라고 할 수 있겠습니다.  즉, 표본 추출이 모집단을 대표하지 못하게 되는 경우, 샘플링 이후의 모든 기술통계와 추론통계가 말짱 꽝이 되는 것입니다.  반면, 샘플링이 모집단을 잘 대표할 경우 엄청난 시간과 돈을 절약할 수 있는 통계의 무기를 획득할 수 있게 됩니다.

 

 

 R 데이터 변환 : (4) 개수 축소 (Sampling)

 

 

 

[ 데이터 변환 구조 ]

 

미국 대공황 시절에 루즈벨트 대통령이 뉴딜정책을 펼 때 경제정책의 기조를 의사결정하기 위해 실업율을 조사해야 했다고 합니다.  통계학자들은 잘 설계된 표본 추출기법을 통해 일부만 조사하고도 실업율을 파악할 수 있다고 한 반면에, 경제학자들은 전수조사를 해야한다고 우겼다고 하는군요.  그래서 샘플 조사도 하고 전수조사도 했다고 하는데요, 샘플 조사야 며칠 이면 끝나지만 전수조사는 몇 달이 걸렸다고 합니다.  전수 조사결과와 샘플 조사 결과를 비교해보니 오차가 무시할 수 있을 정도로 작았다고 했답니다. 이처럼 잘 설계된(!) 샘플링은 시간과 돈을 많이 절약해줄 수 있습니다. 

 

제품을 생산하는 제조공장에서도 품질검사를 위해 샘플링을 많이 사용합니다.  품질검사한다고 전수조사 했다가는 시장에 내다 팔 제품이 남아나지 않아서 공장 망하겠지요?  이럴 때는 어쩔 수 없이 샘플링을 해야만 하는데요, 샘플링을 너무 적게 하면 품질검사 결과를 신뢰할 수 없고, 그렇다고 너무 많이 하게 되면 품질검사 한다고 많은 멀쩡한 제품이 손상되어 손실을 보게 되겠지요. 

 

따라서 샘플링 기법의 종류와 개념에 대해서 명확히 이해하고, Biz. 상황과 분석의 목적에 맞는 샘플링 기법을 적용해야 하겠습니다. 확률표본 추출 기법에는 (a) 단순 임의 추출, (b) 체계적 추출, (c) 층화 임의 추출, (d) 군집 추출, (e) 다단계 추출의 5가지 나눌 수 있으며, 아래에 개념 설명과 도식을 참고하시기 바랍니다. (비 확률표본 추출 기법은 생략)

 

 

[ 확률표본 추출 기법 ]

 

 

 

 

저는 실무에서는 단순 임의 추출과 층화 임의 추출을 가장 많이 사용하기에 이번 포스팅에서는 이 두개에 대해서 R 사용법을 소개해드리도록 하겠습니다. 

 

 

(1) 단순 임의 추출 (simple random sampling) : sample()

 

먼저 1~10까지 정수 벡터에 대해서 5개 표본을 비복원, 복원추출로 단순 임의 추출해보겠습니다.

 

> sample(1:10, 5, replace = FALSE) # 비복원추출
[1] 9 6 5 7 3
> 
> sample(1:10, 5, replace = TRUE) # 복원추출
[1] 9 3 3 2 3

 

단순 임의 추출은 sample(x, size, replace = FALSE/TRUE) 함수를 사용해서 쉽게 실행할 수 있습니다.  위 예시의 첫번째는 비복원 추출 (한번 뽑으면 다시는 안뽑힘) 옵션을 부여한 것이고, 두번째 예시는 복원추출(한번 뽑혔더라도 다시 뽑힐 수도 있음) 예시가 되겠습니다.  복원추출의 경우 1~10중에서 3이 3번 중복해서 추출되었습니다.

 

> sample(1:10, 5, replace = TRUE)
[1] 10  6  9  7 10
> sample(1:10, 5, replace = TRUE)
[1] 1 4 1 4 3

 

똑같은 sample() 명령어인데도 매번 실행할 때마다 표본 추출되는 결과가 다름을 알 수 있습니다.  R 내부적으로 난수표를 생성하면서 무작위로 샘플링을 하기 때문에 그렇습니다.

 

 

다음으로 MASS 패키지에 있는 Cars93 데이터 프레임의 93개 모집단에서 5개 표본을 단순 임의 추출을 해보도록 하겠습니다.

 

> library(MASS)
> dim(Cars93)
[1] 93 27

>

> sim_ran_sam <- sample(1:nrow(Cars93), 5)

> Cars93_srs <- Cars93[sim_ran_sam, ]
> dim(Cars93_srs)
[1]  5 27
 

 

 

 

 

(2) 층화 임의 추출 (stratified random sampling) : strata()

 

다음으로 성별, 연령대별로 고객을 계층(stratum)을 나누어서 임의 추출을 해보도록 하겠습니다.  이를 위해 데이터 핸들링하는 data.table 패키지와 샘플링 하는 sampling 패키지 설치 및 호출이 필요합니다. 

 

> ## data.table 패키지, sampling 패키지 설치 및 호출

> install.packages("data.table")
> install.packages("sampling")
> require(data.table)
> require(sampling)

 

 

 

다음으로 1000명으로 구성된 모집단을 성별(1, 0), 연령대별(1, 2, 3, 4, 5), 재구매여부별(1, 0)로 3개의 변수에 대해서 각각 확률을 설정해주고 d.t 라는 이름의 data.table 을 생성해보겠습니다. 

 

> set.seed(1) > n <- 1000 > d.t <- data.table(gender = rbinom(n, 1 , .5), + age = sample(1:5, n, replace=TRUE), + rebuy_yn = rbinom(n, 1, .2))

 

 

 

 

 

data.table 에서는 data.frame과는 달리 특정 칼럼을 key값으로 색인을 지정(setkey)해주게 되고, 이 key값으로 정렬을 해주게 됩니다. (참고로, 속도가 data.frame보다 빠름)  data.table 의 group 별 집계하는 방식이 data.frame하고는 좀 달라서 낯설것 같은데요, 아래의 두번째 예시 참고하시기 바랍니다.

 

> ## Key 색인 지정, 정렬 > setkey(d.t, gender, age) >

 

 

 

> ## 성, 연령대 계층(stratum) 별로 모집단 원소 수 (총 1,000명)

> d.t[ , .N, keyby = list(gender, age)] gender age N 1: 0 1 113 2: 0 2 108 3: 0 3 93 4: 0 4 106 5: 0 5 100 6: 1 1 115 7: 1 2 86 8: 1 3 96 9: 1 4 73 10: 1 5 110

 

 

다음으로 strata() 함수를 사용해서 층화 임의 추출을 하면 됩니다.

 

> ## 성별, 연령대 계층별 각 20명씩 층화 임화 추출 > set.seed(2) > samp <- data.table(strata(d.t, c("gender", "age"), rep(20, 10), "srswor")) >

 

 

> ## 성별, 연령대 계층별 각 표본 개수 (각 20명 씩 표본 추출) > samp[ , .N, keyby = list(gender, age)] gender age N 1: 0 1 20 2: 0 2 20 3: 0 3 20 4: 0 4 20 5: 0 5 20 6: 1 1 20 7: 1 2 20 8: 1 3 20 9: 1 4 20 10: 1 5 20

 

 

strata() 함수의 사용법은 아래와 같으며, 위에서 method로 "srswor"을 사용했는데요, 이는 simple random sampling without replacement (디폴트) 가 되겠습니다.

 

> help(strata)

 

strata(data, stratanames=NULL, size, method=c("srswor","srswr","poisson", "systematic"), pik,description=FALSE)

-- 중략 --

method

method to select units; the following methods are implemented: simple random sampling without replacement (srswor), simple random sampling with replacement (srswr), Poisson sampling (poisson), systematic sampling (systematic); if "method" is missing, the default method is "srswor".

-- 중략 --

 


여러개의 변수를 가진 DataFrame에 대해서 층화 무작위 추출을 사용해서 Train, Test set 분할을 하는 방법은 아래의 포스팅을 참고하세요. 

==> https://rfriend.tistory.com/515



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

 

 

728x90
반응형
Posted by Rfriend
,

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

  - (3-1) 이산형화(discretization)    

  - (3-2) 이항변수화(binarization)

(4) 개수 축소

(5) 차원 축소

  - 주성분분석

  - 요인분석 

(6) 시그널 데이터 압축

 

중에서 이전 포스팅 (3-1) 이산형화(discretization)에 이어서 (3-2) 이항변수화(binarization)에 대해서 알아보겠습니다.  

 

이산형화가 다수의 구간으로 연속형 변수를 범주화 하는 것이라면, 이항변수화는 '1'과 '0'의 2개의 값으로 가변환(dummy variable)을 만드는 것을 말합니다.  연관분석이나 회귀분석 등에 이항변수화가 필요한 경우가 있습니다.  가령, 연관분석에서는 상품별 구매 여부(1, 0) 거래 데이터 (transaction data)를 가지고 패턴을 찾게 되는데요, 거주 지역이라든지 소득수준을 이항변수화 해서 행렬(matrix)로 만들어서 연관 규칙을 찾는데 활용할 수 있습니다 (더 정확히 말하자면, 메모리를 줄이기 위해서 sparse matrix 형식으로 저장).  또는 만약 시계열 자료가 고정계절변동(계절요인의 변동을 시간의 변화에도 일정하게 변동량을 유지하는 경우)을 가지는 경우에 가변수를 이용한 시계열 회귀모형을 시도해봄직 합니다. 

 

 

 R 데이터 변환 : (3-2) 이항변수화 (binarization)

 

[ 데이터 변환의 구조 ] 

 

 

(1) ifelse() 함수

 

ifelse() 함수를 활용해서 고객 프로파일 내 연령을 10대 간격으로 해서 20대 여부(1, 0), 30대 여부(1, 0), 40대 여부(1, 0), 50대 여부(1, 0) 의 가변수를 만들어보도록 하겠습니다.

 

> ## 고객 프로파일 데이터 프레임 생성

> cust_id <- c("c01", "c02", "c03", "c04", "c05", "c06", "c07")
> age <- c(25, 45, 31, 30, 49, 53, 27)
> 
> cust_profile <- data.frame(cust_id, age, stringsAsFactors = F)
> 
> cust_profile
  cust_id age
1     c01  25
2     c02  45
3     c03  31
4     c04  30
5     c05  49
6     c06  53
7     c07  27
> 
> sapply(cust_profile, class) 
    cust_id         age 
"character"   "numeric" 
> 
> ## 연령대 이항변수화
> cust_profile <- transform(cust_profile, 
+                           age_20 = ifelse(age >= 20 & age < 30, 1, 0), 
+                           age_30 = ifelse(age >= 30 & age < 40, 1, 0), 
+                           age_40 = ifelse(age >= 40 & age < 50, 1, 0), 
+                           age_50 = ifelse(age > 50 & age < 60, 1, 0))

 

> cust_profile
  cust_id age age_20 age_30 age_40 age_50
1     c01  25      1      0      0      0
2     c02  45      0      0      1      0
3     c03  31      0      1      0      0
4     c04  30      0      1      0      0
5     c05  49      0      0      1      0
6     c06  53      0      0      0      1
7     c07  27      1      0      0      0

 

 

 

위 화살표에서 보는 것처럼 해당 연령대에 '1'이, 아닌 곳에는 '0'이 들어가 있는 가변수들을 볼 수 있습니다.   이런 가변수를 활용해 연관분석을 하게 되면 if {연령대 = 20대, 케익구매} -> {반지 구매} 와 같이 구매 상품 정보뿐만 아니라 고객의 프로파일 정보도 같이 반영된, 그래서 타케팅 적중률을 더 높일 수 있는 연관규칙을 도출해낼 수 있습니다.

 

 

가변수를 이용한 시계열회귀모형을 예로 들자면, 아래의 식처럼 시점 t에서의 시계열 추세, 시점 t에서의 계절효과, 시점 t에서의 오차로 분해할 수 있습니다.  시계열회귀분석식을 자세히 보시면 [ D1,t = 1 시점 t에서 계절이 1인 경우, 0 그 이외의 경우 ] 라고 해서 가변수 처리 되어 있음을 알 수 있습니다.

 

 

 

> ## 시계열 데이터 생성 > Season <- c("S1", "S2", "S3", "S4", "S1", "S2", "S3", "S4") > SalesAmt <- c(300, 800, 400, 100, 280, 750, 390, 60) > TS <- data.frame(Season, SalesAmt, stringsAsFactors = F) > > TS Season SalesAmt 1 S1 300 2 S2 800 3 S3 400 4 S4 100 5 S1 280 6 S2 750 7 S3 390 8 S4 60 >

> ## 시계열회귀분석용 가변수 생성 > TS <- transform(TS, + Season1 = ifelse(Season=="S1", 1, 0), + Season2 = ifelse(Season=="S2", 1, 0), + Season3 = ifelse(Season=="S3", 1, 0)) > > TS Season SalesAmt Season1 Season2 Season3 1 S1 300 1 0 0 2 S2 800 0 1 0 3 S3 400 0 0 1 4 S4 100 0 0 0 5 S1 280 1 0 0 6 S2 750 0 1 0 7 S3 390 0 0 1 8 S4 60 0 0 0

 

 

 

 

예측모형적합을 위한 이항변수화를 할 때 한가지 주의해야 할 점이 있습니다.  바로 위의 캡쳐해놓은 표에 보면 S1(봄), S2(여름), S3(가을)은 가변수를 별도로 만들었지만, 노란색으로 동그라미 쳐놓은 S4 (겨울)은 별도의 가변수가 없고 그냥 S1 = 0, S2 = 0, S3 = 0 으로만 처리되어 있습니다.  이는 실수로 S4(겨울)을 빼먹은게 아니구요, 가변수 함정(dummy trap)을 피하기 위해 의도적으로 전체 계절의 갯수(여기서는 봄, 여름, 가을, 겨울의 4개)에서 1개를 빼게 됩니다.  운동회 때 서로의 간격을 맞추어서 줄을 서려면 제일 먼저 하는게 '기준'을 정하고 손을 번쩍 들어 크게 "기준~"하고 외칩니다.  그런 후에야 나머지 학생들이 "기준"이 되는 학생에 맞추어서 대열을 맞추게 되는데요, 계절효과를 반영하는 모형 적합에서도 "기준"이 되는 계절은 가변수를 안만들고, 나머지 계절만 가변수를 만들어서, "기준"이 되는 계절을 기준으로 상대적인 영향도를 계수로 모형에 반영하게 되는 원리입니다.  만약 계절의 전체 개수만큼 가변수를 만들게 되면 최소제곱추정법을 적용할 때 역행렬을 구할 수 없게 되는 가변수 함정에 빠지게 되어 해를 구할 수 없게 됩니다. 

 

시계열분석 통계이론이 잘 이해가 안되시더라도 일단 어떤 상황에서 이항변수화를 하게 되는지, R로는 ifelse() 함수를 써서 어떻게 변환하는지 정도만 이해하셨으면 일단 이번 포스팅에서는 얻어갈 것 다 얻어가신겁니다.

 

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

 

 

 

728x90
반응형
Posted by Rfriend
,

『창의성에 관한 11가지 생각』(황준욱, 유승호, 김윤태 편, 고려대학교 출판부) 를 소개합니다.  

 

아이쉬타인은 이런 말을 했지요. 

"Imagination is more important than knowledge. Knowledge is limited. Imagination encircles the world."  

 

창의성, 상상력에 대해서 진득하게 고민해봐야할 이유를 아인쉬타인이 너무나 명쾌하게 말해주고 있다고 생각해요.  자녀 교육에 대해 관심이 많은 분들은 자녀와 함께 읽어보시면 좋을 책이라는 생각이 듭니다.

 

11가지 생각은 달리 말하자면 저자가 11명 이라는 뜻이 되겠습니다.  11명 저자가 '창의성'이라는 주제를 가지고 달라붙어서 설을 푸는 만큼 읽는 재미가 있습니다. 공동집필에 적합한 주제에 맞게 기획을 잘했다는 생각이 듭니다. 다양성이 주는 매력이랄까요. 책 중간 중간 인용한 사람의 사진이라든지 영화 포스터 등을 성심껏 배치해 놓은 친철함도 엿보입니다

 


 

ps. SBS 스페셜(203회) 방영일 : 2010-03-28 「 창의성, 남의 얘기라는 당신에게 」도 재미있게 봤는데요, 책 읽기 부담스러우시면 SBS스페셜 동영상도 추천하고 싶네요.

  

 

위의 책 목차는 아래와 같아요. 제목 중에서 관심있는것만 골라 읽으셔도 무방하니 주말 반나절 도서관 가서 끌리는 제목만 보셔도 좋겠습니다.

 

1. 아낌없이 사랑을 쏟아라 - 포용력과 창의성
2. “신은 세세함 속에 존재한다”- 섬세함과 창의성
3. 야누스적 사고 - 패러독스와 창의성
4. T.H.A.N.K.S. -‘고마움’의 창출과 창의성
5. 익숙함과 새로움이 만났을 때 -‘만남’으로서의 창의성
6. 나는 삐딱하다, 고로 존재한다 - 다르게 보기와 창의성
7. 하고 싶은 말이 무엇입니까 - 소통과 창의성
8. 무소유는 힘이 세다 - 몰입과 창의성
9. 그 장소, 그 시간의 마법 - 사회적 조건과 창의성
10. 매력적인 조력자 - 창조적 문화와 창의성
11. 완전함을 추구함 - 불완전함과 창의성

 

 

저는 "삐딱한 시선으로 세상을 보라"는 내용 중 '우루주스 베얼리' 작품이 아주 재미있고 인상에 많이 남았습니다.  책에 소개된 우루주스 베얼리 작품 보면서 얼마나 웃었는지 모릅니다. ㅋㅋ

 

아래 빈센트 반고희의 '아를의 침실'을 우루주스 베얼리가 청소를 해놓았습니다.  뭐, 청소라기 보다는 여기저기 짱박아 놓았는데요, 코미디언이자 디자이너이자 예술가라고 자칭하는 우루주스 베얼리의 위트에 탄성이 절로 납니다.

 

 


 아래 그림도 한번 보세요.  조르주 쇠라의 '그랑드자트섬의 일요일 오후' 그림을 우루주스 베얼리가 정리하고 나니 봉지에 여러색깔의 점들로 정리가 되네요!!!  제가 봤을 때 베얼리는 예술가 맞습니다. 와우!
 

 

 


 

  

아래 그림은 브뤼겔의 '카니발과 금욕기간의 싸움'인데요, 베얼리가 광장을 싹 정리해버렸어요. 
 


 

개미새끼 한마리 없이 아주 깨끗하지요?  그럼 그 많던 사람들은 모두 어디로 정리를 했느냐 하면... 
 


 

 

바로 여기 있습니다. ㅋㅋ  아, 젤로 밑에 깔린 사람은 얼마나 숨쉬기 힘들까요. ㅋㅋ
 


 

  

후앙 미로의 '종달새의 노래'도 정리를 잘 해놨네요.  

 


 

아래 사진의 인물은 바로 위의 그림이 추상화라고 해서 정리가 불가능할 것도 없음을 손수 증명해 보이고 있는  우루주스 베얼리가 되겠습니다. 

 


 

 

예전에 KBS스페셜에서 '애플의 시대'에 대해서 방송을 했어요. 거기 보니 '혁신'의 대명사 '스티브잡스와 애플'에 대한 내용 중에 "애플이 직접 창조하고 발명한 것은 없다. 기존의 기술, 비즈니스 모델을 융합/복합해서 재창조했을 뿐이다"라는 말이 나오더군요.

 

살바도르 달리는 이런 말을 했다고도 하지요. "Those who do not want to imitate anything, produce nothing"이라고요.  태양 아래 전혀 새로운게 과연 몇 개나 될런지요.  다양하게 부지런히 보고, 듣고, 느끼고, 생각하고, 다른 것과 엮어보고, 뒤집어도 보고, 넣었다 빼었다도 해보고, 삐딱하게 꼬아도 보고....  

 

애플과 스티브잡스 얘기가 나왔으니 구글을 빼놓으면 에릭 슈미트 회장이 섭섭해하겠지요?  슈미트 전 회장은 구글 직원의 창의성 비결을 묻는 질문에 대해 다음과 같이 답변했다고 하네요.  "직원들에게 자유시간과 먹을 것을 충분히 줘라. 그러면 창의성은 저절로 생긴다."  너무나 맘에 쏙 드는 말이 아닐 수 없습니다. 슈미트 전 회장이 말로만 구라를 친거냐 하면 그건 아닌구요, 3M에 15% Rule이 있다면 구글에는 20% Rule 이 있다고 해요. 업무 시간의 20%는 개인의 창의성을 맘껏 펼칠 수 있는 프로젝트에 할당할 수 있다는 Rule이요.

 

SBS스페셜에 나왔던 얘기를 인용하는 것으로 마무리 짓도록 하지요.  "삐딱하게 보기" 편하시라고 글자를 좀 삐딱~ 하게 써두었습니다. ^_-


       ☞ 창의적이려면, 


             1. 호기심을 가져라.
             2. 다양한 노력과 경험을 해라.
             3. 몰입. 즐기며 일하라. 

728x90
반응형
Posted by Rfriend
,

김무성 새누리당 대표가 미국에 가서 했던 "중국보다 미국"이라는 언론 상에서 화제입니다. 

 

내년 총선을 겨냥해 보수층 결집을 노린 정치적인 의도가 있었다고 해석하는 기사도 있고, 한-중 관계를 고려했을 때 부적절했다는 지적하는 기사도 많습니다. 

  

 

 

 [ 김무성 대표의 한-미, 한-중 관계 발언 ]

 

 

"(미 의회 지도자들에게) 우리는 중국보다 미국이라는 확실한 메시지를 전달할 것"

                                                                - 7월27일 워싱턴 특파원 간담회

 

"한국과 미국의 관계는 전면적인 관계고, 한-중 관계는 분야별 일부의 관계다"

                                                            - 7월27일 우드로월슨센터 연설

 

 

 

 [ 여러 언론 기사 제목 화면 캡쳐 ]

 

 

 

 

저는 김 대표의 발언에 대해 국내 정치에 미칠 영향이나 국제 정치 역학에 대해서 논할 만큼의 실력이나 지식을 가지고 있지는 못하며, 다만 통계를 가지고 김무성 대표의 발언이 왜 위험한지에 대해서만 몇 자 적어보도록 하겠습니다.

 

아래의 한-미, 한-중 간 한국의 수출금액 시계열 추세 그래프를 한번 보시지요.

 

 

 [ 한-미, 한-중 간 한국의 수출금액 시계열 추세 ]

 

 

2014년 기준으로 한국이 중국에 수출한 금액이 한국이 미국에 수출한 금액의 2배를 넘어섰습니다.  한국과 중국이 수교를 맺은게 1992년이며, 이때를 기점으로 해서 한국-중국 간 무역량이 꾸준히 증가하다가 2002년을 넘어서서는 가파르게 상승하고 있습니다.  2003년에 한-미 수출량과 한-중 수출량이 거의 같아가 2004년부터는 한-중 수출량이 한-미 수출량을 넘어섰으며, 그 이후 두 간격이 점점 더 벌어지고 있는 양상입니다.

 

아래는 한-일 수출량까지 포함한 시계열 그래프입니다.

 

 

  [ 한-미, 한-중, 한-일 간 한국의 수출금액 시계열 추세 ]

 

 

2000년 까지는 한-일 수출금액이 한-중 수출금액을 앞섰읍니다만, 2014년 기준으로 봤을 때 한국이 일본에 수출하는 금액 대비 한국이 중국에 수출하는 금액이 5배 정도 됩니다. (한-일 간 무역량은 한국이 일본에 수출하는 금액보다 한국이 일본으로부터 수입하는 금액이 더 많지요).  그만큼 한국에게 있어 중국이 가지는 경제적 위상이 어마어마하다는 증표가 되겠습니다. 

 

아래 표는 한국무역협회-한국무역통계(K-Stat)에서 다운로드한 1993년~2014년도 연간 한국이 수출한 금액(단위: 천$)인데요, CAGR (연 평균 성장률) 이 미국 6.7%, 중국 17.2%, 일본 5.0% 로서 규모 못지않게 성장률도 어마 무시합니다.

 

년도

미국

중국

일본

1993년

18,137,640

5,150,992

11,564,418

1994년

20,552,796

6,202,986

13,522,860

1995년

24,131,474

9,143,588

17,048,871

1996년

21,670,465

11,377,068

15,766,827

1997년

21,625,432

13,572,463

14,771,155

1998년

22,805,106

11,943,990

12,237,587

1999년

29,474,653

13,684,599

15,862,448

2000년

37,610,630

18,454,540

20,466,016

2001년

31,210,795

18,190,190

16,505,766

2002년

32,780,188

23,753,586

15,143,183

2003년

34,219,402

35,109,715

17,276,137

2004년

42,849,193

49,763,175

21,701,337

2005년

41,342,584

61,914,983

24,027,438

2006년

43,183,502

69,459,178

26,534,015

2007년

45,766,102

81,985,183

26,370,191

2008년

46,376,610

91,388,900

28,252,471

2009년

37,649,854

86,703,245

21,770,839

2010년

49,816,058

116,837,833

28,176,281

2011년

56,207,703

134,185,009

39,679,706

2012년

58,524,559

134,322,564

38,796,057

2013년

62,052,488

145,869,498

34,662,290

2014년

70,284,872

145,287,701

32,183,788

CAGR

6.7% 17.2% 5.0%

 

2007년, 2008년 세계 경제 위기 때에 한국이 타격이 적었던 이유 중에 하나로 한-미 무역의 비중 대비 한-중 무역 비중을 그동안 꾸준히 늘려왔던 점을 드는 학자들도 있습니다.  그리고 중국 경제의 거품이 꺼지면 한국 경제가 몸살을 앓을 것이라고 앞날을 우려하는 학자들도 있구요.  그만큼 중국 경제와 한국 경제가 긴밀하게 얽혀있고, 한국에게 있어 경제 하나 만을 놓고 본다면 "미국보다 중국"이라고 말하는게 무역 통계가 말해주는 진실입니다. 

 

김무성 새누리당 대표의 "중국보다 미국"이라는 발언이 정치적 계산의 입장에서는 어떤 득실이 있었는지는 잘 모르겠으나, 경제라는 잣대로 놓고 봤을 때는 지금 한참 일하는 세대와 앞으로의 주역이 될 세대에게는 밥그릇을 걷어차는, 밥그릇에 재를 뿌리는 위험한 발언이었다고 생각하는 이유가 여기에 있습니다.  가뜩이나 경제가 어렵다, 어렵다 하는 요즘에 이런 발언을 하면 위험하지요.

 

그냥 "우방으로서의 미국"하면 될 것을 왜 "중국보다 미국"이라는 식으로 비교를 하고 중국의 심사를 건드리는 것인지 참 의아합니다.  말이라는게 한번 뱉고 나면 주워담을 수 없으니 참 조심스레 해야겠지요.  특히 차기 대선후보로 종종 언급될 만큼 말 한마디에 영향력이 있는 분이라면 더더욱 신중해야 겠지요.

 

사족을 붙이자면, 우리 자녀 세대가 성장해서 경제활동을 할 때가 되면 한-중-일 & 동남아 경제권이 더욱 공고해져 있을 가능성이 높습니다.  동남아 여러 국가들과 우리나라의 무역량 추세를 찾아서 보시면 무슨 말인지 금방 아실 겁니다.  자녀들을 미국으로 유학 보내려는 현 부모들의 노력은 10~20년 전에는 맞았을지 몰라도 향후 10~20년 후를 생각하면 중국이나 동남아로 자녀를 유학보내는게 미국으로 유학보내는 것보다 자녀들의 경제활동을 위해서는 더 유리할 것이라고 생각합니다.  자녀 유학도 "미국보다는 중국"이라는 말이지요.

728x90
반응형
Posted by Rfriend
,

 

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

  - (3-1) 이산형화(discretization)

  - (3-2) 이항변수화(binarization)

(4) 개수 축소

(5) 차원 축소

  - 주성분분석

  - 요인분석 

(6) 시그널 데이터 압축

 

중에서 우선 (3-1) 이산형화(discretization)에 대해서 알아보겠습니다. 

 

분할표(contingency table)를 구하거나 카이제곱 검정을 할 때 범주형 변수를 대상으로 집단 간 독립성 검정을 하게 됩니다.  이처럼 분석기법에 따라서 연속형 변수를 범주형 변수로 변환을 한 이후에야 분석이 가능한 경우가 있습니다. 

 

혹은, 회귀분석을 한다고 했을 때 명목형, 범주형 자료에 대해서 가변수(dummy variable) 화 해서 분석을 진행해야 할 때도 있습니다.  가령 요일효과를 모형에 적합시키고자 한다면 요일 변수를 월요일 여부(mon_yn), 화요일 여부(tue_yn), ... , 토요일 여부(sat_yn) 등과 같이 1, 0 으로 코드화된 가변수로 변환해야 하는 경우도 있습니다.

 

이번 포스팅에서는 첫번째 경우의 (1) 이산형화, 두번째 경우의 (2) 이항변수화에 대해서 R에서는 어떻게 처리하는지 알아보도록 하겠습니다.

 

 

 R 데이터 변환 (3) 범주화 : 이산형화(discretization)

 

 

[ 데이터 변환 구성 ] 

 

 

 

 

(3-1) 이산형화 (Discretization)

 

연속형 변수를 범주형 변수로 변환하는 작업을 이산형화라고 합니다.  이산형화 변화 시에는 '몇 개의 범주로 나눌지?''구분선(cutting line)을 무슨 기준으로, 어디로 할지?'가 중요한 질문이 되겠습니다.

 

두 질문에 대한 학술적인 단 하나의 답안은 없습니다.  두 질문에 대해 공통적으로 분석/활용의 목적이 무엇이냐와 Biz. Domain Konwledge가 충분히 반영이 되어서 의사결정을 해야만 하고, 운영 과정상의 시행착오와 경험을 통한 긍정/부정적 피드백을 반영하여 지속적으로 개선해나가야 할 것입니다. 

 

이번 포스팅에서는 (a) 간격을 동일하게 한 범주화와 (b) quantile을 활용한 범주화 (c) frequency를 동일하게 한 범주화를 R로 어떻게 하는지Cars93 데이터셋의 고속도로 연비(MPG.highway)을 가지고 예를 들어보겠습니다.

 

(참고로, Cars93 은 MASS 패키지에 내장된 데이터 셋으로서, 자동차의 속성에 대해서 27개의 변수, 93개 자동차 관측치를 가진 데이터 프레임)

 

(a) 간격을 동일하게 한 범주화는 R의 hist() 함수로 히스토그램을 그려보는 것이 좋은 출발점이 될 수 있습니다. R의 hist() 함수의 디폴트 구간 개수가 꽤 좋은 결과를 내주거든요.  bin size를 조정해가면서 분포를 탐색해보고서 특정 구간에서 변곡점이 있다면, 혹은 특정 segment 나 factor 별로 분포상의 큰 차이를 보인다면 그 구분선을 가지고 범주를 나눌 수도 있을 것입니다.

 

R의 within() 함수를 활용하여 아래의 Cars93의 고속도로연비는 20~50까지 5단위씩 등간격으로 6개 범주로 나누어 보겠습니다. 

 

> library(MASS)
> str(Cars93)
'data.frame':	93 obs. of  27 variables:
 $ Manufacturer      : Factor w/ 32 levels "Acura","Audi",..: 1 1 2 2 3 4 4 4 4 5 ...
 $ Model             : Factor w/ 93 levels "100","190E","240",..: 49 56 9 1 6 24 54 74 73 35 ...
 $ Type              : Factor w/ 6 levels "Compact","Large",..: 4 3 1 3 3 3 2 2 3 2 ...
 $ Min.Price         : num  12.9 29.2 25.9 30.8 23.7 14.2 19.9 22.6 26.3 33 ...
 $ Price             : num  15.9 33.9 29.1 37.7 30 15.7 20.8 23.7 26.3 34.7 ...
 $ Max.Price         : num  18.8 38.7 32.3 44.6 36.2 17.3 21.7 24.9 26.3 36.3 ...
 $ MPG.city          : int  25 18 20 19 22 22 19 16 19 16 ...
 $ MPG.highway       : int  31 25 26 26 30 31 28 25 27 25 ...
 $ AirBags           : Factor w/ 3 levels "Driver & Passenger",..: 3 1 2 1 2 2 2 2 2 2 ...
 $ DriveTrain        : Factor w/ 3 levels "4WD","Front",..: 2 2 2 2 3 2 2 3 2 2 ...
 $ Cylinders         : Factor w/ 6 levels "3","4","5","6",..: 2 4 4 4 2 2 4 4 4 5 ...
 $ EngineSize        : num  1.8 3.2 2.8 2.8 3.5 2.2 3.8 5.7 3.8 4.9 ...
 $ Horsepower        : int  140 200 172 172 208 110 170 180 170 200 ...
 $ RPM               : int  6300 5500 5500 5500 5700 5200 4800 4000 4800 4100 ...
 $ Rev.per.mile      : int  2890 2335 2280 2535 2545 2565 1570 1320 1690 1510 ...
 $ Man.trans.avail   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 1 1 1 1 1 ...
 $ Fuel.tank.capacity: num  13.2 18 16.9 21.1 21.1 16.4 18 23 18.8 18 ...
 $ Passengers        : int  5 5 5 6 4 6 6 6 5 6 ...
 $ Length            : int  177 195 180 193 186 189 200 216 198 206 ...
 $ Wheelbase         : int  102 115 102 106 109 105 111 116 108 114 ...
 $ Width             : int  68 71 67 70 69 69 74 78 73 73 ...
 $ Turn.circle       : int  37 38 37 37 39 41 42 45 41 43 ...
 $ Rear.seat.room    : num  26.5 30 28 31 27 28 30.5 30.5 26.5 35 ...
 $ Luggage.room      : int  11 15 14 17 13 16 17 21 14 18 ...
 $ Weight            : int  2705 3560 3375 3405 3640 2880 3470 4105 3495 3620 ...
 $ Origin            : Factor w/ 2 levels "USA","non-USA": 2 2 2 2 2 1 1 1 1 1 ...
 $ Make              : Factor w/ 93 levels "Acura Integra",..: 1 2 4 3 5 6 7 9 8 10 ..
 

> ## 고속도로연비(MPG.highway) 히스토그램

> hist(Cars93$MPG.highway)
 

 

 

> ## Model, MPG.highway 두 개 변수만 선택해서 disc_1 데이터 프레임 생성

> disc_1 <- Cars93[,c("Model", "MPG.highway")]

> ## 상위 6개 미리보기

> head(disc_1) Model MPG.highway 1 Integra 31 2 Legend 25

3 90 26 4 100 26

5 535i 30 6 Century 31

>

>

> ## 6개 범주로 등간격 범주화

 

 

> disc_1 <- within( disc_1, { + MPG.highway_cd = character(0) + MPG.highway_cd[ MPG.highway >=20 & MPG.highway <25 ] = "20~25" + MPG.highway_cd[ MPG.highway >=25 & MPG.highway <30 ] = "25~30" + MPG.highway_cd[ MPG.highway >=30 & MPG.highway <35 ] = "30~35" + MPG.highway_cd[ MPG.highway >=35 & MPG.highway <40 ] = "35~40" + MPG.highway_cd[ MPG.highway >=40 & MPG.highway <45 ] = "40~45" + MPG.highway_cd[ MPG.highway >=45 & MPG.highway <=50 ] = "45~50" + MPG.highway_cd = factor(MPG.highway_cd, + level = c("20~25", "25~30", "30~35", + "35~40", "40~45", "45~50")) + })

> 

> ## 상위 6개 보기

> head(disc_1)
    Model MPG.highway MPG.highway_cd
1 Integra          31          30~35
2  Legend          25          25~30
3      90          26          25~30
4     100          26          25~30
5    535i          30          30~35
6 Century          31          30~35
 

 

 

> attributes(disc_1$MPG.highway_cd)
$levels
[1] "20~25" "25~30" "30~35" "35~40" "40~45" "45~50"

$class
[1] "factor"

 

 

> table(disc_1$MPG.highway_cd) # 분할표 생성

 

20~25 25~30 30~35 35~40 40~45 45~50 14 41 27 7 2 2

 

"MPG.highway" 변수 옆에 "MPG.highway_cd" 라는 범주형 변수가 생겼음을 알 수 있습니다.  나중에 통계분석과 연계하기 위해 "MPG.highway_cd" 변수를 within()함수의 제일 마지막 줄에서 요인(factor)으로 지정을 해줬고, level = c("20~25", "25~30", "30~35", "35~40", "40~45", "45~50")) 으로 순서형 요인(ordered factor)의 수준을 지정해주었습니다.

 

 

다음으로 (b) quantile을 활용한 범주화 방법에 대해서 알아보겠습니다.  MPG.highway를 0~25%, 25~50%, 50~75%, 75~100%의 구성비로 해서 4개 범주로 나누어보겠습니다.

 

> summary(disc_1$MPG.highway)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  20.00   26.00   28.00   29.09   31.00   50.00
> 

> # 4분위수의 1Q, 2Q, 3Q, 4Q를 기준으로 4개의 범주 생성

> disc_1 <- within( disc_1, {
+   MPG.highway_cd2 = character(0)
+   MPG.highway_cd2[ MPG.highway <  quantile(MPG.highway, 0.25) ] = "1Q"
+   MPG.highway_cd2[ MPG.highway >= quantile(MPG.highway, 0.25) 
+                    & MPG.highway < quantile(MPG.highway, 0.50) ] = "2Q"
+   MPG.highway_cd2[ MPG.highway >=quantile(MPG.highway, 0.50) 
+                    & MPG.highway < quantile(MPG.highway, 0.75) ] = "3Q"
+   MPG.highway_cd2[ MPG.highway >= quantile(MPG.highway, 0.75) ] = "4Q"
+   MPG.highway_cd2 = factor(MPG.highway_cd2, 
+                           level = c("1Q", "2Q", "3Q", "4Q"))
+ })
> 

> # 상위 6개 보기

> head(disc_1)
    Model MPG.highway MPG.highway_cd MPG.highway_cd2
1 Integra          31          30~35              4Q
2  Legend          25          25~30              1Q
3      90          26          25~30              2Q
4     100          26          25~30              2Q
5    535i          30          30~35              3Q
6 Century          31          30~35              4Q
 

 

 

> table(disc_1$MPG.highway_cd2)  # 분할표 생성

1Q 2Q 3Q 4Q 
22 17 25 29 

 

 

다음으로, (c) frequency를 동일하게 해서 4개 범주를 구성해보도록 하겠습니다.  먼저 고속도로연비(MPG.highway) 기준으로 정렬을 해줘야합니다.

 

> ## 고속도로연비(MPG.highway) 기준으로 오름차순 정렬

> disc_1 <- disc_1[order(disc_1$MPG.highway), ]

 

 

> dim(disc_1) # 93개 관측치, 4개 변수 [1] 93 4

 

## 관측치 개수

> dim(disc_1)[1]
[1] 93
> 

> disc_1$N <- seq(1:length(disc_1$MPG.highway)) # 1~93까지 순서대로 1씩 증가하는 N이라는 변수 생성

>

> # 동일 frequency (23개)로 4개 범주 생성

> disc_1 <- within( disc_1, { + MPG.highway_cd3 = character(0) + MPG.highway_cd3[ N <= 23 ] = "1st_Freq" + MPG.highway_cd3[ N >= 24 & N <= 46 ] = "2nd_Freq" + MPG.highway_cd3[ N >= 47 & N <= 69 ] = "3rd_Freq" + MPG.highway_cd3[ N >= 70 ] = "4th_Freq" + MPG.highway_cd3 = factor(MPG.highway_cd3, + level = c("1st_Freq", "2nd_Freq", "3rd_Freq", "4th_Freq")) + }) > > head(disc_1) Model MPG.highway MPG.highway_cd MPG.highway_cd2 N MPG.highway_cd3 17 Astro 20 20~25 1Q 1 1st_Freq 36 Aerostar 20 20~25 1Q 2 1st_Freq 26 Caravan 21 20~25 1Q 3 1st_Freq 89 Eurovan 21 20~25 1Q 4 1st_Freq 48 Q45 22 20~25 1Q 5 1st_Freq 87 Previa 22 20~25 1Q 6 1st_Freq

 

 

 

 

>

 

 

> table(disc_1$MPG.highway_cd3) 1st_Freq 2nd_Freq 3rd_Freq 4th_Freq 23 23 23 24

 

위의 분할표를 보면 4개 범주별로 23개, 23개, 23개, 24개(총 93개여서 마지막에 1개 더 넣음) 로 동일 frequency로 범주화가 되었음을 알 수 있습니다.  그런데 (c) 같은 frequency 로 범주화 시에 동일한 고속도로연비임에도 범주가 다르게 구분이 되는 수가 생깁니다.  아래 예에서 보면 고속도로연비가 28인 경우 "2nd_Freq"와 "3rd_Freq" 범주에 양다리 걸쳐있는것을 확인할 수 있습니다.  ("1st_Freq"와 "2nd_Freq"에도 고속도로연비 26이 양다리를 걸치고 있습니다.  또한 31이 "3rd_Freq"와 "4th_Freq"에 양다리를 걸치고 있습니다.)  이처럼 동일 frequency로 범주화시에는 중첩됨이 없이 범주화하기가 어려운 문제점이 있습니다.  따라서 해석의 용이성과 중첩 방지를 위해서 (a) 등간격 범주화 또는 (b) quantile 활용 범주화가 (c) 동일 freqency보다는 좀더 유용하다고 볼 수 있겠습니다. 

 

 

이항변수화 (binarization)은 다음번 포스팅에서 소개해드리겠습니다.

 

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

 

 

728x90
반응형
Posted by Rfriend
,
 

데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소

 

(5) 차원 축소

   - 주성분분석

   - 요인분석 

(6) 시그널 데이터 압축

 

중에서 로그 변환, 제곱급 변환을 활용한 정규분포화에 대해서 알아보겠습니다. 이들 변환들이 정규분포가 아니었던 분포를 정규분포로 변환시키는데 활용되므로 정규분포화 변환이라는 카테고리로 묶어보았습니다. 

 

많은 통계기법이 정규분포를 가정하고 있으므로 정규분포(Gausian distribution)가 아닌 경우 정규분포로 변환시키는 것은 사전작업으로 필수적이라고 하겠습니다. 

 

 

 R 데이터 변환 (2) 정규분포화 log(), sqrt()

 

 

[ 데이터 변환 구성 ]

 

 

 

 

자연현상 중에, 우리 주변의 일상 중에 정규분포가 많은데요(예: 키, 몸무게, 통계성적 등), 그에 못지않게 멱함수 분포(Power-law distribution)도 많이 있답니다.  특히 개체간 상호작용과 (긍정적/부정적) 피드백이 작용하는 관계에서는 멱함수 분포가 존재할 가능성이 높습니다. 

 

아래는 한겨레신문에서 카이스트 정하웅 교수님 인터뷰하면서 정규분포(고소도로 네트워크)와 멱함수분포(항공망 네트워크)의 예로 들은 것인데요(바라바시 링크 책 참조), 멱함수 분포를 띠는 항공망 네트워크의 경우 허브(Hub) 역할을 하는 공항이 있다는 것이지요.  이를 척도 없는 네트워크(scale-free network)라고도 하는데요, 이런 허브(Hub), 매개자(Connector) 가 있음으로 해서 세상이 좁아진다(small world)는 이론이 뒷받침을 받게 됩니다.

 

[ 네트워크의 두가지 유형 ]

 

 

한 국가의 부의 분포를 보면 20%의 국민이 부의80%를 차지하고 있고, 마태복은 13장 12절에 있는 ‘무릇 있는 자는 받아 풍족하게 되고 없는 자는 그 있는 것 까지도 빼앗기리라’ 말씀을 따서 마태효과(Matthew effect)라는 이론이 있기도 한데요, 멱함수 분포의 예라고 할 수 있겠습니다. 

 

그밖에도 멱함수 분포를 따르는 것으로 논문 인용, 인터넷 네트워크, 전기회로도, 전기/하수구 네트워크, 뇌의 뉴런 네트워크, 전염병이나 성병의 전파(아래 그림 예의 왼쪽에서 오른쪽, 상에서 하 순서 참고), 산불이나 지진의 강도별 발생 빈도, 프로야구선수 또는 프로축구선수 연봉 등... 그 예를 들자면 아주 많습니다.  혹시 복잡계과학, 네트워크과학에 대해서 관심이 있으시면 바라바시의 링크(Linked), 버스트(Birst), 던컨와츠의 스몰 월드(Small World), 마큐뷰캐넌 사회적원자(Social Atom), 우발과 패턴(Ubiquity) 등의 책을 추천합니다.  저자들이 물리학자 혹은 사회과학자들인데요, 수학적 공식없이도 일반인들이 쉽고 재미있게 읽을 수 있도록 책을 썼습니다.  지적유희 측면에서 재미있어요.  복잡한 세상 속에 이런 규칙이...하고 놀랄겁니다.

 

 

[ 다양한 멱함수 분포 예 ]

 

 

옆길로 많이 샜는데요 ^^;, 이처럼 많은 멱함수 분포를 정규분포로 변환할 때 로그 변환이나 제곱근 변환을 사용하게 됩니다.

 

UsingR 패키지에 들어있는 cfb 데이터 프레임을 가지고 예를 들어보겠습니다. cfb 데이터셋은 소비자 재정에 관한 설문조사 샘플 데이터로서, 14개의 변수와 1000명의 관측치가 들어있습니다.

 

> install.packages("UsingR")
> library(UsingR)

> > data(cfb) # cfb 데이터 불러오기 > head(cfb) # 상위 6개 미리보기 WGT AGE EDUC INCOME CHECKING SAVING NMMF STOCKS FIN VEHIC X17470 5749.975 54 14 66814.19 6000 2000 0 500 39600 6400 X315 5870.634 40 12 42144.34 400 0 0 0 5400 21000 X8795 8043.695 35 14 25697.77 1000 160 0 0 15460 2000 X10720 6092.872 55 12 35976.87 2600 19100 0 0 54700 18250 X19170 7161.757 40 12 39060.61 1000 8300 0 3500 12800 9100 X22075 11429.633 82 12 13362.84 1000 0 50000 0 70500 7500 HOMEEQ OTHNFIN DEBT NETWORTH X17470 84000 0 40200 170800 X315 8000 0 58640 17760 X8795 12000 0 19610 9850 X10720 90000 0 8000 284950 X19170 47000 0 21000 268900 X22075 175000 0 0 253000 >

> summary(cfb$INCOME) # INCOME 요약통계량 Min. 1st Qu. Median Mean 3rd Qu. Max. 0 20560 38030 63400 69900 1542000 >

> hist(cfb$INCOME, breaks=500, freq=TRUE) # INCOME 히스토그램

 

 

 

 

 

(1) 로그 변환 : log()

 

> ## 로그 변환
> cfb <- transform(cfb, INCOME_log = log(INCOME + 1))
> hist(cfb$INCOME_log, breaks=500, freq=TRUE)

 

 

 

 

위의 로그 변환 시에 INCOME_log = log(INCOME + 1) 처럼 (INCOME +1) 을 했습니다.  INCOME 이 '0'부터 시작하는데 '0'을 로그 취하면 마이너스 무한대가 나오기 때문에 1을 더해서 오른쪽으로 1씩 이동시킨 후에 로그변환을 취했습니다.

 

히스토그램을 보면 이전의 멱함수 분포의 소득이 정규분포로 변환되었음을 알 수 있습니다.

 

 

(2) 제곱근 변환 : sqrt()

 

> ## 제곱근 변환
> cfb <- transform(cfb, INCOME_sqrt = sqrt(INCOME + 1))
> hist(cfb$INCOME_sqrt, breaks=500, freq=TRUE)
 

 

 

 

제곱근 변환은 sqrt() 함수를 사용합니다.  위의 예시를 보면 로그변환 보다는 제곱근 변환이 오른쪽에 수입이 엄청나게 많은 부자들을 덜 정규분포화 시킨다는 것을  알 수 있는데요, 원래 데이터의 분포를 보고 로그변환과 제곱근 변환 중에서 더 적합한 것을 선택해서 사용하면 되겠습니다.

 

정규성 검정을 할 때 정규 분위수-분위수 그림(Q-Q Plot)을 사용하는데요, 아래에 원래 INCOME, 로그 변환 INCOME_log, 제곱근 변환 INCOME_sqrt 의 세개 변수에 대해서 Q-Q plot을 그려보았습니다.   아래 Q-Q plot으로 봐서는 로그 변환이 가장 잘 정규성을 띠고 있네요.

 

> ## Q-Q plot
> par( mfrow = c(1,3))
> qqnorm(cfb$INCOME, main="Q-Q plot of INCOME")
> qqline(cfb$INCOME)
> 
> qqnorm(cfb$INCOME_log, main="Q-Q plot of INCOME_log")
> qqline(cfb$INCOME_log)
> 
> qqnorm(cfb$INCOME_sqrt, main="Q-Q plot of INCOME_sqrt")
> qqline(cfb$INCOME_sqrt)
> par(mfrow = c(1,1))
 

 

 

 

 

모집단의 분포 형태에 따른 대략적인 정규분포 변환 방법은 아래 표와 같습니다

 

 [ 분포 형태별 정규분포 변환 방법 ]

 

 distribution

before transformation

transformation function 

distribution

after transformation 

 left

X^3 

 normal distribution

(bell shape)

 mild left

X^2 

 mild right

sqrt(X) 

 right

ln(X) 

 severe right

1/X 

 

 

단일모집단의 정규성 검정 (shapiro test, Q-Q plot) 방법은 아래의 링크를 참조하세요.

R 단일 모집단 분포의 정규성 검정 : shapiro.test(), qqnorm(), qqline()

 

많은 도움이 되었기를 바랍니다.

 

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

 

728x90
반응형
Posted by Rfriend
,

데이터 변환 방법으로서

 

(1) 표준화 (Standardizatio)

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소

(5) 차원 축소

   - 주성분분석

   - 요인분석 

(6) 시그널 데이터 압축

 

중에서 (1) 표준화(Standardization)에 대해서 알아보겠습니다. 

 

 

다양한 소스로 부터 데이터를 R로 불러와서, 결합하고, 결측값과 특이값을 확인 후 처리하고, 필요한 부분의 데이터만 선별적으로 선택 혹은 제거한 후에 분석의 목적과 필요에 따라서, 그리고 데이터의 형태에 따라서 다양한 데이터 변환 (data transformation) 작업을 수행합니다. 

 

고급 분석가와 그렇지 않는 분석가가 나뉘는 부분, 데이터 엔지니어와 데이터 분석가가 나뉘어 지는 부분이 여기서 부터 이지 않을까 싶습니다.  업에 대한 지시과 더불어 분석의 목적과 분석의 기법에 대해서 정확히 알아야 하고, 데이터의 형태가 그에 맞는지, 맞지 않다면 어떻게 변환을 해야 하는지 알아야 하기 때문입니다.  그리고 데이터 변환을 하는데 있어 통계적인 기본 지식이 필요하다보니 여기부터는 프로그래밍을 잘하지만 통계를 잘 모르는 데이터 엔지니어의 경우 어려움을 겪기 시작합니다.

 

이 변환 작업에는 많은 시간과 노력이 필요합니다.  그래서 데이터 분석을 업으로 삼으려고 생각했던 사람이라도 소위 데이터 전처리, 데이터 변환의 지난한 과정에 대해서 재미를 느끼지 못하면 오래 견디지 못하고 다른 커리어로 전향을 하기도 합니다.  그만큼 본격적인 통계/데이터마이닝 과정에 진입하기 위한 전초 단계로 중요하지만 쉽지 많은 않은 과정이라는 얘기입니다. 

 

모델링을 하는데 있어 분석 목적에 유의미하고 적합한 파생변수를 개발하고 input으로 넣는 것이 정말 중요합니다.  개념적 정의, 조작적 정의를 통해 파생변수를 개발하는 과정에 필수로 필요한 이론적 지식이 이번부터 해서 총 6번에 나누어서 진행할 데이터 변환이 되겠습니다. 

 

데이터 변환을 (1) 표준화, (2) 정규분포화, (3) 범주화, (4) 개수 축소(샘플링), (5) 차원 축소, (6) 시그널 데이터 압축 등의 6개 카테고리로 구분하였습니다.  대략적으로 봤을 때 (1) 표준화, (2) 정규분포화, (3) 범주화는 데이터 분포나 속성을 변화시키는 기법이고, (4) 개수 축소(샘플링), (5) 차원 축소, (6) 시그널 데이터 압축은 데이터 크기를 축소하는 기법이 되겠습니다.

 

이번 포스팅에서는 (1) 표준화의 (1-1) z 변환, (1-2) [0-1] 변환에 대해서 알아보겠습니다.  

 

 

데이터 변환 (1) 표준화 

 

 

[ 데이터 변환 구성 ]

 

 

 

 

(1-1) 표준정규분포 z 변환

 

우선 정규분포에 대해서 간략히 짚고 z 변환으로 넘어가겠습니다. 일상 생활 속에서 우리는 다양한 정규분포를 접하고 삽니다.  만약 100명의 수강생을 대상으로 통계와 R 분석 교육을 받고 시험을 치면 아마도 평균을 중심으로 종모양으로 좌우 분포가 비슷한 성적 분포를 띨 것입니다.  수강생 100명의 키와 몸무게를 조사를 해서 히스토그램을 그려보면 이 또한 평균을 중심으로 종모양으로 좌우 대칭인 정규분포를 띨 것입니다.  수강생 얼굴을 아직 본적도 없는데 이렇게 예언을 할 수 있다는거, 이게 참 신기한겁니다. ^^  만약 키의 평균과 표준편차를 저한테 알려주고, 수강생 100명 중에서 한 명의 수강생을 뽑아서 키를 재서 저에게 알려주면 그 수강생이 전체 100명 중에서 상위 몇 % 키에 속할지도 추측할 수 가 있습니다. 놀랍지요?

 

통계학에서는 '중심극한정리(central limit theorem)'이 정말 중요한 역할을 하는데요, 중심극한정리란 분포의 모양을 모르는 모집단으로부터 표본을 추출할 때, 표본평균 의 분포는 표본의 크기 n이 커짐(일반적으로 )에 따라 점점 정규분포로 근사해 간다는 성질을 말합니다.

 

 

참고 ) 중심극한정리 (Central Limit Theorem)

 

을 평균 , 분산 인 모집단으로부터의 크기 n 인 확률표본이라고 했을 때,

표본평균 의 분포는 n이 커짐에 따라 정규분포 으로 근사해 간다.

 

 

중심극한정리에서 표본평균 를 표준화하면

 

통계량 근사적으로 표준정규분포 을 따른다.

 

 

 

 

 이 중심극한정리에 근거해서 보통 샘플이 대략 30개 이상이면 표본평균이 정규분포로 근사한다고 가정하고 정규분포 가정에 근거한 다양한 통계분석 기법(추정과 검정 등...)을 적용할 수 있게 됩니다. 

 

이때 두 개 이상의 모집단으로 부터 표본의 크기가 큰 표본을 추출했을 때, 각 집단의 평균과 표준편차가 다르거나, 혹은 측정 scale 이 다른 경우에는 다수의 집단 간, 변수 간 직접적인 비교가 불가능하게 됩니다.   미국 달러, 유럽의 유로화, 중국의 위안화, 일본의 엔화, 그리고 한국의 원화를 각 각 1000 단위를 가지고 있다고 했을 때, 이게 서로간에 대비해서 얼마나 많은 건지, 값어치가 있는건지 직접 비교하는게 불가능한 것과 같은 이치입니다.  이때 특정 나라의 통화를 기준으로 삼고 다른 나라의 통화를 기준으로 변환을 하면 각 나라별 통화간의 돈의 가치를 비교할 수 있게 됩니다.  이게 표준화의 원리입니다.

 

위에서 정규분포의 중요성에 대해서 설명했는데요, 정규분포 중에서도 평균이 0, 표준편차가 1인 정규분포를 표준정규분포(standadized normal distribution) 이라고 합니다.  평균이 표준편차가 서로 다른 다수의 집합을 표준정규분포로 표준화를 하면 서로 비교를 할 수 있게 됩니다. 

 

그러면, 이제 R로 표준정규화 하는 방법에 대해서 알아보겠습니다.

 

  • 한국 성인 남성 1,000 명의 키가 평균 170cm, 표준편차 10cm의 정규분포
  • 남아프리카 부시맨 성인 남성 1,000명의 키가 평균 150cm, 표준편차 8cm의 정규분포

를 따른 다고 했을 때 두 집단의 키를 평균이 0, 표준편차가 1인 표준정규분포로 표준화를 해보도록 하겠습니다.

 

 

 먼저, 데이터 생성은 아래와 같이 랜덤하게 생성하였습니다.

 

> ## 한국인, 부시맨 각 성인 1000명 키 데이터 생성 > height_korean <- rnorm(n=1000, mean = 170, sd = 10) > height_bushman <- rnorm(n=1000, mean = 150, sd = 8) > > height <- data.frame(height_korean, height_bushman) # 데이터 프레임 생성

> rm(height_korean, height_bushman) # 벡터 삭제

> > head(height) # 상위 6개 데이터 확인 height_korean height_bushman 1 162.7654 132.5271 2 180.5701 135.5497 3 172.6752 142.5168 4 171.8035 156.7872 5 186.5258 154.3027 6 171.4634 156.1118 

 

> ## 한국인, 부시맨 키 히스토그램

> attach(height)
> par( mfrow = c(1,2))
> hist(height_korean, freq = TRUE, main = "한국인 키 빈도 히스토그램")
> hist(height_korean, freq = FALSE, main = "한국인 키 확률밀도함수 그래프")
> 

 

 

> hist(height_bushman, freq = TRUE, main = "부시맨 키 빈도 히스토그램")
> hist(height_bushman, freq = FALSE, main = "부시맨 키 확률밀도함수 그래프")

 

 

> detach(height)

 

 

그리고 표준정규화를 해보겠는데요, (a) scale()함수를 쓰는 방법과 (b) (x-mean(x))/sd(x) 처럼 공식을 직접 입력하는 방법이 있습니다.  결과는 동일합니다.

 

> ## a. scale() 함수
> 
> height <- transform(height, 
+                     z.height_korean = scale(height_korean), 
+                     z.height_bushman = scale(height_bushman)
+                     )
> 
> head(height)
  height_korean height_bushman z.height_korean z.height_bushman
1        179.19         140.60         0.89308         -1.18393
2        164.54         152.70        -0.60892          0.35689
3        184.18         136.76         1.40477         -1.67426
4        196.37         144.26         2.65531         -0.71833
5        162.61         155.72        -0.80706          0.74198
6        158.02         147.19        -1.27775         -0.34510

 

> ## b. z=(x-mean(x))/sd(x)
> height <- transform(height, 
+                     z2.height_korean = (height_korean - mean(height_korean))/sd(height_korean), 
+                     z2.height_bushman = (height_bushman - mean(height_bushman))/sd(height_bushman)
+                     )
> 
> head(height)
  height_korean height_bushman z.height_korean z.height_bushman z2.height_korean z2.height_bushman
1        179.19         140.60         0.89308         -1.18393          0.89308          -1.18393
2        164.54         152.70        -0.60892          0.35689         -0.60892           0.35689
3        184.18         136.76         1.40477         -1.67426          1.40477          -1.67426
4        196.37         144.26         2.65531         -0.71833          2.65531          -0.71833
5        162.61         155.72        -0.80706          0.74198         -0.80706           0.74198
6        158.02         147.19        -1.27775         -0.34510         -1.27775          -0.34510 

 

 

아래 히스토그램은 한국인과 부시맨의 성인 남자 키를 z 표준화 한 값에 대한 히스토그램이 되겠습니다.  둘다 평균이 0, 표준편차가 1인 표준정규분포로 표준화 되었음을 확인할 수 있습니다.

 

> hist(height$z.height_korean, freq=TRUE, main="standized freq. of Korean H")
> hist(height$z.height_bushman, freq=TRUE, main="standized  freq. of Bushman H ")

 

 

 

 

 

(1-2) [0-1] 변환

 

연속형 변수의 값을 '0~1' 사이의 값으로 변환하는 [0-1]변환도 z변환과 함께 많이 쓰이는 표준화 기법입니다.  만약 변수들 간의 scale 이 다른 상태에서 인공신경망 분석을 하려면 [0-1]변환으로 단위를 표준화해준 후에 분석을 시행해야 합니다.  Scale이 다른 두 변수를 [0-1] 변환하게 되면 상호간에 비교가 가능해집니다.

 

[0-1] 변환은  (x-min(x) /(max(x)-min(x)) 의 수식으로 계산하면 됩니다.

 

위의 한국 성인 남성과 부시맨 성인 남성 각 1,000명의 키 데이터를 가지고 이번에는 [0-1] 표준화 변환을 해보도록 하겠습니다.  일단 위 데이터셋 height에서 첫번째와 두번째 변수만 선택하고, 변수명이 너무 길므로 짧게 변수이름을 변경해보겠습니다.

 

> ## [0-1] transformation
> height <- height[,c(1:2)]
> library(reshape)
> height <- rename(height, c(height_korean = "h_kor", height_bushman = "h_bush"))
> head(height)
   h_kor h_bush
1 179.19 140.60
2 164.54 152.70
3 184.18 136.76
4 196.37 144.26
5 162.61 155.72
6 158.02 147.19

 

 

그 다음 [0-1] 변환을 하고 히스토그램을 그려보겠습니다.

 

> height <- transform(height, 
+                     h_kor_01 = (h_kor - min(h_kor))/(max(h_kor) - min(h_kor)), 
+                     h_bush_01 = (h_bush - min(h_bush))/(max(h_bush) - min(h_bush))
+                     )
> 
> head(height)
   h_kor h_bush h_kor_01 h_bush_01
1 179.19 140.60  0.64341   0.27053
2 164.54 152.70  0.41760   0.51072
3 184.18 136.76  0.72034   0.19410
4 196.37 144.26  0.90835   0.34311
5 162.61 155.72  0.38781   0.57074
6 158.02 147.19  0.31705   0.40129
> 
> hist(height$h_kor_01)
> hist(height$h_bush_01)
 
 

 

 

 

한국 성인 남성 키와 부시맨 성인 남성 키가 0~1 사이의 값으로 표준화되었음을 알 수 있습니다.

 

이해가 쉽도록 166cm의 한국 남성과 156cm의 부시맨 남성의 키를 가지고 [0-1] 변환 했을 때의 예시를 개념도로 아래에 작성하였습니다.  참고하시기 바랍니다.

 

 

[0-1] 변환 예시 (한국 남성 166cm, 부시맨 남성 156cm) 

 

 

 

많은 도움 되었기를 바랍니다. 

 

다음번 포스팅에서는 정상화 변환에 대해서 알아보도록 하겠습니다.



여러개의 변수를 가진 DataFrame에 대해서 층화 무작위 추출을 사용해서 Train, Test set 분할을 하는 방법은 아래의 포스팅을 참고하세요. 

==> https://rfriend.tistory.com/515


 

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

 

 


728x90
반응형
Posted by Rfriend
,