欠損データの検出と処理(削除、補完)
欠損データとは、データセット内で値が入力されていない部分のことです。機械学習では、欠損値をそのままにしておくと、モデルの学習時にエラーが発生したり、予測精度が低下したりすることがあります。
そのため、データ分析や機械学習を行う前に、欠損データを検出し、削除または補完によって適切に処理することが重要です。
欠損データの検出と処理を図で理解する

欠損データとは
欠損データは、何らかの理由で値が存在しないデータです。アンケートの未回答、入力ミス、測定エラー、システム上の記録漏れなどによって発生します。
- 値が空欄になっている
NaNとして扱われている- 一部の列だけ値が存在しない
- データ収集時に記録されなかった
欠損データの検出
欠損データを処理するには、まずどの列や行に欠損があるかを確認します。Pythonでは、pandasを使って簡単に欠損値を検出できます。
欠損データの検出コード
import pandas as pd
# サンプルデータの作成
data = {
'col1': [1, 2, None],
'col2': [4, None, 6],
'col3': [None, 8, 9]
}
df = pd.DataFrame(data)
# 欠損データの検出
print(df.isnull())
isnull()を使うと、欠損している部分がTrue、欠損していない部分がFalseとして表示されます。
欠損データの数を確認する
# 列ごとの欠損数を確認
print(df.isnull().sum())
このコードでは、各列に欠損値がいくつあるかを確認できます。
欠損データの主な処理方法
欠損データの処理には、大きく分けて削除と補完の2つがあります。
| 方法 | 内容 | 向いている場合 |
|---|---|---|
| 削除 | 欠損を含む行や列を取り除く | 欠損が少ない場合 |
| 補完 | 欠損部分を別の値で埋める | 欠損が多く、削除したくない場合 |
欠損データの削除
欠損値が少ない場合は、欠損を含む行や列を削除する方法が使えます。
欠損を含む行を削除する
# 欠損データを含む行を削除
df_dropped = df.dropna()
print(df_dropped)
dropna()を使うと、欠損値を含む行を削除できます。
欠損を含む列を削除する
# 欠損データを含む列を削除
df_dropped_columns = df.dropna(axis=1)
print(df_dropped_columns)
axis=1を指定すると、欠損値を含む列を削除できます。
欠損データの補完
欠損値が多い場合や、データを削除すると情報が大きく失われる場合は、欠損部分を別の値で補完します。
一定の値で補完する
# 欠損データを0で補完
df_filled = df.fillna(0)
print(df_filled)
この例では、すべての欠損値を0で補完しています。
平均値で補完する
# 各列の平均値で欠損を補完
df_filled_mean = df.fillna(df.mean(numeric_only=True))
print(df_filled_mean)
数値データでは、平均値や中央値を使って欠損値を補完することがあります。
中央値で補完する
# 各列の中央値で欠損を補完
df_filled_median = df.fillna(df.median(numeric_only=True))
print(df_filled_median)
外れ値の影響を受けにくくしたい場合は、平均値よりも中央値を使う方が適していることがあります。
前後の値で補完する
時系列データのように前後の値に意味がある場合は、直前または直後の値で補完する方法もあります。
# 前の値で補完
df_filled_ffill = df.ffill()
# 後の値で補完
df_filled_bfill = df.bfill()
ffill()は前の値で補完し、bfill()は後の値で補完します。
削除と補完の使い分け
| 状況 | 処理方法 |
|---|---|
| 欠損がごく少ない | 行の削除 |
| 特定の列に欠損が多すぎる | 列の削除を検討 |
| 数値データの一部が欠損 | 平均値・中央値で補完 |
| 時系列データ | 前後の値で補完 |
| 削除するとデータ量が大きく減る | 補完を検討 |
欠損データ処理の注意点
- 欠損が発生した理由を確認する
- 削除しすぎるとデータ量が不足する
- 平均値補完はデータのばらつきを小さくすることがある
- 時系列データでは順序を考慮して補完する
- 訓練データとテストデータで処理方法を揃える
機械学習で欠損処理が重要な理由
多くの機械学習アルゴリズムは、欠損値をそのまま扱えません。欠損値が残っていると、学習時にエラーが発生したり、モデルが正しく学習できなかったりします。
- 学習エラーを防ぐ
- データ品質を高める
- モデルの精度低下を防ぐ
- 分析結果の信頼性を高める