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つの原因があります。
- データの入力ミス
- 例: ユーザーが年齢を入力し忘れた
- 収集時の問題
- 例: センサーの故障、APIのデータ欠落
- 条件付きでデータがない
- 例: 特定の質問に「回答しなかった」場合(アンケート調査)
➡ 欠損の原因を理解することで、適切な補完方法を選択できる!
📌 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, (^^ゞ