欠損値補完とは?方法・注意点・評価設計を解説

欠損値補完とは、データ表の空欄や未観測値を、分析や機械学習で扱える値に置き換える処理です。欠損した行をすべて削除する方法もありますが、標本数が減ったり、欠損しやすい対象に偏りが生じたりします。そこで、中央値や最頻値、時系列の直前値、ほかの変数から推定した値など、データの性質に合った方法を選びます。

本記事では、欠損が生じる理由、削除と補完の使い分け、平均・中央値・最頻値・K近傍法・反復推定の違い、学習データと評価データを分ける方法、実装時のリーク対策、補完後の評価と運用監視までを整理します。補完値を作れば正解になるわけではなく、欠損そのものが持つ意味と不確実性を残したまま判断することが重要です。

欠損値補完とは?空欄を推定値に置き換える前処理

欠損値は、データベースのNULL、CSVの空文字、NaN、入力されていないアンケート回答など、値が観測されていない状態を指します。数値列だけでなく、カテゴリ列、日時列、テキストのメタデータにも発生します。欠損値補完は、この未観測状態を一定のルールで埋め、集計・可視化・モデル学習で処理できる形に整える工程です。

ただし、補完した値は実測値ではありません。たとえば年収が未回答の人に全体中央値を入れても、その人の本当の年収が中央値だったと証明できるわけではありません。補完後の値には推定誤差が含まれるため、補完方法、対象期間、対象列、補完件数を記録し、実測値と区別できるようにします。

欠損が起きる理由|補完前にデータ生成過程を確認する

完全にランダムな欠損だけとは限らない

欠損がランダムに発生しているなら、単純な代表値補完でも大きな偏りが生じにくい場合があります。しかし実務データでは、回答しにくい質問だけ未回答になる、計測器が高温時に停止する、売上が少ない店舗ほど報告を省略する、といった規則性があります。欠損率を列別・期間別・顧客属性別に集計し、欠損フラグと目的変数の関係も確認してください。

「該当なし」と「未入力」を分ける

契約していないため利用回数がないケースと、契約しているのに入力を忘れたケースは意味が違います。両方を同じNaNとして扱うと、補完値に異なる状態を混ぜることになります。業務担当者に確認して、該当なし、未測定、入力エラー、機器障害、秘匿などの状態コードを分けられるなら、元のコードを保持したうえで分析用の欠損値へ変換します。

欠損値を削除する方法と補完する方法の使い分け

欠損行を削除するリストワイズ削除は、実装が簡単で、推定値を混ぜない利点があります。一方で、欠損率が高いとデータ量が減り、欠損が偏っている場合は母集団の代表性を損ないます。特定の列だけを使う集計なら、その列が欠損している行だけを除外するペアワイズの考え方もありますが、指標ごとに分母が変わるため、レポートで明示が必要です。

補完はデータを残せる反面、分布を平らにしたり、ばらつきを過小評価したりします。削除と補完の両方で主要指標を算出し、結論が変わるかを感度分析するのが安全です。欠損率が極めて高い列は、補完方法を工夫するより、業務上の利用目的を見直して列を除外したほうが再現性を保てる場合もあります。

代表値による欠損値補完|平均・中央値・最頻値

平均値補完は外れ値と分布の歪みに注意する

平均値補完は、学習データで計算した平均を欠損セルへ入れる方法です。分布が左右対称で外れ値が少ない数値列なら、基準値として説明しやすいでしょう。しかし、売上や利用時間のように右に長い分布では、少数の大きな値に平均が引っ張られます。また欠損行がすべて同じ平均になるため、分散が小さく見えることにも注意が必要です。

中央値補完は外れ値に比較的強い

中央値補完は、観測値を並べた中央の値を利用します。住宅価格、請求額、滞在時間など外れ値が混ざりやすい列では、平均より安定した基準になることがあります。ただし、中央値も欠損値の不確実性を表すものではなく、欠損が特定のグループに集中している場合は、全体中央値ではなく学習データ内のグループ別中央値を検討します。

カテゴリ列は最頻値または専用カテゴリを使う

性別、会員区分、都道府県などのカテゴリ列は、最も多いカテゴリで埋める方法が基本です。ただし、最頻値を入れると欠損行が多数派カテゴリに偽装されます。欠損が業務上意味を持つなら「不明」「未回答」という専用カテゴリを追加し、モデルが欠損状態を区別できるようにします。カテゴリの表記ゆれを先に統一し、大小文字や全角半角の違いを残さないことも重要です。

推定モデルを使う欠損値補完|KNNと反復補完

K近傍法補完は似た行の値を利用する

K近傍法補完では、欠損している列以外の特徴量が似ている行を探し、その近傍の観測値から値を推定します。たとえば年齢、地域、利用頻度が似た顧客の購入額を参考にするイメージです。距離を計算するため、特徴量の尺度をそろえないと、単位の大きい列だけが近さを支配します。標準化や距離計算に使う列の選定を、学習データの中で行ってください。

反復補完はほかの列から順番に推定する

反復補完は、欠損のある列を目的変数とみなし、ほかの列から回帰モデルなどで予測して埋めます。1列を補完したら、その補完値を使って次の列を補完し、複数回繰り返して安定させます。列同士の関係を利用できる反面、データ量が少ない、欠損率が高い、外れ値が多い場合は推定が不安定になります。補完モデルの種類、反復回数、乱数を記録し、代表値補完との比較を行います。

