欠損値の処理
#データの理解と前処理
欠損値とは
テーブルデータ(構造化データ)で、データがないことをデータの欠損という
欠損している値を欠損値とよぶことが多く、データ分析の前にこれに対処する必要がある
たとえば以下はIrisデータに欠損値があった場合。2件目・4件目のレコードは欠損値が存在する
https://gyazo.com/bf940e3e3d22e3b38d2939f58326debe
そもそも欠損値が生まれる理由は?
値が存在し得ない場合
値が「なんらかの人数の平均値」であるときに、0人の場合はそもそも平均値が存在しない、など
何らかの意図があって欠損している場合
データを計測していない時刻のものである、など
値を取得・計測するのに失敗した場合
人為的ミスや観測機器のエラーで、本来値があるのに欠損している、など
欠損値はどう扱うか
値を埋める
欠損値以外の値の代表値(平均値、中央値、最頻値など)で埋める
数値変数の場合は平均値・中央値などが使える(分布をみて決めたりする)
カテゴリ変数の場合は最頻値などで埋めたりする
ある一定の値(ゼロなど)で埋める
他の変数から予測して埋める
(欠損値の扱いは奥深い。関心のある人は 欠測データ処理 - 共立出版 など参照)
欠損値を含むデータを削除する
基本的に、データを削除すると情報が減るので、あまり望ましくはない
欠損値のまま取り扱う
欠損値があって動作するモデル(決定木系のモデルなど)もある
「欠損値があるかどうか」を表す新しい変数を用意する、というテクニックもある
「欠損値がある」ということ自体が有益な情報になる場合がある
欠損値の確認
pandasデータフレームではDataFrame.isnull()を使うなど
isnull()だと各要素が欠損値(nan)かどうかをTrue/Falseで表示
isnull().sum()で列(特徴量)ごとに欠損値の数を表示
欠損値がデータ上でどのように表現されているかに注意する
isnull()で判断できるのは、欠損値がnan(not a number, 非数)として扱われている場合のみ
データフレームを表示させると、「NaN」と表示される
場合によっては、欠損値を「-1」や「9999」などの数値として置いていたり、「-」「?」などの文字(文字列)で格納していたりする
その場合は、一旦これらの「欠損値を表す値」をnanに置き換える操作が必要
replace()を用いて、np.nanに置き換える
pandasのread_csvで読み込むときに欠損値となる文字列を指定して、最初からnanとして読み込むこともできる
scikit-learnのSimpleImputerクラスなどを使って、欠損値を表す文字列を指定して直接置き換えることもできる