SPSS Modelerで異常検知

#SPSS Modelerを使って、異常検知モデルを作ってみます


* 稼働確認環境
Modeler 18.1.1


# A.事前準備

## A1. 以下からプロジェクトのファイルをzipでダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/0b1a152d-ec09-984f-f04a-16fec5648993.png)

hkwd/DSXL_MachineErr
https://github.com/hkwd/DSXL_MachineErr

## A2. zipファイルを解凍し、データファイルを確認します。
DSXL_MachineErr-master.zipを解凍するとDSXL_MachineErr-master\DSXL_MachineErr-master\datasetsに以下の3ファイルが入っています。

Cond3n_e111.csv
Cond3n_e.csv
Cond3n_e_new.csv

## A3. SPSS Modelerを起動します

# B.データの確認
B1. データを確認します
Cond3n_e.csvというファイルをModelerのキャンバスにドラッグアンドドロップします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/532c2043-c214-c839-9ef3-8f671b12f71c.png)

出力タブからテーブルノードを選択し、ドラッグアンドドロップしたCond3n_e.csvと接続します。
テーブルノードを選択状態にして、黄色の五角形に緑の三角のボタンで実行します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/bb53f3a4-85e7-88df-fc87-02e8d92996f5.png)


以下のようなデータが入っています。各列の意味は以下です。
M_CD: マシンコード
UP_TIIME: 起動時間
POWER: 電力
TEMP: 温度
POWER_DIFF: 電力差分
TEMP_DIFF: 温度差分
POWER_5MAVG: 電力差分5期移動平均
TEMP_5MAVG: 温度差分5期移動平均
ERR_CD_5FUTURE: 5期先エラーコード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/6beb9e9b-326d-598f-c3b0-d55dbd6d16fe.png)

確認し終わったら赤い×ボタンで閉じます。

# C.モデル作成
SPSS Modelerを使って、電力や温度の変化などからエラーは発生していないけれども異常（普通ではない）データを発見するモデルを作成します。


## C1. 集計
レコード設定タブからレコード集計を選び、キャンバスにドラッグアンドドロップします。
そして、Cond3n_e.csvのノードと接続します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/e59edf6a-6210-57b3-a542-cd8d4b87dcba.png)

次にダブルクリックをしてプロパティを開きます。

キーフィールドの「利用可能なフィールドの設定から取得」のアイコンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/c27febc1-d651-8d67-f15d-21e1d03aadbf.png)


「M_CD」を選択し、OKで閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/1d48fc9f-2f5d-ec66-fefd-2588780fa38d.png)

デフォルトモードで平均、最大、中央値にチェックを入れます。このチェックを入れた集計がデフォルトで有効になります。
次に、フィールドにレコード度数を含めるのチェックを外します。
集計フィールドの「利用可能なフィールドの設定から取得」のアイコンをクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/72d3db71-7b1f-4432-890d-012d6d893f28.png)

集計項目を選びます。
「M_CD」と「UP_TIME」以外の列を選択し、OKをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/94a23c09-86a7-b011-60d6-22a05b610f41.png)


選んだフィールドの平均、最大、中央値を集計するよう設定されました。
「ERR_CD_5FUTURE」の平均値や中央値は意味がないので、最大にのみチェックをいれるように修正します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/ccb4deb7-959c-9a83-8841-6682975d2921.png)


プレビューで集計後のデータを確認します。
「M_CD」で一意になり、センサーデータの平均、最大、中央値が計算されています。

赤い×ボタンで閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/0a76192f-0a23-004f-f497-e8b83becb933.png)

レコード集計の設定もOKで閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/f0418ef2-c91e-a016-230b-19c42eb57b0b.png)

## C2. エラーなしデータのみの抽出

出力タブからテーブルノードを選択し、レコード集計ノードと接続します。
テーブルノードを選択状態にして、黄色の五角形に緑の三角のボタンで実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/b2da34e7-8a78-b305-5a0e-5dfa172e8deb.png)

一番左にある`ERR_CD_5FUTURE_Max`の中から「0」のデータを一つ選び、生成メニューから条件抽出ノード（”AND")を選びます。
赤い×ボタンで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/00d7ae30-2858-3d56-7fa7-77caa4ac735a.png)

キャンバスに（生成）という名前の条件抽出ノードができています。
ダブルクリックしてプロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/18c3ac8a-c659-738a-ebb0-b36e00f05f9b.png)

`ERR_CD_5FUTURE_Max = 0`の条件式が作られています。
SPSS Modelerにはこのように出力結果から新たな処理を作る便利な機能があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/27ec59f7-4d01-2994-cca1-5ae9cf51bb4d.png)

出力タブからテーブルノードを選択し、条件抽出ノードと接続します。
テーブルノードを選択状態にして、黄色の五角形に緑の三角のボタンで実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/4396b3a6-a474-a040-a83f-a565677dc0e2.png)


データを確認するとエラーのデータがなくなっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/08a4ab18-c85a-8283-fced-8e39bd3e2f30.png)

グラフタブから散布図ノードを選択し、条件抽出ノードと接続します。
ダブルクリックし、プロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/cc09c7db-721e-d8ce-8613-c9d1e918ead7.png)

X軸に`Power_Mean`、Y軸に`TEMP_Mean`を設定し、実行をクリックします。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/0bf50dd7-e1f5-4647-cb19-46d741c6bc6f.png)

