🤔 범주형 변수(categorical variable) 다루기

많은 머신러닝 모델들은 오직 수치형 변수만을 입력값으로 받는다. 데이터 분석을 진행하면서 범주형 범수에서 중요한 인사이트를 찾았지만, 이를 모델링에 적용할 수 없다면 큰 문제가 생길 것이다. 따라서 범주형 변수를 수치형으로 변환해주는 과정이 필요하다. 하지만 어떻게 범주형 변수가 가지고 있는 정보를 그대로 유지하면서 수치형으로 변환할 수 있을까?

이 중 많이 쓰는 기법이 **가변수 (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