データと前処理

欠損値処理 けっそんちしょり

欠損値補完欠損値処理NaNデータ品質
欠損値処理について教えて

簡単に言うとこんな感じ!

データの中の「空欄」や「未入力」をどう扱うかの問題だよ。アンケートの回答漏れや、センサーが一時的に壊れて計測できなかった時間帯など、現実のデータには必ず穴がある。その穴をどう埋める(または無視する)かがこの処理なんだ!


欠損値処理とは

欠損値処理とは、データセットに含まれる欠損(NULL、NaN、空白など)を適切に扱う前処理のことです。現実世界のデータにはほぼ必ず欠損が存在し、そのまま機械学習モデルに渡すとエラーになるか、精度が大きく低下します。

欠損値の発生メカニズムを理解することが処理の出発点です。なぜ欠損しているのかによって、適切な対処法が変わります。

欠損パターン説明
MCAR(完全ランダム欠損)欠損に規則性がないセンサーのランダム故障
MAR(ランダム欠損)他の変数と関連して欠損高齢者の方がアンケート回答率が低い
MNAR(非ランダム欠損)欠損値自体に意味がある給与が高い人が給与欄を空白にする

主な対処法

削除系

手法説明使いどころ
行削除(リストワイズ)欠損を含む行をすべて削除MCARで欠損率が低い場合
列削除欠損率が高い列を削除欠損率50%以上など

補完系

手法説明特徴
定数補完0や「不明」などで埋めるシンプル、意味を持たせられる
平均値補完列の平均値で埋める数値データ向け、分散が小さくなる
中央値補完列の中央値で埋める外れ値の影響を受けにくい
最頻値補完最もよく出る値で埋めるカテゴリデータ向け
KNN補完近隣データから推定精度高め、計算コスト大
多重代入法確率的に複数パターンを生成統計的に厳密、実装が複雑
モデルベース補完他の列から予測最も高精度、工数も大

歴史と背景

  • 1970年代:統計学で欠損値の理論的研究が進む(ルービン)
  • 1987年:多重代入法(Multiple Imputation)が体系化
  • 2010年代:scikit-learnにSimpleImputerが標準搭載
  • 現在:LLMを使ったテキスト欠損の補完も研究中

Pythonでの実装例

from sklearn.impute import SimpleImputer
import pandas as pd

# 平均値で補完
imputer = SimpleImputer(strategy='mean')
df_filled = pd.DataFrame(
    imputer.fit_transform(df),
    columns=df.columns
)

# 欠損率の確認
print(df.isnull().mean().sort_values(ascending=False))

関連用語