季節性に関するtutorial
季節性のあるもの:気温、人の移動、〇〇月特有のもの・・・
ここで、季節性と言っていますが、一年間ごとの季節、春特有の・・という意だけではなく、一定期間ごとにデータの周期性があるものを取り扱うことができます。
多くの時系列データでは季節性を考慮する必要があります。このチュートリアルではいくつかの季節性を取り扱います。
まず、季節性のかくにん
tutorialでは複数の関数を定義しています。
# サンプリング周波数を設定(1年→365回確認するということ)
fs = pd.Timedelta("365D") / pd.Timedelta("1D")
# 時系列データ ts の周期性を計算
freqencies, spectrum = periodogram(
ts,
fs=fs,
detrend=detrend, # デトレンド方法を指定
window="boxcar", # ウィンドウ関数を指定
scaling='spectrum', # スペクトルのスケーリング方法を指定
)
periodogramが突然出て、定数を返しています。
detrend=データから傾向(トレンド)を除去する方法を指定
よく使われる選択肢:
- `'constant'`: 平均値を差し引く
- `'linear'`: 線形トレンドを除去
- `False`: トレンド除去を行わない
それらの関数を使用してグラフを生成
plot_periodogram(tunnel.NumVehicles);
できたグラフから季節性を確認できます。ここでは週ごとに一定の変動が見られることを示していますね。
データをフーリエ変換して、データをいくつかのsin,cos波で近似します。
# 年次の季節性を表現するために、10組のサイン・コサインペアを生成
fourier = CalendarFourier(freq="A", order=10) # "A"は年次の頻度を意味する
#データ作成の部分
dp = DeterministicProcess(
index=tunnel.index, # 時系列データのインデックスを指定
constant=True, # バイアス(y切片)のためのダミー特徴量を追加
order=1, # トレンドを1次関数であるとみなす
seasonal=True, # 週次の季節性をインジケータで追加
additional_terms=[fourier], # 年次の季節性をFourier項で追加
drop=True, # 共線性を避けるために不要な項を削除
)
# tunnel.indexの日付に対する特徴量を生成(サンプリング)
X = dp.in_sample()
model = LinearRegression(fit_intercept=False)
_ = model.fit(X, y)
ここでこの解説も含め、多くの日本語のtutorial解説では、必要な解説が不足していたり適当なことを書いていたりします。または単に英語の翻訳をしただけの意味不明な文章も見られます。残念ながら、このtutorialは多くの解説が原文でも不足しています。正しく理解するにはしっかりとライブラリ公式によるドキュメントを読む必要があります。(英語ですが非常にシンプルにまとまっています)。この部分のtutorial後にドキュメントを日本語に訳した補足を追加出来たらとおもいます。
先に述べた通り、別に週・年以外にも周期性があると考えたらadditional_termsの部分に入れること必要です。入れなかったらモデルはその周期性を考慮しません。
lagとの関係性:
これについては、株価の例題がわかりやすいと思います。
ある日、株価が急に下がった。では次の日の株価はどうなるか?2つの考え方がありますね。
1:下がる前の株価に戻る
2:前日も下がったし、今日も下がる
データのlag_nとの相関を調べることで1と2のどちらになることが多いかを調べることができます。