はじめに
時系列分析において年月日の季節性を捉える特徴量はラグや移動平均などあるが、その中でも年、四半期、週などのシーズナルパターンを正確にモデルに反映させる必要がある。三角関数を用いた季節性特徴量を作ることにより、日付データの時間軸に沿ってモデルが正しく学習することを目的としています。
アナログ時計の場合、1〜12の数字は全て隣り合っており、例えば23時の次は0時になった時、11のとなりが12があるので視覚的にもわかると思います。
しかし、デジタル時計の場合表示される時刻は、23時の次は0時になり隣り合っているのに、数字だけで見ると最も離れていますよね。
このデジタル時計のように、時間の流れの連続的なパターンを正確にモデルに学習させるというのが、狙いです。
コード
このような時系列データがあったとします。
日付データとsalesとして適当な数字を入れたデータフレームを作成しました。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'date' : pd.date_range('2018-01-01', '2018-12-31', freq='D'),
'sales' : np.random.random(len(df))})
#月、日に分ける
df['month'] = df['date'].dt.month
df['day_of_month'] = df['date'].dt.day
#シーズナル特徴量の生成
df['month_sin'] = np.sin(2*np.pi*df.month/12)
df['month_cos'] = np.cos(2*np.pi*df.month/12)
df['day_sin'] = np.sin(2*np.pi*df.day_of_month/31)
df['day_cos'] = np.cos(2*np.pi*df.day_of_month/31)
一年分しか日付データを生成してないので月、日で三角関数の曲線を作ります。
月、日それぞれに分割後sin、cosを適用します。
import seaborn as sns
#day_sin
plt.figure(figsize=(10,2))
sns.lineplot(data = df,x = df['date'],y = df['day_sin'],errorbar=None)
#day_cos
plt.figure(figsize=(10,2))
sns.lineplot(data = df,x = df['date'],y = df['day_cos'],errorbar=None)
とりあえず、日のデータだけ可視化してみました。
まとめ
日のデータに三角関数を適用したことにより、曲線として季節性を捉えることができました。月、日以外にも年にも適用できるので、何年ぶんもあるような膨大なデータには有効かもしれません。
以上、kaggle初学者が三角関数を使用した季節性特徴量の作り方を書いてみました。
引き続き勉強頑張ります!