KNNによる欠損値補完!Pythonコードで具体例も解説

KNNによる欠損値補完!Pythonコードで具体例も解説

データ分析や機械学習の前処理で避けて通れない課題の一つに、欠損値(missing values)の処理があります。本記事では、欠損値を補完するための手法の一つである「K近傍法(K-Nearest Neighbors, KNN)」について、具体例とPythonコードを交えながら解説します。

1. 欠損値補完とは?

データセットには、入力ミスや収集の制約などにより欠損値が含まれていることがあります。欠損値があるままでは多くの機械学習モデルが正常に動作しないため、欠損値を何らかの方法で補完する必要があります。

欠損値補完の方法には以下のようなものがあります:

  • 平均値や中央値で埋める
  • 特定の値(例:ゼロ)で埋める
  • 周囲のデータをもとに推定して埋める(例:KNN)

KNNによる欠損値補完は、欠損値を補完する対象のデータと似ているデータ(”近傍”)を見つけ、そのデータを基に欠損値を推定する方法です。

2. KNNによる欠損値補完の仕組み

KNNは、以下の手順で欠損値を補完します:

  1. 欠損値があるデータポイントの周囲に、”近い”データポイント(近傍)を探す。
  2. 近傍データの値を基に、欠損値を推定する。たとえば、近傍の平均値や中央値を使用することが多いです。

ここでの”近い”とは、ユークリッド距離やマンハッタン距離などの距離尺度を用いて計算されます。

例えば、以下のようなデータがあったとします:

ID年齢身長体重
12517065
230180?
32817570

体重が欠損しているID=2に対し、KNNを使って補完すると、近い”年齢”と”身長”を基に体重を推定します。

3. KNNのメリットとデメリット

メリット

  • 柔軟性が高い:データの特性に応じた補完が可能です。
  • 精度が高い:データの近傍情報を活用するため、単純な平均値補完よりも精度が向上します。

デメリット

  • 計算コストが高い:データポイントごとに近傍を探すため、大規模データでは時間がかかります。
  • 次元の呪い:特徴量が多い場合、距離計算が難しくなることがあります。

4. PythonでKNNを使った欠損値補完

Pythonでは、sklearn.impute.KNNImputerを使って簡単にKNNによる欠損値補完を実現できます。

以下に基本的なコードを示します:

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

# サンプルデータの作成
data = {
    '年齢': [25, 30, 28, np.nan, 40],
    '身長': [170, 180, 175, 165, np.nan],
    '体重': [65, np.nan, 70, 55, 75]
}
df = pd.DataFrame(data)
print("補完前のデータ:\n", df)

# KNNImputerの初期化
imputer = KNNImputer(n_neighbors=2, weights='uniform')

# 欠損値を補完
filled_data = imputer.fit_transform(df)
filled_df = pd.DataFrame(filled_data, columns=df.columns)
print("補完後のデータ:\n", filled_df)
補完前のデータ:
      年齢     身長    体重
0  25.0  170.0  65.0
1  30.0  180.0   NaN
2  28.0  175.0  70.0
3   NaN  165.0  55.0
4  40.0    NaN  75.0
補完後のデータ:
      年齢     身長    体重
0  25.0  170.0  65.0
1  30.0  180.0  67.5
2  28.0  175.0  70.0
3  26.5  165.0  55.0
4  40.0  177.5  75.0

5. 具体例:KNNで欠損値を補完する方法

ステップ1: データの確認

まず、欠損値がどこにあるかを確認します。以下はPandasを使った欠損値の確認方法です。

print(df.isnull().sum())
年齢    1
身長    1
体重    1
dtype: int64

ステップ2: KNNImputerの初期化

n_neighborsは近傍の数を指定します。一般的に3–5が推奨されます。

imputer = KNNImputer(n_neighbors=3, weights='distance')

ステップ3: 欠損値の補完

KNNImputerを用いて補完します。

filled_data = imputer.fit_transform(df)

補完後のデータを再確認し、欠損値が正しく補完されていることを確認します。

ステップ4: 補完結果の確認

print(filled_df)
  年齢     身長    体重
0  25.0  170.0  65.0
1  30.0  180.0  67.5
2  28.0  175.0  70.0
3  26.5  165.0  55.0
4  40.0  177.5  75.0

このように、KNNを使えば欠損値を手軽に補完できます。

6. まとめ

KNNによる欠損値補完は、近傍のデータを基に欠損値を推定する柔軟かつ精度の高い方法です。特に、単純な平均値補完やゼロ埋めでは対応できない場合に有効です。

Pythonのsklearn.impute.KNNImputerを使えば、実装も簡単です。本記事のPythonコードを参考に、実際のデータ分析でKNNによる欠損値補完を試してみてください。