SPSS Modelerで欠損した日付のレコードを補間する。売上がない日のデータ補間

# 欠損した日付のレコードを補間

日ごとに記録された時系列データで、ある日付のレコードが抜けていることがあります。
例えば日ごとの売上データで、ある日の売上がなかったのでレコード自体が存在しないような場合で、以下の左のデータでは2021-12-31の売上がなかったのでレコード自体が存在していません。これを右のデータのように2021-12-31で売上0のレコードを補間したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7a0c1f3e-312f-b97c-3d97-5a2fec382784.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/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.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/156e094d-21b0-6b7b-5a31-8fbf19691865.png)

以下のようなデータが返ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/55b8e722-ded9-bee6-fb34-851ef3d38298.png)


次に「拡張の変換ノード」を接続し、以下のRスクリプトを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/07b3cf64-a4e1-e23a-cbaa-23bcb7aeb286.png)

```r:日付レコード補間.r
startDate=modelerData[,1]
endDate=modelerData[,2]
modelerData<-cbind(data.frame(seq(startDate,endDate,by="days")))

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

少し解説をします。
以下で、Modelerの1列目と2列目のデータを開始日付、終了日付として取得しています。
```r:
startDate=modelerData[,1]
endDate=modelerData[,2]
```
以下のseq(startDate,endDate,by="days")でstartDateからendDateまでの日付データを生成しています。
```r:
modelerData<-cbind(data.frame(seq(startDate,endDate,by="days")))
```

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/80670472-4b84-7591-09dd-e3ac9bc5bf6c.png)

これを元データと外部結合します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7138bf5e-61ac-b42f-c3d6-4484dc2cceb4.png)

以下のように欠損していた2021-12-31のデータが売上がNULLで補間できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6595ac2c-bfa3-8624-f999-cf4a0c3e41d1.png)

後は「置換ノード」でNULLを0に変換するなどの補間を行えば完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bd6595fe-4ac1-2837-dd08-120190caafc7.png)

売上のなかった2021-12-31のレコードが補間できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/75bf1343-2910-b1af-0e62-ddefa69ca9f5.png)

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

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

* SPSS Modelerで欠損したタイムスタンプのレコードを補間する。取得できなかったセンサーデータの補間 -　Qiita 
    * 欠損した「秒」の補間についての記事です。 

https://qiita.com/kawada2017/items/be56ae15ded415253faa

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

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