앞서 EDA를 통해 데이터셋을 전체적으로 살펴보았다.
그리고 count값에 크게 영향을 미치는 변수 2가지를 상관계수가 높은 순으로 선정했다.
1. 1시간 전 온도 (상관계수 0.62)
2. 1시간 전 풍속 (상관계수 0.48)
이제 본격적인 모델링에 앞서 데이터를 정제하는 전처리를 해본다.
참고로 파이썬에서는 Null 값과 NA 값을 따로 구분하지 않고 NaN이라고 통일하여 결측값으로 표현한다.
먼저 훈련용 데이터의 결측값를 찾아본다.
train.isna().sum()
isna() 함수는 결측치 확인하여 결측치면 True (1), 아니면 False (0)로 나타내준다.
여기에 sum을 사용해서 결측치의 갯수를 확인할 수 있다.
온도와 풍속 데이터에 각각 2개, 9개의 결측값이 있는 것을 확인할 수 있다.
이 데이터를 채워주어야 정확도가 높은 모델을 만들 수 있다.
먼저 온도 데이터의 결측값 위치를 확인해본다.
train[train['hour_bef_temperature'].isna()]
934행, 1035행이 결측치인 것을 확인할 수 있다.
단순히 평균값을 넣어줄까 고려해봤지만...
시간대별로 온도가 다르기 때문에 단순히 온도의 평균값을 넣어주는 것은 정확도를 낮출 수 있다.
시간대별로 온도가 어떻게 나타나고 있는지 살펴보면
train.groupby('hour').mean()['hour_bef_temperature'].plot()
plt.axhline(train.groupby('hour').mean()['hour_bef_temperature'].mean())
axhline은 horizon의 의미로, 수평선을 그려준다. 여기서는 평균값에 수평선을 그려주었다. (참고 axvline = vertical)
0시부터 23시까지 온도 평균이 위의 사진의 그래프처럼 경향성을 띄고 있기 때문에 단순히 평균값인 약 17도를 넣는
것은 적절치 못하다.
train.groupby('hour').mean()['hour_bef_temperature']
사진처럼 시간대별 온도 평균값을 확인했고, 이 값을 결측치에 넣어주는 것이 바람직하다.
fillna() 함수를 통해 결측치를 채워줄 수 있다.
train['hour_bef_temperature'].fillna({934:14.788136, 1035:20.926667}, inplace = True)
934행은 0시 이므로 0시 평균온도인 14.788136도를 넣어주고,
1035행은 18시이므로 18시 평균온도인 20.92667도를 넣어준다.
딕셔너리 형태로 934행, 1035행에 값을 지정해주고 inplace = True 옵션 넣어 값이 저장되게 해준다.
inplace = True 조건을 빠뜨리면 저장이 되지 않는다.
이제 값이 잘 들어갔는지 확인해본다.
train.loc[[934, 1035], :]
값이 잘 들어간 것을 확인할 수 있다.
이제 풍속 데이터의 결측치도 넣어주어야 한다.
train[train['hour_bef_windspeed'].isna()]
18행 ~ 1229행 까지 9개의 채워야할 행을 확인할 수 있다.
인덱스를 통해 행번호를 추출한다.
train[train['hour_bef_windspeed'].isna()].index
또한 시간대별 평균 풍속도 구해준다.
train.groupby('hour').mean()['hour_bef_windspeed']
추출한 행번호를 통해 조금이나마 편하게 수정할 수 있다.
train['hour_bef_windspeed'].fillna({18: 3.281356, 244: 1.836667, 260: 1.620000, 376: 1.965517, 780: 3.278333, 934: 1.965517, 1035: 3.838333, 1138: 2.766667, 1229: 1.633333}, inplace = True)
값이 잘 들어갔는지 확인해본다.
train.loc[[18, 244, 260, 376, 780, 934, 1035, 1138, 1229], :]
정상적으로 값이 저장된 것을 확인할 수 있다.
테스트 데이터도 결측값을 제거해주어야 만든 모델을 잘 평가할 수 있다.
같은 방법으로 테스트 데이터도 결측값을 확인 후 수정해주었다.
(결측치가 1개만 존재해서 중괄호를 달지 않아도 되고, 행번호도 안붙여도 된다)
수정 후 결측값이 존재하는지 보면
test.isna().sum()
온도와 풍속 데이터 모두 결측값이 0개인 것을 확인할 수 있다.
데이터 정제가 완료되었으니 다음편에서 모델링을 해본다.