売上などの時系列データには、周期性があります。周期性の中で、期間の決まっているものを季節性と言ったりします。
例えば、1日単位の売上データであれば週周期(7日間)や年周期(365.25日間)、1時間単位の気温データであれば日周期(24時間)や週周期(168時間)、年周期(8766時間)などです。
要は、複数の季節変動成分がある時系列データが存在するということです。
このことは、以下の記事で話題にしています。
では、具体的にどのようにして複数の時系列成分を抽出するのか、という話題になりますが、便利な手法があります。MSTL(Multiple Seasonal-Trend decomposition)法です。
今回は、「時系列データから複数の季節変動成分をRのMSTL関数で抽出する」というお話しをします。
Contents
時系列データの基本成分に分解する
時系列データ(原系列)は、主に以下の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(月ごとの飛行機乗客数の時系列データ)
時系列解析で有名な月ごとの飛行機乗客数の時系列データで、STLとMSTLを利用し季節変動成分を抽出していきます。
どのようなデータなのかを折れ線グラフで見ていきます。
以下、コードです。
# プロット 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分ごとの電力需要(メガワット)の時系列データで、STLとMSTLを利用し季節変動成分を抽出していきます。
どのようなデータなのかを折れ線グラフで見ていきます。
以下、コードです。
# プロット 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ではどうやるのか、複数の季節成分があるときの時系列モデルとして何かあるのか、別の機会にお話しします。