欠損値の対処方法をまとめてみた!

皆さんは欠損値のあるデータベースを見て、どれくらいの危機感を感じますか?

欠損値があると、データの利活用をしようとする時に、利用可能なデータが少なくなってしまったり、バイアスの乗った分析となる可能性があります。これは、正しい意思決定をしたり、高い予測精度を出す上で、非常に重大な問題になります。

本記事では、データサイエンティストに向けて「欠損値の実践的な対処法を理解して、バイアスの少ない解釈に繋げてほしい」ということを目的に、欠損値(欠測値)の概要から対処方法までをまとめました。

はじめに、最も大切なことを述べると、欠損値のあるデータセットと出会った時は「欠損値が生じた理由」「欠損値に対する適切な処理方法」を調査・検討することが大切です。そうすると、バイアスの少なく、より確からしい意思決定に繋がり、データの利活用に成功することでしょう。

欠損値とは?

欠損値(もしくは欠測値)とは、「取得したデータのうち、全てもしくは一部の値が欠けているもの」です。

英語では”missing values”と呼び、欠損データ / 欠測データ(missing data)も同様の意味で使うことがあります。
欠損値の例として、次のような任意回答のアンケート結果が挙げられます(NaNの部分が欠損値)。

名前年齢身長(cm)体重(kg)
Aさん1915850
Bさん22160NaN
Cさん2316260
Dさん2516665

欠損値の理解がなぜ大切か?

上記で示したアンケート結果を用いて、「身長に対する平均的な体重」を知りたいとします。そこで、欠損値のあるBさんのレコードを削除し、次のようにプロットしたとします。

import matplotlib.pyplot as plt 

height = [158, 162, 166]
weight = [50, 60, 65]

fig, ax = plt.subplots()
ax.plot(height, weight, 'o-', c='k')
ax.set_xlabel('Height (cm)')
ax.set_ylabel('Weight (kg)')

上記の図を見て、次のように考えたでしょうか?

「ふむふむ、身長が大きくなるに伴い、体重もやはり増加傾向にあるらしい。では、このデータを作って、モデルを作成しよう。」

おそらく多くの人はこう考えるでしょう。
しかし、本当にこのデータでモデルを作成していいのでしょうか?

ここで、注目すべきは、Bさんのデータです。

「Bさんのレコードは、なぜ欠損していたのでしょうか?」

一つの仮説ですが、Bさんは「体重の値が大きい」と自分では感じており、それが本人にとってコンプレックスだったため、回答しなかったかもしれません。結果的に、体重に対してコンプレックスのない人が標本として抽出される傾向のあるデータセットになってしまっているかもしれません。そのため、このデータセットを用いて作成されたモデルにはバイアスが生じ、そのモデルを用いると誤った解釈や意思決定につながるリスクがあります。

上記の仮説以外にもデータの偏りやサンプルサイズなどの他にも考慮するべき事項があります。

このように欠損が語ることの情報量が計り知れず、欠損値を理解しておくことにより、以下のようなリスクを軽減することができると考えられます。

欠損値を理解しておくことで軽減できるリスク
  1. 誤った判断につながるリスク
  2. ビジネス上の信頼を損なうリスク
  3. データ分析の困難なシステムが出来上がるリスク

また、筆者は以下のような様々な職種の方々が把握する必要があると考えます。

本記事では、データサイエンティストに向けて「欠損値の実践的な対処法を理解して、バイアスの少ない解釈に繋げてほしい」ということを目的に執筆しておりますが、データサイエンティストではない方々もぜひ最後までご一読いただければ幸いです。

欠損値を理解しておくべき「職種」と「活用事例」
  1. データサイエンティスト(分析の前処理、結果の解釈)
  2. エンジニア(欠損リスクを軽減できるDBおよびフロントの設計・実装)
  3. デザイナー(欠損リスクを軽減できるUI / UXの設計)
  4. 経営者(意思決定、データに対するリスクの理解)
  5. 営業担当者(営業資料内データ理解、提案に対する質疑応答)
  6. 経理担当者(現金過不足に対する処理)

欠損値の種類

まず欠損値の種類に関して、整理していきましょう。

「欠損値は欠損した値であって、そんな種類とかあるの🤔」と思った方も多いのではないでしょうか?

しかし、欠損値の種類を知ることは、バイアスを軽減するための秘訣なのです。

3種類の主な欠損値について次の通りです。

(1) MCAR(Missing Completely At Random)

MCARとは、欠損する確率が完全にランダムな場合を指します。

例えば、大量のデータがあった時に、機械学習の学習時間を減らすため、ランダムにレコードを欠損させた場合、MCARに当てはまります(このようなダウンサンプリングの方法は、あまり手法としてメジャーではありません。)

MCARな欠損の場合は、欠損を無視することが多いです。しかし、それ以上に現実問題ではランダムに欠損していることを証明することが難しいため、あまり登場しません。

(2) MAR(Missing At Random)

