3.3 移動平均

時系列分解の古典的手法は1920年代に始まり、1950年代まで広く使われました。今でも多くの時系列分解手法の基礎となっているので、それがどのように機能するのか理解しておくことは大切です。古典的分解の第一歩は移動平均法を用いてトレンド・循環成分を推計することです。では、移動平均の議論から始めましょう。

移動平均平滑化

\(m\)項の移動平均は、次式のように書けます。 \[\begin{equation} \hat{T}_{t} = \frac{1}{m} \sum_{j=-k}^k y_{t+j} \tag{3.2} \end{equation}\] ただし、\(m=2k+1\)です。つまり、\(t\)時点のトレンド・循環成分の推計値を\(t\)時点の前後\(k\)期間の時系列の平均値で得るということです。時点が近い観測値は値も近いはずです。ですから、平均することでデータ中のランダムさの多くは消去され、平滑なトレンド・循環成分が残る、というわけです。これを\(m\)-MAと書き、\(m\)項移動平均を意味します。

例えば、オーストラリアの財・サービス輸出のGDP比を1960年から2017年まで示した図3.9を検討してみましょう。データは表3.1にも示しています。

global_economy %>%
  filter(Country == "Australia") %>%
  autoplot(Exports) +
  labs(y = "% of GDP", title = "オーストラリアの財・サービス輸出")
オーストラリアの財・サービス輸出: 1960年--2017年

図 3.9: オーストラリアの財・サービス輸出: 1960年–2017年

表 3.1: オーストラリアの財・サービス年次輸出: 1960年–2017年
Year Exports 5-MA
1960 12.99
1961 12.40
1962 13.94 13.46
1963 13.01 13.50
1964 14.94 13.61
1965 13.22 13.40
1966 12.93 13.25
1967 12.88 12.66
2010 19.84 21.21
2011 21.47 21.17
2012 21.52 20.78
2013 19.99 20.81
2014 21.08 20.37
2015 20.01 20.32
2016 19.25
2017 21.27

この表の一番右の列に、5項の移動平均を示し、トレンド・循環成分の推計値としています。その列の最初の値は最初の5つの観測値である1960年–1964年の平均値、次の値は1961年–1965年の平均値、といった具合です。5-MA列の各値は、前後2年を加えた5年間の窓で見た観測値の平均値です。先程の(3.2)式で表すと、5-MA列は\(k=2\)\(m=2k+1=5\)とした\(\hat{T}_{t}\)の値です。最初の2年と最後の2年には値がありません。両端では前後2年の観測値がないからです。端の近くでもトレンド・循環成分を推計できる、より洗練された手法については、後ほど議論します。

「スライド」する時間窓の観測値に関数を適用するsliderパッケージのslide_dbl()を使うことで、移動平均は簡単に計算できます。今回は幅が5の窓にmean()関数を適用します。

aus_exports <- global_economy %>%
  filter(Country == "Australia") %>%
  mutate(
    `5-MA` = slider::slide_dbl(Exports, mean,
                .before = 2, .after = 2, .complete = TRUE)
  )

トレンド・循環成分の推計値を見るために、元データと一緒に図3.10にプロットします。

aus_exports %>%
  autoplot(Exports) +
  geom_line(aes(y = `5-MA`), colour = "#D55E00") +
  labs(y = "% of GDP",
       title = "オーストラリアの財・サービス輸出") +
  guides(colour = guide_legend(title = "series"))
オーストラリアの財・サービス輸出 (黒色) と5-MAによるトレンド・循環成分の推計値 (オレンジ色)

図 3.10: オーストラリアの財・サービス輸出 (黒色) と5-MAによるトレンド・循環成分の推計値 (オレンジ色)

トレンド・循環成分(オレンジ色)は元データよりも平滑で、時系列の微小な変動を除外し主要な動きだけを捉えている点に注意してください。移動平均の項数がトレンド・循環成分推計の平滑さを決めます。一般的に、項数が大きいほどより平滑な曲線になります。図3.11は、オーストラリアの財・サービス輸出データについて、移動平均の項数を変えたときの効果を示しています。

オーストラリアの財・サービス輸出データと異なる項数の移動平均

図 3.11: オーストラリアの財・サービス輸出データと異なる項数の移動平均

このような単純な移動平均の項数は奇数(例えば、3、5、7など)にするのが普通です。奇数ならば対称だからです。\(m=2k+1\)項の移動平均では、真ん中の観測値と前後\(k\)個の観測値で平均されるので、対称です。しかし、\(m\)が偶数のときは、もはや対称になりません。

移動平均の移動平均

移動平均に対し、移動平均を取ることもできます。そうする理由の一つは、偶数項数の移動平均を対称にするためです。

例えば、4項の移動平均を取り、次にその結果に対し2項の移動平均を取ったとします。下表は、オーストラリアの四半期ビール生産量での例です。

beer <- aus_production %>%
  filter(year(Quarter) >= 1992) %>%
  select(Quarter, Beer)
beer_ma <- beer %>%
  mutate(
    `4-MA` = slider::slide_dbl(Beer, mean,
                .before = 1, .after = 2, .complete = TRUE),
    `2x4-MA` = slider::slide_dbl(`4-MA`, mean,
                .before = 1, .after = 0, .complete = TRUE)
  )
