データ分析の報告書で、こんな一文を見かけることがあります。
「欠損値はありませんでした」
安心してよさそうな一文です。ところが、この一文が付いた報告書ほど、注意して読む必要があります。
欠損が本当にゼロのデータは、めったに存在しないからです。
多くの場合、欠損は消えたのではなく、数字や文字の形をして隠れているだけです。
今回は、ある会社で起きた「欠損ゼロなのに数字がおかしい」という出来事を通して、隠れた欠損の正体と、見つけ方を説明します。
出発点――「欠損ゼロ」なのに、平均年齢が若すぎる

いつもの報告

通販会社G社で、会員データを使った顧客分析を始めることになりました。
担当者がまず行ったのは、データの健康診断です。各項目に空欄がいくつあるかを数え、結果を報告しました。
「欠損値はゼロです。すぐ分析に使えます」
ところが、集計結果を見た営業部長が首をかしげます。
会員の平均年齢が、31歳。
G社の主力商品は、40代から50代向けです。店頭で見かける顔ぶれとも合いません。
「0歳」の会員が3,000人いた

年齢の値を小さい順に並べてみると、原因はすぐに見つかりました。
年齢が「0」の会員が、およそ3,000人いたのです。
G社の会員登録では、生年月日の入力は任意でした。
未入力のまま登録すると、システムは年齢の欄に「0」を入れる仕様になっていました。
空欄ではない。数字が入っている。だから、空欄を数える健康診断では引っかかりません。
しかし集計ツールは「0歳」を本物の年齢として扱い、平均を引き下げていました。
地域別ランキングの1位は「(空白)」

同じことは、ほかの項目でも起きていました。
都道府県の欄には、空欄ではなく「空白文字」だけが入っている会員が多数いました。
見た目には何も書かれていませんが、システム上は「値がある」扱いです。
その結果、地域別の会員数を集計すると、1位が「(空白)」という不思議なランキングになりました。
さらに、アンケートの年収欄では、「回答しない」を選んだ人に「9999」という番号が割り当てられていました。
こちらは逆に、平均年収を大きく引き上げていました。
隠れた欠損は、どこから生まれるのか

欠損には2つの顔がある

ここで、欠損の考え方を少し広げる必要があります。
欠損には、2つの顔があります。
1つは、値がない欠損。セルが空っぽの状態です。分析ツールはこれを欠損として数えてくれます。
もう1つは、値の形をした欠損。0、9999、空白文字、「不明」「該当なし」「-」といった、中身のない値です。
後者は、ツールにとってはふつうの値です。数えられず、除外もされず、そのまま平均や合計に混ざります。
G社の「欠損ゼロ」は、前者だけを数えた結果でした。
生まれる場所は、システム・入力規則・運用の約束事

値の形をした欠損は、偶然生まれるものではありません。
生まれる場所は、だいたい決まっています。
- 1つ目は、システムの初期値。未入力なら0、日付なら1900年1月1日、といった仕様です。
- 2つ目は、入力規則。必須項目を埋めないと先に進めないため、担当者が「-」や「なし」を入れて通過する。
- 3つ目は、運用上の約束事。「回答しない場合は9999」のように、現場だけが知っているコード。
どれも、データを作った人にとっては当たり前のルールです。
しかし、分析する側には伝わっていません。だから、隠れたままになります。
見つけ方――集計の前に「値を眺める」

3つの視点で眺める

隠れた欠損を見つける方法は、特別なものではありません。
集計する前に、各項目の値を一度眺める。これだけです。
眺めるときの視点は3つあります。
- 1つ目は、ありえない値。0歳の会員、マイナスの購入額、未来の日付。
- 2つ目は、多すぎる同じ値。同じ数字が不自然に多いなら、初期値やコードを疑います。
- 3つ目は、切りがよすぎる値。9999、99、-1、1900年1月1日。人が「欠損の代わり」に選びがちな数字です。
各項目の最小値、最大値、そして最も多い値の上位3つを表にするだけで、たいていは見つかります。
見つけたら「欠損」に戻してから集計する

見つけた隠れ欠損は、本来の姿である「欠損」に戻してから集計します。
0歳は欠損に。9999は欠損に。空白文字は欠損に。
G社でこの作業をやり直したところ、平均年齢は47歳になりました。店頭の実感と一致する数字です。
地域別ランキングからも「(空白)」が消え、本当の上位地域が見えるようになりました。
ここで初めて、「欠損をどう扱うか」という本来の議論に進めます。
削除するのか、埋めるのか。その話は、欠損が正しく欠損として数えられて、はじめて意味を持ちます。
今回のまとめ

「欠損値はありません」という報告は、安心の材料ではなく、確認の合図です。
欠損には、値がない欠損と、値の形をした欠損があります。
後者は、システムの初期値、入力規則、運用上の約束事から生まれ、ふつうの値として集計に混ざります。
見つけ方は、集計の前に各項目の値を眺めること。ありえない値、多すぎる同じ値、切りがよすぎる値。この3つの視点で見ます。
報告を受ける側が返すべき質問は、1つです。
「欠損がゼロというのは、どうやって確認しましたか」
「空欄を数えました」という答えが返ってきたら、値の形をした欠損は、まだ探されていません。
よくある質問
Q. 隠れ欠損とは何ですか?
空欄ではなく、数字や文字の形をして紛れ込んでいる欠損のことです。
未入力を表す「0」、回答拒否を表す「9999」、空白文字だけのセル、「不明」「該当なし」「-」といった値が典型です。
分析ツールは通常の値として扱うため、欠損として数えられず、平均や合計にそのまま混ざります。
Q. 隠れ欠損があると、分析結果はどう狂いますか?
平均や合計が、実態から離れます。
年齢の「0」が多ければ平均年齢は下がり、年収の「9999」が多ければ平均年収は上がります。また、空白文字が「値あり」と数えられると、集計ランキングに「(空白)」という項目が現れます。
欠損の数が正しく数えられていないため、その後の削除や補完の判断も土台から狂います。
Q. 隠れ欠損は、どうやって見つければよいですか?
集計の前に、各項目の値を一度眺めます。
視点は3つです。ありえない値(0歳、マイナスの金額)、多すぎる同じ値、切りがよすぎる値(9999、-1、1900年1月1日)。各項目の最小値・最大値・最も多い値の上位3つを表にするだけで、たいていは見つかります。
あわせて、データを作った部門に「未入力のときは何が入りますか」と聞くのが確実です。
Q. 「欠損値はゼロです」という報告を受けたら、何を確認すればよいですか?
「どうやって確認しましたか」の1点です。
「空欄を数えました」という答えであれば、値の形をした欠損はまだ探されていません。
各項目の値の分布を眺めたか、データを作った部門に初期値や運用コードを確認したか、を尋ねてください。

