Python / 機械学習初心者です。
データ分析をしようと意気込んだ結果、欠損値の確認を怠ったことでつかえてしまったので反省としてメモを残します。
結論
- データ分析に入る前に、欠損値の有無の確認を行うべきである
- 欠損値が見られる場合は、欠損値以外のデータを上書きするか、欠損値が含まれる行を除外して分析をするなど、何らかの対策をとるべきである
起こったこと
- Kaggleというデータ分析コンテストに参加した際、すべて目視で確認することができない量のデータを分析した
- その際、欠損値(NaN)の存在に気づかず、プログラムが大量のNaNだらけになってしまい、エラーが止まらなかった
欠損値とは
- Not a Number / NaN
- 計算の処理結果が表せない場合の特殊表現
- 詳細を追おうとすると大変にディープな勉強が必要そうなので、本稿ではふれません
- 他の数との演算結果をNaNで返す性質があるため、プログラム内に1つでもNaNが含まれると、計算結果が正しく求められなくなる可能性がある
-
1 + NaN
の演算結果はNaN
である
-
対策 - データ分析開始時のすすめ
- ①まず、何よりも最初に、データの欠損値の有無を確認する
-
isnull().any()
を活用する- データフレームにおいて、欠損値が含まれる列を教えてくれる
- 下記の用にdf_exampleに対して欠損値を確認すると、人口やGDPについては欠損値の存在をTrueで確認できる(北朝鮮の人口が正確にわからないのかな、などと想像も出来る)
#例:countries.csvに各国の基礎統計データが入っているとする
import pandas as pd
df_example = pd.read_csv("hogehoge/example.csv").copy()
print(df_example.isnull().any())
#例
Id False
Name False
Population True
GDP True
Region False
life_expct False
- ②欠損値の存在が確認された列において置換作業を行う
- 列全体がNaNで構成される場合の別の削除方法や、欠損値の置換ではなく行自体の削除を行う場合の処理は割愛します。
# 欠損値存在列が判明したところで
df_example.loc[df_example['Population'].isnull(), 'Population'] = 0
注意
- この場合、置換する先の値が適切なものかどうか、後の計算で何を留意するべきか、注意されたい。
- 例えば、上記のように人口を0と置換した場合、2パターンありえるだろう:
- 「このデータは人口の多い国TOP30とその特徴を算出するためにのみ分析するからこれで問題がない」
- 「このデータからは平均人口を割り出す分析をするから、その際は『人口の値が0でない国』のみを計算対象にして、分母分子の値に不備の無いようにしよう」
まとめ
- データを与えられたら、それにとびついていきなり分析をはじめるのではなく、欠損値の確認から行うことが大切。
参考
(以上)
補言
- 筆者はディープラーニングの入力層に欠損値がまぎれこんでしまったために、後の分析が全く有用でなくなるという経験をし、本稿を書くに至りました。
- 欠損値の確認以外にも、ヒストグラムを描いて外れ値を探すなど、分析前の確認工程・データクレンジングの工程は多々あるかと思います。本稿では2020/03/24時点では言及を控えましたが、それらについても調べたうえでいずれ追記したいと考えています。