데이터 변환 방법으로서

(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() 함수를 써서 어떻게 변환하는지 정도만 이해하셨으면 일단 이번 포스팅에서는 얻어갈 것 다 얻어가신겁니다.

 

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

 

 

 

Posted by R Friend R_Friend