3つの季節性のタイプとその検出方法

'3 types of seasonal patterns and their detection methods'

時系列の季節性の理解

Photo by insung yoon on Unsplash

季節性の分析と取り扱いは、時系列分析における重要な演習です。

この記事では、3つのタイプの季節性とその検出方法について説明します。

季節性とは何ですか?

季節性は、時系列を構成する主要な要素の1つです。季節性とは、一定の期間で繰り返される系統的な変動を指します。

季節性の変動は、天候やカレンダー、経済状況など、さまざまな要因によって引き起こされます。さまざまな応用分野に例があります。夏季は休暇や観光のために航空便が高額になります。別の例として、祝日による消費者支出が12月に増加することがあります。

季節性は、ある期間の平均値が他の時期の平均値と異なることを意味します。この問題により、系列は非定常になります。モデルを構築する際には、季節性を分析することが重要です。

3つの季節性のタイプ

時系列には、3つの季節パターンが現れることがあります。季節性は確定論的または確率的である場合があります。確率的な季節パターンは、定常または非定常のいずれかになります。

これらの季節性のタイプは相互に排他的ではありません。時系列には、確定論的および確率的な季節性の成分が含まれることがあります。

それぞれのパターンについて説明します。

確定論的季節性

確定論的季節性を持つ時系列は、一定の季節パターンを持ちます。季節パターンは常に同じ強度と周期で予測可能な方法で繰り返されます:

  • 同じ強度:季節パターンのレベルが同じ季節期間で変わらない
  • 変わらない周期性:ピークと谷の位置が変わらない。つまり、季節パターンが繰り返される間隔は一定です。

次は、確定論的季節性を持つ合成的な月次時系列の例です:

import numpy as npperiod = 12size = 120beta1 = 0.3beta2 = 0.6sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])xt = np.cumsum(np.random.normal(scale=0.1, size=size))series_det = xt + beta1*sin1 + beta2*cos1 + np.random.normal(scale=0.1, size=size)
人工的な月次時系列とその確定論的な季節成分。著者の画像。

この時系列は、参考文献[3]の本から適応されました。

定常的な季節性は、季節ダミーの説明変数でうまく扱うことができます。季節期間を示すカテゴリ変数です。この場合、各時刻に対応する月です。このカテゴリ変数は、ワンホットエンコーディングによって一連の指示(ダミー)変数に変換されます。

また、フーリエ級数を使用して季節性をモデル化することもできます。フーリエ級数は、異なる周期を持つ正弦波と余弦波です。これについては、以前の記事で詳しく説明しています。

確率的定常季節性

beta1 = np.linspace(-.6, .3, num=size)beta2 = np.linspace(.6, -.3, num=size)sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])xt = np.cumsum(np.random.normal(scale=0.1, size=size))# 確率的季節性を持つ合成時系列series_stoc = xt + beta1*sin1 + beta2*cos1 + np.random.normal(scale=0.1, size=size)
著者による、確率的な定常季節成分を持つ人工的な月次シリーズのイメージ。

確率的な定常季節性は、連続する季節期間(例:年々)にわたって進化します。その強度は予測が難しくなりますが、周期性はほぼ同じままです。

決定論的な季節性では、特定の月に対する最良の予測は年に関係なく変わりません。確率的な定常季節性では、最良の推測は前年の同じ月の値に依存します。

確率的な非定常季節性

時々、季節パターンは数期間にわたって大きく変化します。これらの変化は季節的単位根によって引き起こされることがあります。つまり、季節性は統合されています。

このタイプの季節性は、強度だけでなく周期性も時間とともに変化する傾向があります。つまり、ピークと谷は場所によって異なります。

このタイプの季節パターンの例は、消費シリーズや産業生産データなど、さまざまなドメインで見られます。

統合された季節性を持つ時系列では、変化を予測することは困難です。ショックはデータに永続的な変化を引き起こし、参考文献[1]の引用で「春が夏になる」などのシナリオが生じます。

