Kaggle
DataScience

데이터 전처리(아웃라이어 제거, 데이터 분리)

- Kaggle로 시작하는 머신러닝, 딥러닝 분석

Feb. 7, 2023, 10:09 p.m.

 

안녕하세요?

지난 번 포스트에서는 Seaborn, Matplotlib 등 라이브러리를 이용한 데이터 시각화를 해보았습니다.

이제 본격적으로 딥러닝, 머신러닝을 들어가...기에 앞서서

이번에는 데이터 학습을 효율적으로 하기 위해 꼭 필요한 데이터 전처리 작업을 해볼 것입니다.

 

이상치 제거

kaggle code에서 아래와 같이 작성하여 이상치를 제거하는 함수를 만들어봅니다.

#1. outlier 제거, sigma 이상치 제거 방법(평균의 3배 기준)
def is_outliers(s) :
    lower_limit = s.mean() - (s.std()*3) # lower limit = 데이터셋의 평균 - (데이터셋의 표준편차*3)
    upper_limit = s.mean() + (s.std()*3) # upper limit = 데이터셋의 평균 + (데이터셋의 표준편차*3)
    return ~s.between(lower_limit, upper_limit) # lower limit과 upper limit 사이에 없으면 true, 있으면 false 반, '~'은 not 연산자

여기서 이상치 제거를 위해 3-sigma 법으로 이상치 제거를 하였는데,

3-sigma란 아래와 같이 평균에서 3*표준편차 만큼 떨어져 있는 데이터들을 제외하는 것입니다.

 

위와 같이 함수를 만든 후 아래의 코드로 함수를 실행해보면

df_out = df[~df.groupby('hour')['cnt'].apply(is_outliers)] # hour 칼럼으로 group by 한 데이터에 is_outliers 함수 반환값이 false인 데이터만 df_out 데이터에 넣는다.(outlier 제거)
print('이상치 제거 전 : ', df.shape)
print('이상치 제거 후 : ', df_out.shape)

아래와 같이 데이터 건수가 17414->17265로 줄어든 것을 볼 수 있습니다. 그만큼이 이상치로 분류되어 제거된 것입니다.

 

카테고리 타입 변경

아래의 명령어로 각 칼럼의 타입을 보면

df_out.dtypes # df_out 데이터의 각 칼럼별 타입, code 를 사용하는 데이터들도 현재 float64, int 타입인데 카테고리 형으로 변경해줘야 데이터 학습 시 문제없음

날씨코드, 계절, 연도 등 코드 개념인(실제 숫자 값이 아닌) 데이터들도 모두 float64, int 타입인 것을 확인할 수 있습니다.

이러한 칼럼들의 데이터타입을 제대로 학습할 수 있게 카테고리 형으로 바꿔줘야 합니다.

아래의 명령어로 'weather_code', 'season', 'year', 'month', 'hour'의 칼럼들을 카테고리형 데이터 타입으로 변경합니다.(실행 시 경고가 뜰 수 있는데, 무시해도 됩니다)

df_out['weather_code'] = df_out['weather_code'].astype('category')# 데이터 타입 카테고리 형으로 변경
df_out['season'] = df_out['season'].astype('category')
df_out['year'] = df_out['year'].astype('category')
df_out['month'] = df_out['month'].astype('category')
df_out['hour'] = df_out['hour'].astype('category')

실행 후 아래의 코드로 바뀐 데이터 타입을 확인해봅니다.

df_out.dtypes #바뀐 데이터 타입 확인

아래 결과와 같이 데이터 타입이 'category'로 잘 바뀐것을 볼 수 있습니다.

 

 

dummy 변수 처리

category 형 데이터를 0과 1만 있는 데이터로 변환해주는 것이 dummy 변수 처리라고 합니다.

category 형 데이터를 dummy 변수 처리해주면 해당 카테고리 내 값들이 1개씩 칼럼이 되고, 해당하는 값에 대해서만 1의 값이 들어갑니다.

예) season 칼럼의 데이터 범주가 1~4의 값이었으면, dummy 처리하면 sesaon_1, season_2, season_3, season_4의 칼럼이 생깁니다. 그리고 season 값이 1인 데이터는 season_1 : 1, season_2 : 0, season_3 : 0, season_4 : 0의 데이터로 바뀝니다

아래의 코드로 dummy 처리를 진행하고,

#dummy 변수 처리, dummy 처리를 하면 각 카테고리별로 해당하는 데이터만 1, 아닌 경우 0으로 지정
df_out = pd.get_dummies(df_out, columns=['weather_code', 'season', 'year', 'month', 'hour'])
df_out.head()

그 칼럼구조를 보면 아래와 같이 category 타입 칼럼들이 모두 dummy처리되어서 칼럼수가 많이 늘어난 것이 확인됩니다.

 

이제 이 데이터를 [y 축 : cnt 칼럼 데이터, x 축 : timestamp, cnt 제외한 나머지 데이터]로 나눠줍니다.

df_y = df_out['cnt'] # y 축에는 cnt 칼럼 할당
df_x = df_out.drop(['timestamp', 'cnt'], axis=1) # x축에는 timestamp, cnt 를 제외한 칼럼들 할당
df_x.head()

 

훈련용, 테스트용 데이터 분리

데이터 훈련을 시킬 데이터와 데이터 학습이 잘되었는지 테스트 하기 위한 데이터를 나눠줘야 합니다.

이를 위해 아래와 같이 train_test_split이란 함수를 사용할 것입니다.

# 훈련용, 테스트용 데이터 분리
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, random_state=60, test_size=0.3, shuffle=False) 

위와 같이 입력하면 test_size = 0.3 이므로 전체의 70%는 훈련용 데이터, 30%는 테스트용 데이터로 쪼갠다는 뜻입니다.

그리고 아래와 같이 구조를 다시 확인하면

print('x_train 의 구조는 : ', x_train.shape)
print('y_train 의 구조는 : ', y_train.shape)

print('x_test 의 구조는 : ', x_test.shape)
print('y_test 의 구조는 : ', y_test.shape)

알맞게 데이터가 훈련용, 테스트용으로 쪼개진 것을 볼 수 있습니다.

 

오늘은 데이터 학습시키기 전에 전처리를 해보았습니다.

다음 포스트에서는 본격적으로 딥러닝, 머신러닝을 이용한 데이터 학습과 학습된 모델 기반으로 데이터 예측을 해보겠습니다.

 

 

Reference

[Inflearn]'캐글로 시작하는 머신러닝

딥러닝 분석'(대구빅데이터활용센터)


Project

Comments


Related Posts