MARとは、観測されたデータで条件付けを行うと、欠損する確率が完全なランダムになる場合を指します。

例えば、営業部の人に対してはアンケート回収が完了しているが、技術部の人はまだ半分の人にしか回収をしていなかったとします。技術部という条件にしぼった時、未回収という意味での欠損があるものの、アンケート回収をランダムな順番で行っている場合、欠損確率が完全にランダムなため、MARな欠損値と捉えることができます。

営業部か技術部かによってデータの偏りが生じる可能性を考慮する必要がありますが、欠損が生じている確率はランダムなため、欠損を無視することが多いです。

(3) MNAR(Missing Not At Random)

MNARとは、欠損する確率が欠損値に依存している場合を指します。

例えば、BMI (Body Mass Index)が大きい人ほど、体重に対する回答率が低い(未回答による欠損が多い)場合は、M NARな欠損値と捉えることができます。

このような欠損と依存関係のある変数があると、その条件における値を予測することが難しくなります。そして、データセットにバイアスが高い確率で乗ります。

そのため、MNARな欠損値は絶対に無視してはいけません。

欠損値対処の流れ

それでは、欠損値の種類もわかったところで、欠損値に対する対処の流れを紹介します。
欠損値に対する対処法は次の3つのステップに分かれると考えられます。

STEP.1
システムの設計・実装

  • 「全ステークホルダー(クライアント、データサイエンティスト、デザイナー、エンジニアなど)の協力」が重要。
  • なるべく欠損リスクの軽減されたデータベースおよびUI/UXを構築することが必要。
  • 合理的配慮の必要なユーザーや開示したくない人もいるという配慮のある視点も必要。
STEP.2
データの分析

  • 欠損のあるデータに対して「適切な手法で削除や補完などの処理を実行すること」が重要。
  • 分析ツールによっては、自動的にデフォルトの処理が実行されることがある点に注意が必要。
  • そもそも渡されたデータに対してレコードの欠損(アンケートを拒否した人や何らかの理由で事前に削除している人など)があるかどうかも確認することを推奨。

STEP.3
データの解釈 / 意思決定
  • 「どのような欠損値がどれくらい存在し、それらに対して、どのような意図で、どのような処理をしたか」を把握した上で、解釈 / 意思決定をすることが重要。
  • この考慮による影響の範囲と強さも試算して、理解しておくことも重要。
  • 必要に応じて、欠損のないデータを収集する方針へ転換し、解釈や意思決定を保留することも推奨。

欠損値のあるデータの分析方法

欠損値が実際に含まれているデータセットに対する具体的な分析方法は次の3つに分類されます。

(1) サンプルを削除する方法

おそらく多くの人が最初に考える手法として、「欠損のあるサンプルを丸ごと削除してしまう方法」です。
この手法は「リストワイズ法(List-wise Deletion)」と言います。

MCARの場合は、リストワイズ法を用いても良いと考えられますが、MARの場合は、データに偏りが出る可能性があるため、推奨はできません。MNARの場合は、この手法を用いるのは不適切です。

上述した通り、欠損がランダムな確率で生じていることを示すことは難しいと考えられているため、MCARの使用は基本的に推奨できません。とはいえ、大量のデータの中のほんの一部が欠損している時(欠損によるバイアスによる影響が限りなく小さいと考えられる時)や、ビジネス上の実装コストを抑える必要がある時や、スピードを優先する必要があるときは、この手法が採用されることがあります。

(2) 欠損箇所を補完する方法

次に、欠損箇所を他のデータなどを用いて、代入する「代入法、補完法」が挙げられます。

データの欠損割合が多い場合、代入する指標に分布が引きづられるリスクがデメリットとして挙げられます。

そして、この手法はさらに、一つの指標で補完する「単一代入法(Single Imputation Method)」と複数の指標を用いて統合された値で補完する「多重代入法(Multiple Imputation Method)」に分けられます。

具体的な指標としては次のようなものがあり、データの特性に応じて、手法を選択します。

欠損箇所を補完する指標
  1. 平均値代入法
  2. 比率代入法回帰代入法
  3. 確率的回帰代入法
  4. ホットデック法

上記の指標を組み合わせた多重代入法では、実装コストはかかりますが、指標ごとのばらつきを吸収することができるというメリットがあります。一方で「なぜ、その指標を組み合わせたのか?」という理由を前向きに示すことが難しいというデメリットもあります。

アンケートデータにおけるラウンディング
アンケートデータは一般的に、リッカート尺度(「1: 悪い, 2: 少し悪い, 3: 少し良い, 4: 良い」の中から選択するような尺度)が用いられることが多いです。そして、このような離散的データに対して、上記の平均値代入法などを適応すると連続値になってしまいます。

このような時、値を離散値の尺度に丸め込み(ラウンディング)はするべきでしょうか?

一般的に、よりバイアスの少ない推定値にするためには、ラウンディングは行わず見なし間隔尺度として扱う方が良いと考えられています。しかし、機械学習などにおいて、値をカテゴリカルな変数として扱いたい場合は、ラウンディングをする必要性が出てくると考えられます。

