欠損値の扱い方とは?「平均で埋める」の前に決めるべき判断基準
アンケートの回答、顧客データ、アクセスログ。実務で扱うデータには、ほぼ必ず欠損値が含まれます。多くの現場では、この欠損を平均値で埋めてから分析を先に進めます。手が早く、迷う余地もなく、ひとまず数値が揃うからです。
しかし、この「とりあえず平均で埋める」という判断は、本当に安全なのでしょうか。この記事は、欠損値の扱いにおいて、補完の手法を選ぶより前に決めるべき判断があることを、scikit-learn公式ドキュメントと、実際の研究現場での運用実態をもとに整理します。
30秒で要点
- 欠損値の対処は、大きく「削除する」か「補完する」かに分かれる。削除は基本的な戦略だが、価値のあるデータを失う代償を伴う
- 補完手法は、その列だけを使う単変量手法(平均値補完など)と、他の特徴量も使う多変量手法に分かれる。平均値補完は数ある単変量手法の1つにすぎない
- 1つの値で埋めて終わる単一代入は、埋めた値に潜む不確実性を見えなくしてしまう。複数の補完結果のばらつきを見る多重代入という考え方がある
- 欠損値の扱いを何も報告していない研究、削除だけで済ませている研究は、専門的な研究の現場でも珍しくない
| 用語 | 意味 |
|---|---|
| 単変量補完 | 欠損している列自体の非欠損値だけを使って値を推定する方法(例:平均値・中央値で埋める) |
| 多変量補完 | 他の特徴量(列)も使って、欠損している値を推定する方法 |
| 単一代入 | 欠損箇所を1つの値で埋め、以後はその値を確定値として扱う方法 |
| 多重代入 | 複数の補完済みデータセットを作り、それぞれの分析結果のばらつきから、欠損に由来する不確実性を把握する方法 |
欠損値をどう扱うか、最初の分かれ道
欠損値に直面したときの選択肢は、大きく2つに分かれます。データそのものを削除するか、値を補完するかです。
scikit-learn公式ドキュメントは、欠損を含む行や列をまるごと削除する方法を「不完全なデータセットを使う基本的な戦略」だとしつつ、こう続けています。「ただし、これには、不完全であっても価値のあるデータを失うという代償が伴う」(scikit-learn “8.4. Imputation of missing values”)。
削除は最も手軽な選択肢ですが、無条件に安全というわけではありません。欠損している行・列を削っていった結果、分析に使えるデータ量が大きく減ってしまうことがあります。特に、ある特定の条件を満たすデータだけに欠損が偏っている場合、削除によって残るデータが本来の集団を代表しなくなるおそれもあります。「削除すれば欠損問題は解決する」という発想自体が、最初の分かれ道を見落としています。
補完手法は「平均で埋める」だけではない
削除ではなく補完を選ぶ場合、次に問われるのは「どう埋めるか」です。scikit-learnは、補完のアルゴリズムを大きく単変量と多変量の2種類に分類しています。
単変量補完は、欠損している列自体の非欠損値だけを使って値を決める方法です。scikit-learnのSimpleImputerがこれにあたり、指定できる戦略には平均値(mean)・中央値(median)・最頻値(most_frequent)・固定値(constant)があります。カテゴリ変数(数値ではない項目)には最頻値か固定値が使われます。
一方、多変量補完は、他の特徴量(列)も使って欠損値を推定する方法です。scikit-learnのIterativeImputerがこれにあたり、利用可能な全特徴量の情報を使って値を推定します。
つまり、「平均で埋める」というのは、数ある補完手法のうちの単変量手法の、さらに1つの戦略にすぎません。他の列との関係をまったく考慮しない、最も単純な方法だという位置づけになります。
なお、IterativeImputerはscikit-learn 1.9.0時点で「依然として実験的(experimental)」な機能とされており、公式ドキュメントは「デフォルトのパラメータや挙動の詳細が、非推奨化の手続きを経ずに変わる可能性がある」と明記しています。使用にはfrom sklearn.experimental import enable_iterative_imputerという明示的なインポートが必要です。バージョンに依存する情報である点には注意してください。
「埋めたら終わり」ではない、という視点
補完を行うと、データセットからは「どこが欠損していたか」という情報そのものが見えなくなります。しかし、その位置情報自体が分析にとって有益な場合があります。
scikit-learnは、「補完を使う際、どの値が欠損していたかという情報を保持しておくことは、有益な場合がある」としており、MissingIndicatorという、欠損していた位置を記録する仕組みを用意しています。SimpleImputerやIterativeImputerにもadd_indicatorというオプションがあり(既定値はFalse)、これを使うと補完後のデータに欠損位置のフラグを追加できます。
たとえば、あるアンケート項目に回答しなかったこと自体が、その回答者の特徴を表している可能性があります。単に平均値で埋めてしまうと、この「回答しなかった」という情報は失われます。補完は「値を埋める」で終わる作業ではなく、「何が失われた情報で、何を残すか」を決める作業でもあります。
1つの値で埋めることの見落とされがちなコスト
もう1つ見落とされがちな論点があります。それは、欠損値を1つの値で埋めて終わりにする「単一代入」が、埋めた値の不確実性を見えなくしてしまうという点です。
統計コミュニティでは、補完済みのデータセットを複数(m個)作り、それぞれを同じ分析にかけて結果のばらつきを確認する「多重代入」という考え方が広く使われています。scikit-learnはこの利点を「欠損値に起因する固有の不確実性の結果として、分析結果がどれだけ異なりうるかを理解できること」と説明しています。
scikit-learnのIterativeImputerは、Rのmiceパッケージ(連鎖方程式による多変量データの補完手法。Stef van Buuren、Karin Groothuis-Oudshoorn両氏による論文が2011年12月12日にJournal of Statistical Software45巻3号に掲載、DOI: 10.18637/jss.v045.i03)に着想を得て設計されています。ただし、___IterativeImputer0___は既定では単一の補完結果だけを返す点が、本来の多重代入の考え方とは異なります。
1つの値で埋めてしまうと、その値がまるで「本当の値」であったかのように、以降の分析すべてが進んでいきます。埋めた値に含まれているはずの不確実性が、分析の途中で静かに消えてしまうという構造です。
なぜ「平均で埋めれば安全」だと思ってしまうのか
「平均で埋める」が実務で広く行われている背景には、欠損は無条件にランダムに起きているはずだ、という無意識の前提があります。欠損がランダムであれば、平均という「真ん中の値」で埋めても、全体の傾向を大きく歪めることはなさそうに思えるからです。
しかし、欠損が本当にランダムに起きているかどうかは、データを見ただけでは自明ではありません。特定の条件を持つ回答者ほど回答しない、特定の時期のログほど記録が抜けている、といった偏りが隠れている可能性は常にあります。「埋めれば揃う」という手軽さが、「本当にランダムな欠損なのか」という前提の検証を後回しにさせてしまう、というのがこの誤解が生まれる構造です。
なお、欠損がどのようなメカニズムで生じたかを分類する枠組み自体は存在しますが、この記事が参照した一次資料はその分類に踏み込んでおらず、本記事でも扱いません。欠損の背景にあるデータ全体の探索的な整理については、探索的データ分析(EDA)とは何かも参照してください。
専門的な研究の現場でも、この判断は軽視されている
「そうは言っても、実務では細かい理屈より速さが重要では」と感じる人もいるかもしれません。しかし、欠損値の扱いが軽視されているのは実務の現場に限った話ではありません。
機械学習を用いた臨床予測モデルに関する文献レビュー(Nijman S ほか、Journal of Clinical Epidemiology誌、2022年2月号、142巻218-229ページ、DOI: 10.1016/j.jclinepi.2021.11.023、PMID: 34798287)は、2018年から2019年に発表された152本の論文を対象に、欠損データの扱いを調査しました。その結果、欠損データについて何も報告していない論文が56本あり、処理方法を報告していた96本のうち、最も多い対処は削除(65本)で、そのうち完全ケース分析(欠損を含む行をすべて除外する方法)が43本を占めていました。多重代入を用いていたのはわずか8本、欠損のメカニズムに関する情報を報告していたのも8本にとどまっています。論文は、削除は一般に推奨されない手法であるにもかかわらず、それが最も多く使われていると結論づけています。
この調査は医療分野の機械学習予測モデル研究を対象にしたものであり、マーケティングや業務データを扱う一般のビジネス現場を調べたものではありません。そのため「一般のビジネス現場でもこの通りだ」と外挿することはできません。それでも、査読を経た専門的な研究の場ですら、欠損の扱いを深く検討せずに削除で済ませている割合が高いという事実は、実務における「とりあえず平均で埋める」という判断が特別に手抜きだというわけではなく、広く見られる傾向であることを示しています。
判断軸の提示:手法を選ぶ前に決めること
- 削除するか補完するかを、データ量への影響を踏まえて先に決める。削除によって残るデータがどれだけ減るか、欠損が特定の条件に偏っていないかを確認する
- 「平均で埋める」を既定の選択にしない。単変量・多変量、どの情報を使って推定するかを、データの性質に応じて選ぶ
- 欠損していたという情報自体を捨てるかどうかを決める。位置情報が分析に有益な場合は、補完と並行して保持する
- 1つの値で埋めて終わりにしてよいか、複数の補完結果のばらつきを確認すべきかを検討する。特に結論が重要な意思決定に使われる場合、単一代入で不確実性が見えなくなっていないかを意識する
自社でも試せる、最小の検証
自社で扱っているデータのうち、欠損値が含まれる項目を1つ選んでください。その項目が「今どう処理されているか」(削除されているのか、平均値で埋められているのか、それとも未対応のままか)を確認し、欠損している行だけを取り出して、他の項目の傾向に何らかの偏りがないかを見比べてみてください。偏りが見つかれば、それは「欠損はランダムだ」という無意識の前提を疑うきっかけになります。
この記事で扱わなかったこと
欠損が生じるメカニズムそのものを分類する枠組み、___IterativeImputer1___パッケージの連鎖方程式の具体的な手続き、KNNImputerや欠損を前処理なしで扱える推定器同士の性能比較には踏み込んでいません。扱ったのは、手法を選ぶ前に決めるべき「消すか埋めるか」「単一の値で済ませるか、不確実性を残すか」という判断の順序です。
この記事で扱ったような、自社データの前処理における判断を状況に照らして整理したい場合は、無料診断ツールで状況を言語化するところから始めることができます。
状況を整理する(15分)