Core Media Lab記事一覧
開発・インフラ

【GA4】探索レポートの「サンプリング制限」と保持期限を突破!BigQuery無料連携で生データSQL分析基盤を作る手順

【GA4】探索レポートの「サンプリング制限」と保持期限を突破!BigQuery無料連携で生データSQL分析基盤を作る手順

Webサイトや個人メディアの成長に欠かせないGoogle アナリティクス 4(GA4)ですが、サイトの記事数やアクセス数が少しずつ増えてくると、多くの運営者が「GA4の管理画面だけでは正確なデータ分析ができない」という壁に直面します。

特に、詳細なユーザー行動を深掘りするために「探索(Explore)レポート」を使った際、次のような悩みや違和感を持ったことはないでしょうか。

  • 探索レポートで期間を広げたりセグメントを掛け合わせたりすると、右上のアイコンが黄色になり「データサンプリング(間引き集計)」が発生して正確な数値が分からなくなる
  • プライバシー保護の「しきい値(Thresholding)」が適用され、せっかく発生した少数のコンバージョンやロングテール記事のPVが「(other)」や非表示に丸められてしまう
  • GA4の仕様上、生データの保持期間が「最大14ヶ月」に制限されており、1年前の同月と比較した長期的なリライト効果検証ができない

これらのGA4特有の制限をすべて回避し、「100%サンプリングなしの正確な生データ(Raw Data)」を無期限・実質無料で蓄積できる唯一の方法が、Google Cloudのデータウェアハウス「BigQuery(ビッグクエリ)」との公式連携です。

本記事では、個人〜中規模メディア運営者が知っておくべき「GA4のサンプリング制限の仕組み」から、「無料枠の範囲内で安全にBigQuery連携を行う手順」、そして「コピペで使える実践的なSQL分析クエリと自動化連携」までを体系的に解説します。

なぜGA4単体では不十分なのか?サイト運営者を悩ませる「3つの制限」

かつてのユニバーサルアナリティクス(旧UA)では、月額15万ドル(約2,000万円)以上の有料版「GA360」を契約した大企業しかBigQueryへの生データ出力ができませんでした。しかし現在のGA4では、個人ブログを含むすべての無料版ユーザーにBigQueryへのネイティブ連携機能が開放されています。

Googleが無料でこの機能を開放した背景には、GA4単体の管理画面が抱える「3つの構造的な制限」があります。

1. 探索レポートの「データサンプリング(間引き)」と「しきい値」の壁

GA4のレポート機能は、大きく分けて「標準レポート」と「探索レポート」の2種類があります。

あらかじめ用意された「標準レポート」は事前集計済みのテーブルを参照するため原則としてサンプリングは発生しません。しかし、実務で最も使う「探索レポート(自由形式、ファネルデータ探索、経路データ探索など)」では、クエリ対象のイベント数が「1,000万件(無料版GA4の上限クォータ)」を超えると、自動的に一部のデータだけを抽出して全体を推測する「サンプリング(間引き集計)」に切り替わります。

さらに厄介なのが、少数のユーザー行動を分析しようとした際に発動する「データのしきい値」や「基数(カーディナリティ)の上限」です。

  • しきい値の適用: 特定のクエリや属性でユーザー数が少ない場合、個人の特定を防ぐ目的でGA4側が自動的に行を非表示にする
  • (other) 行への集約: URLパラメータや詳細なページパスなど、ユニークな値の種類(基数)が多すぎると、下位のデータがすべて「(other)」という1行にまとめられてしまい、個別記事の数値が追えなくなる

「月間1,000万イベントなんて個人サイトには関係ない」と思うかもしれませんが、GA4では1ページビューだけでなく、`scroll`(スクロール)、`click`(クリック)、`user_engagement` などの全自動計測イベントが合算されるため、中規模サイトで数ヶ月分のデータをクロス集計すると意外と簡単に制限へ引っかかります。

2. 探索レポート用データの保持期間が「最大14ヶ月」で強制削除される

サイト運営において最も致命的なのが、無料版GA4におけるイベントデータの保持期間上限が「2ヶ月(デフォルト)」または「最大14ヶ月」に固定されている点です。

