更新:2024/09/17

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

はるか
はるか
欠損値ってデータセットにおいて問題。
ふゅか
ふゅか
そうね!欠損値が多いとデータの品質が低下して、分析の信頼性がなくなるわ!だから、欠損値の処理ってすごく大事なの♪

1. 欠損値とは

欠損値とは、データセットにおいて欠けている値や不明な値のことを指します。データが収集される際、何らかの理由で特定の情報が取得できなかったり、エラーが発生した場合などに欠損値が生じます。データ分析や機械学習のプロセスにおいて、欠損値は次のような問題を引き起こす可能性があります。

  1. データの品質低下: 欠損値が多いと、データの全体的な品質が低下し、分析結果の信頼性が損なわれる可能性があります。
  2. モデルの性能への影響: 欠損値をそのまま放置すると、機械学習モデルの学習や予測に悪影響を及ぼす可能性があります。
  3. バイアスの発生: 欠損値が特定のパターンに偏っている場合、データセット全体にバイアスが生じる可能性があります。

2. 欠損値の補完

Scikit-learnでの欠損値の処理には、主にSimpleImputerというクラスを使用します。データ分析や機械学習の前処理で欠損値を適切に処理することは、モデルの性能向上において非常に重要です。以下に、SimpleImputerを使った基本的な欠損値処理の方法を解説します。

はるか
はるか
その通り。Scikit-learnの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)

このコードでは、欠損値を含むデータフレームを作成し、SimpleImputerstrategy'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で補完したいならstrategyを’constant’にして、fill_valueに0を設定する。

データセットの内容に応じて、特定の値(例えば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で補完しています。

PR