DSXLのSPSS Modelerで異常検知

#Data Science Experience Local(DSXL)のSPSS Modeler Flowsの機能を使って、異常検知モデルを作ってみます
SPSS Modeler Flowsの機能はオンプレのデスクトップソフトウェアのSPSS Modelerの機能をDSXL上で利用可能にした機能です。
この機能をつかって教師なし学習の異常検知モデルを作ってみます。

###環境
1.2.0.2 (20180421_0214) x86_64 

###参照
SPSS Modeler Flows add-on - IBM Data Science Experience
https://datascience.ibm.com/docs/content/local/canvas.html?audience=local&context=analytics

IBM SPSS Modeler - 概要 - 日本
https://www.ibm.com/jp-ja/marketplace/spss-modeler

##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. DSXLにログインしプロジェクトにインポートします。
プロジェクトリストを開き、NewProjectでプロジェクトを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/597713a5-0320-e06b-6408-b7f06a0f3200.png)
FromFileで先ほどダウンロードしたZIPファイルを指定し、Createします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/18722b77-55f0-007e-9d00-5788f9e8fd72.png)

##B.データの確認
B1. データを確認します
プロジェクトのAssetのDataSetsからCond3n_eというデータをPreviewします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/a2303e9c-fe4c-6aab-79c7-daf29faaf92b.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/098ca559-9dec-8303-11d6-c6c8eb6853c9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/5066b156-7a83-54ee-839e-669a1d05075c.png)

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

C1. SPSS Modeler Flows(またはStreams)のタブを開き、Add flow(またはStreams)でFlow(またはStreams)を作成を開始します。FlowまたはSteamとは分析の処理フローを定義した設計図のようなものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/105e0f5c-ee7a-d7d1-0511-978fa29681a8.png)

C2. Blankを選択し、任意の名前を付けてCreateします。
なお、ここで「From File」を選択するとオンプレ版のSPSS Modelerでつくった.strファイルを読み込むこともできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/6e0a99b0-eac2-90d2-3a68-34580f7f2f2e.png)


C3. 学習データを選択します。
Cond3n_e.csvをドラッグアンドドロップで中央のキャンバスという領域に置きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/190a0f3a-6c71-9a60-a2a1-32ab217c42c7.png)

Cond3n_e.csvのノードを選び右クリックでOpenを選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/f0a3e770-ad6b-600f-fce5-5a50754f5c82.png)

Dataの中の「ERR_CD_5FUTURE」列のOverrideにチェックをつけ、Storageを「String」に変更し、Saveで保存します。
「ERR_CD_5FUTURE」は数値のデータですが、エラーコードなのでデータ型を文字型と指定をしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/d41d28f5-3dde-3709-034b-02f82b5d0206.png)

C4. データの中身を確認します。
Cond3n_e.csvのノードを選び右クリックでView Dataを選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/c975b5f5-986c-821b-1ced-29ddce13d3d8.png)

データが表示されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/09c91551-275b-813f-bced-c42312722fb9.png)

Stream名をクリックして、キャンバスに戻ります。

C5. 集計
Nodesの一覧からRecord OperationsのAggregateを選び、キャンバスにドラッグアンドドロップします。
そして、Cond3n_e.csvのノードと接続します。
次に右クリックをしてプロパティを開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/7ed4b9b0-b3d3-923a-fc16-ac66d148964e.png)

Settingsを開き、Key FieldsのAdd Columnsクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/5744c23c-6a9c-5bf5-3314-7dfccc93f251.png)

「M_CD」を選択し、OKで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/de48ac15-89ec-c19c-8fa5-a8f16af44fd0.png)

Aggregationsで集計項目を選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/7d137cd2-8d6a-0fe4-5211-5846de11ab88.png)

Add Cloumnsをクリックします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/932f6f36-8086-3ba7-f8b7-0f3fcae07f1a.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/391107eb-174d-a712-7d03-a4b589f8aa15.png)

Aggregate OperationsをEditします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/09ed9e8f-7c7a-2717-a652-844d75fafec5.png)

Mean(平均)、Maximum（最大）、Median(中央値)の3つにチェックをいれ、OKで閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/8825381b-15d7-cbf6-db90-fbf52321a566.png)

「ERR_CD_5FUTURE」以外の列もMean(平均)、Maximum（最大）、Median(中央値)の3つにチェックをいれ、「ERR_CD_5FUTURE」はMaximum（最大）にのみチェックをいれ、OKで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/4dbbcafa-683b-7ff2-bec7-8c8c4b9f4466.png)