比較項目 GA4単体(管理画面・探索レポート) GA4 × BigQuery連携(生データ保存)
データの保持期間 最大14ヶ月(期限を過ぎると自動削除) 無期限(設定次第で何年分でも永久保存)
サンプリング(間引き) 1,000万イベント超の探索で発生 一切なし(100%全件の生データを集計)
(other) 行の丸め込み 高基数ディメンションで頻発する 一切なし(1PVのロングテール記事まで正確)
外部ツール・AI連携 Data APIのトークン上限(クォータ)が厳しい SQLで自由に抽出し、PythonやGASへ直結可能

GA4の管理画面(データ設定 ➔ データ保持)で「14ヶ月」に変更していたとしても、14ヶ月を1日でも過ぎた生データはサーバーから順次消去され、探索レポートで過去2年〜3年をまたいだ比較分析を行うことは不可能になります。

一方、BigQueryへ毎日データをエクスポートしておけば、GA4側で14ヶ月経過して消えたデータもBigQuery内にそのまま残り続けるため、「サイト開設からの全アクセス履歴」を永久に自分の資産として保持できます。

3. GA4管理画面のUIが重く、リライト前後の詳細比較や自動化がやりづらい

記事のリライトやSEO改善を行う際、「特定のカテゴリに属する記事群の、リライト前30日間とリライト後30日間のCTR・直帰率・内部リンク遷移率を一括比較したい」といったニーズが頻繁に発生します。

GA4のブラウザ画面でこれを毎回ポチポチと設定するのは非常に手間がかかるうえ、動作も重くなりがちです。データがBigQueryに入っていれば、一度書いたSQLクエリを実行するだけで、わずか数秒で必要な分析テーブルを出力できるようになります。

BigQuery連携で解決!「無料枠(毎月10GB保存・1TBクエリ)」の仕組みと課金防衛ライン

「BigQueryは企業のビッグデータ基盤だから、個人で使ったら高額なクラウド破産をするのではないか?」と不安に感じる方も多いですが、結論から言えば個人〜月間数十万PV規模のWebメディアであれば、ほぼ完全無料(0円)のまま運用し続けることが可能です。

Google Cloud(BigQuery)の無料枠で個人・中規模メディアは実質0円

BigQueryの料金体系は、「① データを保存しておくストレージ料金」と「② SQLでデータを検索(スキャン)したときのクエリ料金」の2つだけで構成されており、それぞれに非常に広い毎月リセットされる無料枠(Free Tier)が設けられています。

課金項目 BigQueryの毎月無料枠 無料枠を超えた場合の単価目安 個人メディアでの到達目安
① ストレージ保存容量 毎月 10 GB まで無料 約0.02ドル / GB(月約3円 / 1GB) 月間10万PVのサイトで約2〜3年分溜めてようやく10GBに届くレベル
② SQLクエリ処理量(スキャン量) 毎月 1 TB(1,024GB)まで無料 6.25ドル / TB(オンデマンド料金) 1回100MBの集計SQLを月10,000回実行しても無料枠内

※2026年時点のGoogle Cloud公式料金表(東京リージョン `asia-northeast1` 基準)に基づく目安です。さらに、90日間一度も書き換えられていない過去の日次テーブルは自動的に「長期保存ストレージ(料金半額:約0.01ドル/GB)」へ移行するため、仮に数年後に10GBを超えたとしても、追加費用は月額わずか数十円(うまい棒数本分)に収まります。

従量課金で失敗しないための2大鉄則!「Dailyエクスポート」と「日付パーティション指定」

ただし、初期設定とSQLの書き方で以下の「2つのルール」を知らないと、無料枠を飛び越えて意図しない課金が発生するケースがあります。必ずこの防衛ラインを押さえておきましょう。

  1. エクスポート方式は「毎日(Daily)」だけを選び、「ストリーミング(Streaming)」は絶対にONにしない:
    GA4からBigQueryへデータを転送する際、「日次(1日1回まとめて転送)」は完全無料ですが、リアルタイムに転送する「ストリーミングエクスポート」は無料枠の対象外(有料の請求先アカウントが必須かつデータ量に応じた従量課金)となります。通常のSEO分析やサイト改善であれば、前日までのデータが毎朝揃う「日次(Daily)」だけで100%十分です。
  2. SQLを書くときは必ず日付(_TABLE_SUFFIX)で検索範囲を絞る:
    BigQueryは「保存されているデータのうち、SQLがスキャンした列と期間のサイズ」に対してクエリ容量を計算します。全期間・全カラムを無条件で検索する SELECT * を乱発せず、後述する WHERE _TABLE_SUFFIX BETWEEN ... を使って「直近30日分だけスキャンする」といった書き方を徹底すれば、月1TBの無料枠を使い切ることはまずありません。
