欠損した日付のレコードを補間
日ごとに記録された時系列データで、ある日付のレコードが抜けていることがあります。
例えば日ごとの売上データで、ある日の売上がなかったのでレコード自体が存在しないような場合で、以下の左のデータでは2021-12-31の売上がなかったのでレコード自体が存在していません。これを右のデータのように2021-12-31で売上0のレコードを補間したいと思います。
この記事ではこのようにレコード自体が存在しない時系列データのレコードをSPSS ModelerのR拡張ノードを使って、補間していきます。
■サンプルストリーム
■テスト環境
Modeler 18.3
R 4.0.5
Windows 10 64bit
Rの連携のセットアップが必要です。
SPSS Modelerの拡張ノードでRを利用する
https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a
まず補間の範囲を決めます。ここでは「レコード集計ノード」をつかって、データの最小日付と最大日付を求めています。
次に「拡張の変換ノード」を接続し、以下の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列目のデータを開始日付、終了日付として取得しています。
startDate=modelerData[,1]
endDate=modelerData[,2]
以下のseq(startDate,endDate,by="days")でstartDateからendDateまでの日付データを生成しています。
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のデータも生成されていることがわかります。
以下のように欠損していた2021-12-31のデータが売上がNULLで補間できました。
後は「置換ノード」でNULLを0に変換するなどの補間を行えば完成です。
売上のなかった2021-12-31のレコードが補間できました。
参考情報
- Rで連続する秒などのタイムスタンプのベクトルを作る - Qiita
- Rのseq関数は日付以外にも年月日時分秒または週毎の補間も可能です。
- SPSS Modelerで欠損したタイムスタンプのレコードを補間する。取得できなかったセンサーデータの補間 - Qiita
- 欠損した「秒」の補間についての記事です。
- Modelerデータ加工Tips#03-欠損値に直前の値を代入または線形補間する | IBM ソリューション ブログ
- 今回は単純に0で補間しましたが、平均など様々な補間方法を紹介しています。