表 3.2: 四半期ビール生産量に4項の移動平均を取り、さらに2項の移動平均を取る場合
Quarter Beer 4-MA 2x4-MA
1992 Q1 443.00
1992 Q2 410.00 451.25
1992 Q3 420.00 448.75 450.00
1992 Q4 532.00 451.50 450.12
1993 Q1 433.00 449.00 450.25
1993 Q2 421.00 444.00 446.50
2009 Q1 415.00 430.00 428.88
2009 Q2 398.00 430.00 430.00
2009 Q3 419.00 429.75 429.88
2009 Q4 488.00 423.75 426.75
2010 Q1 414.00
2010 Q2 374.00

一番右の列の“\(2\times4\)-MA”表記は、4-MAにしてさらに2-MAにした、という意味です。一番右の列の値は、その左の列の値から2項の移動平均を取って得ています。例えば、4-MA列の最初の2つの値は、 451.25=(443+410+420+532)/4 と 448.75=(410+420+532+433)/4です。 2x4-MA列の最初の値は、これら2つの値の平均: 450.00=(451.25+448.75)/2です。

偶数項数(例えば4項)の移動平均を取った後でさらに2項の移動平均にすることを、「中心化4項移動平均」と呼びます。結果が今や対称になっているためです。確認のため、\(2\times4\)-MAを次のように書いてみます。 \[\begin{align*} \hat{T}_{t} &= \frac{1}{2}\Big[ \frac{1}{4} (y_{t-2}+y_{t-1}+y_{t}+y_{t+1}) + \frac{1}{4} (y_{t-1}+y_{t}+y_{t+1}+y_{t+2})\Big] \\ &= \frac{1}{8}y_{t-2}+\frac14y_{t-1} + \frac14y_{t}+\frac14y_{t+1}+\frac18y_{t+2} \end{align*}\] 対称な形の観測値の加重平均になっていますね。

移動平均の組み合わせは他にも可能です。例えば、\(3\times3\)-MAはよく使われるもので、3項の移動平均をさらに3項の移動平均したものです。一般的に、対称にするためには、奇数項数には奇数項数を組み合わせた移動平均にする必要があります。同様に、偶数項数には偶数項数を組み合わせる必要があります。

季節性のあるデータのトレンド・循環成分推計

中心化移動平均の最も一般的な使用目的は、季節性のあるデータからトレンド・循環成分を推計することです。\(2\times4\)-MAを考えてみましょう。 \[ \hat{T}_{t} = \frac{1}{8}y_{t-2} + \frac14y_{t-1} + \frac14y_{t} + \frac14y_{t+1} + \frac18y_{t+2} \] 四半期データに適用すると、各四半期に等しいウェイトが与えられます。最初の項と最後の項は年は1つずれますが同じ四半期だからです。結果として、季節変動は相殺され、\(\hat{T}_t\)の値には季節変動がほとんど、あるいは、全く残りません。四半期データに対しては、\(2\times 8\)-MAや\(2\times 12\)-MAを使っても、同様の効果が得られます。

一般的に、\(2\times m\)-MAは、最初と最後の項は\(1/(2m)\)のウェイトを、それ以外の全ての項は\(1/m\)のウェイトを持つ、\(m+1\)項の加重移動平均と同値です。ですから、季節周期\(m\)が偶数なら\(2\times m\)-MAを、奇数なら\(m\)-MAを、トレンド・循環成分推計に使うことができます。例えば、年次季節性がある月次データのトレンド・循環成分推計には\(2\times 12\)-MAが使えますし、週次季節性がある日次データのトレンド・循環成分推計には7-MAが使えます。

それ以外の項数を選択すると、通常、トレンド・循環成分推計に季節性が混じってしまうことになります。

事例: 米国小売業の就業者数

us_retail_employment_ma <- us_retail_employment %>%
  mutate(
    `12-MA` = slider::slide_dbl(Employed, mean,
                .before = 5, .after = 6, .complete = TRUE),
    `2x12-MA` = slider::slide_dbl(`12-MA`, mean,
                .before = 1, .after = 0, .complete = TRUE)
  )
us_retail_employment_ma %>%
  autoplot(Employed, colour = "gray") +
  geom_line(aes(y = `2x12-MA`), colour = "#D55E00") +
  labs(y = "人 (千)",
       title = "米国小売業の就業者数")
米国小売業の就業者数に2x12-MAを適用

図 3.12: 米国小売業の就業者数に2x12-MAを適用

3.12は、米国小売業の就業者数に\(2\times12\)-MAを適用したものです。平滑な線は季節性を示していませんね。移動平均よりもずっと洗練された手法を用いた図3.6のトレンド・循環成分推計とほぼ同じです。それ以外の項数(ただし、24、36などを除く)を選択していれば、平滑な線は季節変動を示すことになったでしょう。

加重移動平均

移動平均の組み合わせは、加重移動平均になります。例えば、これまで議論してきた\(2\times4\)-MAは、ウェイトが\(\left[\frac{1}{8},\frac{1}{4},\frac{1}{4},\frac{1}{4},\frac{1}{8}\right]\)の加重5-MAと同値です。一般的に、加重\(m\)-MAは以下のように書けます。 \[ \hat{T}_t = \sum_{j=-k}^k a_j y_{t+j} \] ここで、\(k=(m-1)/2\)で、ウェイトは\(\left[a_{-k},\dots,a_k\right]\)です。ウェイトは合計が1で、\(a_j = a_{-j}\)となるよう対称であることが重要です。単純な\(m\)-MAは全てのウェイトが\(1/m\)に等しい特殊ケースです。

加重移動平均の主な利点は、トレンド・循環成分のより平滑な推計を生成することです。窓をスライドするごとに、平均計算に観測値が丸ごと入ったり出たりするのではなく、観測値のウェイトが徐々に増加し、それから徐々に減少することで、より平滑な曲線になるのです。