(3) 欠損が含まれた状態で分析する方法

最後に、欠損が含まれた状態で分析する手法があります。

具体的には、「完全情報最尤推定法(Full Information Maximum Likelihood Method; FIML)」という手法があります。この手法は、統計モデルを仮定して、欠損パターンに応じた個別の尤度関数を仮定した最尤推定法です。

ここで、「MCARでは、リストワイズ法の方が楽だし、それで良いのでは?」と思ったかもしれません。しかし、リストワイズ法ではサンプルの数が減ってしまうことから検出力が下がることが懸念されます。このようなデメリットから、実装コストはかかるもののFIMLや多重代入法の方が良いと考えられています。

さらに、踏み込んだ手法として、欠損値のメカニズムを組み込んだ”Selection Model”や”Pattern Mixture Model”などもある。また、機械学習の分野では、欠損値の含まれたデータを用いた方が、決定木のアルゴリズムをベースとしたフレームワーク(LightGBM)において高い精度が出ると言うような事例もありました。

その他の欠損値対処のアプローチ

上述した欠損値に対する対処方法は、すでに取得されたデータに欠損が含まれていた場合を想定しています。

しかし、どのような手法を選択しても、欠損が存在する限り、バイアスは生じます。そのため、欠損をなくすために取り組みべきアプローチを最後に紹介します。

(1) 欠損の発生原因の調査

この工程は、上述した事後的な(Post-hocな)な欠損値処理と同じくらい重要です。

具体的には、データを読み込んだり、関係者(サービスオーナーやユーザーなど)にヒアリングしたりして、欠損が生じた仮説をたて、検証します。

もしもこの仮説を通して、欠損の原因がわかったら、欠損が生じない(もしくは欠損が生じた因子が特定できる)ようにシステムを改変しましょう。

(2) 欠損リスクの軽減されたシステム設計方法

欠損値が生じる原因は次の3つがあると考えられます。これらの要因に考慮して、システムを作成すると良いと考えられます。

欠損リスクの軽減されたシステム設計方法
  1. 必須回答の機構を作る。
  2. 質問項目がわかりやすく、同質に伝わる機構を作る。
  3. 回答の送信まで行動できる課題契約性の高い仕組みを作る。

一方で、正しいデータが収集されるための工夫も必要だと考えられます。全てのアンケート項目が必須回答で質問項目が肥大化したときに、全て真ん中の値で回答されるとデータの正確性が失われます(中心化傾向)。

(3) 観測できない欠損値

最後に、観測できない欠損値を考慮することを意識しましょう。

アンケートを取得したと時にそもそも回答してくれなかった人は、欠損値として観測が難しい場合があります。この時、欠損が生じたプロセスを「アンケートの認知、回答の決意、最後までの回答」というように分割することにより、欠損の原因特性がより理解できるようになり、データ回収に繋がる可能性が高まります。

終わりに

いかがだったでしょうか?

もしもこの記事を通して、欠損値の理解が深まり、世の中において散見される「誤った分析・解釈・意思決定」が少なくなれば筆者としては幸いです。

参考文献

【おまけ:筆者の考えていること】

QRコードジェンガ

一時期、Twitterで話題になったQRコードジェンガはご存知でしょうか?
(ちなみに、筆者はだいぶブームが過ぎた後に、先輩から教えてもらいました。)

QRコードジェンガとは、QRコードのピクセルを人ますずと順番に消していき、読み取れなくしてしまった人が負けというゲームです。このゲームは、一部のピクセルに欠損が生じても読み取ることができる仕組みを利用しています。

このゲームを通して、少し欠損値を身近に感じていただければ幸いです笑

参考 QRコードジェンガgithub.io

RAIDの分散パリティ

ここから少し真面目な余談です。

RAID(Redundant Array of Inexpensive Disks)とは、「複数台のハードディスクを組み合わせて、冗長性を向上させる技術」です。一部のRAIDでは「分散パリティ」と言って、いずれかのハードディスクが故障したときに、別のハードディスクに保存したパリティを用いて復元する機構があります。

この技術においても見方によっては、欠損値処理のように捉えることができ、手法の転用ができるのではないかと思いました。

参考 RAIDとは何か?知っておきたい基礎知識Elecom

誤り訂正

「(古典ビットにおける)誤り訂正」とは、「データを転送する際の伝送路において発生する誤りを訂正する技術」です。

この技術においても、誤ったデータが生じた時(正しいデータが欠損した時)に、正しいデータにするための対処方法であり、他の技術基盤への転用が期待できるなと考えています。

量子コンピュータにおける「量子誤り訂正」の分野では、まだまだ技術が発展途上にあることから、欠損値処理や分散パリティなどの技術から着想を得て、進歩できるのではないかと思いました。

このように、目の前の具体化された現象や手法を抽象化して、領域や技術階層の異なる視点との架け橋をかけることはイノベーションを生み出す上で重要だと考えます。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA