Pythonで欠損値を埋め込む方法|平均値、中央値、KNNの3つの方法を解説

スポンサーリンク

今回は、Pythonで欠損データの値をImputeするための3つの重要なテクニックに焦点を当てます。

それでは、始めましょう。


スポンサーリンク

なぜデータの欠損値をインプットする必要があるのか?

インピュテーションを進める前に、欠損値とは何かを理解しておきましょう。

つまり、欠損値とは、調査やデータ収集の際に何らかのデータの欠損があったために、データセットの中で欠損していると思われる部分や、NULL値である部分を指します。

機械学習モデルにおいて欠損値を持つことは、以下の理由から非常に非効率的で危険であると考えられています。

  • 機械学習モデルの効率を低下させる。
  • データ値の全体的な分布に影響を与える。
  • MLモデルの推定に偏った効果につながる。

このようなときに,インピュテーションが登場する.

インピュテーションとは,データセット全体の欠損値やヌル値を特定の値で置き換えることを意味する.

インピュテーションは,以下の手法のいずれかを用いて行うことができる.

  • 平均値によるインピュテーション
  • 中央値によるインピュテーション
  • Knn Imputation

次のセクションでは、それぞれの手法を理解し、実装してみましょう。

1. MEANによる欠損値のインピュテーション

欠損値は、その特定の特徴/データ変数の平均値で埋め合わせることができる。

つまり、ヌル値や欠損値は、その特定のデータ列やデータセットのデータ値の平均値で置き換えることができます。

以下のデータセットを見てみましょう。

#Load libraries
import os
import pandas as pd
import numpy as np

上のデータセットにはNULL値が含まれていることがわかる。

そこで、その特徴量の平均値を用いてNULL値を代入してみましょう。

必要なライブラリのインポート

ここでは、まず、必要なデータセットを作業環境にロードします。

marketing_train = pd.read_csv("C:/marketing_tr.csv")

pandas.read_csv()関数を使用して、データセットを環境にロードします。

marketing_train.isnull().sum()

データベース内の欠損値を確認する

欠損値を埋め込む前に、以下のように isnull() 関数 を用いて欠損値の有無を確認する必要があります。

custAge       1804
profession       0
marital          0
responded        0
dtype: int64

上記のコードを実行した後、以下のように欠損値の数が出力されます。

missing_col = ['custAge']
#Technique 1: Using mean to impute the missing values
for i in missing_col:
 marketing_train.loc[marketing_train.loc[:,i].isnull(),i]=marketing_train.loc[:,i].mean()

明らかに見られるように、データ変数 ‘custAge’ は 7414 レコードのうち 1804 個の欠損値を含んでいます。

すべてのNULL値に対してmean()メソッドを使用する

さらに、mean() 関数` を使用して、カラム ‘custAge’ の平均値ですべての NULL 値をインプットしています。

marketing_train.isnull().sum()

変更内容を確認する

平均値による置換を行った後、すべての値が置換されたかどうかを確認してみましょう。

custAge       0
profession    0
marital       0
responded     0
dtype: int64

以下のように、すべての欠損値がインプットされ、欠損値がなくなったことがわかります。

#Load libraries
import os
import pandas as pd
import numpy as np
 
marketing_train = pd.read_csv("C:/marketing_tr.csv")
print("count of NULL values before imputation
"
)
marketing_train.isnull().sum()
 
missing_col = ['custAge']
 
#Technique 2: Using median to impute the missing values
for i in missing_col:
 marketing_train.loc[marketing_train.loc[:,i].isnull(),i]=marketing_train.loc[:,i].median()
 
print("count of NULL values after imputation
"
)
marketing_train.isnull().sum()

2. 中央値によるインピュテーション

この手法では,データ値またはデータセットの中央値を用いて欠損値をインプットする.

以下の例で理解しよう。

例えば、以下の様になります。

count of NULL values before imputation
custAge       1804
profession       0
marital          0
responded        0
dtype: int64
count of NULL values after imputation
custAge          0
profession       0
marital          0
responded        0
dtype: int64

ここでは、median() 関数 を用いて、中央値を用いて欠損値をインプットしている。

結果は以下の通りです。

#Load libraries
import os
import pandas as pd
import numpy as np
marketing_train = pd.read_csv("C:/marketing_tr.csv")
print("count of NULL values before imputation
"
)
marketing_train.isnull().sum()

3. KNNインピュテーション

この手法では、KNNアルゴリズム(K-nearest-neighbour アルゴリズム)に基づいて欠損値をインプットします。

このアルゴリズムでは、欠損値は最近傍の推定値で置き換えられる。

以下の例で実装を理解しよう。

KNNインピュテーション:

count of NULL values before imputation
custAge       1804
profession       0
marital          0
responded        0
dtype: int64

ここで、欠損値の数を表す。

lis = []
for i in range(0, marketing_train.shape[1]):
     
    if(marketing_train.iloc[:,i].dtypes == 'object'):
        marketing_train.iloc[:,i] = pd.Categorical(marketing_train.iloc[:,i])
        #print(marketing_train[[i]])
        marketing_train.iloc[:,i] = marketing_train.iloc[:,i].cat.codes
        marketing_train.iloc[:,i] = marketing_train.iloc[:,i].astype('object')
         
        lis.append(marketing_train.columns[i])
        

以下のコードでは、データ変数のデータ型を、カテゴリカルコードを割り当てたオブジェクト型に変換しています。

#Apply KNN imputation algorithm
marketing_train = pd.DataFrame(KNN(k = 3).fit_transform(marketing_train), columns = marketing_train.columns)

KNN() 関数は、可能な限り最近傍の値を使用して欠損値をインプットするために使用されます。

Imputing row 1/7414 with 0 missing, elapsed time: 13.293
Imputing row 101/7414 with 1 missing, elapsed time: 13.311
Imputing row 201/7414 with 0 missing, elapsed time: 13.319
Imputing row 301/7414 with 0 missing, elapsed time: 13.319
Imputing row 401/7414 with 0 missing, elapsed time: 13.329
.
.
.
.
.
Imputing row 7101/7414 with 1 missing, elapsed time: 13.610
Imputing row 7201/7414 with 0 missing, elapsed time: 13.610
Imputing row 7301/7414 with 0 missing, elapsed time: 13.618
Imputing row 7401/7414 with 0 missing, elapsed time: 13.618

インピュテーションの出力

print("count of NULL values after imputation
"
)
marketing_train.isnull().sum()
count of NULL values before imputation
custAge          0
profession       0
marital          0
responded        0
dtype: int64

結果は以下の通りです。

Dataset For Imputation
Dataset For Imputation

まとめ

ここまでで、このトピックは終わりです。

この記事では、3種類のインピュテーションのテクニックを実装しました。

もし何か疑問があれば、お気軽にコメントください。

Pythonに関するこのような投稿は、Python with AskPythonとKeep Learningにご期待ください。

タイトルとURLをコピーしました