第509話|「欠損ゼロ」の報告書が信用できなかった理由
NaNではない「隠れ欠損」の見つけ方

第509話|「欠損ゼロ」の報告書が信用できなかった理由NaNではない「隠れ欠損」の見つけ方

データ分析の報告書で、こんな一文を見かけることがあります。

欠損値はありませんでした

安心してよさそうな一文です。ところが、この一文が付いた報告書ほど、注意して読む必要があります。

欠損が本当にゼロのデータは、めったに存在しないからです。

多くの場合、欠損は消えたのではなく、数字や文字の形をして隠れているだけです。

今回は、ある会社で起きた「欠損ゼロなのに数字がおかしい」という出来事を通して、隠れた欠損の正体と、見つけ方を説明します。

出発点――「欠損ゼロ」なのに、平均年齢が若すぎる

「欠損ゼロ」と書かれた報告書と、若すぎる平均年齢のグラフを見比べる分析担当者

 いつもの報告

会員データの集計結果を上司に報告する若手の分析担当者
通販会社G社で、会員データを使った顧客分析を始めることになりました。

担当者がまず行ったのは、データの健康診断です。各項目に空欄がいくつあるかを数え、結果を報告しました。

欠損値はゼロです。すぐ分析に使えます

ところが、集計結果を見た営業部長が首をかしげます。

会員の平均年齢が、31歳。

G社の主力商品は、40代から50代向けです。店頭で見かける顔ぶれとも合いません。

 「0歳」の会員が3,000人いた

年齢の一覧表に「0」が並んでいるのを見つけて驚く担当者
年齢の値を小さい順に並べてみると、原因はすぐに見つかりました。

年齢が「0」の会員が、およそ3,000人いたのです。

G社の会員登録では、生年月日の入力は任意でした。

未入力のまま登録すると、システムは年齢の欄に「0」を入れる仕様になっていました。

空欄ではない。数字が入っている。だから、空欄を数える健康診断では引っかかりません。

しかし集計ツールは「0歳」を本物の年齢として扱い、平均を引き下げていました。

 地域別ランキングの1位は「(空白)」

地域別ランキングの1位が空白になっている棒グラフ
同じことは、ほかの項目でも起きていました。

都道府県の欄には、空欄ではなく「空白文字」だけが入っている会員が多数いました。

見た目には何も書かれていませんが、システム上は「値がある」扱いです。

その結果、地域別の会員数を集計すると、1位が「(空白)」という不思議なランキングになりました。

さらに、アンケートの年収欄では、「回答しない」を選んだ人に「9999」という番号が割り当てられていました。

こちらは逆に、平均年収を大きく引き上げていました。

隠れた欠損は、どこから生まれるのか

システムの初期値・入力規則・運用ルールから、欠損が「値」に姿を変える様子の図解

 欠損には2つの顔がある

「空欄の欠損」と「数字の形をした欠損」を並べて見比べる担当者
ここで、欠損の考え方を少し広げる必要があります。

欠損には、2つの顔があります。

1つは、値がない欠損。セルが空っぽの状態です。分析ツールはこれを欠損として数えてくれます。

もう1つは、値の形をした欠損。0、9999、空白文字、「不明」「該当なし」「-」といった、中身のない値です。

後者は、ツールにとってはふつうの値です。数えられず、除外もされず、そのまま平均や合計に混ざります。

G社の「欠損ゼロ」は、前者だけを数えた結果でした。

 生まれる場所は、システム・入力規則・運用の約束事

登録画面・入力フォーム・運用マニュアルの3つから隠れ欠損が生まれる図
値の形をした欠損は、偶然生まれるものではありません。

生まれる場所は、だいたい決まっています。

  • 1つ目は、システムの初期値。未入力なら0、日付なら1900年1月1日、といった仕様です。
  • 2つ目は、入力規則。必須項目を埋めないと先に進めないため、担当者が「-」や「なし」を入れて通過する。
  • 3つ目は、運用上の約束事。「回答しない場合は9999」のように、現場だけが知っているコード。