欠損指標を追加して「欠損した事実」を残す

補完値だけでは、元のセルが欠損していたか分からなくなります。そこで列ごとに欠損フラグを追加し、欠損の有無を別の特徴量としてモデルへ渡す方法があります。欠損が目的変数と関係する場合に有効ですが、欠損フラグ自体が将来の情報を含まないか確認します。予測時点で取得できないフラグを学習に使うと、運用で再現できないモデルになります。

欠損値補完の実装|学習データ内で統計量を計算する

実装で最も重要なのは、平均や中央値などの補完統計量を全データから計算しないことです。先に訓練・検証・テストへ分割し、訓練データだけで補完器を適合させます。検証やテストには、訓練データから得た統計量を適用します。全データの中央値を使うと、評価データの分布を学習側へ見せるデータリークになります。

from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder

numeric_pipe = Pipeline([
    ("imputer", SimpleImputer(strategy="median", add_indicator=True)),
])
category_pipe = Pipeline([
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("encoder", OneHotEncoder(handle_unknown="ignore")),
])
preprocess = ColumnTransformer([
    ("num", numeric_pipe, numeric_columns),
    ("cat", category_pipe, category_columns),
])

上はscikit-learnのパイプラインに数値列とカテゴリ列の補完を組み込む例です。実際には、この前処理器を推定器と一緒にパイプラインへ入れ、交差検証の各学習分割で適合させます。カテゴリ列の最頻値が存在しない場合や、未知カテゴリを予測時に受け取る場合の動作もテストしてください。列名、列順、欠損を表す記号も入力契約として固定します。

補完方法の評価|人工欠損と業務指標を組み合わせる

真の値が分からない欠損を直接採点することはできません。そこで、観測済みの値の一部を隠して人工的な欠損を作り、補完値と元の値を比較する方法があります。MAEやRMSEで数値の誤差を測り、カテゴリなら正解率やF1などを使います。ただし人工欠損が実際の欠損メカニズムを再現しているとは限らないため、欠損率や属性別のパターンを変えた複数条件で評価します。

補完の誤差だけでなく、最終目的への影響も確認します。補完後に作る予測モデルの検証指標、集計値の差、意思決定の誤り、担当者が確認できる件数などを比較します。中央値補完の誤差が小さくても、顧客ランクの境界を誤るなら業務上は不適切です。モデル性能と業務指標を併記し、採用理由を説明できる状態にします。

欠損値補完の運用|分布の変化と再学習を監視する

本番では、欠損率が変化するだけでモデルの入力分布が変わります。列ごとの欠損率、欠損フラグの割合、補完後の値の分布、カテゴリの未知値件数を日次や週次で監視します。あるセンサーの停止や入力画面の変更で欠損が急増した場合、補完器を更新する前にデータ取得の原因を直すほうが効果的です。

再学習時には、補完器と予測モデルを同じバージョンで保存します。補完統計量だけを別に更新すると、過去の予測を再現できなくなる可能性があります。学習期間、除外条件、欠損率、補完戦略、評価結果を実験記録に残し、担当者が変わっても処理を追跡できるようにします。

欠損値補完まとめ|埋める前に欠損の意味と評価を決める

欠損値補完は、空欄を機械的に埋める作業ではありません。欠損の原因と業務上の意味を確認し、削除、代表値、K近傍法、反復推定、専用カテゴリなどを比較して選びます。数値列では分布と外れ値、カテゴリ列では最頻値への偏り、補完後に失われる欠損情報を考慮してください。

実装では訓練データだけで補完器を適合させ、検証・テストへ情報が漏れないパイプラインを作ります。人工欠損による誤差評価と、最終モデルや業務指標への影響を併用し、本番では欠損率と補完値の分布を監視します。補完値を実測値と同じものとして扱わず、推定であることを記録に残すことが、再現性と説明責任につながります。

よくある質問(FAQ)

Q. 欠損値補完とは何ですか?

欠損値補完とは、未観測の空欄を平均、中央値、最頻値、推定モデルなどで置き換え、分析や機械学習で扱える形にする処理です。補完値は実測値ではないため、方法と件数を記録します。

Q. 平均値と中央値はどちらを使うべきですか?

外れ値が少なく分布が対称なら平均値、外れ値や歪みがあるなら中央値を出発点にします。最終的には人工欠損の誤差と、補完後の業務指標を比較して決めます。

Q. 欠損値補完でデータリークを防ぐには?

訓練データだけで平均や中央値などの統計量を計算し、検証・テストにはその統計量を適用します。前処理器をモデルのパイプラインに含めると、分割ごとの適合を管理しやすくなります。

Q. 欠損フラグは追加したほうがよいですか?

欠損した事実に予測上の意味がある場合は、欠損フラグを追加すると情報を残せます。ただし予測時点で取得できない情報をフラグに含めないこと、フラグ追加の有無を検証データで比較することが必要です。

Q. 欠損行を削除してはいけませんか?

欠損率が低く、欠損が結果に偏っていないなら削除が適切な場合もあります。欠損率や属性別の偏りを確認し、削除と補完の両方で結論が変わらないか感度分析を行って判断します。

参考資料