データ準備を行う際、欠落したデータをどう補うか、というのは常に頭を悩ませる問題です。今回はこの課題について考えてみましょう。
空白文字や0に置き換える場合
文字型のフィールドであれば、空白に変換したり、数値型のフィールドであれば0に変換する、というのも一つの解かと思います。特に数値型フィールドの場合はNullを0にする、というのはよくある話です。
この場合は、基本的にはデータクレンジングツールを使うというのが一番基本的な解答なのでしょうが、処理速度が遅い、と言われているため、処理速度の早い「CReW DataCleanse」を使うか、フォーミュラツールでIF文で対応するのが常套手段です(データ量が少ないなら普通にデータクレンジングツールでいいんじゃない?という気もします)。
データクレンジングツールを使う場合は以下のようなオプション設定で可能です(オプション一部のみ抜粋)。
Designer 2024.1以降をお使いであれば、Coalesce関数が使えます(DBを使われている方は、SQLにこの名前の関数が実装されていることが多いため、馴染み深いかもしれません)。これは、引数に指定したもののなかでNullではない値のうち最も左側にある値を採用してくれる関数です。つまり、今回のようなケースでは以下のように記載します。
Coalesce([Value], 0)
これにより、[Value]がNullなら0を採用してくれます。Nullでないなら[Value]が採用されます。
これと同じ意味のIF文は以下のようになります。Designer 2023.2以前を使っている方はこちらをご利用ください。
IF IsNull([Value]) THEN 0 ELSE [Value] ENDIF
ちなみに、フォーミュラツールであれば各フィールドに対して個別に関数を書いていく必要がありますが、複数フィールドフォーミュラなら一発で解決できます([_CurrentField_]を使って計算するのがポイントです)。
Coalesce([_CurrentField_], 0)
複数フィールドフォーミュラに関してはツールの使い方をご確認いただければと思います。
平均値や中央値で補完したい場合(数値型のみ)
統計的な値で欠落した値を補完したい場合は非常に簡単です。インピュテーションツールを使えば一発解決です!
そもそも「Imputation」ってあまり聞き慣れない英単語かと思います。調べてみると「代入」とのことで・・・カタカナそのままじゃなくてもう少しわかりやすい名前のほうがいいな、と個人的には感じます(実際にやってることで考えると、統計値代入ツールとかでしょうか・・・)。
インピュテーションツールは、平均値、中央値、最頻値もしくはユーザー指定の値で指定したフィールド全体の欠落値(Null)を置き換えることができます。ちなみに、指定した値をまるっと書き換えることもできるようです。カテゴリごとに統計値を取って補完する、みたいな機能はないのが若干マイナスポイントでしょうか・・・(そのような場合はバッチマクロでがんばるか個別にフィルタでがんばるしかないですね!)。
欠落値を統計的な値で置き換えても本当に良いかどうか、というのは十分吟味する必要がありますが、有用な方法の一つです。
なお、インピュテーションツールは数値型のフィールドにしか使えないのでご注意ください。
平均値、中央値、最頻値以外で補完するには?
インピュテーションツールは平均値、中央値、最頻値でしか補完することしかできません。基本的な用途として機械学習用のデータセットの準備を想定しているツールだからでしょうか?例えば、最低値、最高値などで穴埋めしたいこともあるかと思います。このような場合はいくつかのツールを組み合わせてロジックを作る必要があります。
基本的には、フィールド付加ツールを用いて置換したい値を持つデータを元のデータに付与し、フォーミュラツールでNullを置き換えるだけです。複数項目に一度に対応したい場合はワークフローのロジックに工夫が必要になります(データを縦持ちにして一気に処理しましょう)。
※ワークフローの詳細はサンプルワークフローをご確認ください。
前後のレコードの値を見て補完したい場合(数値型のみ)
時系列データなどでは、前後のレコードの値を見て線形補間するようなことを行いたいことも多いかと思います。このような場合は、複数行フォーミュラを使います。補完方法は利用者側で好きな計算式を書く必要があります。
例えば、前の値で埋める、前後の値の中間の値で埋める、といったことがあるかと思います。
Nullなら前の値で埋める、といった場合は以下のような数式が利用可能です。
IF IsNull([Value]) THEN
[Row-1:Value]
ELSE [Value] ENDIF
これは非常によく使うオプションかと思います(特にカテゴリ値を扱うような場合はよく使うと思います)。
前後の値の中間の値で埋める、といった場合は以下のような計算式で可能です。
IF IsNull([Value]) THEN
([Row-1:Value]+[Row+1:Value])/2
ELSE [Value] ENDIF
ただ、このケースは連続してNullになっているような場合は適用できません。例えば以下のようなケースです。Noが2,3および8,9は連続してValueがNullになっています。
そして、前後の値の中間の値で埋めるという方法で対応したい場合は、たいてい連続してNullになっているレコードが含まれているようなケースが多いかと思います。これに対応する場合はロジック的に作り込まないと対応できないのでご注意ください(難易度が途端に跳ね上がります)。ワークフローにすると以下のようになります。
さらにレコードの間隔が一定ではない場合は上のワークフローではNGなので、以下のように改良できます。
いっそのことNullデータは捨てる
そもそもNullのデータは値がわからない、ということもあるので、捨ててしまう、という結論もありかと思います。この場合は、フィルターツールで該当のレコードを取り除きましょう。
まとめ
- 値がNullの場合の様々な値の補完方法をご紹介しました
- 統計的な値で埋めたい場合はインピュテーションツールが活躍します。それ以外の場合はIF文もしくはCoalesce関数(2024.1以降)で値を置き換えます
- 補完したい値によっては値を作ってからフィールド付加ツールで追加してから補完します
- 前後の値を見ながら補完したいような場合は線形的な補完が必要になり少々ロジックを組むのが大変かもしれません
サンプルワークフローダウンロード
次回
未定です。
コメント