どれも、データを作った人にとっては当たり前のルールです。

しかし、分析する側には伝わっていません。だから、隠れたままになります。

見つけ方――集計の前に「値を眺める」

各項目の最小値・最大値・上位の値を並べた一覧表を確認する担当者

 3つの視点で眺める

「ありえない値」「多すぎる同じ値」「切りがよすぎる値」の3つの視点を示すカード
隠れた欠損を見つける方法は、特別なものではありません。

集計する前に、各項目の値を一度眺める。これだけです。

眺めるときの視点は3つあります。

  • 1つ目は、ありえない値。0歳の会員、マイナスの購入額、未来の日付。
  • 2つ目は、多すぎる同じ値。同じ数字が不自然に多いなら、初期値やコードを疑います。
  • 3つ目は、切りがよすぎる値。9999、99、-1、1900年1月1日。人が「欠損の代わり」に選びがちな数字です。

各項目の最小値、最大値、そして最も多い値の上位3つを表にするだけで、たいていは見つかります。

 見つけたら「欠損」に戻してから集計する

「0」や「9999」を欠損の印に置き換えてから集計し直す担当者
見つけた隠れ欠損は、本来の姿である「欠損」に戻してから集計します。

0歳は欠損に。9999は欠損に。空白文字は欠損に。

G社でこの作業をやり直したところ、平均年齢は47歳になりました。店頭の実感と一致する数字です。

地域別ランキングからも「(空白)」が消え、本当の上位地域が見えるようになりました。

ここで初めて、「欠損をどう扱うか」という本来の議論に進めます。

削除するのか、埋めるのか。その話は、欠損が正しく欠損として数えられて、はじめて意味を持ちます。

今回のまとめ

「欠損ゼロ」の報告に対して「どう確認しましたか」と質問する意思決定者
欠損値はありません」という報告は、安心の材料ではなく、確認の合図です。

欠損には、値がない欠損と、値の形をした欠損があります。

後者は、システムの初期値、入力規則、運用上の約束事から生まれ、ふつうの値として集計に混ざります。

見つけ方は、集計の前に各項目の値を眺めること。ありえない値、多すぎる同じ値、切りがよすぎる値。この3つの視点で見ます。

報告を受ける側が返すべき質問は、1つです。

「欠損がゼロというのは、どうやって確認しましたか」

空欄を数えました」という答えが返ってきたら、値の形をした欠損は、まだ探されていません。

よくある質問

Q. 隠れ欠損とは何ですか?

空欄ではなく、数字や文字の形をして紛れ込んでいる欠損のことです。

未入力を表す「0」、回答拒否を表す「9999」、空白文字だけのセル、「不明」「該当なし」「-」といった値が典型です。

分析ツールは通常の値として扱うため、欠損として数えられず、平均や合計にそのまま混ざります。

Q. 隠れ欠損があると、分析結果はどう狂いますか?

平均や合計が、実態から離れます。

年齢の「0」が多ければ平均年齢は下がり、年収の「9999」が多ければ平均年収は上がります。また、空白文字が「値あり」と数えられると、集計ランキングに「(空白)」という項目が現れます。

欠損の数が正しく数えられていないため、その後の削除や補完の判断も土台から狂います。

Q. 隠れ欠損は、どうやって見つければよいですか?

集計の前に、各項目の値を一度眺めます。

視点は3つです。ありえない値(0歳、マイナスの金額)、多すぎる同じ値、切りがよすぎる値(9999、-1、1900年1月1日)。各項目の最小値・最大値・最も多い値の上位3つを表にするだけで、たいていは見つかります。

あわせて、データを作った部門に「未入力のときは何が入りますか」と聞くのが確実です。

Q. 「欠損値はゼロです」という報告を受けたら、何を確認すればよいですか?

「どうやって確認しましたか」の1点です。

「空欄を数えました」という答えであれば、値の形をした欠損はまだ探されていません。

各項目の値の分布を眺めたか、データを作った部門に初期値や運用コードを確認したか、を尋ねてください。