데이터 분석을 위한 데이터 전처리 방법 - Data Handling

  데이터 분석을 하기 위해서는 가장 기본적으로 데이터 전처리를 진행해야합니다.  해당 포스팅은 Hands-Hands-On Machine Learning 책과 코세라 강의 중 How to Win a Data Science Competition: Learn from Top Kagglers를 공부하며 정리하고 데이터 분석을 진행하는 과정을 포함하고 있습니다. 이 포스팅은 캐글 Titanic 생존 예측 분석 데이터를 예시로 진행해볼 예정입니다.

 

  이번 글에서는 데이터 전처리 과정 중 앞서 알아본 Data Cleaning 과정 후 진행하게 될 Data Handling과 Feature Generation에 대해서 알아보겠습니다. 우리가 주로 접하게 되는 많은 Raw 데이터 들은 이미 정제가 완료된 아주 보기 좋은 데이터죠. 하지만 이 데이터들은 머신러닝 알고리즘이 보기에는 이해하기 힘든 내용들입니다. 데이터 전처리의 핵심인 Data Handling과 Feature Generation을 통해서 머신러닝이 쉽고 빠르게 이해할 수 있는 데이터로 만들어 보겠습니다.

 

 

 


  • Data Cleaning : 불필요한 데이터 제거 및 누락된 데이터 처리

  • Data Handling(데이터 전처리) : 머신러닝 알고리즘이 이해할 수 있는 데이터로 처리하기 (Numeric, Categorical and Ordinal, DateTime and coordinates)

  • Feature Generation : 기존의 데이터를 기반으로 새로운 데이터를 생성

 


Data Handling

데이터 핸들링에서는 수치형 변수(Numeric), 범주형 변수(Categorical)를 처리하는 방법에 대해서 알아보도록 하겠습니다.

 

1. 수치형 변수 Numeric Data 처리

  • Tree based models : 숫자형 데이터 전처리에 영향을 거의 받지 않음

  • Non Tree based models : 숫자형 데이터 전처리에 영향 받음

머신러닝 알고리즘은 수치형 변수에 많은 영향을 받지 않지만 계산 과정에서 데이터 값이 너무 크거나 작으면 제대로 반영이 되지 않을 수 있습니다. 그렇기에 수치형 변수를 처리해 주는 것은 중요합니다. 숫자형 변수를 처리하는 방법은 데이터를 정규화 즉 Normalization 하는 방법이 있습니다. 대표적인 정규화 방법은 sklearn.preprocessing 패키지가 제공하는 MinMaxScaler와 StandardScaler가 있죠.

 

 

- Min-Max Normalization

최소-최대 정규화는 데이터를 정규화하는 가장 일반적인 방법입니다. 모든 값에 대해 각각의 최소값 0, 최대값 1로 변환하는 것이죠

from sklearn.preprocessing import MinMaxScaler
titanic_df.head()

minmax = MinMaxScaler().fit(titanic_df)
output = minmax.fit_transform(titanic_df)
output = pd.DataFrame(data=output, columns=titanic_df.columns)
output.head()

- StandardScaler

from sklearn.preprocessing import StandardScaler
titanic_df.head()

scaler = StandardScaler().fit(titanic_df)
output = minmax.fit_transform(titanic_df)
output = pd.DataFrame(data=output, columns=titanic_df.columns)
output.head()

- Log transform

MinMaxScaler와 StandardScaler를 이용한 방법 외에도 수치형 데이터에 log를 해주면 수치형 변수를 쉽게 정규화 할 수 있습니다.

output = titanic_df.copy()
output['Fare'] = np.log1p(titanic_df['Fare'])
output.head()

 

2. 범주형 변수 Categorical and Ordinal Data 처리

 

고유한 값을 가지는 범주형 변수라고 하면 Ticket의 등급(1, 2, 3)이나 다니는 학교(유치원, 초등학교, 중학교 등)과 같이 'A', 'B', 'C'와 같은 종류를표시하는 데이터를 말합니다. 카테고리(Category) 데이터라고도 합니다. 대부분 데이터 분석 알고리즘은 숫자만 입력받을 수 있습니다. 그렇기 때문에 범주형 데이터는 숫자로 변환해야합니다.

 

  • Tree based models : Label Encoding, Frequency Encoding 처리

  • Non Tree based models : One-Hot Encoding 처리

