많은 머신러닝 모델들은 오직 수치형 변수만을 입력값으로 받는다. 데이터 분석을 진행하면서 범주형 범수에서 중요한 인사이트를 찾았지만, 이를 모델링에 적용할 수 없다면 큰 문제가 생길 것이다. 따라서 범주형 변수를 수치형으로 변환해주는 과정이 필요하다. 하지만 어떻게 범주형 변수가 가지고 있는 정보를 그대로 유지하면서 수치형으로 변환할 수 있을까?
이 중 많이 쓰는 기법이 **가변수 (dummy variable)**로 처리를 해주는 방법이다.
가변수 처리는 범주형 변수를 0과 1의 값만을 갖는 변수로 전환하는 방법이다. 다음 예시를 통해 이를 이해해보자.
다음과 같이 요일에 대한 정보를 갖고 있는 피쳐가 있다고 생각해보자.
index | 요일 |
---|---|
0 | 월 |
1 | 화 |
2 | 수 |
이에 대한 가변수 처리는 다음과 같다. 범주형 변수에 카테고리 수만큼 컬럼을 추가하여, 해당 카테코리에 해당하는 컬럼에는 1, 아니면 0을 기입하는 것이다.
index | 월 | 화 | 수 |
---|---|---|---|
0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
2 | 0 | 0 | 1 |
판다스에서 제공하는 get_dummies()
함수를 활용하여 가변수 처리를 해볼 수 있다. get_dummies()
에서 제공하는 파라미터는 다음과 같다.
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False,
columns=None, sparse=False, drop_first=False, dtype=None)
dummy_na=True
로 설정하면 결측값까지도 가변수 처리가 가능하다. K개의 카테고리가 있다면 사실, K-1개의 가변수 만으로도 모든 카테고리를 구별할 수 있다. drop_first = True
는 첫번째 카테고리를 제거하여 이를 구현한다.
Q1. 어떻게 K개의 카테고리를 K-1개의 가변수 컬럼으로 구별이 가능할까?
Q2. 만약 수백개의 카테고리가 존재하고, 특정 카테고리의 수들은 매우 적을 경우 어떻게 전처리를 하는 것이 효율적일까?
아래는 판다스에서 제공하는 예시 코드이다.
In [60]: df = pd.DataFrame({"key": list("bbacab"), "data1": range(6)})
In [61]: pd.get_dummies(df["key"])
Out[61]:
a b c
0 False True False
1 False True False
2 True False False
3 False False True
4 True False False
5 False True False
In [62]: df["key"].str.get_dummies()
Out[62]:
a b c
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
4 1 0 0
5 0 1 0