scikit-learnの欠損値の処理方法!平均値や中央値で補完について



1. 欠損値とは
欠損値とは、データセットにおいて欠けている値や不明な値のことを指します。データが収集される際、何らかの理由で特定の情報が取得できなかったり、エラーが発生した場合などに欠損値が生じます。データ分析や機械学習のプロセスにおいて、欠損値は次のような問題を引き起こす可能性があります。
- データの品質低下: 欠損値が多いと、データの全体的な品質が低下し、分析結果の信頼性が損なわれる可能性があります。
- モデルの性能への影響: 欠損値をそのまま放置すると、機械学習モデルの学習や予測に悪影響を及ぼす可能性があります。
- バイアスの発生: 欠損値が特定のパターンに偏っている場合、データセット全体にバイアスが生じる可能性があります。
2. 欠損値の補完
Scikit-learnでの欠損値の処理には、主にSimpleImputer
というクラスを使用します。データ分析や機械学習の前処理で欠損値を適切に処理することは、モデルの性能向上において非常に重要です。以下に、SimpleImputer
を使った基本的な欠損値処理の方法を解説します。

SimpleImputer
を使って、strategyを’mean’に設定すれば平均値で補完できる。
2.1. 平均値で欠損値を補完
欠損値をその列の平均値で補完する方法です。
from sklearn.impute import SimpleImputer
import numpy as np
import pandas as pd
# サンプルデータの作成
data = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [np.nan, 2, 3, 4]
})
# 平均値で補完するインプータの作成
imputer = SimpleImputer(strategy='mean')
# 補完の実行
data_imputed = imputer.fit_transform(data)
print(data_imputed)
このコードでは、欠損値を含むデータフレームを作成し、SimpleImputer
のstrategy
を'mean'
に設定してインスタンス化します。その後、fit_transform
メソッドを使ってデータ内の欠損値を各列の平均値で補完します。
NaNを除いたAのデータの平均は$\frac{1+2+4}{3}=\frac{7}{3}$であるので、2.3333がNaNに入ります。一方で、NaNを除いたBのデータの平均は$\frac{2+3+4}{3}=3$であるので、3がNaNに入ります。
2.2. 中央値で欠損値を補完
# 中央値で補完するインプータの作成
imputer_median = SimpleImputer(strategy='median')
# 補完の実行
data_imputed_median = imputer_median.fit_transform(data)
print(data_imputed_median)
このコードでは、strategy
を'median'
に設定することで、欠損値を各列の中央値で補完します。
NaNを除いたAのデータの中央値は2であるので、2がNaNに入ります。一方で、NaNを除いたBのデータの最頻値は3であるので、3がNaNに入ります。
2.3. 最頻値で欠損値を補完
# 最頻値で補完するインプータの作成
# サンプルデータの作成
data = pd.DataFrame({ 'A': [1,1, 2, np.nan, 4], 'B': [np.nan, 2,2, 3, 4] })
imputer_most_frequent = SimpleImputer(strategy='most_frequent')
# 補完の実行
data_imputed_most_frequent = imputer_most_frequent.fit_transform(data)
print(data_imputed_most_frequent)
このコードでは、strategy
を'most_frequent'
に設定し、データの中で最も頻繁に出現する値で欠損値を補完します。
NaNを除いたAのデータの最頻値は1であるので、1がNaNに入ります。一方で、NaNを除いたBのデータの最頻値は2であるので、2がNaNに入ります。
2.4. 特定の値で欠損値を補完

データセットの内容に応じて、特定の値(例えば0など)で欠損値を補完することも可能です。
# 特定の値(例えば0)で補完するインプータの作成
imputer_constant = SimpleImputer(strategy='constant', fill_value=0)
# 補完の実行
data_imputed_constant = imputer_constant.fit_transform(data)
print(data_imputed_constant)
ここでは、strategy
を'constant'
にし、fill_value
に0を設定することで、欠損値を0で補完しています。