- Label Encoding

Label Encoding을 사용하면 범주형 변수를 숫자형 변수로 변경할 수 있습니다. 예를 들어 성별이 남자, 여자가 있다면 남자를 1, 여자를 2로 변경해 주는 것이죠. Label Encoding은 모든 Feature에 도움이 된다고 볼 수는 없습니다.

 

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le = le.fit(df['Sex'])
df['Sex'] = le.transform(df['Sex'])
df.head()

 

 

- Frequency Encoding

Frequency Encoding은 각 Feature의 비율 단위로 변수를 변경해 주는 것입니다. Label Encoding이 타겟값과 전혀 상관 없는 값이 코딩되는 것이기 때문에 성능에 크게 반영이 안될 수 있지만 Frequency Encoding은 타겟값과 관련있는 값이 인코딩되기 때문에 더 좋다고 할 수 있습니다.

 

encoding = df.groupby('Sex').size()
encoding = encoding/len(df)
df['encoding'] = df.Sex.map(encoding)
df.head()

 

 

- One-Hot Encoding

One-Hot Encoding은 대표적인 문자열 값을 숫자형으로 인코딩하는 전처리 작업입니다. Non-Tree 기반 머신러닝 알고리즘은 범주형 변수를 Label Encoding 후 1, 2, 3, 4와 같이 변경하더라고 이 변수들을 숫자로 인식하기 때문에 성능 저하에 큰 요인이 된다고합니다. One-Hot Encoding은 피쳐 값의 유형에 따라 새로운 피쳐를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼은 0을 표시하는 방법입니다. 아래 예시를 보면 더 쉽게 이해할 수 있습니다.

 

onehot = pd.get_dummies(df['Sex'], prefix='sex')
df = pd.concat([df, onehot], axis=1)
df.head()

 

3. 시간 데이터(Datetime)

시간 데이터는 아래 표 처럼 다양한 피쳐를 만드는 것으로 전처리가 가능합니다.

- daynumber_since_year_2014, day_til_holidays : 특정 기간 이 후/이 전 경과 일수를 넣어주는 피쳐

- is_holiday : 공휴일인지 아닌지 특정 기간을 넣어주거나(공휴일 : True, 평일 : False)

- Weekday : 날짜의 주기성(월 : 0, 화 : 1, 수 :2, 목 : 3, 금 : 4, 토 : 5, 일 : 6)

Date Weekday daynumber_since_year_2014 is_holliday days_till_holidays sales
01.01.14 5 0 True 0 1213
02.01.14 6 1 False 3 938
03.01.14 0 2 False 2 2448

 

뿐만 아니라 특정 기간의 차이를 이용해서 새로운 변수를 추가하는 것도 알고리즘 성능 향상에 많은 도움이 됩니다.

 

 

Feature Generation

간단한 데이터 전처리 과정이 끝나면 기존의 데이터를 바탕으로 새로운 피쳐를 생성할 수 있습니다. 이 과정을 하기 위해서는 기존 데이터를 탐색적 분석(EDA)를 통해 깊이 이해한 후 진행해야합니다. 앞서 시간 데이터 전처리 과정에서 설명한 시간을 이용하여 다양한 피쳐를 만드는 것 또한 Feature Generation의 하나라고 볼 수 있습니다.

 

아래 표 처럼 제품 가격의 소숫점만 나타내는 변수를 추가한 것인데 이런 변수를 통해서도 머신러닝 성능을 향상 시킬 수 있답니다. 뿐만아니라 두가지 이상의 피쳐를 결합해서 새로운 피쳐도 생성할 수 있어요.

 

Price Fractional_part
0.99 0.99
2.49 0.49
1.0 0.0

 

2020/06/19 - [데이터 분석 세상/데이터 분석] - 데이터 분석을 위한 데이터 전처리 방법 - Data Cleaning

이 글을 공유하기

댓글(0)

Designed by JB FACTORY