概要
データ分析はデータクレンジングに8割の時間を要すると言われます。欠損値の扱いはデータ分析を行う上で重要なファーストステップとなります。
欠損値とは、何らかの理由でデータの一部が抜け落ちている状態です。欠損値があると予測モデル作成時に欠損値が影響してうまく学習できないなどの不都合が発生する可能性があります。
ここでは、padasにおける欠損値の確認方法、欠損値を含むデータの削除方法、欠損値の補完方法の基礎を紹介します。
欠損値の確認
まずは欠損値を含むデータの確認方法について確認します。欠損値を確認するにはisnull()
を利用します。isnull()
ではDataFrameの要素で値が欠損していればTrue、欠損していなければFalseを返します。
df = pd.DataFrame({
'id': [1, 2, 3, 4, 5, 6 ,7],
'name': ['taro', 'takuya', 'erika', 'hanako', 'jiro', 'goro', 'rika'],
'age': [20, 25, 18, 25, 25, 18, 19],
'sex': ['male', 'male', 'female', 'female', 'male', None, 'female'],
'height': [170, 180, 160, 165, 190, 172, None]
})
df.isnull()
# id name age sex height
# 0 False False False False False
# 1 False False False False False
# 2 False False False False False
# 3 False False False False False
# 4 False False False False False
# 5 False False False True False
# 6 False False False False True
欠損値の件数を集計
列ごとの欠損値の件数を集計するにはisunull
とsum()
を利用します。
df.isnull().sum()
# id 0
# name 0
# age 0
# sex 1
# height 1
# dtype: int64
欠損値を含むレコードを削除
欠損値を持つレコードを削除するにはdropna()
を利用します。以下の例では欠損値を含む6行目と7行目が削除されます。
df.dropna()
# id name age sex height
# 0 1 taro 20 male 170.0
# 1 2 takuya 25 male 180.0
# 2 3 erika 18 female 160.0
# 3 4 hanako 25 female 165.0
# 4 5 jiro 25 male 190.0
欠損値を含むレコードのみ抽出
続いて、欠損値を持つ列が一つでもあるレコードを抽出します。先を行うにはisnull()
とany()
を利用します。まずは欠損値を含むレコードを判定する処理を見てみましょう。
df.isnull().any(axis=1)
# 0 False
# 1 False
# 2 False
# 3 False
# 4 False
# 5 True
# 6 True
上記を実行すると欠損値を持つ列が一つでもあるレコードがTrueとなっております。今回の例では、6行目と7行目がTrueとなっております。
続いて上記の結果を条件にDataFrameから欠損値を持つ列が一つでもあるレコードを抽出します。
df[df.isnull().any(axis=1)]
# id name age sex height
# 5 6 goro 18 None 172.0
# 6 7 rika 19 female NaN
欠損値の補完
欠損値の補完するもっとも簡単な方法はfillna()
を利用することです。
まずは共通の値で一律に値を補完する方法を紹介します。以下の例では6行目と7行目の欠損値が0
で補完されます。
df.fillna(0)
# id name age sex height
# 0 1 taro 20 male 170.0
# 1 2 takuya 25 male 180.0
# 2 3 erika 18 female 160.0
# 3 4 hanako 25 female 165.0
# 4 5 jiro 25 male 190.0
# 5 6 goro 18 0 172.0
# 6 7 rika 19 female 0.
続いて、列ごとに欠損値の値を指定して補完する方法を紹介します。以下の例ではsexの欠損値にmale、heightの欠損値に0を指定して補完をおこないます。fillna()
の引数にはdictionary型で列名と値を渡します。
df.fillna({'sex': 'male', 'height': '0'})
# id name age sex height
# 0 1 taro 20 male 170
# 1 2 takuya 25 male 180
# 2 3 erika 18 female 160
# 3 4 hanako 25 female 165
# 4 5 jiro 25 male 190
# 5 6 goro 18 male 172
# 6 7 rika 19 female 0
まとめ
今回は、pandasにおける欠損値の確認、削除、補完について基礎的な方法をご紹介しました。データ分析はデータクレンジングに8割の時間を要すると言われており、欠損値の扱いは非常に重要となります。データの特性に応じて、欠損値を含むレコードを削除したり、最大値、最小値、平均値などで補完するなど様々な対応が考えられます。欠損値の扱いについてはしっかり慣れるようにしましょう。