BigQueryによるGAトラフィック分析

某旅行会社のeコマース部門にいます。BigQueryを利用してGoogleアナリティクスデータの分析例を紹介します。

BigQueryで特集ページのコンバージョン貢献を集計する

特集ページのコンバージョン貢献

f:id:webmarketer_desu:20200316184724j:plain

特集ページが見られたセッションで予約に至ったかどうかを把握する方法を紹介します。以前のエントリーでも書きましたが、GoogleアナリティクスのUI上でも特集ページごとにセグメントを設定すれば可能ですが、数が多いと面倒ですのでBigQueryで集計してしまいます。さらにデータポータルからそのテーブルを参照してモニタリングすることもできそうです。

特集ページによっては、セッション単位ではなくユーザー単位の行動を追う方がいいケースもあるかもしれませんが、ひとまずセッション単位で出してみたいと思います。

特集ページのセッション数集計

 こちらは紹介済のクエリですが、/product/とindex.htmlの間にある特集ページを識別するディレクトリだけをtokusyuというカラムに入れてPV数とセッション数を集計しています。

 select
 regexp_extract(hits.page.pagePath,r'www.example.com/product/(.*)/index.html') as        tokusyu,
 count(hits.page) as pageview,
 count(distinct visitid) as session 
 from `{bigqueryプロジェクトID}.{データセット}.ga_sessions_日付`
 ,unnest(hits) as hits
 group by 1
 ;

 eコマースサイトでトランザクションの計測をしている場合は、ここにtotals.transactionsをsumすればいいように思えるのですが、それでは正確な数はかえってきません。それを確認するために、以下のようなクエリを実行してみてください。

 select
 visitId,
 hits.page.pagePath,
 hits.page,
 totals.transactions
 from `{bigqueryプロジェクトID}.{データセット}.ga_sessions_日付`
 ,unnest(hits) as hit
 order by 4
 ;

 order by でトランザクションがあった順番にならべていますが、トランザクションの数字は該当するvisitIdのすべてのpagepathに入っているはずです。

下のような結果になっていると思いますが、この状態でtransactionsを合計すると実際よりも大きな数字になってしまいます。

f:id:webmarketer_desu:20200317184959p:plain

 セッション単位でトランザクション情報を格納したテーブルとジョイン

hits.transactions.transactionIdに予約番号のような値を送っている場合、重複を除外してカウントすればいいように思いますが、hits.transactions.transactionIdは予約完了ページのpagepathにしか紐づいていません。特集ページの行にはtransactionIdは存在しませんのでそれを使って集計する方法も適いません。

そこで、セッションとtransactionIdを紐づけたテーブルを用意し、最初に紹介したテーブルにjoinする方法をとります。

 with pv as(
 select
 concat(fullvisitorid,'_',visitid) as id,
 regexp_extract(hits.page.pagePath,r'www.example.com/product/(.*)/index.html') as        tokusyu,
 concat(clientId,visitId,date,(visitstarttime+hits.time))as pageview, 
 visitid, 
 from `{bigqueryプロジェクトID}.{データセット}.ga_sessions_日付`
 ,unnest(hits) as hits),
 tx as(
 select
 concat(fullvisitorid,'_',visitid) as id,
 hits.transaction.transactionId,
 from `{bigqueryプロジェクトID}.{データセット}.ga_sessions_日付`
 ,unnest(hits) as hits)
 select
 tokusyu
 count(distinct pageview) as pv,
 count(distinct visitid),
 count(distinct transactionid)
 (select
 tokusyu,
 pageview,
 visitId,
 transactionId,
 from pv
 left join tx
 using(id)
 group by 1,2,3,4)
 group by 1
 ;

まず、pvという名前でトランザクション以外のカラムをまとめます。ページビュー数は、fullvisitorid・visitid・date・(visitstarttime+hits.time)を結合することでhitが発生したユニークな値として格納しておきます。

txテーブルには、transactionIdとpvテーブル同様にfullvisitoridとvisitidを結合したユニークなセッションの情報をidと言う名前で格納します。

このidというカラムをキーにしてpvとtxをjoinすると、tokusyu、pageview、visitIdにtransactionIdを加えたテーブルができます。これをサブクエリとして集計すれば、特集単位のトランザクション貢献を把握することができます。

deviceCategoryやtrafficSource.mediumのカラムを追加すればより深堀できそうです。お試しください。