💡 ワンポイント(クレジットカード登録なしで試せる「BigQuery サンドボックス」):
Google Cloudには、クレジットカード(請求先アカウント)を一切登録せずに上記の無料枠(10GB保存・1TBクエリ)を利用できる「BigQuery サンドボックス」モードが用意されています。「絶対に1円も課金されたくない」という場合は、請求先を紐付けないサンドボックス状態のまま連携を始めることも可能です(ただしサンドボックス時はテーブルのデフォルト有効期限が60日になるため、無期限保存したい段階で請求先アカウントを有効化し、テーブル期限を「無期限」に変更するのがベストプラクティスです)。

【実践】GA4とBigQueryを連携して生データを自動蓄積する4ステップ

ここからは、実際にGA4とBigQueryを接続して日次の生データエクスポートを開始する手順を4つのステップで解説します。所要時間は約10分です。

STEP 1:Google Cloud(GCP)プロジェクトの作成とBigQuery APIの有効化

まずはデータを保存する受け皿となる「Google Cloud プロジェクト」を作成します。

  1. GA4の管理者権限を持っているGoogleアカウントで、Google Cloud コンソールへアクセスします。
  2. 画面左上のプロジェクト選択プルダウンをクリックし、「新しいプロジェクト」を選択します。
  3. プロジェクト名(例:core-media-lab-analytics など分かりやすい名前)を入力して「作成」をクリックします。
  4. 作成したプロジェクトに切り替わったら、左上のナビゲーションメニューから「APIとサービス」➔「ライブラリ」を開き、検索窓で BigQuery API を検索して「有効にする」をクリックします(多くの場合、最初から自動で有効化されています)。

STEP 2:GA4管理画面の「BigQuery のリンク」から接続設定を開始する

続いて、Google アナリティクス 4(GA4)の管理画面へ移動します。

  1. GA4画面左下の歯車アイコン「管理(Admin)」をクリックします。
  2. 「サービス間のリンク設定」セクションにある「BigQuery のリンク」をクリックします。
  3. 右上の青い「リンク」ボタンをクリックし、「BigQuery プロジェクトを選択」から先ほどSTEP 1で作成したGCPプロジェクトにチェックを入れて「確認」を押します。

STEP 3:ロケーションは「東京(asia-northeast1)」・頻度は「毎日(Daily)」のみを選択

プロジェクトを選択すると、データの保存場所(ロケーション)とエクスポート頻度の設定画面に進みます。ここが最も重要な設定ポイントです。

  • データのロケーション: プルダウンから asia-northeast1(東京) を選択します(一度作成すると後からリージョン変更ができないため、国内向けサイトなら東京を選んでおくのが基本です)。
  • データストリームとイベント: 対象のWebデータストリームが選択されていることを確認します。除外したい不要なイベントがなければそのまま進みます。
  • 頻度(Frequency): 「毎日(Daily)」にのみチェックを入れます。(※前述の通り、すぐ下の「ストリーミング」にはチェックを入れないでください)。

最後に確認画面で「送信」をクリックし、ステータスに「リンク作成済み」と表示されれば、GA4とBigQueryの接続は完了です。

STEP 4:翌朝以降にBigQueryコンソールで「events_YYYYMMDD」テーブルを確認する

連携設定を完了した直後は、まだBigQuery側にテーブルは作られません。通常、設定完了の翌日(24時間以内)から自動エクスポートが始まります。

翌日以降にGoogle Cloudの「BigQuery Studio(SQLワークスペース)」を開くと、プロジェクト配下に以下のようなデータセットとテーブルが自動生成されているはずです。

  • データセット名: analytics_XXXXXXXXX(末尾の数字はあなたのGA4プロパティID)
  • テーブル名: events_YYYYMMDD(日付ごとにシャーディングされた日次テーブル群)

なお、無期限でデータを保存したい場合は、analytics_XXXXXXXXX データセットの右側にある三点リーダーから「データセットを編集」を開き、「テーブルのデフォルトの有効期限」のチェックを外して(無期限にして)保存しておきましょう。

【コピペで使える】BigQueryでGA4の生データを集計する実践SQLクエリ集

BigQueryにデータが溜まり始めたら、いよいよSQLを使って「サンプリング一切なし」の正確なデータを抽出してみましょう。