正常なマシンのデータに絞り込まれているにも関わらず、右下には普通ではないデータが離れてプロットされています。こういうマシンは今は正常でも問題が潜んでいるかもしれません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/64a390c0-e9c3-4155-2baa-6934c1f6d059.png)

表示から「探索モード」と「インタラクティブ」を選択し、「選択範囲をアクティブにします」アイコンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/13cc1697-1cc1-7fac-d01f-4c707bef568b.png)


このデータを囲みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/f80dde15-2282-a87c-f93a-3d1d47f1b5ad.png)

生成メニューから領域の抽出ノードを選びます。
赤い×ボタンで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/769b4e5c-35ec-6e90-eb44-f2399adfe4e7.png)

変更内容は保存しないで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/963868ab-253c-19da-edbe-c3652bd79407.png)

キャンバスに新たな（生成）という名前の条件抽出ノードができています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/c2a19684-d87c-32e6-6eb8-cadf1abce826.png)

ダブルクリックすると散布図で囲んだ領域が条件式として生成されています。
OKをクリックして閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/01058f3b-6771-b677-505c-66fdda00f146.png)

先ほど作った条件抽出ノードの後ろにつなぎ、プレビューします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/c8f15247-e189-4dc3-cddd-b1347e12cb2b.png)

449のマシンであることがわかります。

赤い×ボタンで閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/97b32caa-20ce-2cfd-1457-7165b761a2ed.png)


## C3. モデルの作成
このように散布図をみて普通ではない異常なデータを見つけることは、項目数が多い場合は困難です。このような異常データを自動的に発見するのが異常値検査ノードです。

フィールド設定タブからデータ型ノードをドラッグアンドドロップし、正常データのみに絞り込んだ条件抽出ノードにつなぎます。
ダブルクリックでプロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/5ea42006-dcb2-45d8-496b-e05b406c76c9.png)

値の読み込みをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/cad93874-3b51-87c2-6890-06bf7f1d2e27.png)

「M_CD」列のロールをなしに設定します。
OKをクリックして閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/098c37d1-a897-833b-47b5-fd35ac5ddd6f.png)


モデル作成タブより異常値検査ノードをドラッグアンドドロップし、データタイプノードとつなぎます。
ダブルクリックして、プロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/d60854c2-ea37-4dce-1fd5-8115671b9dca.png)


「異常値インデックスの最低レベル」にチェックを入れます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/de351531-ae16-35af-d5a0-e9e3c9a7cbcd.png)

エキスパートタブに移り、モードを「エキスパート」に指定します。
「ピアグループ数を指定」を指定し、クラスター数を１に設定します。
そして、実行ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/9aa404f5-3211-be2d-3caf-8ea025ac5b5e.png)



## C4. 結果の確認
レコード設定タブからソートノードをドラッグアンドドロップし、モデルナゲットとつなぎます。
ダブルクリックでプロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/683ed0d8-9ed8-33cc-5901-30ff8036f958.png)

ソート項目の「利用可能なフィールドの設定から取得」のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/0385de3d-fcf1-36e1-8dd8-220d1fd572c6.png)

`$O-AnomalyIndex`を選び、OKをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/f621bf9f-3bbc-9127-6091-0c652029dd47.png)

順序を降順に設定し、OKで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/29c25e08-b7e8-234c-6a38-56312928fce0.png)

右クリックし、プレビューで確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/55bc5669-41a2-d9c5-c19c-0e4470937fba.png)


`$O-Anomaly`がTのデータは異常と判定されたデータです。先ほどの449も異常と判定されています。
さらに`$O-Field-1`や`$O-Field-2`に異常と判定した理由となった項目が列挙されます。たとえば2行目のデータは`POWER_5AVG_Mean`,`POWER_DIFF_MEAN`などで他のデータと比べて異常だったと判定されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/2f394a6f-2987-3e8a-28f5-56056c01fbe9.png)

`POWER_5AVG_Mean`,`POWER_DIFF_MEAN`がどちらも０であることが異常と判定された原因です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/a531317c-f017-13d1-a9c1-a562213aa616.png)

赤い×ボタンで閉じます。

グラフタブから散布図ノードを選択し、モデルナゲットと接続します。
ダブルクリックし、プロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/39b0bbf8-f7cf-99a3-88c1-b8208181a938.png)


X軸に`POWER_5AVG_Mean`,Y軸に`POWER_DIFF_MEAN`,Color 色に`$O-Anomaly`を設定し、実行をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/b8b41f06-b8fe-0cae-4ab9-7049c4256aff.png)


確かに他の点から離れている様子がわかります。他に異常と判定された2レコードも他の点から離れていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/6c21826c-c3e4-a738-8d58-1dc22b1a231c.png)



# おわりに
Anomaly（異常値検査）ノードは教師なし学習の手法です。教師あり学習の場合は異常ケースがある程度の件数はないとモデルを作ることができませんが、教師なし学習であれば、異常ケースが少ない場合にも利用することができるます。ですので、滅多に発生しない故障や今までに発生したことのない故障を検知できる可能性もあります。

# 参考
#### SPSS Modelerによる製造系データの分析ハンズオン・コンテンツへのリンク #SPSS_Modeler - Qiita 

https://qiita.com/spssfun2017/items/383a8d1059d008ccfad0