Google Analyticsには「サンプリング」というローデータ(raw date)をそのまま表示せず、推定値を算出して表示するAnalytics独自の制限機能があります。
このサンプリングを回避し、正確なデータを取得する方法にAnalytics APIを使ってデータを細かく取得する、という方法があります。
そこで今回はサンプリングとは何か、そしてAPIでデータを取得する方法について説明したいと思います。ぜひ参考にしてみてください。
大規模サイトにおけるGoogle Analyticsの問題点
Google Analyticsのサンプリングとはなにか?
月間アクセス数が数百万以上ある大規模なWebサイトの場合、Google Analyticsの集計値がサンプリングによって正確に表示されない事があります。
サンプリングとは、ローデータ(母集団)から一部分のみを抽出し、その一部のデータから全体の値を推定する事を指します。つまり、サンプリングで集計している時は、必ずし本来のアクセス集計値が表示される訳ではありません。あくまでも推定値でしかないのです。
例としてデータ表示期間を1年間以上と長期で指定した場合、集計対象となる母集団が大きいため、下図の様にエラーが表示され集計できません。
データ収集対象があまりに大きい場合、サンプリングが発生して正しい値が取得できなかったり、そもそもエラーが表示されデータが取得できなかったりします。
すべてのデータを正確に収集して表示しようとすると、たいへん高度な処理が発生し、いわゆる「重く」なってしまうので、このように「母数から一部分を抽出して全体の値を推定」(サンプリング)しているのです。
このおかげで、Google Analyticsは迅速に任意のデータを表示することが可能となっているわけです。
Googleは公式において、サンプリングを次のようにたとえています。
データ分析の分野において、大規模なデータセットの中から有意な情報を得るため、すべてのデータの一部を抽出することをサンプリングと言います。たとえば、100 エーカーの範囲に自生している木の本数を推定する場合、木の分布が均一であれば、1 エーカーの本数を数えて 100 を掛けるか、0.5 エーカーの本数を数えて 200 を掛ければ、全体の本数を的確に予測することができます。
リンク:アナリティクスヘルプ:サンプリングの仕組み
サンプリングが発生する条件とは
Googleアナリティクスでサンプリングが発動する条件は下記の2つがあるようです。
セッション値の集計は「合計セッション数」
収集した合計セッション数が一定数を超えるとサンプリングが発動します。
・無料版のスタンダードの場合 → 50万セッションを超えた場合
・有料版のアナリティクス360の場合 → 1億セッションを超えた場合
収集期間を長期で指定した場合などはこのサンプリングが発動します。
ディメンション値の集計は「行数」
ディメンションの収集対象数である「行数」が一定数を超えるとサンプリングが発生します。
・無料版のスタンダードの場合 → 5万行を超えた場合
・有料版のアナリティクス360の場合 → 7万5千行を超えた場合
行数がリミット(5万もしくは7万5千)を超えると、超えた分は自動的に (other) として1つにまとめられてしまいます。
なお、上記は日次処理済みのデータ制限であり、複数日にまたがる処理済みのデータ制限ですと、
・無料版のスタンダード → 10万行を超えた場合
・有料版のアナリティクス360 → 15万行を超えた場合
超えた分は自動的に (other) として1つにまとめられてしまいます。
公式ヘルプページの最下部に記載がある通り、1日に収集されるデータの順番が異なる事で、日毎に各ディメンションの値が異なる場合があります。
Analytics APIでサンプリングを回避しながら集計しよう
サンプリングを回避する1つの方法として1度に取得するデータ量を小さく絞る方法があります。
1ヶ月のセッション数が指定の制限数(通常版であれば50万)を超えてしまう場合、サンプリングが発生します。ということは、1日単位のセッション数が50万以下であれば、日次でデータを取ることでサンプリングを回避できるということになります。
つまり、1日単位でデータを取得し、Excelなどで合算すれば正確な値を得ることができるわけです。
※なお、ディメンションレポートの行数の問題は、表示するデータの値を小さくする事では解決できません。サイト内の個々ページ群毎にプロパティを分けたり、パターンが類似するランディングページURLはフィルタによって正規化し1つのURLに集約する必要があります。
APIでデータを取得し、集計してみよう
Googleアナリティクス管理画面からでも日毎のデータを取得することは出来ますが、1ヶ月間のデータであれば30回、1年間であれば365回のダウンロード作業をしなければなりません。
ディメンションで絞ったり、チャネル別のデータも取得しようとした場合、アナリティクス管理画面からデータをダウンロードしようとすると膨大な工数がかかります。
そこで利用できるのがAPIです。簡単なプログラムを作ってしまえば、ほぼ手作業無しで細かい絞込のデータを大量かつ一度に取得できます。一度APIに慣れてしまえば、サンプリングが発生していないデータを手軽に取得できるでしょう。
事前に環境を構築する必要があります。下記を参考にしてください。
▼環境構築に関する参考ページ
・初心者でも分かる!なGoogle Analytics APIの使い方
・【PHP】Google Analytics API v3.0 使い方?データ取得編
・Google Analytics API(v3)を使ってPHPでリアルタイムユーザー数を取得する方法
それでは早速APIを通してセッション数を日別で取得してみましょう。
$params = array(
'dimensions' => "ga:year,ga:month,ga:day",
'sort' => "ga:year,ga:month,ga:day",
);
$google_analytics_metrics = 'ga:sessions,ga:bounces,ga:goalCompletionsAll,ga:sessionDuration';
上のパラメータは、サイト全体のセッション数や直帰数、合計CV数などを日付順(降順)で取得します
パラメータを設定したら、プログラムを起動してAPIからAnalyticsのデータを取得してみましょう。
セッション数や直帰数、CV数、滞在時間を3年間分、取得回数にして約1900回(365日×5年=約1900回)を取得しました。
この作業をAnalyticsのGUI画面から手作業で行おうとすると、時間がいくらあっても足りないですが、API経由では数秒で取得が終わります。
しかし、APIの取得が早くとも、データそのものが正確(GUI画面の値と一致する)でなければ意味がありません。
実際にAPIで取得したデータ(セッション数)とGoogleアナリティクスのGUI画面の値と比較しましたが、完全に同じ値が表示されました。当たり前ですが、一桁台まで完全に同じ値でした。
集計期間を変えて何度かチェックしましたが、すべての値(セッション数)は同一でした。
このように、APIを使えばGoogle AnalyticsのGUI画面と同じ値を数年間分一気に、しかもサンプリングを回避しながら日別単位で取得できるでしょう。
「オーガニック経由」に絞ってセッション数を取得してみよう
では、次にサンプリングが発生するオーガニック流入数をAPIで取得してみます。
Analytics APIのパラメーターに「filter」を加え、参照(mediumu)をオーガニック(organic)を指定します。こうする事で、参照が自然検索流入のみを抽出の対象とします。
$params = array(
'dimensions' => "ga:year,ga:month,ga:day",
'sort' => "ga:year,ga:month,ga:day",
'filters' => 'ga:medium==organic',//検索エンジンのアクセスのみ
);
さて、3年間分のアクセス数を一度に集計する事もあり、GoogleアナリティクスのGUI画面ではセッション数が数千万と表示されており、すでにサンプリングが発生していました。
API経由で取得した値とアナリティクス画面の値は一致しませんでした。API経由で取得した値を基本とした場合、GUI画面のセッション数と5.97%の差がありました。
※API経由で取得した日次セッション数はアナリティクス画面の値(上述した1日単位でデータ検索期間を指定した時の値)と一致している為、API経由の値の合算値はサンプリングが発生していないデータであるということがわかります。
キーワードの日次レポートをダウンロードしてみよう
(※2019年5月現在、Google Analyticsにおける検索キーワードのチェック機能はnot provideの表示などにより正確を期しているとはいえない状況です。なお、同様の機能はGoogle Search Consoleに移行していますので、そちらで確認することを強くお勧めします。)
キーワードの推移を日別や月別で分析し、キーワード毎のパフォーマンスを分析する時があると思います。
GoogleAnalyticsでも検索流入キーワードのパフォーマンスデータをダウンロードできますが、画面上で選択している期間の合計値しかダウンロードできません。
Yahoo!リスティング広告やGoogleAdwordsの様な日別分割レポートを手軽にダウンロードできず、細かなキーワード分析を行うにも非常に多くの工数がかかります。
AnalyticsAPIを使う事で、日別毎のキーワードデータも一瞬にしてダウンロードできます。
$params = array(
'dimensions' => "ga:year,ga:month,ga:day,ga:keyword",
'sort' => "ga:year,ga:month,ga:day",
'filters' => 'ga:medium==organic;ga:keyword=@コア',//検索エンジンのアクセスのみ
);
上のコードは自然検索経由のキーワードの内、「コア」を含むキーワード(フレーズ一致)のパフォーマンスデータを日別で取得します。
ダウンロードしたデータは、上の図の様にExcelのピボットテーブルを使ってクロス集計すると、時系列で流入数の増減推移を見る事ができます。
サンプリングが発生しない期間で比較すると、GUI画面の値とAPI経由の値は一致しており、キーワード単位のデータ取得も問題なく取得できるようです。
これで、自然検索経由でもリスティング広告のレポートの様にキーワード単位の流入推移を日別や月別で分析でき、より多くのインサイトを見つけられそうです。
最後に
以前も、より細かいディメンションで分けられた大量のデータを分析し、ユーザーの回遊傾向やキーワードのポテンシャルを分析しようとは考えた事がありました。しかし、アナリティクスのGUI画面でデータを一つ一つダウンロードする工数の多さに断念し、結局大きなデータの区分けである程度の分析に留めていました。
今回のGoogleアナリティクスAPIを使えば、いままで面倒で避けてきたデータのダウンロード作業を機械に任せ、自分の時間をよりデータの分析に使えそうです。
プログラムは一度書いてしまえば、あとは欲しいデータの内容に合わせてパラメーターを書き換えるだけでGoogleアナリティクスのデータを一括に大量にダウンロードできてしまいます。
頻繁に大規模サイトのAnalyticsを触られる方は一度APIを使って細かいデータを取得&分析してみることをお勧めします。