Shikata Ga Nai

Private? There is no such things.

22. 欠損データをうまく補完するテクニック

Hello there, ('ω')ノ

📌 1. 欠損データとは? なぜ発生するのか?

✅ 欠損データ(Missing Data)とは?

データの一部が抜け落ちている状態を 「欠損データ」 といいます。
例えば、以下のようなデータで Age 列に欠損値があるとします。

ID Name Age Salary
1 Alice 25 50000
2 Bob NaN 55000
3 Carol 30 NaN
4 David 40 60000

データの一部が「NaN(Not a Number)」や「null」になっている!


✅ 欠損データが発生する原因

📌 欠損データはなぜ発生するのか?
主に以下の3つの原因があります。

  1. データの入力ミス
    • 例: ユーザーが年齢を入力し忘れた
  2. 収集時の問題
    • 例: センサーの故障、APIのデータ欠落
  3. 条件付きでデータがない
    • 例: 特定の質問に「回答しなかった」場合(アンケート調査)

欠損の原因を理解することで、適切な補完方法を選択できる!


📌 2. 欠損データの検出

✅ (1) 欠損データの確認

Python(pandas)を使って、データの欠損状況を確認してみましょう!

import pandas as pd
import japanize_matplotlib  # ← 追加(matplotlibで日本語対応)

# サンプルデータ
data = {"Name": ["Alice", "Bob", "Carol", "David"],
        "Age": [25, None, 30, 40],
        "Salary": [50000, 55000, None, 60000]}

df = pd.DataFrame(data)

# 欠損データの数を確認
print(df.isnull().sum())

# データの欠損状況を可視化
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(6,4))
sns.heatmap(df.isnull(), cmap="viridis", cbar=False)
plt.title("欠損データの可視化")
plt.show()

🔍 出力

Name      0
Age       1
Salary    1
dtype: int64

isnull().sum() で各列の欠損数を確認!
ヒートマップで、どの部分が欠損しているかを視覚的に把握!


📌 3. シンプルな欠損値の補完方法

✅ (1) 平均値・中央値・最頻値で補完

import pandas as pd

# ダミーデータ
data = {
    "Name": ["Alice", "Bob", "Carol", "David"],
    "Age": [25, None, 30, 40],  # BobのAgeがNaN
    "Salary": [50000, 55000, None, 60000]  # CarolのSalaryがNaN
}

df = pd.DataFrame(data)

# ✅ `inplace=True` を使わずに修正
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Salary"] = df["Salary"].fillna(df["Salary"].median())

print(df)

📌 使い分け
- 平均値(mean) → 値が正規分布に近いとき
- 中央値(median) → 外れ値が多いとき(平均値が影響を受けやすい)
- 最頻値(mode) → カテゴリデータに使う(例: 「都市」や「性別」)

シンプルな補完方法だが、多くのケースで有効!


📌 4. 機械学習を使った高度な補完テクニック

✅ (1) KNN(k近傍法)で補完

KNN(K-Nearest Neighbors)を使うと、似たデータの平均値で補完 できます。

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

# ダミーデータの作成
data = {
    "Name": ["Alice", "Bob", "Carol", "David"],
    "Age": [25, None, 30, 40],  # BobのAgeがNaN
    "Salary": [50000, 55000, None, 60000]  # CarolのSalaryがNaN
}

df = pd.DataFrame(data)

# 🔹 数値データのみを抽出
numeric_cols = df.select_dtypes(include=["number"]).columns
df_numeric = df[numeric_cols]

# 🔹 KNNによる欠損値補完
imputer = KNNImputer(n_neighbors=2)  # k=2
df_numeric_filled = pd.DataFrame(imputer.fit_transform(df_numeric), columns=numeric_cols)

# 🔹 元のデータフレームに補完済みの数値データを戻す
df[numeric_cols] = df_numeric_filled

print(df)

KNNを使うと、データのパターンを考慮して補完できる!
単純な平均値補完よりも、より精度の高い推定が可能!


✅ (2) MICE(Multiple Imputation by Chained Equations)

MICE(多重補完)は、欠損値を他の特徴量を使って予測し、補完 する手法です。

import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

# ダミーデータの作成
data = {
    "Name": ["Alice", "Bob", "Carol", "David"],
    "Age": [25, None, 30, 40],  # BobのAgeがNaN
    "Salary": [50000, 55000, None, 60000]  # CarolのSalaryがNaN
}

df = pd.DataFrame(data)

# 🔹 数値データのみを抽出
numeric_cols = df.select_dtypes(include=["number"]).columns
df_numeric = df[numeric_cols]

# 🔹 MICEによる欠損値補完
imputer = IterativeImputer(max_iter=10, random_state=42)
df_numeric_filled = pd.DataFrame(imputer.fit_transform(df_numeric), columns=numeric_cols)

# 🔹 元のデータフレームに補完済みの数値データを戻す
df[numeric_cols] = df_numeric_filled

print(df)

他の特徴量との関係を考慮し、より現実的な値を補完!
欠損データが多い場合に特に有効!


📌 5. 欠損データ補完の選び方

どの補完方法を使うべきか? データの性質によって適切な手法を選択 しましょう!

方法 適用シーン メリット デメリット
平均値補完 数値データ(分布が正規) 簡単・速い 外れ値に弱い
中央値補完 外れ値が多いデータ 外れ値の影響を受けにくい データの分布を考慮しない
最頻値補完 カテゴリデータ 意味のある値を補完 カテゴリの偏りが出る可能性
KNN補完 欠損値が少ないデータ 近いデータを元に補完 計算コストが高い
MICE補完 欠損値が多いデータ 他の特徴量を活用できる 時間がかかる

状況に応じて適切な補完方法を選ぶことが重要!


🎯 まとめ

欠損データは、データ入力ミスや収集エラーによって発生する!
isnull() や ヒートマップを使って、欠損状況を可視化!
平均値・中央値・最頻値のシンプルな補完が基本!
KNNやMICEを使うと、より高度な補完が可能!
データの特性に応じて、最適な補完手法を選ぶことが重要!

Best regards, (^^ゞ