SPSS Modelerの機械学習系モデルで時系列予測をする

SPSS Modelerの時系列ノードでは、時系列予測が簡単に行えます。しかし、指数平滑化やARIMAなどの古典的な統計的手法以外の機械学習系のモデルを使って時系列予測をしたいことがあります。


以下のようなデータから店舗1の売上を予測したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d316dd2e-8422-67d9-604f-a058a85a42e2.png)

## 実行動画（11分50秒）

<iframe width="560" height="315" src="https://www.youtube.com/embed/MDrrfxcI9Bk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


時系列予測の基本的な考え方は、以下のように自己相関、トレンド、周期変動、外因の特徴量から予測を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/170ca64d-b2cf-3328-3d0b-e6d5c7d165c6.png)


# 周期性要素の特徴量作成
まず周期性（季節性）要素の特徴量を作ります。
例えば1週間で周期があることを想定をする場合は「@OFFSET(店舗1,7)」で一週前の値をとってきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d6a5bbff-d9b3-801d-3567-13617ec9eb2e.png)

以下のように1週間前のデータが取れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9307eab7-edd4-38f5-f76c-eade526a8f22.png)

# 自己相関要素の特徴量作成
次に自己相関要素の特徴量を作ります。
ここでは3期分の過去データを取ります。AR(3)過程のイメージです。合わせて周期性要素についても3期分の過去データを取ります。
「時系列」ノードでLAGを取ります。「店舗1」と「店舗1S」から作ります。オフセットを3にすることで3期分の過去データが取れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/529669a3-42ae-f56a-29c3-3e92e6e35b65.png)

例えば1/1から1/3のデータが横持ちされていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1be2a27f-11bf-c558-2af7-57ba19de9b31.png)

# トレンド要素の特徴量作成
トレンド要素を期の差分からとります。

ここでは「フィールド作成」ノードを使って、「店舗1__2 - 店舗1__1」のように2期前-1期前という差分を取っています。もちろん3期前-2期前などの差分などもとっても構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/23dfb0cb-b5c7-75c7-46fb-d53d63455f86.png)

同様に周期性要素についても差分の特徴量を作ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1ee19d33-44e2-4e4f-eb50-6a80612bee20.png)

以下のような特徴量が作れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9a5c2cb0-851b-88b2-be67-cf28b3edaa94.png)

# 外部要因
ここまでは「店舗1」の自系列のデータから特徴量を作りました。
「降水量」「最高気温」「大学講義」「特売」の外部要因も使ってみたいと思います。

「データ型」ノードをつなぎ、「店舗1」を「対象」とし、「降水量」「最高気温」「大学講義」「特売」と先ほどまで「店舗1」から作った特徴量を「入力」にします。「大学講義」「特売」はフラグ型にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9563228b-d067-3cb6-7689-3814c1938653.png)

# モデル作成
数値予測ができるモデルであれば、何を使ってモデルを作ってもかまいません。XGBOOSTや自動数値のモデリングノードを使えば精度の高いモデルを作る事ができると思いますが、ここでは軽いCHAIDを使ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a75e8a2a-f03a-f563-a74c-561ea647c717.png)

# 1期先の予測
1期先の予測を行います。まず外部要因のデータを用意します。
予測を行いたい11/23の外部要因のデータは以下のようになっています。「降水量」「最高気温」は天気予報から入力して、「大学講義」「特売」は予定を入力するイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cbca9e6c-a2cd-23af-e1f2-a327ec3088e6.png)

このデータを学習データと「レコード追加」ノードでつなげます。「店舗1」の過去のデータがないと特徴量が作成できないためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4cd9f2c6-16e5-5243-84d7-edc90ed8c8b1.png)

以下のように11/23のデータが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fceef795-70dd-9001-4331-f133fb712cc7.png)

「店舗1S」から「データ型」ノードまでの特徴量を作っていたノード群をコピーペーストします。プレビューを見ると以下のようになっており、11/23を予測するための説明変数がそろったことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2ee01b78-f382-75fc-905e-23a7dd2663ac.png)

