SPSS Modelerで欠損したタイムスタンプのレコードを補間する。取得できなかったセンサーデータの補間

# 欠損したタイムスタンプのレコードを補間

秒ごとに記録された時系列データで、ある秒のレコードが抜けていることがあります。
例えば毎秒の温度センサーデータで、ある秒のセンサーが取得できなかったのでレコード自体が存在しないような場合で、以下の左のデータでは2021-12-31 23:59:59のセンサー情報が取得できなかったのでレコード自体が存在していません。これを右のデータのように2021-12-31 23:59:59で前後のデータから温度を線形補間したレコードを補間したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b5cf0e89-05b0-70f3-35c4-21fd79dcce88.png)


この記事ではこのようにレコード自体が存在しない時系列データのレコードをSPSS ModelerのR拡張ノードを使って、補間していきます。

■サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/220427%E6%97%A5%E4%BB%98%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%A3%9C%E9%96%93/220427TS%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%A3%9C%E9%96%93.str

■テスト環境
Modeler 18.3
R 4.0.5
Windows 10 64bit

Rの連携のセットアップが必要です。
SPSS Modelerの拡張ノードでRを利用する
https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a

まず補間の範囲を決めます。ここでは「レコード集計ノード」をつかって、データの最小タイムスタンプと最大タイムスタンプを求めています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3b191e2a-aa1e-2639-6f96-a6d67f995d66.png)


以下のようなデータが返ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/24345af4-513c-cbee-8963-0f758099ce5a.png)



次に「拡張の変換ノード」を接続し、以下のRスクリプトを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c02788c1-79f5-6859-3e4d-9fc74df6f27d.png)


```r:タイムスタンプレコード補間.r
startTS=modelerData[,1]
endTS=modelerData[,2]
modelerData<-cbind(data.frame(seq(startTS,endTS,by="sec")))

#メタデータ設定
modelerDataModel<-data.frame(X1=c(fieldName='TS',fieldLabel="",fieldStorage="timestamp",fieldMeasure="",fieldFormat="",fieldRole=""))
```

少し解説をします。
以下で、Modelerの1列目と2列目のデータを開始タイムスタンプ、終了タイムスタンプとして取得しています。
```r:
startTS=modelerData[,1]
endTS=modelerData[,2]
```
以下のseq(startTS,endTS,by="sec")でstartTSからendTSまでの秒ごとのタイムスタンプデータを生成しています。
```r:
modelerData<-cbind(data.frame(seq(startTS,endTS,by="sec")))
```

最後にModelerに戻すデータの列名やデータ型を指定しています。
```
#メタデータ設定
modelerDataModel<-modelerDataModel<-data.frame(X1=c(fieldName='TS',fieldLabel="",fieldStorage="timestamp",fieldMeasure="",fieldFormat="",fieldRole=""))
```

プレビューすると開始タイムスタンプと終了タイムスタンプの間のタイムスタンプデータが生成されていて、元データでは欠損していた2021-12-31 23:59:59のデータも生成されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/add6c91c-029e-8854-3c4a-bddc5f072c29.png)


これを元データと外部結合します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d5c55ca9-b5ed-2ddc-ce7e-043ea618a945.png)


以下のように欠損していた2021-12-31 23:59:59のデータが売上がNULLで補間できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/62f2fb18-a064-566b-a7e7-6dfdb5ae4902.png)


後は「ストリーミング時系列ノード」で線形補間を行えば完成です。「ストリーミング時系列ノード」についての詳しい情報は[参考情報](https://qiita.com/kawada2017/items/be56ae15ded415253faa#%E5%8F%82%E8%80%83%E6%83%85%E5%A0%B1)を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8ecbef4c-a5fa-5a59-ff5b-32b58600faa7.png)

センサーデータが存在しなかった2021-12-31 23:59:59のレコードが補間できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/81b8b225-d14c-8a86-52d7-46a81b9bf718.png)

# 参考情報
* Rで連続する秒などのタイムスタンプのベクトルを作る - Qiita 
    * Rのseq関数はタイムスタンプ以外にも年月日時分秒または週毎の補間も可能です。

https://qiita.com/kawada2017/items/23e9270331714fe04b07

* SPSS Modelerで欠損した日付のレコードを補間する。売上がない日のデータ補間 - Qiita 
    * 欠損した日付の補間についての記事です。

https://qiita.com/kawada2017/items/31fcc2e59277ac33c4e7

* Modelerデータ加工Tips#03-欠損値に直前の値を代入または線形補間する | IBM ソリューション ブログ 
    * 今回は線形補間しましたが、平均など様々な補間方法を紹介しています。

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-03/

* SPSS Modeler ノードリファレンス 2-10 ストリーミング時系列分析 - Qiita 
    * ストリーミング時系列の使い方です。

https://qiita.com/416nishimaki/items/11d1581bef7fff2a9ede