데이터는 크게 수치형 데이터와 범주형 데이터로 나뉜다.
오늘은 데이터가 범주형일 경우 분석을 위해 처리해야 하는 방법에 대해 정리해보도록 한다.
볌주형 데이터의 경우 일반적으로 회귀분석과 같은 연속형 변수를 다루는 분석기법에서는 사용할 수 없기 때문에 형태를 변환하여 가능하도록 만들어 줘야한다.
R에서 제공하는 iris 데이터로 예를 들어보자. 여기서 Species 변수를 범주형 데이터라고 하고, 분석을 위해 'setosa', 'versicolor', 'virginica'을 수치형 데이터로 변환하여 처리할 것이다.
이렇게 수치로 변환한 데이터를 더미변수라고 한다.
R과 Python을 통해 범주형 변수를 수치형 데이터로 변환하는 방법은 아래와 같다.
R 코드
1. transform 함수
n개의 범주가 있을때 기준이 되는 범주를 제외한 n-1개의 더미변수를 만들고, transform 함수를 사용하면 더미변수명을 직접 정할 수 있다. 여기서는 'Species' 변수의 'virginica' 범주를 기준으로 잡았고, '
setosa'
범주는 'Species_setosa' = 1, '
versicolor' 범주는 'Species_versicolor' = 1로 입력되어진 것을 알 수 있다. 두 더미변수에 모두 0인 경우는 기준범주인 'virginica'를 의미한다.
1
2
3
4
5
6
7
|
#------ iris 데이터 읽기
data("iris")
#------ 더미변수 변환방법1
d_iris1<-transform(iris,
Species_setosa = ifelse(Species =="setosa", 1, 0),
Species_versicolor = ifelse(Species =="versicolor", 1, 0))
|
cs |
2. dummies 패키지
데이터프레임에 있는 변수 중 범주형 변수를 자동으로 변환해 준다. 위의 transform 함수는 다르게 dummies 패키지는 범주의 레벨 수 만큼 더미변수를 생성하고, 범주형변수명+범주레벨 이름이 합쳐져서 더미변수명을 자동 생성한다.
1
2
3
4
5
|
#------ 더미변수 변환방법2
install.packages("dummies")
library(dummies)
d_iris2<-dummy.data.frame(iris)
|
cs |
위의 두가지 방법으로 더미변수를 만든 후 회귀분석 결과를 비교해보기 위해 iris 데이터를 활용하여 임의로 모델을 만들었다.
1
2
3
4
5
6
7
8
|
#------ 1) 범주형 변수 더미변수로 변환하지 않음
summary(lm(Sepal.Length ~ Sepal.Width + Petal.Length + Species, data = iris))
#------ 2) 범주형 변수 transform 함수 사용하여 더미변수로 변환
summary(lm(Sepal.Length ~ Sepal.Width + Petal.Length + Species_versicolor + Species_virginica, data = d_iris1))
#------ 3) 범주형 변수 dummies 패키지 사용하여 더미변수로 변환
summary(lm(Sepal.Length ~ Sepal.Width + Petal.Length + Speciesversicolor + Speciesvirginica +Speciessetosa, data = d_iris2 ))
|
cs |
1) '범주형 변수 더미변수로 변환하지 않음' 결과
자동으로 setosa 범주가 기준값으로 설정되었음을 알 수 있다.
사실 더미변수로 변환하지 않더라도 R은 알아서 가변수 처리를 해준다... 해당 변수가 factor형이든 character형이든...
분석용으로는 R을 쓰는 이유인것 같다. 너무 편하다!!!
2) '범주형 변수 transform 함수 사용하여 더미변수로 변환' 결과
1번 결과와 동일함을 보여주기 위해 기준이 되는 범주를 맞춰주었다. 변수명은 다르지만 결과는 동일함을 알 수 있다.
3) '범주형 변수 dummies 패키지 사용하여 더미변수로 변환' 결과
기준이 되는 'setosa'는 NA로 출력되며 다른 변수의 회귀계수값은 동일함을 알 수 있다.
다만, 회귀식을 작성할때 마지막에 오는 더미변수가 기준변수가 되므로 유의하여 모델을 만들어야 한다!!
Python 코드
0. 샘플데이터 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import pandas as pd
from pandas import DataFrame, Series
from itertools import cycle
pd.set_option('display.unicode.east_asian_width', True)
#데이터 생성
area = '서울 부산 대구 인천 광주'.split()
college = '인문대학 사회과학대학 자연과학대학'.split()
gender = '남성 여성'.split()
fake_data = zip(range(100), cycle(area), cycle(college), cycle(gender))
hundred_students = DataFrame([data for num, *data in fake_data],
columns='지역 단과대 성별'.split())
hundred_students['score'] = pd.DataFrame(np.random.randn(100,1))
print(hundred_students.head(10))
|
cs |
1. get_dummies 함수
연속형 변수인 score를 제외한 범주형 변수 지역, 단과대, 성별은 자동으로 더미변수가 생성되었다. 데이터프레임에 있는 모든 범주형 변수를 변환해주기 때문에 특정 열만 변환을 할 것이라면 columns 파라미터에 선택해주고, prefix 파라미터로 원하는 더미변수명도 지정 가능하다.
1
2
3
4
5
|
#get_dummies 함수
hundred_students = pd.get_dummies(hundred_students)
#hundred_students = pd.get_dummies(hundred_students, columns=['지역'], prefix='지역')
print(hundred_students.head(10))
|
cs |
2. OneHotEncoder 함수
sklearn의 OneHotEncoder 함수는 숫자형만 읽을 수 있기 때문에 문자형으로 된 변수는 먼저 labelling을 해주어야 한다. 아래 코드는 지역 변수를 먼저 라벨링 해주고, 원핫인코딩을 하는 순서로 되어 있다. 범주형 변수를 한번에 처리해주는 get_dummies 함수보다 복잡한 과정을 거쳐야 한다.... 개인적으로 get_dummies 함수를 쓰는게 편할 것 같다...;;;;
1
2
3
4
5
6
7
8
9
10
11
12
|
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
label = LabelEncoder()
hundred_students['지역라벨'] = label.fit_transform(hundred_students['지역'])
onehot = OneHotEncoder()
x = onehot.fit_transform(hundred_students['지역라벨'].values.reshape(-1,1)).toarray()
onehot_df = pd.DataFrame(x, columns = ["지역_"+str(int(i)) for i in range(x.shape[1])])
hundred_students = pd.concat([hundred_students, onehot_df], axis=1)
hundred_students
|
cs |
감사합니다 :)
'머신러닝&딥러닝 > Python' 카테고리의 다른 글
[R과 Python 비교] 데이터 프레임 병합하는 다양한 방법 (0) | 2022.05.24 |
---|---|
[scikit-learn] PCA 기능 (0) | 2022.05.18 |
[Jupyter notebook] 아나콘다 가상 환경 생성 및 활용 (0) | 2022.05.10 |
[matplotlib] Line chart 기본 옵션 (0) | 2022.04.22 |
[GitHub] 내 코드 관리하기! (0) | 2019.05.03 |