본문 바로가기

구간화(Binning) 더미변수(Dummy Variable) pd.cut[빅공남! 통계 같이해요]

KAIST수학전공쌤 2022. 3. 9.

구간화(Binning) 더미변수(Dummy Variable) 변수변환 빅데이터 분석기사 빅분기 변수변환 주제로 오늘 포스팅을 준비했습니다. 지난 포스팅에서는 변수변환 방법으로 Scaler에 대해서 공부를 했었습니다. 오늘은 연속형, 변수형 변수를 서로 변환하는 내용에 대해서 주로 다루고자합니다. 이론적인 내용과 파이썬 코딩 실습을 같이하는 포스팅과 유튜브 영상을 준비했습니다. 유튜브 영상 링크는 포스팅 맨 하단에 첨부하도록 하겠습니다.

 

지난 포스팅에서 정리했듯이, 변수변환 방법은 4가지로 정리를 해보고 있습니다.

- Scaler(Min-max, Z-score, Robust)

- 구간화(Binning)

- 더비 변수(Dummy Variable

- 함수 변환(지수,로그,루트,역수 등등....)

 

오늘은 4가지 중에서 2가지 주제인 구간화(Binning)과 더미 변수(Dummy Variable)에 관한 내용입니다.

 

1. 구간화(Binning)

구간화(Binning)은 연속형 변수를 범주형(Category)형태의 변수로 바꾸는 것을 말합니다. 특히, 숫자 형태의 데이터를 구간을 나누고 구간별로 데이터를 구분해서 범주(Category)를 만드는 것입니다. 아래 그림을 참고해서 볼 수 있습니다.

https://docs.tibco.com/pub/sfire-analyst/10.10.0/doc/html/en-US/TIB_sfire-analyst_UsersGuide/bin/bin_what_is_binning.htm

왼쪽 그림처럼, 각 나이에 대해서 몇명이 존재하는지를 나타내는 그림이 있는 상태에서 변수를 구간화(Binnning)한다는 의미는 나이를 40대,50대,60대,70대이상 으로 나누는 것을 의미합니다. 위의 오른쪽 그림처럼 Binned Age는 나이의 구간을 나누어서 새롭게 만들어낸 변수로 볼 수 있습니다.  

 

아래 그림처럼 원본데이터가 0~10의 사이의 값을 가지는 경우에 구간화를 실습해보았습니다. 구간(Bins)를 [0,2,4,6,8,10] 2간격을 나누어서 구간화(Binning)하는 경우를 만들어 보았습니다. 아래 그림에서 bins_5는 5개의 구간으로 나눈 값을 의미합니다. [4,6)은 4이상 6미만을 의미하는 구간입니다. 다시 이 구간을 크기를 순서대로 A,B,C,D,E로 나누어서 범주(Category)를 만들어 보았습니다.

 

 

2. 더미변수(Dummy Variable)

더미 변수(Dummy Varialbe)은 범주형(Category) 변수를 0과 1의 숫자형태로 변환하는 것을 의미합니다. 데이터 모델링을 할 때, 숫자형태의 데이터가 들어가야 하는 경우가 있습니다. 이 경우 더미변수로 변환을 해서 적용을 해볼 수 있습니다. 범주(Category) 종류가 n가지가 있다면, 더미 변수는 (n-1)가지의 열로 나타낼 수 있습니다. 그리고, 더미변수는 one-hot encoding을 통해서 바꿀 수 있습니다.

 

그런데 단순히, 범주형(Category) 형태의 변수를 숫자로 만들면 파이썬에서 Label Encoder로 표현해낼 수 있습니다. 아래 그림처럼 0,1,2,... 알파벳 순으로 데이터를 변환해서 숫자형태로 만들 수 있습니다. 하지만, 색상이 1일때와 2일때 2배차이난다고 색상이 2배로 변하는 것이 없습니다. 그래서 범주형(Category)변수를 더미변수로 만든다는 것은 숫자형태로 0과 1의 열을 추가해서 만드는 것을 의미합니다.

더미 변수로 One-Hot Encoding을 통해서 데이터를 바꾼다면 다음 그림처럼 변환할 수 있습니다. 

알파벳 순으로 Blue, Green, Red를 정렬하고, 첫번째 변수를 제외한 나머지 2개의 변수(Green, Red)에 대해서 Dummy Variable을 생성하면, 0과 1의 숫자 조합으로 Blue, Green, Red를 모두 만들어 낼 수 있습니다.

그림 처럼, 원본데이터는 color 열을 가지고 있습니다. dummy를 만들어내면, color_Green, Color_Red가 생성이 됩니다. 그런데, color_Green, Color_Red열로 Blue를 찾아낼 수 있습니다. 만약, color_Green이 0이고, color_Red = 0이라면, Green도 아니고 Red도 아니기 때문에 Blue가 된는 것입니다. 이처럼 변수를 dummy varialbe로 변환하면, n개의 범주는 n-1개의 열을 가지는 dummy variable로 나타낼 수 있습니다.

 

3. 구간화(Binning) 파이썬 코딩 

[데이터 샘플 만들기]

import pandas as pd
import numpy as np

#랜덤변수, 0~10사이, 20개 생성
data_origin = np.random.randint(10, size=10)
df = pd.DataFrame()
df['original']=data_origin

 

[pd.cut 명령어로 Binning 하기]

#구간을 0~10사이로 만듦.
bins = [0,2,4,6,8,10]
data_bin5 = pd.cut(df['original'],bins,right=False)
df['bin_5']=data_bin5

#낮은 구간부터 순서대로 A~B 범주화
Category = pd.cut(df['original'], bins,right=False,
                 labels=["E","D","C","B","A"])
df['Category']=Category

#낮은 구간부터 순서대로 A~B 범주화
rank = pd.cut(df['original'], bins,right=False,
                 labels=["5","4","3","2","1"])
df['Rank']=rank
df

 

[코딩 실행 결과]

 

4. 더미변수(Dummy Variable) 파이썬 코딩 

[데이터 생성]

import pandas as pd

df = pd.DataFrame()
df['size']=['S','S','M','L','XL','L','S',np.nan]
df['color']=['Red','Blue','Red','Green','Red','Green','Blue','Red']
df

 

[데이터 생성 결과]

[Label Encoder로 숫자 변환시]

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df['label_color'] = encoder.fit_transform(df['color'])
df

[Label Encoder 코딩 결과]

[pd.get_dummies 명령어로 color dummy variable 생성]

df = pd.DataFrame()
df['size']=['S','S','M','L','XL','L','S',np.nan]
df['color']=['Red','Blue','Red','Green','Red','Green','Blue','Red']
pd.get_dummies(df, columns = ['color'] )

[color dummy variable 생성 결과]

 

[pd.get_dummies, drop_first = True (n-1)개 열로]

pd.get_dummies(df,columns=['color'],
               drop_first=True)

[코딩 결과]

[pd.get_dummies, dummy_na = True 결측치도 dummy 변수화]

pd.get_dummies(df,columns=['size'],dummy_na = True)

 

 

댓글