범주형 데이터는 숫자의 차이가 의미가 없기 때문에 원핫인코딩/더미화 하여 데이터 처리를 해줘야 한다.
즉, 색상이
1. 빨강
2. 노랑
3. 파랑
인 경우를 본다면, 1,2,3의 순서나 크기가 데이터 분석에 영향을 줄 수 있기 때문이다.
따라서 빨강인이 아닌지에 대한 여부로 변수를 변경해야 한다.
이렇게 되면 색상 컬럼/변수 하나가 3개의 컬럼으로 증가하여 빨강인지 아닌지, 노랑인지 아닌지, 파랑인지 아닌지로 변경하게 된다.
이런 데이터 변경을 쉽게 해주는 코드들은 아래와 같다.
1. 기본 데이터 셋 만들기
import pandas as pd
df = pd.DataFrame([['green', 'M', '10.1', 'class1'],
['red', 'L', '13.5', 'class2'],
['blue', 'XL', '15.3', 'class1']])
df.columns = ['color', 'size', 'price', 'classlabel']
print(df)
color size price classlabel
0 green M 10.1 class1
1 red L 13.5 class2
2 blue XL 15.3 class1
2. 데이터 셋에서 필요한 부분들을 숫자로 변경한다.
=> color, size를 숫자로 변경하고 price는 데이터 타입을 변경함.
X = df[['color', 'size', 'price']].values # 데이터 프레임에서 numpy.narray로 변환됨.
color_le = LabelEncoder() # 원핫인코딩을 위해 string을 int 라벨로 변환함
X[:, 0] = color_le.fit_transform(X[:,0]) # 인텍스 '0'에 있는 color 변경
X[:, 1] = color_le.fit_transform(X[:,1]) # 인텍스 '1'에 있는 size 변경
X[:,2] = X[:,2].astype(dtype=float)
print(X)
[[1 1 10.1]
[2 0 13.5]
[0 2 15.3]]
3. 원핫인코딩
3-1. scikit-learn 사용
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(categorical_features=[0]) # 인텍스 '0'의 데이터를 원핫인코딩함
ohe = ohe.fit_transform(X).toarray() # 원핫인코딩으로 명목변수 변경 후 numpy로 변경
print(ohe)
[[ 0. 1. 0. 1. 10.1]
[ 0. 0. 1. 0. 13.5]
[ 1. 0. 0. 2. 15.3]]
3-2. pandas 사용
X_df = pd.get_dummies(df[['color', 'size','price']])
print(X_df)
color_blue color_green color_red size_L size_M size_XL price_10.1 \
0 0 1 0 0 1 0 1
1 0 0 1 1 0 0 0
2 1 0 0 0 0 1 0
price_13.5 price_15.3
0 0 0
1 1 0
2 0 1
'데이터분석 > 머신러닝' 카테고리의 다른 글
[기초개념] 데이터 분석 관점에서 한줄로 정리한 '머신러닝 딥러닝 데이터 분석을 하기 위해 꼭 알아야할 기본 개념' (0) | 2018.05.28 |
---|---|
[데이터 분석] 의미있는 피처(컬럼) 선택 (0) | 2018.05.17 |
[데이터 분석-전처리] 범주형 데이터 (0) | 2018.04.24 |
[데이터 분석-전처리] 결측치 처리하는 방법 (3) | 2018.04.24 |
[이론] 머신러닝 알고리즘 기초 (인공뉴런-퍼셉트론, 에이다라인) (0) | 2018.04.24 |