ここにモデルナゲットを接続してスコアリングします。以下のように予測ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/10af6121-f6d1-11eb-79ca-2d49ab3bbb99.png)

# 2期先の予測
次に2期先の11/24の予測を行います。11/24の予測を行うためには1期前の11/23のデータが必要です。これには今予測した値を使います。

予測結果から予測値のみを「フィルター」ノードで取り出します。列名も「$R-」を除いて「店舗1」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8286c0c3-a97a-7ec5-ba42-02a44d203472.png)

11/23のレコードと「レコード結合」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/241de382-8af1-e0ee-17d7-3711d2d33218.png)
以下のように11/23のレコードに「店舗1」の列が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4ffafdec-6f07-72b2-8a36-c1226e29c557.png)

「店舗1」の方がFLOAT型になっているので、元データに合わせるためにINTEGER型にroundします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/af2d59ad-a188-a3c5-b33f-20e45dd40921.png)


予測を行いたい11/24外部要因のデータを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3e24d45e-db07-87a2-6826-ebbba001578f.png)

「レコード追加」で元の学習データ、11/23のデータ、11/24のデータをつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9e89c804-e26e-449f-c2cc-e04e9de4336f.png)

以下のように「店舗1」を含む11/23と外部要因のみの11/24のデータが繋げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c22e9474-95d5-1f07-7de2-9ec89e3c24c8.png)

「店舗1S」から「モデルナゲット」ノードまでのノード群をコピーペーストします。結果は以下のようになっており、11/24が予測できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/606389ba-e197-38fb-db84-7a72a017f3bf.png)


# 複数期先の予測
3期先の予測も、2期先の予測結果「$R-店舗1」を「店舗1」に置き換えていくことで、可能です。ただし、予測結果を基に予測を重ねていくので、だんだん信頼性は下がっていく可能性があります。

# 外部要因の注意
外部要因は、基本的には、予測日の情報が予測時点で得られている必要があります。つまり11/22の時点で予測する場合、11/23や11/24の「降水量」「最高気温」「大学講義」「特売」があらかじめわかっている必要があります。
予測日の情報がわからない外部要因を含めたい場合は外部要因も「@OFFSET」や「時系列」ノードでわかる時点までずらしておく必要があります。
ただ、その情報に本当に意味があるかはよく考えるべきです。例えば前日や前々日の「大学講義」「特売」の情報は未来の予想には役に立たない可能性が高いと思われます。

# サンプルストリームとデータ
#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/master/240408%E6%99%82%E7%B3%BB%E5%88%97%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB/timeseiresMachineLearning.str

#### サンプルデータ

https://github.com/hkwd/spsssample/blob/master/240408%E6%99%82%E7%B3%BB%E5%88%97%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB/sales1_sf.csv

https://github.com/hkwd/spsssample/blob/master/240408%E6%99%82%E7%B3%BB%E5%88%97%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB/sales1_sf1123.csv

https://github.com/hkwd/spsssample/blob/master/240408%E6%99%82%E7%B3%BB%E5%88%97%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB/sales1_sf1124.csv

* テスト環境
    * Modeler 18.5
    * Windows 11 64bit

# 参考

#### SPSS Modeler ノードリファレンス 5-8 時系列(時系列Autoモデリング)

https://qiita.com/416nishimaki/items/f7842af5af1d6410526d

時系列ノードでの時系列予測方法がわかりやすく解説されています。

#### 【時系列分析入門コース】まずは基礎をガッチリ固めてスタートダッシュ
https://www.youtube.com/watch?v=Fq73BS32a-8&

#### テーブルデータ系モデルで複数先予測（線形回帰）
https://www.salesanalytics.co.jp/datascience/datascience125/


#### 【時系列分析③】ARMA過程と誤差項の意味【ついに時系列の始まり！
https://www.youtube.com/watch?v=Ja7OZzu1s7w