안녕하세요?
지난 번 포스트에서는 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]'캐글로 시작하는 머신러닝
딥러닝 분석'(대구빅데이터활용센터)