データをみる上で怖いもの。
それは、、、、欠損です!
というわけで今回は欠損について思うことをメモします。プログラミングの話なのでご了承ください。
データの欠損とは
データの欠損には大きく2つあります。それは一部が欠けているものとレコードそのものが欠けているものです。
レコードの一部が欠けている場合は、例えばこんな感じ。
例
id name price date 0 1 100 2020-11-01 1 2 b 110 2020-11-02 2 3 c 120 2020-11-03 3 4 b 130 2020-11-04 4 5 140 2020-11-05 5 6 b 150 2020-11-06 6 7 d 160 2020-11-07 7 8 b 170 2020-11-08
これは1行目と5行目のnameが欠けています。しかし、レコードそのものが欠けているわけではないですよね。この場合は結構話が早くて、結論はテーブル名.isnull().any(axis=0)で判定可能です。
問題は次の場合。
例
id name price date 0 1 100 2020-11-01 1 2 b 110 2020-11-02 2 3 c 120 2020-11-03 3 4 b 130 2020-11-04 4 5 140 2020-11-05 5 7 d 160 2020-11-07 6 8 b 170 2020-11-08
レコードそのものが欠けているものです。さっきと違い、よくみてみると6番目が消えています。これの何が面倒かと言うと、コンピューターが抜けていると教えてくないところです。現に、idでは6が抜けていますが、一番左のコンピューターが一恵あげているところでは抜けていません。
対処法
ひとまずの対処としては、日付でカウント欠けてみる、と言うのがあげられます。もうちょっと具体的には
1date_diff(max(date),min(date),day)+1で、そもそも日付が何日あるか計算する
2count(distinct(date))で実際のレコードの日付の数を数えあげる
です。上の例だと、
1は(11月8日−11月1日+1)で8
2は7
なので、ここで食い違います。