Python日記

【現場の実例公開:GA4の自動レポート作成】PythonとGoogle APIを使ったイベント計測

2021年9月1日

現役マーケターのクリワンです。

僕は、GA4のレポートをPythonで自動化しています。

今回は、現場で使っている自動レポートの一部抜粋をご紹介していきます。

僕はノンプログラマーなので、もっと効率のいい方法があるかもしれませんが、

この方法でも十分に実務に対応でき、かつ簡単に測定が可能です。

毎日のレポート作成を自動化して、もっとやるべきことに専念していきましょう。

環境

Mac 11.4

python 3.9

仮想環境:Poetry

前回までの振り返り

前提を割愛しますが、詳しく知りたい方は以下の記事でチェックしてみてください。

僕の場合は、セキュリティの都合でスプレッドシートの使用制限があるため、

今回もGA4とエクセルでの連携をしていきます。

必要であれば、エクセルデータはこちらからダウンロードできます。
参考までなので、適宜修正するか、お使いのフォーマットで大丈夫です

インポートするモジュールも前回までと同じ内容です。

今回の記事では、一部不要なモジュールもありますが、そのまま記載しています。

from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import DateRange
from google.analytics.data_v1beta.types import Dimension
from google.analytics.data_v1beta.types import Metric
from google.analytics.data_v1beta.types import RunReportRequest
import os
import openpyxl as op
import re
import datetime
import pandas as pd
from datetime import datetime, date, time
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'creds_ga2.json'

表示したいデータを決める

こちらの冒頭も前回までと同じです。

それに加えて、今回は測定したい値を 変数 = 0 と記入しました。

例えば、pageViewはPV数、formClickはフォームをクリックした数を表しています。

def sample_run_report(property_id="xxxxxxxxxxx"):
    client = BetaAnalyticsDataClient()
    wb = op.load_workbook('test.xlsx')
    sheet = wb.get_sheet_by_name('Sheet')
    #最大行
    maxRow = sheet.max_row + 1
    #最大列
    maxClm = sheet.max_column + 1

    reportDate = []
    pageView = 0
    userCount = 0
    newUserCount = 0
    formClick = 0
    conversion = 0
    pricePage = 0
    applyPage = 0
    desktopCount = 0
    mobileCount = 0
    tabletCount = 0
    mediumOrganic = 0
    mediumCpc = 0
    mediumSocial = 0
    mediumReferral = 0

必要なイベントを Google Tag Manager で作成する

GA4をPythonで計測する際に、基本的なPV数やコンバージョン数など標準で計測できます。

でも、特別のページやユーザーの行動などの測定したいケースも多くありますよね。

その場合に便利なのが、Google Tag Manager でイベントを作成することです。

イベント作成の仕方は以下の記事を参考にしてください。

ちなみに、今回の例では、

  • formClick = 0
  • pricePage = 0
  • applyPage = 0

はGoogle Tag Manager でイベントをたてて計測をしているものです。

Dimension×Metricsでリクエストを作成する

GA4のデータをAPIから取得する場合は、

  • Dimension
  • Metrics
  • Data_ranges

を掛け合わせてデータを取得します。

今回は、

Dimension → date、eventName、deviceCategory、mediumの4つ

MetricsactiveUsers、newUsers、eventCount の3つ

Daterange → yesterday

を掛け算して、情報を取り出していきます。

request = RunReportRequest(
        property=f"properties/{xxxxxxxxx}",
        dimensions=[Dimension(name="date"),Dimension(name="eventName"),Dimension(name="deviceCategory"),Dimension(name="medium")],
        metrics=[Metric(name="activeUsers"),Metric(name="newUsers"),Metric(name="eventCount"),],
        date_ranges=[DateRange(start_date="yesterday", end_date="yesterday")],
    )

re.matchで条件分岐