Include record countのチェックを外し、Saveで保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/74910ce3-5698-4019-0182-0b0f63165332.png)

View Dataで集計後のデータを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/87318f5f-06f4-67e8-edc8-7d1bd815953d.png)

「M_CD」で一意になり、センサーデータの平均、最大、中央値が計算されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/ec33b3ae-15f3-a900-552b-db88c5ad77f0.png)

最終的にエラーが発生したマシンのエラーもERR_CD_5FUTURE_Maxに記録されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/d6e1ba4b-b082-645e-045c-6ad007b99a49.png)

ストリーム名をクリックして戻ります。

C6. エラーなしデータのみの抽出
Record OperationsのSelectノードをドラッグアンドドロップし、Aggregateノードと接続し、設定を開きます。
SettingのなかのConditionに「ERR_CD_5FUTURE_Max='0'」を記入し、Saveで保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/86175591-3e5e-c46c-7298-2bff2965f591.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/5e75c423-f7ec-98b7-ac20-b33144160064.png)

Chartをクリックし、プロパティを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/42556fea-2495-e3c1-7c30-acdb69fe9aac.png)

Chart TypeでScatter（散布図）を選択し、Settingタブを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/8cf9e302-05b2-6ee2-2d76-479d074abfc3.png)

X軸にPower_Mean、Y軸にTEMP_Meanを設定します。
正常なマシンのデータに絞り込まれていますが、右下には普通ではないデータが離れてプロットされています。こういうマシンは今は正常でも問題が潜んでいるかもしれません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/878a3cd8-4f84-3f9e-9d40-cfa20bd5906a.png)

Selectモードにし、このデータを囲みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/1e39bcb2-174e-47f3-1a8b-dda47213d8be.png)

Highlightをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/757b9e5d-6f30-5c79-b15b-36654c00796c.png)

スプレッドシートに戻ると先ほどの値が強調表示され、449のマシンであることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/e51e77d1-d5d9-0b26-666f-4323745be9c3.png)

ストリーム名をクリックして戻ります。

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

Field OperationsからTypeノードをドラッグアンドドロップし、Selectノードにつなぎます。
プロパティを開き、Settingの中のConfigure Typesをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/db7a1471-294f-9ecb-fe8c-7bfc5fd793e4.png)

Add Cloumnsをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/47e70db9-30f0-98fa-d436-d1b518e3c59c.png)

全列を選択し、OKで閉じます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/d6aee991-9095-4c62-fd3f-8b5d2dc63f04.png)

Read Valuesボタンをクリックし、データを読み込みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/b9a42585-9e92-8768-916b-fa82540024e9.png)

「M_CD」列のRoleをNoneに設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/80140a9f-a9f2-dd51-6b19-cd3136d315d8.png)


OKをクリックして閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/120d4b99-b692-e6e0-eac8-b26595a4663e.png)

Saveをクリックして、保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/ac657280-fa3a-d0c2-16c4-85dc89378645.png)

ModelingよりAnomaly（異常値検査ノード）をドラッグアンドドロップし、Typeノードにつなぎます。
プロパティを開き、Build OptionsのDetermine cutoff value for anomaly byでIndex levelを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/848847a6-2a09-e507-44da-787d205b25a4.png)

さらにExpertOptionsでModeをExpertにし、Specify number of peer groupsにチェックをいれ、Number of peer groupsを１に設定します。
Saveして保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/198e5d63-be1b-4b7b-1608-c2ac12fa9521.png)


Anomaly（異常値検査ノード）を右クリックしてRunします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/f3914291-f395-62f3-0770-b9fc58a4b0e0.png)


C9. 結果の確認

Runしてできたモデルを右クリックし、View Dataで結果を確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/35fc399e-f13f-7620-8aa3-609c74dd2373.png)

スプレッドシートで右のほうの列の\$O-AnomalyIndexを2回クリックし、降順に並べます。
\$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/9cc287cb-0925-6f04-5e5b-d5371f4e7702.png)

Chartを開き、Scatter（散布図）を選択し、Settingタブで
X軸にPOWER_5AVG_Mean,Y軸にPOWER_DIFF_MEAN,Color Mapに\$O-Anomalyを設定し、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/cd5fe8b9-4730-e955-ff46-50b25ffe78cf.png)

PreferencesでChartThemesをibm_blueに設定します。
確かに3点が他の点から離れている様子がわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/c15af830-9ed0-9e23-72f1-9bca7f95655f.png)


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