某ヘルスケアデータサイエンティストのブログ

ヘルスケア方面で働くデータサイエンティストが、いろいろやってみたことをメモするブログです。

東京都の新型コロナウィルス時系列データを時系列分析してみる

1.背景

時系列分析の勉強をしている最中に新型コロナウィルスが発生したので、ホットな話題ということもあり、時系列分析をぶつけてみた次第です。

2.方法

・使用データは東洋経済オンラインのサイトから取得しました。
toyokeizai.net

・言語はPython。時系列分析はstatsmodelsを使用します。tsa.seasonal_decomposeによるいわゆる乗法モデルベースの基本成分分解ですね。

3.結果と考察

まずはパッケージとデータのインポートから。

import statsmodels.api as sm
import pandas as pd
import numpy as np
import requests
import io
from matplotlib import pylab as plt
%matplotlib inline
# グラフを横長にする
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6

import warnings
warnings.simplefilter('ignore')

df = pd.read_csv('prefectures.csv')

データの中身。とりあえず、目的である東京だけ見てみる。

tokyo = df[df['prefectureNameJ']=='東京都']
tokyo.tail()

	year	month	date	prefectureNameJ	prefectureNameE	testedPositive	peopleTested	discharged	deaths
4524	2020	6	15	東京都	Tokyo	5592	16351.0	4887.0	314.0
4571	2020	6	16	東京都	Tokyo	5619	16351.0	4936.0	316.0
4618	2020	6	17	東京都	Tokyo	5633	61112.0	4978.0	317.0
4665	2020	6	18	東京都	Tokyo	5674	63083.0	5017.0	317.0
4712	2020	6	19	東京都	Tokyo	5709	64844.0	5071.0	320.0

新規感染者数を分析したいのですが、累積の感染者数しかありません。
なので、手作業で新規感染者数を作りにいきます。

tokyo['NewPositive'] = 0.0
for i in range(len(tokyo)-1):
    tokyo.iloc[i+1,9] = tokyo.iloc[i+1,5] - tokyo.iloc[i,5]
plt.figure(figsize=(15, 8))
plt.plot(tokyo.NewPositive)

f:id:tmaj:20200702203509p:plain
よくみるグラフが出てきました。ぱっと見、上昇トレンドかなと。
次に自己相関係数と偏自己相関係数を見てみましょう。

fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(tokyo.NewPositive, lags=30, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(tokyo.NewPositive, lags=30, ax=ax2)

f:id:tmaj:20200702203736p:plain
15日前との偏自己相関が大きい。しかもマイナスの偏自己相関になりました。
ということは約2週間前の結果が小さくなると、当日の結果が大きくなる関係にあります。
人々はある日の新規感染者数を見て警戒度を変えるので上記のような関係になるということでしょうか。
すなわち、2週間前の新規感染者数が小さい→油断する→当日の新規感染者数が増える、ということなのかもしれないです。
ただし、トレンドがある場合に偏自己相関係数をそのまま解釈してよいのか、勉強不足故、よくわかりません。
トレンドがある時系列なので、周期性を観察するために1階差分をとって自己相関係数をみてみます。

diff = tokyo.NewPositive.diff()
diff = diff.dropna()
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(diff, lags=30, ax=ax1)

f:id:tmaj:20200702210311p:plain
まあ、7日ですかね。
次に、成分分解をしてみます。

fig, (ax1,ax2,ax3) = plt.subplots(3,1, figsize=(15,8))
seasonal_decompose_res = sm.tsa.seasonal_decompose(tokyo.NewPositive, freq=7)
seasonal_decompose_res.trend.plot(ax=ax1)
seasonal_decompose_res.seasonal.plot(ax=ax2)
seasonal_decompose_res.resid.plot(ax=ax3)

f:id:tmaj:20200702210429p:plain
上昇トレンドにみえますね。
特段何もしなければ、今後も上昇トレンドは続いていくのか、注視が必要でしょう。