GA4テーブル最大の壁「ネスト構造(event_params)」をUNNESTで攻略する

BigQueryに出力されたGA4のテーブルを初めて開いた人が必ず戸惑うのが、「1つのセル(行)の中に、配列として複数のパラメータが入れ子(ネスト)で格納されている」という独自のデータ構造です。

たとえば、「どのページ(page_location)が見られたか」や「どのセッションID(ga_session_id)か」といった情報は、独立した列ではなく、すべて event_params という繰り返しレコード(ARRAY / STRUCT型)の中に格納されています。

これを取り出すには、BigQuery標準SQLの UNNEST(アンネスト=入れ子の展開) とスカラーサブクエリを組み合わせる定番イディオムを使います。以下のSQLテンプレートをそのままコピペすれば、複雑な構造を意識することなく一発で集計できます。

クエリ例1:サンプリングなし!記事(ページパス)別の正確なPV・UUランキング抽出SQL

指定した期間(例:直近1ヶ月など)における、記事URLごとの正確なページビュー数(PV)とユニークユーザー数(UU)を集計する基本クエリです。GA4の探索レポートでは「(other)」に丸められてしまう1PVの記事まで100%正確に取得できます。

-- 記事(ページパス)別のPV数・ユニークユーザー数集計クエリ
SELECT
  -- URLからドメインやクエリパラメータを除いたパス部分を抽出
  REGEXP_EXTRACT(
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
    r'^https?://[^/]+(/[^?#]*)'
  ) AS page_path,
  -- ページタイトルの取得
  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS page_title,
  -- PV数(page_viewイベントの総数)
  COUNT(1) AS pageviews,
  -- ユニークユーザー数(user_pseudo_idの重複除外カウント)
  COUNT(DISTINCT user_pseudo_id) AS unique_users
FROM
  -- ★ご自身の「プロジェクトID.analytics_プロパティID.events_*」に書き換えてください
  `your-project-id.analytics_123456789.events_*`
WHERE
  -- 【重要】スキャン量を抑えるため必ず _TABLE_SUFFIX で対象期間を指定する
  _TABLE_SUFFIX BETWEEN '20261001' AND '20261031'
  AND event_name = 'page_view'
GROUP BY
  page_path,
  page_title
ORDER BY
  pageviews DESC
LIMIT 100;

クエリを実行する前に、BigQuery画面の右上に表示される「このクエリを実行すると XX MB が処理されます」という事前見積もり表示を確認する癖をつけましょう。_TABLE_SUFFIX が正しく効いていれば、わずか数MB〜数十MBのスキャン量で瞬時に結果が返ってきます。

クエリ例2:流入元(参照元/メディア)× ランディングページ別のセッション・CV集計SQL

続いて、「検索エンジン(google / organic)やSNSから、どの記事にランディングし、どれくらいコンバージョン(または特定クリック)が発生したか」をクロス集計する実践クエリです。

