【Python×データ前処理】欠損値補完・クレンジングをPandas及びsklearn・SimpleImputerで実践

こんにちは、Kosei(@kay_diacc2)です!

データ分析や機械学習・AIモデル構築のために欠かせないデータクレンジング。その中でも欠損値の処理は分析・モデル精度向上という観点で非常に重要なプロセスと言えます。本記事では「Pythonを用いた欠損値データの補完方法」について解説します。

目次

欠損値の補完

欠損値の補完方法は下記の手順で実施します。

  1. データセットの準備
  2. PandasのDataFrameを構築
  3. fillna()メソッドで欠損値を補完
  4. scikit-learnのSimpleImputerクラスをもとに欠損値を補完

メインは(3)(4)であり、その点詳しく解説します。

fillna()

fillna()とは、欠損値補完のために用いられるメソッドです。

SimpleImputer

SimpleImputerとは、機械学習で用いるscikit-learnライブラリ内に準備されたクラスです。欠損値補完のために用いられます。

データセットの準備

欠損値補完を行うデータセットを準備し、PandasのDataFrameに変換します。今回はデータセットとして下記例を用います。

import pandas as pd
from io import StringIO

csv_data = \
'''
ColA,ColB,ColC,ColD
1,2,1,4
10,9,,4
2,2,5,
3,,,9
'''

df = pd.read_csv(StringIO(csv_data))
ColA ColB ColC ColD
0 1 2 1 4
1 10 9 NaN 4
2 2 2 5 NaN
3 3 NaN NaN 9

fillna()メソッドを用いた特定列の欠損値補完

中央値

fillna()メソッドを用いる際、下記のように引数を指定すると、該当列の欠損値が中央値で置換できます。

今回の例では、columnCの欠損値を中央値で置換した場合を示します。

#特定の特徴量:のNaN → 中央値変換
df["ColC"].fillna(df["ColC"].median())
ColA ColB ColC ColD
0 1 2 1 4
1 10 9 3 4
2 2 2 5 NaN
3 3 NaN 3 9

平均値

#平均値変換
df["ColC"].fillna(df["ColC"].mean())

最大・最小値

#最大値
df["ColC"].fillna(df["ColC"].max())
#最小値
df["ColC"].fillna(df["ColC"].min())

最頻値

#最頻値
df["ColC"].fillna(df["ColC"].mode())

上記引数にinplace=Trueを指定すると、欠損値補完されたオブジェクトとして更新されます。

scikit-learnのSimpleImputerクラスをもとに欠損値を補完

各列の欠損値を一括置換

Scikit-learnのSimpleImputerでインスタンスを作成し、欠損値の補完を行います。

各特徴量(列)ごとに計算された平均値で各々の欠損値を置換したい場合、下記のように記載します。

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer

#Dataframe値をarrayで読込
X = df.iloc[:,:4].values

#インスタンス生成・平均値補完
si = SimpleImputer(missing_values=np.nan, strategy='mean')

#補完
X = si.fit_transform(X)

#新規のDataFrameを生成
df1 = pd.DataFrame(X,columns=list(df.columns))
print(df1)
0 1 2 3
0 1 2 1 4
1 10 9 3 4
2 2 2 5 5.6
3 3 4.3 3 9

欠損値の補完方法の指定

欠損値補完方法を指定するには、strategy=”XXXX”部分に下記を記載します。

mean 平均値
median 中央値
most_frequent 最頻値
constant 定数(fill_valueで指定した数値or文字列)

中央値(median)

#中央値
si = SimpleImputer(missing_values=np.nan, strategy='median')
0 1 2 3
0 1 2 1 4
1 10 9 3 4
2 2 2 5 4
3 3 2 3 9

定数(constant)

欠損値をfill_valueで指定した数値または文字列で置換します。constantでの欠損値一括補完というケースほとんどないですが今回は例として示します。

#定数(fill_value)
si = SimpleImputer(missing_values=np.nan, strategy='constant',fill_value=9999)
0 1 2 3
0 1 2 1 4
1 10 9 9999 4
2 2 2 5 9999
3 3 9999 9999 9

欠損値の可視化・除去作業について

本記事をご覧いただきありがとうございました!本記事ではデータクレンジングのノウハウとして「欠損値の確認・可視化方法」および「欠損値の除去(削除)方法」についても解説しています。是非ご覧ください!

データクレンジング:欠損値の確認・可視化方法

データクレンジング:欠損値の除去方法

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる