COVID-19 예측

입문


신종 코로나바이러스 감염자 수가 늘어나자 도쿄, 오사카, 교토, 병고에서 긴급사태 선언이 나왔다.감염자 수 정보는 후생 노동성 페이지에서 다운로드할 수 있다.우선 양성 인원수의 데이터를 다운로드하여 도표화를 시도해 보자.
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns


def get_data():
    url = 'https://www.mhlw.go.jp/content/pcr_positive_daily.csv'
    df = pd.read_csv(url,
                     usecols=[0, 1],
                     names=['date', 'positives'],
                     skiprows=1,
                     parse_dates=['date'],
                     index_col='date'
                     )
    return df


def main():
    df = get_data()
    df.plot()
    plt.title('COVID19 日別感染者数')
    plt.show()


if __name__ == '__main__':
    main()

문외한이라도 내가 보기에는 이번이 네 번째라고 생각할 것이다.
앞으로 어떻게 될까요?
이번에는 Prophet와 ARIMA를 사용해 1개월 후의 감염자 추이를 예측해 봤다.그 실용 LSTM 모델도 시험해 봤지만 잘 예상하지 못해 다른 방법으로 시험해 보기로 했다.

Prophet으로 예측해보세요.


Prophet는 페이스북이 개발한 예측 모델이다.
사용 방법에는 특징이 있지만 모형을 만드는 것은 간단하다.
Pandas의 DataFrame에서 입력 데이터를 지정합니다.이때 시간 시퀀스의 열 이름을 ds로 설정하고 측정 값의 열 이름을 y로 설정해야 합니다."cap"이라는 열을 추가해야 합니다. 받아들일 수 있는 최대치를 지정합니다.이번에는 만 원입니다.데이터 검색 및 DataFrame 제작은 다음과 같습니다.
    url = 'https://www.mhlw.go.jp/content/pcr_positive_daily.csv'
    df = pd.read_csv(url,
                     usecols=[0, 1],
                     names=['ds', 'y'],
                     skiprows=1,
                     parse_dates=['ds'],
                     )
    df['cap'] = 10000
모형의 제작은 다음과 같이 진행된다.
    model = Prophet()
아무것도 지정하지 않으면 선형 회귀가 되기 때문에 이번에는 아래와 같이logistic 회귀를 지정합니다.
    model = Prophet(growth='logistic')
그리고 데이터를 지정하여 의합합니다.
    model.fit(df)
미래를 예측하려면 미래 날짜를 지정한 데이터 프레임워크를 만듭니다.make_future_데이터 프레임이라는 방법을 사용하면 지정한 목적지까지의 데이터 프레임을 만들 수 있습니다.여기에도cap열을 추가해야 합니다.
    df_future = model.make_future_dataframe(periods=30)
    df_future['cap'] = 10000
예측치를 구해 보다.
    predicts = model.predict(df_future)
아래와 같이 결과를 도표로 표시할 수 있다.
plt.xkcd () 를 사용하면 직접 작성한 도면을 만들 수 있습니다.(안 그래, 그냥 해보고 싶었어.)
    plt.xkcd()
    model.plot(predicts)
    plt.tight_layout()
    plt.title('Prediction COVID-19 by Prophet Model')
    plt.show()

나는 증가하는 경향이 있다는 것을 안다.너도 그것의 주기성을 볼 수 있다.하지만 실제 값에는 맞지 않아요...

ARIMA로 예측해 주세요.


다음은 ARIMA로 예측해 보겠습니다.감염자 수가 1주일의 주기성을 가지고 있다는 것을 알고 이번에는 사리마(Seasonal ARIMA 모델)를 사용해 봤다.
ARIMA 모델을 이해하지 못해서 설명을 잘 못해서 원본 코드만 씁니다.
import datetime
import pandas as pd
from matplotlib import pylab as plt
import japanize_matplotlib
import statsmodels.api as sm


def get_data():
    url = 'https://www.mhlw.go.jp/content/pcr_positive_daily.csv'
    df = pd.read_csv(url,
                     usecols=[0, 1],
                     names=['date', 'positives'],
                     skiprows=1,
                     parse_dates=['date'],
                     index_col='date'
                     )
    return df


def main():
    plt.xkcd()

    df = get_data()
    diff = df['positives'].diff()
    diff = diff.dropna()

    params = sm.tsa.arma_order_select_ic(diff, ic='aic', trend='nc')
    aic_order = params['aic_min_order']

    '''
    orderはarma_order_select_icで求めた値を指定。
    seasonal_orderは1週間周期なので4番目に7を指定。
    '''
    model = sm.tsa.SARIMAX(
        df,
        order=(aic_order[0], 1, aic_order[1]),
        seasonal_order=(1, 1, 1, 7)
    ).fit()

    '''
    30日分の予想をしてみる
    '''
    predict_period_from = df.index.max()
    predict_period_to = df.index.max() + datetime.timedelta(days=30)

    predict = model.predict(predict_period_from, predict_period_to)
    plt.plot(df, label='real')
    plt.plot(predict, label='predict')
    plt.title('Prediction COVID-19 by SARIMA Model')
    plt.savefig('covid19-arima2.png')
    plt.show()


if __name__ == '__main__':
    main()

아무래도 예측이 잘 된 것 같은데.

끝날 때


이번에는 Deep Learning을 포기하고 다른 방법으로 COVID19를 예측해 봤습니다.
아리마 모형의 대단함도 알겠습니다.Deep Learning과 함께 공부하고 싶습니다.
소스를 GitHub 위에 얹으세요.

좋은 웹페이지 즐겨찾기