【データリテラシー】第11回 時系列データ
時系列データ
身の回りの現象は時間的に変動するものが多い。 その現象の時間的変動を継続観測して得られるデータを時系列データという。 時系列データは観測される時間と順序に意味がある。
以下のグラフは日本全体の新型コロナウイルス新規陽性者数の推移(2020年)である。
出典:厚生労働省「データからわかる-新型コロナウイルス感染症情報-」(参照 2021-08-29)
時系列データは観測された順番に $y_{1},y_{2},\cdots,y_{n}$ とする。 $i$ 番目の観測値 $y_{i}$ と $j$ 番目の観測値 $y_{j}$ では、$i<j$ ならば $y_{j}$ は $y_{i}$ の後に観測されたことになる。 因果関係として、過去に起こったことが未来に影響を及ぼしても、未来に起こったことが過去に影響を及ぼすことはありえない。 つまり、$i<j$ ならば $y_{j}$ は $y_{i}$ の結果と考えることはできても、$y_{i}$ は $y_{j}$ の結果とは考えることはできない。
時系列データから取り出す情報として、長期的傾向と短期的傾向がある。 時系列データの長期的傾向はトレンドという。 時系列のトレンドを見たいときは、短期的な変動は邪魔(ノイズ)になり、逆に短期的な変動が見たいときは、トレンドが邪魔になる。
階差
ある時点の観測値 $y_{i}$ とその一つ前の観測値 $y_{i-1}$ の差をとることを階差といい、$\Delta y_{i}$ で表す1)。 \[ \Delta y_{i}=y_{i}-y_{i-1} \]
階差によってトレンドを取り除き、短期的傾向を見ることができる。
以下のグラフは日本全体の新型コロナウイルス新規陽性者数のデータから階差をとったものである。 短い周期で振動しており、振動の振幅にもいくつかピークがあることが分かる。
移動平均
時系列データが短期的に大きくなったり小さくなったりを繰り返す振動をしている場合、各時点の前後のいくつかの観測値で平均をとってトレンドの情報を取り出すことができる。 これを移動平均という。
ある時点の観測値 $y_{i}$ の前後 $2k+1$ 個の観測値(前の $k$ 個と後ろの $k$ 個)との移動平均は以下の通りである。 \begin{eqnarray*} z_{i}&=&\frac{y_{i-k}+y_{i-k+1}+\cdots+y_{i-1}+y_{i}+y_{i+1}+\cdots+y_{i+k-1}+y_{i+k}}{2k+1}\\ &=&\frac{1}{2k+1}\sum_{j=-k}^{k}y_{i+j} \end{eqnarray*}
$k$ をいくつにとれば良いかはデータによって異なるので、調整しなくてはならない。
以下のグラフは日本全体の新型コロナウイルス新規陽性者数のデータから7日間平均($k=3$)をとったグラフである。 元のグラフではよく分からなかったが、トレンドを見ると 2回目のピーク後に減少して増加する際に、11月20日あたりで小休止したあとに再び増加を始めていることが分かる。
自己相関
同じ時系列データの中で、異なる時点との相関を自己相関という。 自己相関を表す指標を自己相関係数といい、各時点と $h$ 後の時点との自己相関係数 $r_{h}$ は以下で定義される。 \[ r_{h}=\frac{\displaystyle\frac{1}{n-h}\sum_{i=1}^{n-h}(y_{i}-\bar{y})(y_{i+h}-\bar{y})}{S_{y}^{2}} \] ここで $\bar{y}$ は平均、$S_{y}^{2}$ は分散である。 \[ \bar{y}=\frac{1}{n}\sum_{i=1}^{n}y_{i} \] \[ S_{y}^{2}=\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\bar{y})^{2} \]
自己相関係数は相関係数の一種なので、相関係数の性質を持つ。 $r_{h}>0$ の場合は各時点の傾向が $h$ 後の時点でも同じ傾向が続き、$r_{h}<0$ の場合は傾向が逆転することを意味する。
$h$ を変化させることで $r_{h}$ も変化する。 横軸に $h$、縦軸に $r_{h}$ をとって描いたグラフをコレログラムという。
$h$ が大きいほど、より後で観測された観測値との相関になるので、相関は弱くなるのが一般的である。 しかし、周期性を持つ時系列データでは、その周期ごとに相関は強くなる。 コレログラムを見ることで周期がどれくらいか知ることができる。
以下のグラフは新型コロナウイルス新規陽性者数のデータのコレログラムである。 新規陽性者とその7日間移動平均は、$h$ が大きくなるにつれて自己相関係数がほぼ直線的に小さくなり、相関は徐々に弱くなっている。 一方、階差の方は $h=7,14,21,28$ と 7 の倍数のときに自己相関係数に鋭いピークが見られるため、短期変動の周期は 7 日であることが分かる。
演習
- 使用するデータセット:newly_confirmed_cases_daily_2020.csv
このデータは日本全体の新型コロナウイルス新規陽性者数の日別のデータ(2020年)である。
出典:厚生労働省「データからわかる-新型コロナウイルス感染症情報-」(参照 2021-08-29)
LibreOffice Calc で CSV ファイルを開くと、列A に「日付」、列 C に「新規陽性者数」のデータが並んでいる。
折れ線グラフ
新規陽性者数の推移を折れ線グラフで表す。
データの選択
- セル A1 から A342 とセル C1 から C342 の範囲を選択する。
- メニューバーの
[挿入]
→[グラフ]
を選択してグラフウィザードのダイアログを表示する。
① グラフの種類
[線]
を選択する。- 右側の4つある種類から
[線のみ]
を選択する。 [次へ]
をクリックする。
② データ範囲
はじめにデータ範囲を指定したので、ここでは何もしなくてよい。
[次へ]
をクリックする。
③ データ系列
データ範囲から自動的に Y 値と範囲が設定されるので、ここでは何もしなくてよい。
[次へ]
をクリックする。
④ グラフ要素
- 「タイトル」に「新型コロナウイルス感染症 新規陽性者数の推移」と入力する。
- 「サブタイトル」に「2020年」と入力する。
- 「X 軸」に「日付」と入力する。
- 「Y 軸」に「新規陽性者数 [人]」と入力する。
[完了]
をクリックする。
これで折れ線グラフが描かれる。
折れ線の属性の変更
折れ線の色などを変更してもよい。
- グラフ編集モードにする。
- グラフ上の青い折れ線のどこかをダブルクリックして「データ系列」のダイアログを表示する。
[線]
タブをクリックする。- 「線の属性」の「スタイル」「色」「幅」「透明度」を変更する。
[OK]
をクリックする。
7日間の移動平均
7日間の移動平均を計算する。
- セル D1 に「7日間移動平均」と入力する(ラベル)。
- セル D5 に「
=AVERAGE(C2:C8)
」と入力する。 - セル D5 をコピーしてセル D6 から D339 に貼り付ける。
LibreOffice には移動平均を求める機能があるので、それを利用してもよい。
- セル C2 から C342 までを選択する(入力範囲)。
- メニューバーの
[データ]
→[統計]
→[移動平均]
を選択すると「移動平均」のダイアログが開く。 - 「データ」の「結果貼り付け先」に結果を出力したい場所の最初のセル(例えば D1)を指定する。
- 「データ方向」はデータが列方向に並んでいるので
[列]
を選択する。 - 「パラメーター」は間隔に
[7]
を入力する。 [OK]
をクリックすると移動平均の結果が出力される。「#N/A
」と表示されるセルはデータ不足で計算できないところなので気にしなくてよい。
余裕があれば折れ線グラフを描いてみよう。
階差
階差を計算する。
- セル E1 に「階差」と入力する(ラベル)。
- セル E3 に「
=C3-C2
」と入力する。 - セル E3 をコピーしてセル E4 から E342 に貼り付ける。
余裕があれば折れ線グラフを描いてみよう。
課題
新型コロナウイルスの新規陽性者数のデータから「山形県」の新規陽性者の折れ線グラフを描き、7日間の移動平均と階差を計算しなさい。 データの範囲は 2020/1/26 から現在までとする。
新型コロナウイルスの新規陽性者数のデータは以下よりダウンロードする。
このページの「新規陽性者数の推移(日別)」のグラフの右下にある「オープンデータ」をクリックして CSV ファイルを保存する。
作成したファイルは ODFスプレッドシート(拡張子 .ods)で提出すること。