re.matchで条件分岐をして細かい設定をしています。

    response = client.run_report(request)
    print("Report result:")
    for row in response.rows:
        if re.match("xxxxx_pv", row.dimension_values[1].value) :
            #reportDate = datetime.strptime(row.dimension_values[0].value, '%Y%m%d')
            pageView += int(row.metric_values[2].value)
            userCount += int(row.metric_values[0].value)
            newUserCount += int(row.metric_values[1].value)
            if re.match("desktop", row.dimension_values[2].value) :
                desktopCount += int(row.metric_values[0].value) 
            elif re.match("mobile", row.dimension_values[2].value) :
                mobileCount += int(row.metric_values[0].value)
            elif re.match("tablet", row.dimension_values[2].value) :
                tabletCount += int(row.metric_values[0].value)  
        elif re.match("xxxxx_before_download", row.dimension_values[1].value) :
            formClick += int(row.metric_values[0].value) #フォームクリック
        elif re.match("xxxxx_download", row.dimension_values[1].value) :
            conversion += int(row.metric_values[0].value) #コンバージョン
            print(row.dimension_values[3].value,row.metric_values[0].value)
            if re.match("organic", row.dimension_values[3].value) :
                mediumOrganic += int(row.metric_values[0].value)
            elif re.match("cpc", row.dimension_values[3].value) :
                mediumCpc += int(row.metric_values[0].value)          
        elif re.match("xxxxx_price_path", row.dimension_values[1].value) :
            pricePage += int(row.metric_values[0].value) #料金
        elif re.match("xxxxx_apply_cv", row.dimension_values[1].value) :
            applyPage +=  int(row.metric_values[0].value) #お申し込みページ                  
        else:
            pass

例えば、冒頭の以下の記述をみてみます。

re.match("xxxxx_pv", row.dimension_values[1].value)

row.dimention_values[1].value は、先に設定したdimensionsのリストの2つ目を指しています。

つまり、eventname が、"xxxxx_pv"と一致しているものを呼び出しているということです。

もしも、一致している場合は、eventCountがプラスされていくように以下で設定しています。

pageView += int(row.metric_values[2].value)

Dimension×Metricsを使って、必要なデータを引っ張ってくるのが、

少し手間のかかるところですが、いろいろと試して数値を出してみると慣れてくると思います。

エクセルシートへの書き出し

最後にエクセルシートへの書き出しを命令します。

この記事では、取り出した数値を最終行にすべて書き込んでいく記述を書いています。

    sheet.cell(maxRow,column=2).value = pageView #PV数
    sheet.cell(maxRow,column=3).value = userCount #ユーザー数
    sheet.cell(maxRow,column=4).value = newUserCount #新規ユーザー
    sheet.cell(maxRow,column=5).value = formClick #フォームクリック
    sheet.cell(maxRow,column=6).value = conversion #コンバージョン
    sheet.cell(maxRow,column=7).value = pricePage #料金
    sheet.cell(maxRow,column=8).value = desktopCount #デスクトップ
    sheet.cell(maxRow,column=9).value = mobileCount#モバイル
    sheet.cell(maxRow,column=10).value = tabletCount #タブレット
    sheet.cell(maxRow,column=11).value = mediumOrganic
    sheet.cell(maxRow,column=12).value = mediumCpc
    sheet.cell(maxRow,column=13).value = mediumSocial
    sheet.cell(maxRow,column=14).value = mediumReferral
    maxRow += 1
    wb.save("test.xlsx")  


if __name__ == '__main__':
    #main()
    sample_run_report()

これで記述は完成です。

まとめ

今回は、僕が実際に仕事で使っている、

GA4の自動レポートの抜粋をご紹介しました。

かなり細かくレポートを作成したいので、

実際にはもっと多くの情報を取得していますが、

項目を調整するメンテナンス以外は一切時間がかかっていません。

cronを使って、コードの実行まで自動化することで、作業時間をゼロにできました。

ぜひ参考にしてください。

-Python日記