pandas_欠損値

Pandasで欠損値を処理するテクニック:データクレンジングの基本

はじめに

データ分析や機械学習の前処理において、欠損値(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
  • 欠損値の可視化
  • 機械学習による補完

参考リンク


ご質問・ご意見

欠損値処理に関する疑問やご意見がありましたら、お気軽にコメントやお問い合わせください。


注意事項

データの取り扱いに関する法律や規約を遵守してください。


上部へスクロール