スクロール:到達深度の測定と解釈の限界

要点

スクロール計測はページ上の到達位置を記録します。読了、理解、注意を証明するものではありません。しきい値、測定範囲、分母を明確にします。

白紙のカードを並べた2台の机、真ちゅうのランプ、えんじ色の資料がある架空の無人分析室
この記事の内容

スクロール計測はページ上の到達位置を記録します。読了、理解、注意を証明するものではありません。しきい値、測定範囲、分母を明確にします。

自動計測と独自のしきい値を分ける

GA4の拡張計測は、垂直方向90%の深度が初めて見えるとscrollを送信します。25%、50%、75%の段階は自動では得られません。独自のしきい値には別の計測と重複排除が必要です。高さの変化、遅延読み込み、動的な画面遷移も記録します。

課題に照らして解釈する

高速スクロールやアンカーリンクで、継続的に読まずに末尾へ到達できます。答えが上部にある場合もあります。似た構造を比較し、課題達成、エラー、意見と組み合わせます。イベント数、ページビュー数、利用者数は異なる単位です。

収集範囲を定める

フランスのCNILは一部の閲覧者計測トラッカーについて厳格な条件下で同意免除を示しています。告知や集計だけでは免除を証明できません。目的、アクセス、保存期間を記録し、未計測の訪問を否定的な観測と扱わないようにします。

架空の例:測定範囲内だけの割合

架空の例:測定範囲内だけの割合
項目値解釈
測定したページビュー100計測対象として適格な範囲のみ。
90%に達したページビュー60ページビューごとに重複を排除。
この範囲内の割合60 / 100 = 60%ユニーク利用者数でも読了率でもありません。

出典

編集確認日:2026年11月1日。

スクロール深度は、理解度ではなく、露出度を示す指標です

ページ深度に到達したからといって、注意や理解度を示すものではありません。コンテンツの長さ、利用可能な時間、そしてその後の行動と関連付けることで、より有用な指標となります。

  • しきい値が文書全体に適用されるのか、それとも表示されているセクションに適用されるのかを定義する。
  • 短いページ、読み込みの遅延、モバイル端末、再訪問をテストする。
  • シグナルは読了完了の証明ではなく、閲覧経路の指標として提示する。

一次資料:Google Analytics — Set up events. 関連する方法:実践ガイドを読む.

データ結合の整合性

結合による行の増加が合計値を歪める場合があります。

  • 注文テーブルの1行は注文、明細の1行は注文内の商品を表します。結合前に重複キーとNULLキーを確認します。
  • 明細を注文キーごとに集約します。その結果と結合すれば、商品ごとに注文金額が繰り返されません。元の注文テーブルの合計と照合します。
  • LEFT JOINは明細のない注文を残しますが、右側テーブルへのWHERE条件はその注文を除外する場合があります。対応する行がないことと金額ゼロは別です。

再現できる受け入れ事例

架空の例です。顧客や実際の観測結果を示すデータではありません。

事例の入力を見る
{
    "orders": [
        {
            "id": 1,
            "total": 100
        },
        {
            "id": 2,
            "total": 200
        }
    ],
    "line_order_ids": [
        1,
        1,
        2
    ],
    "sum_before": 300,
    "sum_after_raw_join": 400
}

期待される判断

400は注文を二重計上しています。注文ごとに明細を集約し、合計300に戻します。 追加で、各100の架空の注文を2件試します。合計は200です。SUM(DISTINCT total)では100となり、正しい値が消えます。金額の重複排除ではなく、識別子と結合の対応件数を確認します。

再現できるSQLクエリ

架空例:金額100と200の注文2件と、注文1、1、2に対応する明細3件。クエリはVALUESだけを使います。テスト環境で実行してください。

WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2))
SELECT COUNT(*) AS rows, SUM(o.total) AS total
FROM orders o JOIN lines l ON l.order_id = o.id;
WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2)),
per_order AS (
  SELECT order_id, COUNT(*) AS line_count
  FROM lines GROUP BY order_id
)
SELECT COUNT(*) AS orders, SUM(o.total) AS total
FROM orders o LEFT JOIN per_order l ON l.order_id = o.id;

直接結合すると3行で合計400になります。先に集約すれば2件の注文と合計300を得られます。

WITH orders(id, total) AS (VALUES (1, 100), (2, 100))
SELECT SUM(total) AS correct_total,
       SUM(DISTINCT total) AS distinct_total
FROM orders;

金額が100と100の場合、正しい合計は200ですがSUM(DISTINCT total)は100です。

検証手順

  1. 注文と明細の粒度を定めます。
  2. 2明細の注文を結合します。
  3. キー、件数、照合済み合計を残します。

PostgreSQL — Table expressions and joins

SUM(DISTINCT total)だけで直せますか?

いいえ。100の注文が2件あれば合計は200ですが、SUM(DISTINCT total)は100になります。金額の重複排除ではなく、キーの関係を修正します。

一次資料:PostgreSQL — Table expressions and joins. 関連する方法:実践ガイドを読む.

アクセシブルなデータ表

小さな画面でもセルの関係を理解できる必要があります。

  • captionで表を識別し、thで見出しを示します。単純な表ではscope="row"とscope="col"で方向を示し、単位と期間を値の文脈に残します。
  • 横スクロール領域はキーボードから到達可能にし、すべての列を読めるようにします。カードに変換するならラベルと単位を繰り返し、比較に必要な情報を消しません。
  • キーボードとスクリーンリーダーでセル、行、列、単位を探す課題を試します。並べ替えや絞り込み後も繰り返します。見た目だけで読み上げの対応は確認できません。

再現できる受け入れ事例

架空の例です。顧客や実際の観測結果を示すデータではありません。

事例の入力を見る
{
    "column_headers": [
        "2025",
        "2026"
    ],
    "row_headers": [
        "A",
        "B"
    ],
    "cell": {
        "row": "B",
        "column": "2026",
        "value": 42
    },
    "layout": "mobile"
}

期待される判断

モバイル表示でも値42とB、2026の関連が分かる必要があります。

検証手順

  1. 行見出し、列見出し、単位を特定します。
  2. キーボードと支援技術でセルを読みます。
  3. モバイル化と拡大後も関係を保ちます。 重要なセルではスクロール後も行、列、単位を確認します。見出しがないと、読める値でも意味を取り違える可能性があります。

W3C WAI — Tables tutorial

一次資料:W3C WAI — Tables tutorial. 関連する方法:実践ガイドを読む.