ファイナンス、情報通信技術のスキル・アグリゲーション・サイト

' . iseeit.jp 情報通信技術 . '
 
MongoDB / Access Log ②

PVからセッションへ
uqid が意味を持った日

後から足した uqid は、最初「毎アクセスにIDを振る」だけのものでした。 それを「60分無操作で失効するセッション」に変えた瞬間——ユニーク訪問者・PV/セッション・直帰率が、 初めて意味のある数字になります。変えたのはフィールドではなく、振り方でした。

uqid セッション化 直帰率 PV/セッション 失効スライダー

§ 0 — 導入

数字はあった。でも、何も分からなかった

前回、アクセスログに uqid を後から足しました。 最初は「毎アクセスにユニークなIDを振る」だけのもの。ログは溜まり、PV数も出ます。

ところが、肝心のことが分かりませんでした。「何人が来たのか」「ちゃんと読まれたのか」「すぐ帰ったのか」。 数字はあるのに、意味が無い。この停滞から抜け出すには、たった1つの発想の転換が必要でした。

IP・uqid はすべてマスク済み。 本文とデモの uqid は u-A9f3 のような匿名ラベルで、個人を特定するものではありません。
§ 1 — PV の限界

「表示回数」だけでは、つぶれて見える

PV(ページビュー)は「ページが表示された回数」です。ここに落とし穴があります。 1人が10ページ見ても、10人が1ページずつ見ても、同じ10PV。まったく違う状況が、同じ数字に潰れます。

だから PV だけでは、訪問者数も、1人あたりの回遊も、すぐ帰ったかどうかも見えません。 そして毎アクセスに新しい uqid を振っていた頃は、その uqid も同罪でした。アクセスごとに別IDでは、 結局PVと同じ粒度。「同じ人」が繋がらないのです。

§ 2 — 転換

uqid を「セッション」に変える

発想を変えます。uqid を毎回振るのをやめ、同じ訪問者には、同じIDを一定時間持たせる。 そして「ひとまとまりの訪問」を1単位として数える——これがセッションです。

定義はシンプル。最後のアクセスから60分間、無操作が続いたら失効。次に来たら新しいセッション。 実装も、最終アクセス時刻を覚えておいて「今 − 最終 > 60分」で判定するだけです。

// uqid を毎回振らず、同じ訪問者に一定時間持たせる(骨子)
const TIMEOUT = 60 * 60 * 1000;   // 60分

function resolveSession(uqid, now){
  const last = store.get(uqid);            // 最終アクセス時刻
  if (!last || now - last > TIMEOUT){    // 60分無操作 → 新セッション
    store.newSession(uqid);
  }
  store.touch(uqid, now);               // 最終アクセスを更新
  return store.sessionId(uqid);
}
変えたのは、たった1つ。 フィールドは同じ uqid。振り方を変えただけです。なのに、次に見るように世界が変わります。 (失効管理を APCu で高速に行う実装は、appw.jp の運用記事に譲ります。)
§ 3 — 意味を持った3つの指標

まとまりが、数字を生む

セッションという「まとまり」ができて初めて、計算できるようになった指標が3つあります。

ユニーク訪問者数

重複しない uqid の数。「何人来たか」が初めて分かります。PVでは決して出せなかった数字です。

PV / セッション

総PV ÷ セッション数。「1回の訪問で何ページ回ったか」——回遊の深さです。サイトの中を歩いてもらえたか。

直帰率

1ページだけ見て帰ったセッションの割合。「入口で満足せずに去ったか」——コンテンツの掴みが分かります。

3つとも、セッションという単位がなければ計算すらできなかった指標です。

§ 4 — 体感デモ

生ログが、セッションになる

生のアクセスログ(時刻・uqid・uri)を、失効ルールで束ねます。失効時間スライダーを動かすと、 同じ訪問者でも無操作が続けば別セッションに割れ、指標が連動して動くのが見えます。

Interactive · Raw log → Sessions
生ログ → セッション束ね
サーバー通信なし。サンプルログは固定です。uqid・IP はマスク済み。
▼ 生ログ(1行 = 1PV/時刻は経過分)
セッション失効時間(無操作)60分
▼ セッション(束ねた結果)
「セッション化する」を押すと、生ログが束ねられます。
ユニーク
訪問者
総PV
セッション
PV / セッション
直帰率
失効時間を選んで「セッション化する」を押してください。60分(本番の設定)から始め、15分に縮めると数字がどう動くか見てください。

失効時間を短くするほど、1人の訪問が複数セッションに分断され、セッション数と直帰率が上がり、 PV/セッションは下がります。ユニーク訪問者数と総PVは変わりません—— 同じ生ログでも、セッションの定義しだいで、見える景色が変わるのです。

§ 5 — 落とし穴と設計判断

セッションは、近似である

失効時間は、何分が正解か

デモで見たとおり、失効時間は指標を直接動かします。短すぎると1つの訪問が分断され、 長すぎると別の訪問が繋がってしまう。一般的な慣習と、回遊のリズムを見て60分を選びました。 唯一の正解はなく、「何を1訪問とみなすか」という設計判断です。

Cookie拒否・共有IP — 完璧は狙わない

uqid が取れない、あるいは複数人で被ることもあります。セッションは個人の完璧な特定ではなく、 実用的な近似と割り切ります。傾向を読むには、それで十分です。

bot は、セッションから除く

ここで1本目の bot フラグが効きます。ボットのアクセスを混ぜると、回遊も直帰率も歪む。 だから指標を出す前に、ボットを除外します。「誰を数えるか」を絞ることも、分析の一部です。 ——では、そのボットや攻撃者を、どうやって見分けるのか。それが次回の主題です。

プライバシーの節度。 uqid は個人を名指しするものではなく、匿名の範囲で扱います。IP と同様、マスクして記録・分析します。

この記事のまとめ

  • PVは「表示回数」。訪問者数・回遊・直帰が全て潰れて見える。
  • uqid を毎回振るのをやめ、60分無操作で失効するセッションに変えた。
  • まとまりができて初めて、ユニーク訪問者・PV/セッション・直帰率が計算できた。
  • 失効時間は指標を動かす設計判断。セッションは完璧な特定でなく実用的な近似。
  • 指標を出す前に bot を除外する。「誰を数えるか」も分析の一部。

関連記事

Next — アクセスログ基盤③
攻撃者は、パターンで浮かぶ — ログから異常を読む

正常な訪問者のパターンが分かると、そこから外れる異常が見えます。同一IPの高頻度アクセス、 同一UAの複数IP分散、存在しないパスへの試行——ログから攻撃者を浮かび上がらせます。検出の先の「遮断」は appw.jp へ。