새소식

Python/Project

Machine learning을 활용한 코로나 확진자 수 예측하기.

  • -

 

 

 머신러닝에서 여러 가지 패키지와 라이브러리를 사용해서

코로나19 바이러스 확진자 수를 예측하는 코드를 만들어 보겠습니다.

사용데이터는 github에서 사용할 수 있는 데이터를 url을 통해 가져왔고, 엑셀 파일로 불러와도 상관없습니다.

 

 

import pandas as pd
import plotly.graph_objs as go
import plotly.offline as py
from fbprophet import Prophet
from fbprophet.plot import plot_plotly, add_changepoints_to_plot
import numpy as np


url = 'https://raw.githubusercontent.com/datasets/covid-19/master/data/time-series-19-covid-combined.csv'
data = pd.read_csv(url, error_bad_lines=False)
data.head()

 

 

먼저 코딩 시작전에 필요한 패키지와 데이터 셋을 불러오는 과정입니다.

아래의 설명과 같은 기능을 가지고 있는 라이브러리고, 불러온 데이터를 data 변수에 저장하였습니다.

 

pandas : 텍스트 입출력 및 데이터 프레임 가공 라이브러리

plotly : 그래프 라이브러리

fbprophet : 시계열 예측 라이브러리

numpy : 수치 연산을 수행하는 선형대수 라이브러리

 

이렇게 불러온 데이터를 data.head()라는 명령을 통해 아래와 같은 데이터를 잘 불러왔는지 확인할 수 있었습니다.

이렇게 가져온 데이터는 전 세계적으로 github에서 가지고 있는 데이터입니다.

저는 데이터의 수를 조금 축소하기 위해 한국의 국적 확진자 만의 데이터에서

data와 confirmed 값만을 가진 데이터 프레임으로 가공했습니다.

 

 

df_korea = data[data['Country/Region'] == 'Korea, South']
df_korea = np.column_stack([df_korea.Date, df_korea.Confirmed])
df_korea = pd.DataFrame(df_korea)


df_korea = df_korea.reset_index().rename(columns={0: 'date', 1: 'confirmed'})
df_korea = df_korea.drop("index", axis=1)

df_korea.tail()

 

 

 

df_korea.tail()의 결과 아래의 데이터와 같이 가장 최근인 어제 (9월 12일)까지의

누적 확진자와 날짜를 가진 데이터를 얻어올 수 있었습니다.

 

 

fig = go.Figure()
fig.add_trace(go.Scatter(x=df_korea.date,y=df_korea.confirmed,))

fig

 

 

위에서 가공한 df_korea 데이터를 활용해서

trace 와 scatter이라는 함수를 통해 x축은 날짜, y 축은 확진자 수를 가지는 그래프를 그립니다.

 

 이렇게 가장 최근까지 월별로 코로나 확진자 수를 보기 좋은 그림으로 얻을 수 있습니다.

df_prophet = df_korea.rename(columns={'date': 'ds','confirmed': 'y'})

df_prophet.tail()

 

 

이후 과정은  누적 확진자 수를 예측하기 위해  Facebook Prophet 라는 패키지를 사용합니다.

Facebook Prophet의 장점은 다른 시계열모델에 비해 더 간단하게 모델을 만들 수 있고,

holiday에 따른 경향성을 확인할 수 있다는 점이 있습니다.

또한 Facebook Prophet을 사용하기 위해서는 데이터 가공이 필요하고,

data는 ds, confirmed는 y로 rename 하는 과정을 가집니다.

그리고 rename 한 데이터 프레임의 마지막 5행을 출력합니다.

 

df_prophet.tail()의 결과  9월 12일까지의 날짜와 누적 확진자 수를 볼 수 있습니다.

 

 

m = Prophet(

changepoint_prior_scale=0.2, # increasing it will make the trend more flexible
changepoint_range=0.98, # place potential changepoints in the first 98% of the time series
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=True,
seasonality_mode='additive')

m.fit(df_prophet)
future = m.make_future_dataframe(periods=7)
future.tail(7)

 

 

그 다음 과정은 가장 중요한 모델을 만드는데 필요한 설정입니다.

연계절성 ,주계절성 , 일계절성에 대한 트렌드를 분석하는데 넣는 작업입니다.

additive는 누적되는 데이터임을 의미하고,

changepoint_prior_scale는 값이 커질수록 모델을 유연하게 만듭니다.

또 changepoint_range는 데이터의 앞쪽 몇 퍼센트 부분 안에서 변화점을 만들 것인지 설정합니다.

그 후 m.fit(df_prophet)라는 명령은 모델링을 끝낸 뒤, 모델을 학습시키고,

앞으로 예측할 기간 동안의 데이터가 들어갈 공간을 확보합니다.

7일동안 예측할 것이라고 설정하고, future 데이터의 마지막 5행을 출력해서 확보된 공간을 확인합니다.

그 후 future.tail(7) 을 통해 확인해보면 아래와 같이 이후 7일동안의 확보된 공간을 확인할 수 있습니다.

 

forecast = m.predict(future)
forecast[['ds','yhat','yhat_lower','yhat_upper']].tail(7)
fig = plot_plotly(m, forecast)

py.iplot(fig)

 

 

학습된 모델을 활용하여 위에서 비어놓은 공간에 데이터를 예측해서 채워 넣습니다.

예측한 데이터의 날짜, 예측값, 오차를 고려한 예측 최솟값, 예측 최댓값을 볼 수 있습니다.

그리고 지금까지의 데이터와 예측한 데이터의 그래프를 그립니다.

전체 데이터의 시각화와 최근 데이터( 6개월)의 그래프를 볼 수 있습니다.

 

 

이렇게 시각화된 자료를 통해 코로나19 확진자 수를 예측하는 과정을 마무리했습니다.

 

데이터를 가져오는데 부담이 없었고, 전처리과정에서도 큰 문제없이 진행되었습니다.

 

감사합니다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.