#はじめに
Kaggleの「Predict Future Sales」コンペに手を付けるに当たって、時系列データ初心者の自分が参考にしているKernelである「Time Series Basics」の訳を自分のメモがてら記事として残していくことにしました。グラフは省略、ひとまず基礎理論を解説している2章まで。
Jagan氏に感謝を。
平文は訳文
斜体はメモ
#時系列データの基礎:
(Basics of TS)
様々な伝統的な時系列データモデルの様々な基礎的概念の調査と
それらの背景にあるいくらかの基礎的な直感について
#目標:
(Objective)
このカーネルは多種多様な時系列データの概念のリポジトリとして初学者に提供するために作られている
熟練者にとっても新鮮さを与えるような有益なものであれば良いと願う
#コンペティションデータの概観:
(Competition and data overview)
このプレイグラウンドのコンペティションでは, ロシアのソフトウェア会社1cCompanyの次月の総売上を製品ごと・店ごとに予想するチャレンジを与えられている
###1cCompanyは何をしている?
このプログラムの1Cエンタープライズ8システムは日々の企業活動の自動化を目指している: 様々な会社の財務や経営のビジネスタスク、例えば、経営の会計、取引の会計、HRマネージメント、CRM、SRM、MRP、MRP、などである。
Data: 店舗商品の組み合わせについて日々の売り上げのデータが与えられているが、タスクは月ごとの単位で売上を予測することだ
#Single series:
(Single series)
このプログラムの目標を達成するには、店舗と商品の組み合わせそれぞれについて次月の売り上げを予測することが必要だ
それぞれの店舗と商品の売り上げの時間推移は時系列データ自身だ。
全ての組み合わせに挑戦する前にまず、ある一つの系列データを予測すためにはどうすれば良いか理解しておこう
会社全体の月ごとの総売上の予測について取り上げておいた
では初めに、月ごとの総売上を計算し、データをプロットしてみよう
ざっと見てみると: 明確に季節性過程と減少トレンド過程があることがわかる.
簡単な分解を使って、トレンド、季節性、残差を確認してみよう
加法モデルを想定してるため、次のように書ける
yt=St+Tt+Et
ytはt期間におけるデータ、Stはt期間における季節性過程、Ttはt期間におけるトレンドサイクル過程、そしてEtはt期間における残り(もしくはイレギュラーまたは誤差)であり、乗算モデルに似ている
yt=St x Tt x Et
#定常性とは:
(Stationarity)
データが定常性であるとはどういった意味だろうか?
1.連続データの平均値が時間関数的であってはならない。下図の赤いグラフは時間が経つごとに増加しているため、定常性ではない
2.連続データが一貫して変化していない場合、時間関数的であってはならない。この性質は同分散性という名称で知られている。下図の赤いグラフは、時間が経つごとにバラバラに変化していることに注目してほしい。
3.最後に、i番目とi+m番目の区間の共分散は、時間関数的であってはならない。次のグラフにおいて、時間が増加するごとに波の幅がどんどん近くなっていることに気づくだろう。したがって、共分散は赤い方の連続データとは一致していない。
(グラフはKernel参照)
定常性とはデータ系列の時間普遍性のことだ。例えば、時系列データの二点間が互いに関係していることである。それは互いのデータが、どれだけ離れていても、方向が前後していてもだ。
時系列データが定常過程であれば、簡単にモデル化できる。統計的モデルは、時系列データが定常性であることを想定、前提条件としている。
定常性であるかどうかを確認するテストとして利用されるものには複数ある。
ADF( Augmented Dicky Fuller Test)
KPSS
PP (Phillips-Perron test)
もっとも普遍的なADFを用いてみよう
De-trend
データ系列を前月データの差分データに変換する(numpy.diffでできるのかな?)
De-Seansonalizetion
データ系列を前年のデータの差分データに変換する
〜ほか省略〜
#AR, MA and ARMA models:
(AR, MA and ARMA models)
TL: DR モデルの比較説明:
MA - 系列データの次の値が前の値の平均値であるような関数
AR - 次の値の誤差(平均)がn前の値における誤差であるような関数
ARMA - 両方の混合
上段左は自己相関、上段右は偏自己相関を示している
statsmodels.sta.api.acf/pacf
下段2つはいずれもデータが正規分布に従っているかどうか確認している。
statsmodels.api.qqplot(...lines='s')
spicy.stat.probplot
〜ほか省略〜
##さて、だんだん記憶が曖昧になってきて見通しが悪いので、気の利いた要約を下表にまとめておこう
(Now things get a little hazy. Its not very clear/straight-forward.)
ACF(自己相関)の形状 | 必要なモデル |
---|---|
指数的に、次第に0に減衰する | ARモデル、偏自己相関を使って ARモデルのorderを特定するようにプロットする |
ポジティブとネガティブを交互に繰り返し, ゼロのARモデルに減衰する. | 偏自己相関を使って、orderを識別するようにプロットする |
ひとつかそれ以上の波形があり, 残りはほぼゼロ | MAモデル、プロットがゼロになるところを持って、orderを識別する |
いくつかのずれの後にゼロに向かって減衰する | ARMAモデル |
全てゼロ、もしくはほぼゼロ | データがほとんどランダム |
高い値が一定の周期で続く | 季節的自己回帰項を含んでいる |
ゼロに減衰しない | 定常性がない |
#次は
LSTMを用いているKernelを読みたい