はじめに
データ分析や機械学習の前処理において、欠損値(Missing Values) の処理は非常に重要です。欠損値を適切に処理しないと、分析結果が歪んだり、エラーが発生したりする可能性があります。本記事では、Pythonのデータ解析ライブラリであるPandasを使用して、欠損値を効果的に処理するためのテクニックを詳しく解説します。
欠損値とは?
欠損値とは、データセット内で値が存在しない部分のことを指します。Pandasでは、欠損値は通常NaN
(Not a Number)やNone
として表現されます。欠損値が存在する原因はさまざまで、データ収集時のエラーや回答の無記入などが挙げられます。
データの準備
まずは、サンプルデータを用意します。
import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [24, np.nan, 22, 23, np.nan],
'City': ['New York', 'Los Angeles', np.nan, 'Chicago', 'Houston'],
'Score': [85, 90, np.nan, 88, 92]
}
df = pd.DataFrame(data)
データフレームの表示
print(df)
出力結果
Name Age City Score
0 Alice 24.0 New York 85.0
1 Bob NaN Los Angeles 90.0
2 Charlie 22.0 NaN NaN
3 David 23.0 Chicago 88.0
4 Eve NaN Houston 92.0
欠損値の検出
4.1 欠損値の有無を確認する
df.isnull()
出力結果
Name Age City Score
0 False False False False
1 False True False False
2 False False True True
3 False False False False
4 False True False False
4.2 列ごとの欠損値の合計を確認する
df.isnull().sum()
出力結果
Name 0
Age 2
City 1
Score 1
dtype: int64
欠損値の削除
5.1 欠損値を含む行の削除
df_dropped_rows = df.dropna()
print(df_dropped_rows)
出力結果
Name Age City Score
0 Alice 24.0 New York 85.0
3 David 23.0 Chicago 88.0
5.2 欠損値を含む列の削除
df_dropped_columns = df.dropna(axis=1)
print(df_dropped_columns)
出力結果
Name
0 Alice
1 Bob
2 Charlie
3 David
4 Eve
注意点:重要な情報が失われる可能性があるため、欠損値の削除は慎重に行う必要があります。
欠損値の置換(補完)
6.1 特定の値で置換する
6.1.1 固定値で置換
df_filled = df.fillna(0)
print(df_filled)
出力結果
Name Age City Score
0 Alice 24.0 New York 85.0
1 Bob 0.0 Los Angeles 90.0
2 Charlie 22.0 0 0.0
3 David 23.0 Chicago 88.0
4 Eve 0.0 Houston 92.0
6.1.2 列ごとに異なる値で置換
df_filled_cols = df.fillna({'Age': df['Age'].mean(), 'Score': df['Score'].median()})
print(df_filled_cols)
出力結果
Name Age City Score
0 Alice 24.000000 New York 85.0
1 Bob 23.000000 Los Angeles 90.0
2 Charlie 22.000000 NaN 88.0
3 David 23.000000 Chicago 88.0
4 Eve 23.000000 Houston 92.0
6.2 前後の値で置換する
6.2.1 前の値で置換(前方埋め)
df_ffill = df.fillna(method='ffill')
print(df_ffill)
出力結果
Name Age City Score
0 Alice 24.0 New York 85.0
1 Bob 24.0 Los Angeles 90.0
2 Charlie 22.0 Los Angeles 90.0
3 David 23.0 Chicago 88.0
4 Eve 23.0 Houston 92.0
6.2.2 後の値で置換(後方埋め)
df_bfill = df.fillna(method='bfill')
print(df_bfill)
出力結果
Name Age City Score
0 Alice 24.0 New York 85.0
1 Bob 22.0 Los Angeles 90.0
2 Charlie 22.0 Chicago 88.0
3 David 23.0 Chicago 88.0
4 Eve NaN Houston 92.0
欠損値の埋め方の選択
7.1 データの性質を考慮する
- 平均値で埋める:数値データで外れ値が少ない場合。
- 中央値で埋める:外れ値の影響を抑えたい場合。
- 最頻値で埋める:カテゴリーデータに適用。
7.2 モデルを使用した補完
機械学習モデルを使用して、欠損値を予測する高度な方法もあります。
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=2)
df_numeric = df.select_dtypes(include=[np.number])
df_imputed = pd.DataFrame(imputer.fit_transform(df_numeric), columns=df_numeric.columns)
print(df_imputed)
実践的なテクニック
8.1 欠損値の可視化
欠損値の分布を視覚的に確認することで、より適切な処理方法を選択できます。
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(df.isnull(), cbar=False)
plt.show()
8.2 条件付きで欠損値を処理する
特定の条件を満たす行のみ欠損値を埋めることができます。
# 'Age'が欠損しているが、'Score'が高い人の'Age'を平均値で埋める
mean_age = df['Age'].mean()
df.loc[(df['Age'].isnull()) & (df['Score'] > 90), 'Age'] = mean_age
まとめ
欠損値の適切な処理は、データ分析の精度を大きく左右します。Pandasを使用することで、簡単かつ柔軟に欠損値を検出・処理することが可能です。
ポイントのまとめ
- 欠損値の検出:
isnull()
やsum()
を使用して欠損値の状況を把握。 - 欠損値の削除:
dropna()
で行や列を削除(ただし情報の損失に注意)。 - 欠損値の置換:
fillna()
を使用して、平均値や前後の値で埋める。 - 高度な補完:機械学習モデルを使用して欠損値を予測・補完。
関連キーワード
- Pandas
- 欠損値処理
- データクレンジング
- データ前処理
- Python
- データ分析
- fillna
- dropna
- 欠損値の可視化
- 機械学習による補完
参考リンク
ご質問・ご意見
欠損値処理に関する疑問やご意見がありましたら、お気軽にコメントやお問い合わせください。
注意事項
データの取り扱いに関する法律や規約を遵守してください。