COVID-19의 감염자 수를 Prophet으로 예측

개요



Google이 대시보드에서 COVID-19 예측 데이터를 게시하기 시작했습니다.
두 번째 달인이지만, Prophet은 어떻게 예측할지 시도했습니다.
국내 감염자 수 데이터는 Kaggle에 있었기 때문에
  • 실시: 2020년 11월 24일
  • 패키지: Prophet

  • Prophet의 감염자 수 예측



    데이터 세트
    기간: 2020/2/6 ~ 2020/11/20
    (3일마다 최신으로 업데이트된 것 같습니다)
    Domestic: 국내
    Airport: 공항 검사
    Returnee: 귀국자
    Positive: 음성 수
    Tested: 검사자 수
    그 밖에도 column은 있지만 데이터 결손이 산견되었으므로, 이번에는 Domestic과 Airport의 Positive를 사용한다
    import numpy as np 
    import pandas as pd 
    from fbprophet import Prophet
    from fbprophet.plot import add_changepoints_to_plot
    
    df = pd.read_csv('covid_jpn_total_1124.csv')
    df_dom = df[df['Location'] == 'Domestic']
    #print(df_dom.isnull().sum())
    df_air = df[df['Location'] == 'Airport']
    #print(df_air.isnull().sum())
    
    df_air = df_air.dropna(how='any')
    print(df_air.describe)
    



    원시 데이터는 누적되었으므로 매일 차등을 취합니다.
    pos_def: Positive 수/일
    test_def: Tested 수/일
    (음성률의 예측에 사용할 생각이지만, 이번에는 사용하지 않는다)
    arr3 = [0]
    arr1 = np.array(df_dom.iloc[1:,2])
    arr2 = np.array(df_dom.iloc[:-1,2]) 
    arr3 = np.append(arr3, arr1 - arr2)
    df_dom['pos_def'] = arr3
    
    arr3 = [0]
    arr1 = np.array(df_dom.iloc[1:,3])
    arr2 = np.array(df_dom.iloc[:-1,3]) 
    arr3 = np.append(arr3, arr1 - arr2)
    df_dom['test_def'] = arr3
    

    Prophet 사양에 맞는 Dataframe 준비
    df_test = pd.DataFrame()
    df_test['ds'] = pd.to_datetime(df_air['DS'])
    df_test['y'] = df_air['pos_def']
    print(df_test)
    df_test.iloc[:,1].plot()
    



    Prophet의 모델을 준비한 데이터에 fit시켜 30일분까지 포함하여 예측 실행
    m = Prophet(yearly_seasonality=False, weekly_seasonality=True, daily_seasonality=True)
    m.fit(df_test)
    future = m.make_future_dataframe(periods=30, freq='D', include_history=True)
    #future.tail()
    forecast = m.predict(future)
    forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
    

    결과 그리기
    fig = m.plot(forecast, figsize=(20, 10))
    ax = add_changepoints_to_plot(fig.gca(), m, forecast)
    ax = fig.gca()
    ax.set_title("Positive", size=16)
    ax.set_xlabel("date", size=16)
    ax.set_ylabel("# Positives", size=16)
    ax.tick_params(axis="x", labelsize=14)
    ax.tick_params(axis="y", labelsize=14)
    



    흑점은 실제 데이터(GroundTruth)
    청청역은 95% 신뢰 구간의 상한 하한을 나타낸다
    그래프와 같이 모델은 데이터를 정확하게 추적 할 수 있습니다.
    12월 초순에 감염자수 3000명을 조금 넘은 곳에서, 이번 제3파는 수렴할 예측이 되었다

    누가 봐도 낙관적 지나지만, 데이터가 과거의 감염자수 추이만으로는 이러한 예측이 되어 버린다
    일본인의 행동변용 등 허벅지 요인을 포함한 파형을 입력하고 있는 것도 마찬가지로 앞으로도 일본인이 감염 예방행동을 취하면 의외 12월 초순에 피크아웃할지도 모른다.

    Prophet은 사계변동도 파악해 주지만, 사용한 데이터가 1년에 못 미치기 때문에 겨울이기 때문에 감염자수가 늘어난다는 경향은 발견되지 않는다
    3,4년 코로나가 만연하고 있으면 그러한 경향이 데이터상으로 보인다고 생각하지만, 소원이네
    다른 설명 변수 *1도 더해 multivalidate가 아니면 정밀도는 기대할 수 없다

    *1) 음성률, 중증자수, 퇴원자수, 입국자수 등, 1,2개월로 변화해 주는 복수의 변수일까
    정치인이나 관리의 질이 낮고 무능함은 constant이므로 데이터 과학에서도 유용하지 않습니다.

    또한 Google의 지금 (11/24)의 예측은 아래 그림과 같습니다.
    Prophet의 결과와 마찬가지로 12월 초순에 3000명을 넘지만 그 이후에도 단조롭게 증가하고 있다



    이어서 Prophet의 공항 검사에서의 Positive 판정 예측은 아래와 같았다.


    2,3주 후, 4000명을 넘었을까, 같은 코드로 재예측해 이번 결과와 비교하기로 한다

    좋은 웹페이지 즐겨찾기