季節時系列のテスト

時系列の視覚化は季節パターンを確認するための簡単な方法です。しかし、より体系的なアプローチのために使用できるいくつかのテストがあります。

季節の強度の測定

次のヒューリスティックに従って季節パターンの強度を定量化することができます:

import pandas as pdfrom statsmodels.tsa.api import STLdef seasonal_strength(series: pd.Series) -> float:    # 時系列の分解    series_decomp = STL(series, period=period).fit()        # 残差 + 季節性の分散    resid_seas_var = (series_decomp.resid + series_decomp.seasonal).var()    # 残差の分散    resid_var = series_decomp.resid.var()    # 季節の強度    result = 1 - (resid_var / resid_seas_var)    return result

この関数は、決定論的または確率的であるかに関係なく、季節性の強度を推定します。

# 決定論的なシリーズの強い季節性seasonal_strength(series_det)# 0.93# 確率的なシリーズの強い季節性seasonal_strength(series_stoc)# 0.91

このメトリックの著者は、値が0.64を超える場合は季節差分フィルタを適用することを推奨しています[2]。

季節性を検出する別の方法として、季節性時系列の自己相関をチェックするQSテストがあります。

非定常季節性の検出

季節パターンが非定常であるかどうかをチェックするために設計されたいくつかの統計的テストがあります。

一般的な例として、Canova-Hansen(CH)テストがあります。その仮説は次の通りです:

  • H0(帰無仮説): 季節パターンは定常である(季節単位根なし);
  • H1: シリーズに季節単位根が含まれている

OCSBテストとHEGYテストは、CHの代替手法です。

これらは、pmdarima Pythonライブラリ(およびR予測パッケージ)で利用可能な関数nsdiffsで実装されています。

from pmdarima.arima import nsdiffsperiod = 12 # 月次データnsdiffs(x=series_det, m=period, test='ch')nsdiffs(x=series_det, m=period, test='ocsb')nsdiffs(x=series_stoc, m=period, test='ch')nsdiffs(x=series_stoc, m=period, test='ocsb')

関数nsdiffsは、系列を定常にするために必要な季節差分のステップ数を返します。

この場合、すべてのケースで結果は0です。しかし、上記で見たように、季節パターンが強くないことを意味するわけではありません。

季節データに特化した他のテストもあります。例えば、季節ケンドールテストは、季節的な時系列に対して単調な傾向をチェックする非パラメトリックテストです。

キーポイント

  • 時系列の季節成分は、一定の期間で繰り返される体系的なパターンです。
  • 季節性は、決定論的、確率的、またはその両方の混合である場合があります。確率的な季節パターンは、定常性を持つ場合と持たない場合があります。
  • 季節性の強さを推定するか、統計的なテスト(例:QSテスト)を使用して季節性を検出することができます。
  • 季節の単位根も統計的なテストで特定することができます。関数nsdiffsは、定常性のために季節差分が必要かどうかを推定します。

お読みいただき、ありがとうございました。次のストーリーでお会いしましょう!

  • 時系列のトレンドの理解
  • 気候変動のための時系列:エネルギー需要の予測

コード

  • https://github.com/vcerqueira/blog/blob/main/posts/seasonality/intro.py

参考文献

[1] Canova, F. and Hansen, Bruce E. (1995) “Are seasonal patterns constant over time? A test for seasonal stability”. Journal of Business & Economic Statistics, 13(3), pp. 237–252

[2] Wang, X, Smith, KA, Hyndman, RJ (2006) “Characteristic-based clustering for time series data”, Data Mining and Knowledge Discovery, 13(3), 335–364.

[3] Holmes, Elizabeth E., Mark D. Scheuerell, and E. J. Ward. “Applied time series analysis for fisheries and environmental data.” NOAA Fisheries, Northwest Fisheries Science Center, Seattle, WA (2020).

[4] Time-series: deterministic/stochastic seasonality , in “The Samuelson Condition”

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more