brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Mar 11. 2019

Python: m.l with DataProc(2)

공공데이터, 날씨, 예측, 데이터 전처리/후처리

2000년 부터 2018년 까지

날씨데이터를 읽고 시각화를 해본다.


목적은 각 데이터의 특성을 파악하고 상관관계를 확인한다.

머신러닝을 활용해 온도, 습도, 일사량 등을 예측해본다.

딥러닝을 활용해 같은 작업을 동시에 진행한다.


우선 데이터의 항목을 알아보자.


1시간 단위의 날씨 데이터를 사용한다.

모든 csv 파일을 읽어서 하나의 DataFrame 으로 만든다.

기온 데이터에 대한 시각화를 통해 대략의 데이터 특성을 파악해보자.

봄, 여름, 가을, 겨울 이 있다고는 알고있다.

이 데이터는 시즈널리티(Seasonality) 성격을 가지고 있다.

즉, 데이터가 시계열에 따라 주기성을 갖는다.

베이지안을 사용하면 이와 같은 특성을 통해서 다음해의 기온도 예상해 볼 수 있다.


하나의 데이터를 더 확인해보자.

바로 일사량이다.

뭔가 이상하다.

데이터가 좀 거칠어 보이고 정제가 제대로 되있다고 볼 수 없는 모습이다.


일사량 데이터의 특징은

1. 낮 시간 Pick 에 다다르고 점차 줄어든다.

2. 나머지 비어있는 데이터(Empty or NaN)는 0으로 봐도 무방하다.

3. 하지만, 0으로 되어있지 않다.

4. 불연속적인 데이터 흐름에 대한 클린징이 필요해 보인다.


이 모든 작업이 선행되어야

머신러닝이든 딥러닝이든 무언가를 할 수 있는 기초 준비가 완성된다.


데이터의 노이즈는 모델의 성능에 악영향을 줄 수 있다.

정규화, l1, l2제한 등을 통해서 어느정도 커버 할 수 있지만 본질의 문제는 존재할 수 밖에 없다.


일사량 데이터에 대한 전처리 작업은 다음 이야기에서 다루도록 하고

오늘의 마지막 Task 는

온도 데이터에 대한 시계열 정렬 및 전처리 작업이다.


먼저 데이터를 date 기준으로 index 하고

정렬에 대한 문제 유무를 확인 한 후,

1시간 단위의 데이터를 15분 단위의 데이터로 나누어 보려고 한다.


index를 주입한다.


온도 데이터의 Empty, NaN, Outlier 를 살펴보자.

317 개의 빈 데이터를 확인 할 수 있다.


여기서 문제가 발생한다.

1. 데이터를 채워넣을 것인가? 채워 넣는다면 어떤 데이터를 어떻게 넣을 것인가?

2. 비어있는 데이터 Row를 삭제할 것인가?


이에 대한 고민에서 생각한 방법은

1. 시계열 데이터의 특성을 고려해서

2. 앞, 뒤의 데이터를 두고 Linear 값을 넣는다.

3. 또는 단순히 앞, 뒤의 데이터를 그대로 가져다 넣는다.

4. 삭제한다.


먼저 삭제하는 방법은 정말 간단하다. 고민이 필요가(?) 없다.

빈 값이 사라졌다.


이번엔 앞 / 뒤의 값으로 채워넣는 방법으로 누락 데이터를 채우는 방법을 사용해본다.


마지막으로 데이터의 빈측치에 대해서

앞 / 뒤의 데이터의 평균값으로 채워넣는 방법이 있다.


예를 들어

[1, 2, 5, ?, ?, ?, 20] 의 숫자열 데이터가 있다고 가정하자.

3개의 물음표에 들어가야 할 데이터를 채우는 방법은

1. [1, 2, 5, 5, 5, 5, 20] 

2. [1, 2, 5, 20, 20, 20, 20] 

지금까지 배운 방법으로는 이렇다.


현실적인가? 에 대한 질문에는 선뜻 대답할 수 없다.

그럼 이건 어떤가?

[1, 2, 5, 9, 13, 17, 20]

조금은 합리적이라 할 수 있는가?


이 방법을 통해서 온도 데이터의 빈측값을 채워넣어 보겠다.

위 코드를 통해 빈측값을 채울 수 있다.


두 코드의 결과가 크게 다르지는 않지만 문서를 통해서 자세히 알아보길 바란다.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html


진짜 마지막이다.

이 시계열 데이터를 15분 단위로 나누어 보려고 한다.

1시간은 60분, 15분으로 나누면 총 4개의 데이터가 된다.


우리는 이 늘어난 데이터를 Interpolate 함수를 통해서 가공하려고 한다.


먼저 날짜 데이터만 가지는 DataFrame 객체를 생성한다.


빈측값을 볼 수 있다.

이제 채워넣어 본다.


위의 기법을 이용해 일사량 데이터를 가공 할 수 있다.

작가의 이전글 Python: m.l with DataProc(1)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari