データサイエンスのいろは · ⏱️ 読了目安 10分

10回押されたボタンの前に、立っていたのは1人だけだった|重複カウント

深夜、少し小腹が空いてコンビニへ歩いていた。途中の交差点で、押しボタン式信号の黄色い箱の前に立ち、親指でボタンを「カチカチカチカチ」と猛烈に連打している人を見かけた。赤信号が早く青に変わるわけでもないのに、10回くらい連続で叩いていた。

一言でいうと、ボタンが何回押されたかと、何人がそこに立っているかは全く別の数字だ

もし交通管理システムのサーバーが「押しボタンイベント:10回」という生ログをそのまま受け取って「10人の歩行者が横断を待っています」と集計したら、真夜中の交差点に突然ミニバス1台分のツアー客が現れたことになる。けれど実際にそこにいるのは、スニーカーを履いて少しイライラした人が1人だけだ。

「そんなバカな勘違い、誰もしないよ」と思うかもしれない。けれど、パソコンの画面に向かってデータベースやアクセス解析のツールを開いた瞬間、僕らはこの「10回押されたボタン」を、平気な顔で「10人の反応」として報告書に書いてしまいがちだ。

前の僕は、データベースからログを引くときに、何も考えずに COUNT(*) を叩いていた。今日は、データの件数が増えたときに「人が増えた」と勘違いしないための、僕の手の内を書いてみる。

まず、100回のクリックを並べてみる

実在のサービスのデータを出すと角が立つので、僕が作った架空の数字を置いた。

あるWebサイトで、記事の末尾に「役に立った!」というフィードバックボタンを新しく置いたとする。初日の夜に集計ツールを開くと、嬉しいことに合計でちょうど 100回 押されていた。

「初日で100回! 100人もの人が喜んでくれた!」

そう言いたくなる気持ちをぐっとこらえて、ログの中身を「誰が押したか(ユーザーID)」ごとに並べ直してみる。すると、こんな内訳だったりする。

ユーザークリック回数割合
Aさん60回60%
Bさん20回20%
Cさん4回4%
Dさん4回4%
Eさん4回4%
Fさん4回4%
Gさん4回4%
合計(7人)100回100%

計算してみる。

  • Aさん1人で60回。
  • Bさん1人で20回。
  • 残りの5人(C〜Gさん)が4回ずつで、計20回。
  • 全部足すと、60 + 20 + 20 = 100回。

たしかに「クリック」というイベントは100回起きている。数字に嘘はない。

けれど、ボタンを押した「人数」は何人か。表を上から数えると、AさんからGさんまでの たった7人 だ。100回押されたボタンの前に立っていたのは、100人ではなく7人だった。

しかも、その100回のうち80回(80%)は、AさんとBさんの2人だけで叩き出している。残りの5人は4回ずつだ。

「100件の反響がありました!」とだけ書かれた報告書を読むと、誰だって「100人のユーザーが満足そうにうなずいている光景」を頭に思い浮かべる。けれど実際の部屋で起きていたのは、「7人が集まっていて、そのうちの1人が猛烈な勢いでボタンを60回連打していた」という光景だったわけだ。

10回押されたボタンの前に、スニーカーは一足しかなかった。
10回押されたボタンの前に、スニーカーは一足しかなかった。

COUNT(*)COUNT(DISTINCT) のあいだ

データベースを触ったことがある人なら、SQLという言葉に馴染みがあるかもしれない。

データベースに向かって「何件ある?」と聞くとき、一番手軽なのはこれだ。

SELECT COUNT(*) FROM button_clicks;

これを実行すると、迷いなく「100」が返ってくる。テーブルに入っている行数を、そのまま1行ずつ数えたからだ。

一方で、「何人が押した?」と聞くときはこう書く。

SELECT COUNT(DISTINCT user_id) FROM button_clicks;

返ってくる数字は「7」だ。DISTINCT(別々の、重複しない)という単語を挟むことで、「同じ人が何回押していても、1人として数えてね」と指定したからだ。

キーボードを叩く指の手間としては、たった8文字増えただけ。けれど、この8文字を忘れるだけで、手元の数字は 14倍以上(100 ÷ 7 ≒ 14.3倍)に膨らむ。

ログの「行数」を数えているのか、画面の向こうの「人間」を数えているのか。この2つを混同したまま数字を眺めるのは、夜の交差点で押しボタンの連打数を歩行者の人数として数えるのと全く同じことだ。

Web解析ツールに潜む3つの階層

これはデータベースを直接叩く人だけの話ではない。Googleアナリティクスのようなアクセス解析ツールを見るときも、全く同じ落とし穴がある。

アクセス解析には、だいたい3つの階層がある。

  1. イベント数(またはPV・ヒット数):ボタンが押された、ページが開かれたという「出来事」の総数(一番多い)
  2. セッション数:一連の訪問の回数(同じ人が朝と夜に来たら2セッション)
  3. ユーザー数(アクティブユーザー数):サイトに訪れた「人」の数(一番少ない)

必ず「イベント数 ≧ セッション数 ≧ ユーザー数」というピラミッドになる。

あるページで「閲覧数が前週比で1.5倍になりました!」という数字を見たとき、僕はまず「セッション数とユーザー数はどう動いたか?」を見る。

もしユーザー数が横ばいで、1人あたりの閲覧イベント数だけが跳ね上がっていたら、それは「人気が出た」のではないかもしれない。「サイトの案内が分かりにくくなって、迷子になった人が同じページを何度も行き来している」可能性だってある。

「イベント数が2倍です! 改善大成功です!」

……ボタンが重くて反応しないから、みんながイライラして2回ずつ叩いてるだけだったりする。

いわゆる「レイジクリック(怒りの連打)」だ。操作に対する反応が遅いボタンは、クリック数だけが綺麗に跳ね上がる。数字の上では大人気に見えるのに、画面の向こうにいる人間は怒っている。件数だけを見て喜んでいると、現場の悲鳴を拍手と聞き間違えることになる。

数字は嘘をつかないけれど

統計の世界でよく言われる合言葉がある。「数字は嘘をつかない。でも嘘つきは数字を使う」。

誰が最初に言ったのかは諸説あって(マーク・トウェインが自伝で引いたとも、昔の統計家キャロル・D・ライトが言ったとも言われる)、はっきりした出典は定かではない。だから僕も「昔からそう言われている」とだけ留めておく。

けれど、1954年にダレル・ハフが書いた古典『統計でウソをつく法』をめくると、まさにこの「数える単位のすり替え」が手を変え品を変え登場する。

「100回のクリック」という記録自体は、1ビットの狂いもない本物の事実だ。嘘はどこにも混ざっていない。

けれど、その100という数字を提示しながら、「これだけ多くの人に使われています」と語った瞬間に、それは真実の皮をかぶった虚構になる。嘘はデータの中にあるのではなく、「何を1件として数えたか」を言わずに見せる人間の選択の中にある。

今日のまとめ:配車する前に、靴の数を数える

深夜の押しボタン信号の前に戻る。

信号機のボタンを10回連打していたあの人は、たぶん終電か何かに急いでいただけだ。ボタンを何回叩いたところで青信号の時間は1秒も伸びないし、渡る人間が10人に増えるわけでもない。

画面の向こうでグラフの棒がぐんと伸びて、「大反響です!」と声高に言いたくなったとき、僕はまず深呼吸して、そこにいる人の頭数を数えることにしている。

夜の交差点に10台のバスを配車してしまう前に、黄色い箱の前に立っているスニーカーが一足だけじゃないかを、ちゃんと確かめたい。

やあ、ここまで読んでくれてありがとう。

身近な疑問に引っかかったら、数えて確かめないと気が済まない。引っかかってから「なるほど」に辿り着くまでの過程を置く場所「猫だくさん」。