SPSS Modelerのループでパラメーターを与えて特徴量を生成

# はじめに
ループで同じ構造のデータから特徴量を効率的に生成してみます。
工場や製品など同じ形式のデータから同じ特徴量をつくりたいことがあります。その場合にストリームを複数作る事もできますが、たくさんある場合は大変ですし、修正をする時に修正箇所がその分増えてしまいます。
ここでは[この記事](https://qiita.com/spssfun2017/items/702c218e8a12079c6a60)で作った特徴量を、ループを使って、複数の工場に対しても同様に生成していきます。


この記事は[SPSS秋のユーザーイベント2024](https://www.ibm.com/blogs/solutions/jp-ja/smuc-2024-autumn/)の[東日本旅客鉄道の堀様のご講演の「ものづくり領域で活かされるSPSSの今とこれから-2異常検知と自動化」](https://speakerdeck.com/jpspss/20241127spssqiu-02-dong-ri-ben-lu-ke-tie-dao-ku-yang-zi-liao)でご紹介したデモ②「ループ処理による効率化」の解説です。
[『実践！ 異常検知と故障予測―IBM SPSS ModelerによるIoT時系列データ活用』（東京図書）](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5%E3%81%A8%E6%95%85%E9%9A%9C%E4%BA%88%E6%B8%AC%E2%80%95IBM-SPSS-Modeler%E3%81%AB%E3%82%88%E3%82%8BIoT%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8-%E5%B0%8F%E5%B7%9D/dp/4489023855)の「1-3　実務で使える異常検知」(p.78-96)の一部を簡略化してご紹介しています。詳しい内容をお知りになりたい方はぜひ書籍もご参照いただければと思います。

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

# テストデータ
テストデータは、以下のような時系列データです。「第一工場」と「第二工場」の2つの工場のデータが一つのファイルに入っています。
「製品切替Bボタン」が押されてから「温度」が210度にあがるところまでの3分という時間を特徴量としてそれぞれの工場分、取り出したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c3cf45a1-60a9-5f29-ef46-bb6fb2c89827.png)




# 工場名のインスタンス化
「データ型ノード」で「値の読み込み」を行って、「工場名」をインスタンス化しておきます。これによって「工場名」には「第一工場」と「第二工場」のデータが入っていることが認識できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/481da7d9-fdde-c1e5-3112-66ad8d4de1ab.png)

# 工場名の絞り込み

「条件抽出ノード」をつなぎます。
「条件」に「`工場名 = '$P-工場名'`」を設定します。
「工場名」はパラメータで与えるという設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f55f027a-26f0-aa6d-cc13-ca99881bf1c0.png)

残りの処理は[この記事で作った処理](https://qiita.com/spssfun2017/items/702c218e8a12079c6a60#%E8%AA%AC%E6%98%8E%E5%A4%89%E6%95%B0%E3%81%AE%E4%BD%9C%E6%88%90)です。「製品切替Bボタン」が押されてから「温度」が210度にあがるところまでの時間が3レコード抽出されます。

# パラメータの設定
「ツール」＿「ストリームのプロパティー」＿「パラメータ」でパラメータの設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2100b708-6318-53d4-cc37-16715248b453.png)

以下の設定でパラメータ「`$P-工場名`」を作ります。
名前：「工場名」
ストレージ：文字列
値：「第一工場」←デフォルト値が「第一工場」であるという意味です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e0670d99-6d98-24ea-52a7-9aafeae36f48.png)

「テーブルノード」を右クリックして、実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b8e18313-654c-b2a5-3ead-5abf7711eaa7.png)

「工場１」の特徴量を抽出できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/09fa45d3-91fe-e476-399f-ef49e8838503.png)


# ループの設定
次にループを使って、このパラメーターに自動的に「第一工場」と「第二工場」の値を入れて実行します。

「ツール」＿「ストリームのプロパティー」＿「実行」で実行の設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/74fd3c1b-0c34-d1e9-77c7-ad31d49b014c.png)

「ループ」のオプションを選び、「ループ」のタブを選び、「反復キー」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/84714281-84c6-8fab-9185-f61491be273b.png)

以下の設定で反復キーを設定します。。
反復対象：「ストリームパラメータ -　値」←パラメータの値を変えながらループするという意味です。
パラメータ：「工場名」
ノード：「工場名:select」←工場名の条件抽出ノードです。
フィールド：「工場名」
値：「第一工場」と「第二工場」←データ型ノードでインスタンス化していたので値を選ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1da28a34-63ec-66b1-587e-8e8c6b13a6b2.png)

以下のように「第一工場」と「第二工場」がパラメータとして与えられるループの設定ができます。
「OK」で確定させてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1c16beb3-1f98-ce30-7780-14506891047a.png)

# 結果
ループの対象になった工場名の条件抽出ノードにループのマークがついています。
「現在のストリームを実行」で実行します（選択内容の実行」ではありません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9d701a8e-9b86-ce98-4e7b-c5f344a5d4d4.png)


ストリームが二回実行されて、テーブルノードの結果が２つ出てきます（重なって出てくるのでウインドウは後ろに隠れていることがあります）。結果は以下のように「第一工場」と「第二工場」の特徴量が抽出されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/988476ae-45ea-f204-5204-d9ddceaf6e8e.png)


ループでパラメーターを与えて特徴量を生成する事ができました。

# サンプル
#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/refs/heads/master/241204loopParameter/240918%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E7%89%B9%E5%BE%B4%E9%87%8F2.%E3%83%AB%E3%83%BC%E3%83%97.str


#### サンプルデータ
https://github.com/hkwd/spsssample/blob/master/241204loopParameter/%E5%B7%A5%E5%A0%B41_2%E3%83%87%E3%83%BC%E3%82%BF.csv

# 参考
#### 20241127SPSS秋02_東日本旅客鉄道 堀様資料
https://speakerdeck.com/jpspss/20241127spssqiu-02-dong-ri-ben-lu-ke-tie-dao-ku-yang-zi-liao

#### 『実践！ 異常検知と故障予測―IBM SPSS ModelerによるIoT時系列データ活用』（東京図書）
https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5%E3%81%A8%E6%95%85%E9%9A%9C%E4%BA%88%E6%B8%AC%E2%80%95IBM-SPSS-Modeler%E3%81%AB%E3%82%88%E3%82%8BIoT%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E6%B4%BB%E7%94%A8-%E5%B0%8F%E5%B7%9D/dp/448902385

#### SPSS Modelerで時系列データから「時間」の特徴量を作る
https://qiita.com/spssfun2017/items/702c218e8a12079c6a60