時系列データから複数の季節変動成分をRのMSTL関数で抽出する

時系列データから複数の季節変動成分をRのMSTL関数で抽出する

売上などの時系列データには、周期性があります。周期性の中で、期間の決まっているものを季節性と言ったりします。

例えば、1日単位の売上データであれば週周期(7日間)年周期(365.25日間)1時間単位の気温データであれば日周期(24時間)週周期(168時間)年周期(8766時間)などです。

要は、複数の季節変動成分がある時系列データが存在するということです。

このことは、以下の記事で話題にしています。

第285話|複数の季節変動成分のある時系列データ

では、具体的にどのようにして複数の時系列成分を抽出するのか、という話題になりますが、便利な手法があります。MSTL(Multiple Seasonal-Trend decomposition)法です。

今回は、「時系列データから複数の季節変動成分をRのMSTL関数で抽出する」というお話しをします。

時系列データの基本成分に分解する

時系列データ(原系列)は、主に以下の3つの変動成分で成り立っています。

  • トレンド
  • 季節
  • 不規則

トレンド変動成分は上昇傾向や下降傾向など、季節変動成分は週周期や年周期など、不規則変動成分はトレンドと季節変動成分以外です。

原系列=トレンド変動+季節変動+不規則変動

この3つの成分に分ける手法は色々あります。STL(Seasonal-Trend Decomposition Procedure Based on LOESS)法などが有名です。

STL法などを使うと通常は1つの季節変動しか分解できません。では、季節変動が複数ある場合は、どうすれば分解できるのでしょうか?

STLを拡張したMSTL(Multiple Seasonal-Trend decomposition)法があります。

RのForecastパッケージのMSTL関数を使い分解する

R時系列解析のパッケージと言えば、Forecastです。その中に、STLやMSTLを実施する関数があります。

以下のサンプルデータを使い、MSTL分解を実施してみます。

  • AirPassengers
  • taylor

AirPassengersは、時系列解析で有名な月ごとの飛行機乗客数の時系列データです。季節変動成分は、年周期(12周期)のものが1つあることが想像ですきます。

taylorは、2000年6月5日(月)から8月27日(日)までのイングランドとウェールズにおける30分ごとの電力需要(メガワット)の時系列データです。季節変動成分は、日周期(48周期、1日=30分×48)と週周期(336周期、7日=30分×336)の2つの季節性があることが想像できます。

この2つのデータセットに対し、以下の2つの時系列成分の分解手法を実施します。

  • STL法:季節変動成分を1つだけ分解
  • MSTL法:季節変動成分を複数分解

 

必要なパッケージのインストール

以下の2つのパッケージを利用します。

  • tidyverse
  • forecast

tidyverseは、データの基本的な操作などをするときに必要な関数をまとめたパッケージです。forecastは、時系列解析用のパッケージです。

まだインストールされていない方は、インストールしておいてください。

以下は、コード例です。

install.packages("tidyverse")
install.packages("forecast")

 

必要なライブラリの読み込み

まず、必要なRのライブラリを読み込みます。

以下、コードです。

# ライブラリの読み込み
library(tidyverse)
library(forecast)

 

AirPassengers(月ごとの飛行機乗客数の時系列データ)

時系列解析で有名な月ごとの飛行機乗客数の時系列データで、STLMSTLを利用し季節変動成分を抽出していきます。

 

どのようなデータなのかを折れ線グラフで見ていきます。

以下、コードです。

# プロット
AirPassengers %>% autoplot()

 

以下、実行結果です。

 

この時系列データを、STL(Seasonal-Trend Decomposition Procedure Based on LOESS)法で分解してみます。

以下、コードです。

# STL分解
AirPassengers %>% stl(s.window="per", robust=TRUE) %>% autoplot()

 

以下、実行結果です。

 

年周期(12周期)が抽出されました。

 

この時系列データを、MSTL(Multiple Seasonal-Trend decomposition)法で分解してみます。

以下、コードです。

# MSTL分解
AirPassengers %>% mstl(lambda = "auto") %>% autoplot()

 

以下、実行結果です。

 

このことから、季節変動成分が1つであるAirPassengers(月ごとの飛行機乗客数の時系列データ)でも、MSTL法による分解で対応できることが分かります。

 

taylor(30分ごとの電力需要の時系列データ)

2000年6月5日(月)から8月27日(日)までのイングランドとウェールズにおける30分ごとの電力需要(メガワット)の時系列データで、STLMSTLを利用し季節変動成分を抽出していきます。

 

どのようなデータなのかを折れ線グラフで見ていきます。

以下、コードです。

# プロット
taylor %>% autoplot()

 

以下、実行結果です。

 

この時系列データを、STL(Seasonal-Trend Decomposition Procedure Based on LOESS)法で分解してみます。

以下、コードです。

# STL分解
taylor %>% stl(s.window="per", robust=TRUE) %>% autoplot()

 

以下、実行結果です。

 

日周期(48周期、1日=30分×48)が抽出されました。

 

この時系列データを、MSTL(Multiple Seasonal-Trend decomposition)法で分解してみます。

以下、コードです。

# MSTL分解
taylor %>% mstl(lambda = "auto") %>% autoplot()

 

以下、実行結果です。

 

このことから、taylor(30分ごとの電力需要の時系列データ)の季節変動成分が、日周期(48周期、1日=30分×48)と週周期(336周期、7日=30分×336)の2つあることが分かります。2つの中では、日周期(48周期、1日=30分×48)の方が強いようです。

 

まとめ

今回は、「時系列データから複数の季節変動成分をRのMSTL関数で抽出する」というお話しをしました。

Pythonではどうやるのか、複数の季節成分があるときの時系列モデルとして何かあるのか、別の機会にお話しします。