【データリテラシー】第11回 時系列データ
時系列データ
身の回りの現象は時間的に変動するものが多い。 その現象の時間的変動を継続観測して得られるデータを時系列データという。 時系列データは観測される時間と順序に意味がある。
以下のグラフは日本全体の新型コロナウイルス新規陽性者数の推移(2021年)である。
出典:厚生労働省「データからわかる-新型コロナウイルス感染症情報-」(参照 2022-12-07)
時系列データは観測された順番に $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}$ の前後 $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$ をいくつにとれば良いかはデータによって異なるので、調整しなくてはならない。
例えば $k=3$ だと \[ z_{i}=\frac{y_{i-3}+y_{i-2}+y_{i-1}+y_{i}+y_{i+1}+y_{i+2}+y_{i+3}}{7} \] になる。
以下のグラフは日本全体の新型コロナウイルス新規陽性者数のデータから7日間平均($k=3$)をとったグラフである。 第3波、第4波、第5波の大きなピークが3つあることが分かる。
階差
ある時点の観測値 $y_{i}$ とその一つ前の観測値 $y_{i-1}$ の差をとることを階差といい、$\Delta y_{i}$ で表す1)。 \[ \Delta y_{i}=y_{i}-y_{i-1} \]
階差によってトレンドを取り除き、短期的傾向を見ることができる。
以下のグラフは日本全体の新型コロナウイルス新規陽性者数のデータから階差をとったものである。 短い周期で振動しており、振動の振幅にもいくつかピークがあることが分かる。
自己相関
同じ時系列データの中で、異なる時点との相関を自己相関という。 自己相関を表す指標を自己相関係数といい、各時点と $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=66$ 日にマイナスのピークがあり、新規陽性者数の山と谷はほぼ2ヶ月ごとに現れることを示している(第6波には当てはまらない)。 一方、階差の方は $h=7,14,21,28,\cdots$ と 7 の倍数のときに自己相関係数に鋭いピークが見られるため、短期変動の周期は 7 日であることが分かる。
指数
複数の時系列データを比較する際には、ある時点を基準の100として、そこからの変化率で見ることがある。 この変化率を指数という。
物価指数
物価指数とは物価の変動を財・サービスの量と価格を元に計算される指数である。 消費者物価指数や企業物価指数などがある。
消費者物価指数(CPI:Cosumer Price Index)とは、全国の世帯が日常購入する商品やサービスの物価変動を表す指数である。 ある基準となる時点(基準時)に家計で購入した商品やサービスと同じものを、比較する時点(比較時)に買いそろえるとしたらどれだけお金がかかるかという考えで計算されている(ラスパイレス方式)。 比較時の消費者物価指数は、基準時の物価を100として表される。 ラスパイレス方式の計算式は以下のようになる。 \[ I_{t}=\frac{\displaystyle\sum_{i=1}^{n}p_{t,i}q_{0,i}}{\displaystyle\sum_{i=1}^{n}p_{0,i}q_{0,i}}\times 100 \]
変数 | 意味 |
---|---|
$I_{t}$ | 比較時の消費者物価指数 |
$i$ | 品目 |
$p_{t,i}$ | 比較時の品目の価格 |
$p_{0,i}$ | 基準時の品目の価格 |
$q_{0,i}$ | 基準時の品目の購入数量 |
以下のグラフは2020年を基準(100)とした消費者物価指数の推移である。 電気代が1980年に急激に上がっているのは第2次オイルショックによるところが大きい。 当時、日本の発電は石油火力発電の割合が大きかったため、原油価格の高騰によって電気代が上がった。 その後、石油への依存割合を減らして天然ガスや石炭の火力発電、原子力発電などの電源を多様化することで電気代は下がり、2011年の東日本大震災で原子力発電が停止してもその他の発電によって補うことができた。
演習
- 使用するデータセット:newly_confirmed_cases_daily_2021.csv
このデータは日本全体の新型コロナウイルス新規陽性者数の日別のデータ(2021年)である。
出典:厚生労働省「データからわかる-新型コロナウイルス感染症情報-」(参照 2022-12-07)
1列目に「日付」、2列目に「日本全国の新規陽性者数」のデータが並んでいる。
ファイルの読み込み
上記の CSV ファイルは 1 列目に日付があるが、ファイルで読み込む際に「日付」であることを認識させる必要がある。
- 起動時の
[ファイルを開く]
か、メニューバーの[ファイル]
→[開く]
で CSV ファイルを選択する。 - シートでは列 A に日付が表示されるはずだが、「
###
」と表示される場合は列幅が足りないので、列幅を広げて正しく表示されるようにする。 - 列 A の列ヘッダで右クリックしてコンテキストメニューから
[セルの書式設定]
を選択する。 [数値]
タブにおいて「カテゴリー」で[日付]
を選択し、「形式」で[12月31日]
を選択して[OK]
をクリックする。
新規シートタブの追加
全国のデータは新しいタブで扱う。 新しいタブでは元のタブからセルの参照でデータを入れることにする。
- シートタブの左にある
[+]
をクリックして新しいシートを追加する。 - 新しいシートタブをダブルクリックして名前を「全国」にする。
- セル A1 に「日付」、セル B1 に「全国」と入力する(ラベル)。
- セル A2 に「
=
」と入力したまま、マウスでシートタブ「newly_confirmed_cases_daily_2021
」のセル A2 をクリックして Enter を押す。 - セル B2 に「
=
」と入力したまま、マウスでシートタブ「newly_confirmed_cases_daily_2021
」のセル B2 をクリックして Enter を押す。 - セル A2 と B2 をコピーして 3 行目から 366 行目まで貼り付ける。
これで列 A に日付、列 B に日本全国の新規陽性者数のデータが表示される。
折れ線グラフ
全国の新規陽性者数の推移を折れ線グラフで表す。
データの選択
- セル A1 から B366 の範囲を選択する。
- メニューバーの
[挿入]
→[グラフ]
を選択して「グラフウィザード」のダイアログを表示する。
① グラフの種類
[線]
を選択する。- 右側の4つある種類から
[線のみ]
を選択する。 [次へ]
をクリックする。
② データ範囲
はじめにデータ範囲を指定したので、ここでは何もしなくてよい。
[次へ]
をクリックする。
③ データ系列
データ範囲から自動的に Y 値と範囲が設定されるので、ここでは何もしなくてよい。
[次へ]
をクリックする。
④ グラフ要素
- 「タイトル」に「新型コロナウイルス感染症 新規陽性者数の推移」と入力する。
- 「サブタイトル」に「2021年」と入力する。
- 「X 軸」に「日付」と入力する。
- 「Y 軸」に「新規陽性者数 [人]」と入力する。
[完了]
をクリックする。
これで折れ線グラフが描かれる。
目盛間隔の変更
このままだと目盛間隔が広いので、一月ごとに変更する。
- グラフ編集モードにする。
- グラフのX軸の「1月1日」付近をダブルクリックして「X軸」のダイアログを表示する。
[目盛]
タブをクリックする。- 「種類」を
[日付]
にする。 - 「主間隔」の
[自動]
のチェックを外し、[1]
[月]
にする。 [OK]
をクリックする。
折れ線の属性の変更
折れ線の色などを変更してもよい。
- グラフ編集モードにする。
- グラフ上の青い折れ線のどこかをダブルクリックして「データ系列」のダイアログを表示する。
[線]
タブをクリックする。- 「線の属性」の「スタイル」「色」「幅」「透明度」を変更する。
[OK]
をクリックする。
7日間の移動平均
7日間の移動平均を計算する。
- セル C1 に「7日間移動平均」と入力する(ラベル)。
- セル C5 に「
=AVERAGE(B2:B8)
」と入力する。 - セル C5 をコピーしてセル C6 から C363 に貼り付ける(セル C364 から C366 には貼り付けない)。
LibreOffice には移動平均を求める機能があるので、それを利用してもよい。
- セル B2 から B366 までを選択する(入力範囲)。
- メニューバーの
[データ]
→[統計]
→[移動平均]
を選択すると「移動平均」のダイアログが開く。 - 「データ」の「結果貼り付け先」に結果を出力したい場所の最初のセル(例えば C1)を指定する。
- 「データ方向」はデータが列方向に並んでいるので
[列]
を選択する。 - 「パラメーター」は間隔に
[7]
を入力する。 [OK]
をクリックすると移動平均の結果が出力される。「#N/A
」と表示されるセルはデータ不足で計算できないところなので気にしなくてよい(削除してもよい)。
余裕があれば折れ線グラフを描いてみよう。
階差
階差を計算する。
- セル D1 に「階差」と入力する(ラベル)。
- セル D3 に「
=B3-B2
」と入力する。 - セル D3 をコピーしてセル D4 から D366 に貼り付ける。
余裕があれば折れ線グラフを描いてみよう。
ファイルの保存
CSV 形式だと数式やグラフが保存できない。 ODF 表計算ドキュメント(拡張子 .ods)として保存しよう。
ファイル形式を ODF 表計算ドキュメント(拡張子 .ods)にするには ファイル形式の変更 を参照。
課題
新型コロナウイルスの新規陽性者数のデータから「2022年」「山形県」の「新規陽性者」「7日間の移動平均」「階差」の3つの折れ線グラフを描きなさい。
新型コロナウイルスの新規陽性者数のデータは以下よりダウンロードする。
- このページの「新規陽性者数の推移(日別)」にある「オープンデータ」をクリックして CSV ファイルを保存する。
- 列 A に「Date(日付)」があるので、2022/1/1 から 2022/12/31 までを用いること。
- 列 H に「Yamagata(山形県)」の「新規陽性者数」のデータが並んでいる。
作成したファイルは ODF 表計算ドキュメント(拡張子 .ods)で提出すること。