EnsekiTT Blog

EnsekiTTが書くブログです。

データ分析における欠損値のパターンの話

こんにちは、えんせきです。
こないだ夜遅くにスマホの電池が切れた状態で自転車で走っていたら、品川で迷いました。
五反田方向に行きたかったのに、大崎で完全に間違った方向に向かって青物横丁を通って大井町に行ってしまってました。

つまりなにしたの?

欠損値にはパターンがあってそれによって対処も変わってくる。というわけで欠損値を自分で作ってみることにした。
欠損値のパターンについてはこれで勉強し直した。

村山 航「欠損データ分析 (missing data analysis) -完全情報最尤推定法と多重代入法-」
http://koumurayama.com/koujapanese/missing_data.pdf

f:id:ensekitt:20180304033809j:plain

欠損値のパターン

完全無欠データ

すばらしい。さいこう!(比較のために書いた)
これはIrisをサンプリングしたデータで、欠損はない。
f:id:ensekitt:20180304025946p:plain
0〜3はそれぞれ
'sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'
で、今回は3のpetal width (cm)を欠損させることにした。

欠損値が完全にランダムに発生している(MCAR)

実際に見かけたら逆に意図的っぽい感じがする。ただ、完全にランダムなので簡単な補完をしても母集団の推定に影響がない。
MCARはMissing Completely At Random。
これは

petal width (cm)をランダムサンプルして欠損させることにした。
これで作った

data_mcar = data.copy()
data_mcar[3] = data_mcar[3].replace(data[3].sample(n=5), np.NaN)
data_mcar

f:id:ensekitt:20180304030006p:plain

欠損値が観測データに依存して発生している(MAR)

裏を返すと欠損しているかが欠損値そのものに依存していない。(ただこれは、欠損しているから確認できない。)
たとえば、一次試験を行って一次試験に合格した人だけが二次試験を受けられるとすると、二次試験の結果は一次試験の結果によって欠損する。
MARはMissing At Random。
petal length (cm)が1.7未満の場合、petal width (cm)が欠損させることにした。
これで作った

data_mar = data.copy()
data_mar[3] = data_mar[3].replace(data_mar[data_mar[2]<1.7][3], np.NaN)
data_mar

f:id:ensekitt:20180304030159p:plain

欠損値が欠損データに依存して発生している(MNAR)

僕が就活の時にやったやつ。英語に関する質問がこれだけで、英語が苦手だからTOEICのスコアが任意回答だと書かない。みたいなのでおきる。
パッと見MNARだと思っても、MARにできないか考える。これからデータを集める場合はMNARにできるように集められるようにがんばる。
MNARはMissing Not At Random。

petal width (cm)が1.0未満の場合、petal width (cm)が欠損させることにした。
ただ、よく考えたら作り方的にはMNARになるんだけどpetal width (cm)と強く関係していることがわかっているから
厳密にはMNARには出来ていない。
これで作った

data_mnar = data.copy()
data_mnar[3] = data_mar[3].replace(data_mar[data_mar[3]<1][3], np.NaN)
data_mnar

f:id:ensekitt:20180304030441p:plain

欠損値の対処方法について今度まとめる。