欠損値処理 けっそんちしょり
欠損値補完欠損値処理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))