EnsekiTT Blog

EnsekiTTが書くブログです。

Python+Pandasでリストワイズ削除とペアワイズ削除で欠損値に対処する話。

こんにちは、えんせきです。
最近目が痒くて仕方ありません。寒いらしいですが、雨が待ち遠しいです。
流石に週末に病院へ行って対処を考えることにしました。

つまりなにしたの?

リストワイズ削除とペアワイズ削除は最近は手軽ながらも機械学習だとあんまり使わない気がする欠損値に対する対処をPythonでやってみた。
f:id:ensekitt:20180308224738j:plain

リストワイズ削除とは

リストワイズ削除では、指定された変数の少なくとも1つに欠損値がある場合、ケースは分析から除外される。
分析は、完全なデータセットを持つケースでのみ実行される。リストワイズはべらぼうにデータ量が多かったり欠損が少ない時はサクッとできるので便利。

ペアワイズ削除とは

ペアワイズ削除では、統計処理(相関とか)に欠落しているデータを含むケースを使用する場合に使う。例えば、各データに本来3つの変数があって、各A,B,Cとすると、
A,Bだけで計算可能な統計処理については、Cが欠損していても実行する。逆に、B,Cが必要な統計処理についてはCが欠損していたら出来ないから削除する。
今の例だと、A,Bの処理の方がより多くの情報を元に計算が行われていて、B,Cの処理はCの欠損によってより少ない情報で計算が行われている。

実際にやってみる

データセットは適当に作ったこちら

columns = ['Name', 'English', 'Mathematics', 'Japanese']
data_list = [['kawasaki', 71, 84, 81 ],
             ['fujisawa', 70, 77, 73 ],
             ['kikukawa', 60, 68, 56 ],
             ['kanaya', np.NaN, 89, 72],
             ['takatsuka', 18, 93, 87 ],
             ['totsuka', 56, 73, np.NaN],
             ['okazaki', 86, 71, 94],
             ['ogaki', 99, 74, np.NaN],
             ['mishima', 79, 71, 86],
             ['oofuna', 50, 62, 53],
             ['oiso', 40, 71, 37],
             ['ninomiya', 68, 53, 49],
             ['hayakawa', 83, np.NaN, 39],
             ['toyohashi', 72, 15, 88],
            ]

tokai_class = pd.DataFrame(data_list, columns=columns)
tokai_class

リストワイズ削除の適用

tokai_class.dropna()[f:id:ensekitt:20180308224057p:plain]

f:id:ensekitt:20180308224121p:plain
NaNの含まれていた、Kanaya, Totsuka, Ogaki, Hayakawaのデータが消えた。

ペアワイズ削除の適用

ここではEnglishとMathematicsに着目した処理を行うことにしてみる

tokai_class[tokai_class.English.notna() & tokai_class.Mathematics.notna()]

f:id:ensekitt:20180308224142p:plain
EnglishとMathematicsにNaNのあるKanayaとHayakawaが削除され、TotsukaとOgakiのデータは引き続き使える。

特徴

MCARの場合はこれらの手法は普通に使える。
欠損値があってもなくても分布が変わらないからそりゃそうかって感じ。ただ、やはりもったいない。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。