-- セッション単位の流入元×ランディングページ×CV集計クエリ
WITH session_data AS (
  SELECT
    -- ユーザーIDとセッションIDを組み合わせて一意のセッションキーを作成
    CONCAT(
      user_pseudo_id,
      '-',
      CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)
    ) AS session_key,
    -- セッションの流入元(source / medium)
    IFNULL(collected_traffic_source.manual_source, '(direct)') AS source,
    IFNULL(collected_traffic_source.manual_medium, '(none)') AS medium,
    -- ランディングページ(session_start時のURLパス)
    MAX(
      IF(
        event_name = 'session_start',
        REGEXP_EXTRACT((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'), r'^https?://[^/]+(/[^?#]*)'),
        NULL
      )
    ) AS landing_page,
    -- 特定イベント(例:アフィリエイトリンククリックや問い合わせ完了)の発生回数
    COUNTIF(event_name = 'click') AS click_events
  FROM
    `your-project-id.analytics_123456789.events_*`
  WHERE
    _TABLE_SUFFIX BETWEEN '20261001' AND '20261031'
  GROUP BY
    session_key, source, medium
)
SELECT
  CONCAT(source, ' / ', medium) AS source_medium,
  landing_page,
  COUNT(DISTINCT session_key) AS sessions,
  SUM(click_events) AS total_clicks,
  ROUND(SAFE_DIVIDE(SUM(click_events), COUNT(DISTINCT session_key)) * 100, 2) AS click_rate_pct
FROM
  session_data
WHERE
  landing_page IS NOT NULL
GROUP BY
  source_medium,
  landing_page
ORDER BY
  sessions DESC
LIMIT 100;

このようなセッション単位の集計も、SQLとして一度保存(保存済みクエリ)しておけば、毎月日付を変えるだけで1秒で正確な分析レポートが手に入ります。

BigQueryのデータをGAS・Python・VPSで自動レポート化する発展活用術

BigQueryに生データが蓄積されると、ブラウザ上でSQLを叩くだけでなく、外部の自動化ツールやAIと繋いで「分析業務そのものを完全自動化」する道が開けます。

1. Googleスプレッドシート(GAS)のBigQueryサービスで週次SEOレポートを自動更新

Google Apps Script(GAS)には、標準の拡張サービスとして BigQuery API が用意されています。これを使えば、毎週月曜日の朝に上記のようなSQLを自動実行し、集計結果をそのままGoogleスプレッドシートの「記事管理表」や「リライト候補シート」へ自動で書き込むことができます。

ただし、数ヶ月〜数年分の膨大なデータをGAS単体でループ処理・整形しようとすると、GAS特有の「6分実行制限エラー」に引っかかることがあります。データ量が増えてきた場合は、重い集計処理を外部のVPSへ逃がすハイブリッド構成が有効です。

💡 あわせて読みたい(GASの実行時間制限を突破する方法):
・【脱・6分制限】GASの「実行時間エラー」を根本解決!重い定期処理をVPS×Pythonへ逃がすハイブリッド自動化術

2. VPS上のPythonやn8n・Difyと連携して「AIアクセス解析Bot」を構築する

さらに一歩進んだ自動化として、月額数百円〜千円台の格安VPS上に構築した Pythonスクリプト や n8n、Dify からBigQueryのデータを定期取得するパイプラインが非常に強力です。

  • n8n × BigQuery: 毎朝9時にn8nのBigQueryノードで前日のPV急増記事・急落記事を自動抽出し、SlackやDiscordへサマリーを通知する。
  • Dify × BigQuery: 抽出した記事別アクセスデータとSearch Consoleの検索順位データを自前DifyのAIワークフローへ渡し、「今週優先してリライトすべき記事トップ3と具体的な改善見出し案」をAIに自動起案させる。

これらを自前のVPS環境で組み合わせることで、人間がアナリティクスの画面を毎日開いて悩む時間をゼロにし、記事執筆とサイト改善だけに集中できる環境が完成します。

💡 あわせて読みたい(VPSでDify・n8nをセルフホストする手順):
・【脱・無料枠制限】Difyを格安VPSにセルフホスト構築する完全手順!Dockerで無制限AI環境を作る
・【脱Zapier】n8nを格安VPSにDocker構築する完全手順!タスク無制限のAPI自動化基盤を作る

まとめ:GA4×BigQuery連携は「1日でも早く繋ぐだけ」で将来の資産になる

本記事では、GA4の探索レポートにおけるサンプリング制限や14ヶ月のデータ保持期限を突破するため、BigQueryの無料枠を活用して生データSQL分析基盤を構築する手順を解説しました。

  • GA4の3大制限を完全解消: サンプリング(間引き)、しきい値による(other)丸め込み、最大14ヶ月のデータ消去から完全に解放される。
  • 無料枠と2大鉄則で安全運用: 毎月10GB保存・1TBクエリの無料枠があり、「Dailyエクスポートのみ選択」と「_TABLE_SUFFIX による期間指定」を守れば個人メディアは実質0円で運用できる。
  • ⚠️ 過去の遡りエクスポートは不可: BigQueryへのデータ蓄積は「リンク設定を完了したその日から」しか始まりません(設定より前の過去データを遡って転送することは仕様上できません)。

今はまだSQLを書く予定がなくても、「今日リンク設定を済ませておくだけ」で、1年後・2年後に振り返り分析をしたくなったときの貴重な生データが毎日自動で貯まり続けます。わずか10分で終わる設定ですので、ぜひ今すぐGA4とBigQueryを繋いでおきましょう。

また、蓄積したビッグデータを24時間自動で集計・AI分析させるための「自分専用の自動化サーバー(VPS)」をまだお持ちでない方は、以下の比較記事もあわせて参考にしてみてください。

🚀 【2026年最新】データ分析・自動化におすすめの国内VPS 3選を比較する