データ活用

【使いまわせる!】Google Analytics 4からデータを取得する【Python】

うねうね

本記事では、Google Analytics 4(GA4)にあるデータをPythonから取得する方法を紹介します。2023年7月でUniversal Analyticsが廃止されGA4への移行が必要になり、GA4では「Data API」と呼ばれる新しいAPIを使うことになりました。今回はこちらの「Data API」の利用方法に特にフォーカスして紹介していきます。

本記事で紹介するPythonプログラムは使いまわしがし易いようにしておりますので、ぜひご活用ください!

事前準備

GA4の設定

GA4からData APIを使ってデータを取得するためには、サービスアカウントを作成や認証ファイルの取得が必要です。この部分はさまざまなページで紹介されているので調べてみてください。

個人的には、Google 公式のQuick Startおよび下記のページが参考になりました。

【API Quick Start|Google Analytics】

【Python Tips: Google Analytics Data API v1 に移行したい】

Pythonライブラリのインストール

今回紹介するPythonスクリプトを実行するために、下記よりライブラリをインストールしてください。

pip install pandas
pip install google-analytics-data

PythonからGA4のデータを取得してCSVに出力

ユーザー設定ファイルの作成

GA4からデータを取得する上で必要な認証ファイル及びプロパティIDを指定しておく設定ファイルを作成します。下記をコピー&ペーストして、「config_GA4.ini」などとして保存します。

[DEFAULT]
GOOGLE_APPLICATION_CREDENTIALS = C:\Workspace\python\get_data_GA4\configs\sample-test-user-*****.json
PROPERTY_ID = 123456789
FILTER_FIELD = pagePathPlusQueryString
FILTER_EXPRESSION = /aaa
  • GOOGLE_APPLICATION_CREDENTIALS:認証ファイルのパスを指定します。
  • PROPERTY_ID:プロパティIDを指定します。
  • FILTER_FIELD/FILTER_EXPRESSION:取得するデータに対して絞り込みを行う際に指定します。
    例のように「pagePathPlusQueryString」、「/aaa」と指定するとアクセスされたページパスのうち、「/aaa」から始まるページのみに絞り込まれます。絞り込みを行わない場合は、「FILTER_EXPRESSION = 」といった形で右辺を空欄にすればOKです。

Pythonスクリプトの作成

下記はGA4からデータを取得するPythonスクリプトの一例です。こちらを「get_GA4_data_main.py」などとして保存します。

import os
import argparse

from google.analytics.data_v1beta import BetaAnalyticsDataClient
from google.analytics.data_v1beta.types import (
    DateRange,
    Dimension,
    Metric,
    Filter,
    FilterExpression,
    RunReportRequest,
)
import configparser
import pandas as pd

parser = argparse.ArgumentParser(description='This script gets GA4 data and store as CSV. ')
parser.add_argument('-configfile_GA_path', help = "Set path including config file name e.g. C:/Users/hogehoge/config.ini ", required = True)
parser.add_argument('-startdate', help = "Set startdate to insert into database as hyphen dilimiter yyyy-mm-dd e.g. 2021-01-01 ", required = True)
parser.add_argument('-enddate', help = "Set enddate to insert into database as hyphen dilimiter yyyy-mm-dd e.g. 2021-01-07 ", required = True)
parser.add_argument('-csv_path', help = "Set path to save csv path e.g. C:/Users/hogehoge", required = True)
parser.add_argument('-csv_prefix_name', help = "Set prefix csv name as [prefix name]yyyy-mm-dd~yyyy-mm-dd[suffix name]. ", default = "", required = False)
parser.add_argument('-csv_suffix_name', help = "Set suffix csv name as [prefix name]yyyy-mm-dd~yyyy-mm-dd[suffix name]. ", default = "", required = False)
args = parser.parse_args()

DIMENSIONS = [
    "date", 
    "dateHourMinute",
    "pagePathPlusQueryString",
    "sessionSource",
    "deviceCategory", 
    "operatingSystem", 
    "pageTitle"
    ]

METRICS = [
    "totalUsers",
    "sessions",
    "screenPageViews",
    "userEngagementDuration"
]

class get_GA4_data():
    def __init__(self, config_ini_path):
        config_ini = configparser.ConfigParser()
        if not os.path.exists(config_ini_path):
            raise FileNotFoundError(config_ini_path + " is not found. ")
        config_ini.read(config_ini_path, encoding="utf-8")
        

        self.GOOGLE_APPLICATION_CREDENTIALS = config_ini['DEFAULT']['GOOGLE_APPLICATION_CREDENTIALS']
        os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = config_ini['DEFAULT']['GOOGLE_APPLICATION_CREDENTIALS']
        self.PROPERTY_ID = config_ini['DEFAULT']['PROPERTY_ID']
        self.FILTER_FIELD = config_ini['DEFAULT']['FILTER_FIELD']
        self.FILTER_EXPRESSION = config_ini['DEFAULT']['FILTER_EXPRESSION']
        print(f"self.FILTER_FIELD: {self.FILTER_FIELD}")
        print(f"self.FILTER_EXPRESSION: {self.FILTER_EXPRESSION}")


    def sample_run_report(self, startdate = "2023-03-01", enddate = "2023-03-07"):
        """Runs a simple report on a Google Analytics 4 property."""
        # TODO(developer): Uncomment this variable and replace with your
        #  Google Analytics 4 property ID before running the sample.
        # property_id = "YOUR-GA4-PROPERTY-ID"

        # Using a default constructor instructs the client to use the credentials
        # specified in GOOGLE_APPLICATION_CREDENTIALS environment variable.
        client = BetaAnalyticsDataClient()

        request = RunReportRequest(
            property=f"properties/{self.PROPERTY_ID}",
            dimensions=[ Dimension(name = dim) for dim in DIMENSIONS],
            metrics=[ Metric(name = met) for met in METRICS],
            date_ranges=[DateRange(start_date=startdate, end_date=enddate)],
            dimension_filter=FilterExpression(
                filter=Filter(
                    field_name = self.FILTER_FIELD,
                    string_filter = Filter.StringFilter(match_type = "BEGINS_WITH", value = self.FILTER_EXPRESSION),
                )
            ),
        )
        self.response = client.run_report(request)

    def make_dataframe(self):
        output_header = DIMENSIONS + METRICS
        print(output_header)
        
        ### 辞書にしてDataframe化
        output_dic = {}
        for header in output_header:
            output_dic[header] = []

        for row in self.response.rows:
            value_list = []
            value_list += [elem.value for elem in row.dimension_values]
            value_list += [elem.value for elem in row.metric_values]

            for k,v in zip(output_header, value_list): 
                output_dic[k].append(v)
        
        self.df = pd.DataFrame(output_dic)
        
    def write_csv(self, filename):
        self.df.to_csv(filename, index=False)

def main():
    config_GA_path = args.configfile_GA_path
    csv_path = args.csv_path
    csv_prefix_name = args.csv_prefix_name
    csv_suffix_name = args.csv_suffix_name
    startdate = args.startdate
    enddate = args.enddate
    
    con_GA = get_GA4_data(config_GA_path)
   
    con_GA.sample_run_report(startdate=str(startdate), enddate=str(enddate))
    con_GA.make_dataframe()
    filename = csv_path + "/" + csv_prefix_name + str(startdate) + "~" + str(enddate) + csv_suffix_name +".csv"
    con_GA.write_csv(filename)

if __name__ == "__main__":
    main()

取得データに含めたいDIMENSIONSもしくはMETIRCSは、コード上部のリストに直接追加してください。

実行

では実行してみましょう!コマンドプロンプトから下記のコマンドを実行します。

python .\get_GA4_data_main.py -configfile_GA_path "C:\Workspace\python\get_data_GA4\configs\config_GA4.ini" -startdate "2024-01-01" -enddate "2024-01-07" -csv_path "C:\Workspace\python\get_data_GA4\data\"
  • -configfile_GA_path:「ユーザー設定ファイルの作成」節で作成したiniファイルのパスを指定します。
  • -startdate/-enddate:データを取得する期間を「yyyy-mm-dd」の形式で指定します。
  • -csv_path:CSVファイルを出力するパスを指定します。

上記を実行すると、指定したフォルダに指定した期間のCSVファイルが出力されていることを確認できますね!!

さいごに

本記事では、PythonからGA4のデータを取得する方法について紹介しました。汎用的に使えるようCSVファイルとして出力する設計にしておりますので、例えばデータベースに格納したり、BIツールで分析して、データの”活用”を進めてみてくださいね!

Google Sheet上で管理・分析する場合には、こちらの記事も参考になるので是非ご覧ください!

あわせて読みたい
CSVファイルを自動でGoogle Sheetへ格納する【Pythonから追加・上書き】
CSVファイルを自動でGoogle Sheetへ格納する【Pythonから追加・上書き】
ABOUT ME
うねうね
うねうね
データエンジニア
記事を読んでいただいている皆さんが理解しやすくかつ手軽に試せることを意識して、データの蓄積、加工、分析・可視化のノウハウを発信していきます!Pythonを使ったデータ収集基盤作成及びそのノウハウ発表で登壇したりしています。
記事URLをコピーしました