본문 바로가기
그로스해킹/GTM, GA4 API

Google Analytics용 Python API(GA4) 사용법(1)

by 코듀킹 2024. 6. 9.

이 문서에서는 GA4와 파이썬을 연결시켜서 파이썬에서 GA4 데이터를 불러오는 방법을 알아보겠다. 한가지 아쉬운 점은 빅쿼리처럼 모든 데이터를 불러올 수는 없다는 점이다. 어떤 데이터를 불러올 수 있는지는 이 문서를 참고하자.

 

작업 순서

1. 구글 문서 접속

https://developers.google.com/analytics/devguides/reporting/data/v1/quickstart-client-libraries?hl=ko

 

2. Google Analytics Data API v1 사용 설정 클릭

 

3. 이름 설정 후, Next 클릭

 

4. Download private key as JSON 클릭

 

5. client_email 복사

DOWNLOAD PRIVATE KEY AS JSON을 클릭하면, JSON 파일이 다운로드 된다.

구글 분석과 파이썬 코드 모두에서 승인할 API에 대한 키를 제공한다.

 

 

JOSN 파일을 열어, client_email 부분을 복사한다.

 

6. 구글 클라우드 콘솔에서 해야할 작업

1) cloud.google.com에서 구글 클라우드 콘솔에 접속한다.

2) 메뉴에서 API 및 서비스 > 라이브러리를 클릭한다.

3) Google Analytics Data API를 검색하여 '사용'을 클릭한다. (프로젝트를 생성할 때 승인이 필요한 API이다.)

4) API 및 서비스 > 사용 설정된 API 및 서비스에서 맨밑으로 스크롤을 내려 Google Analytics Data API가 있는지 확인한다.

5) 상단 구글 클라우드 로고 우측 버튼을 클릭하 새 프로젝트를 생성한다.

6) 프로젝트 이름을 설정하고, '만들기'를 클릭한다.

7) 새로 만든 프로젝트를 클릭한다. 그러면 Google Analytics Data API가 없는 것으로 확인 된다.

8) 상단의 '+ API 및 서비스 사용 설정'을 클릭한다.

9) Google Analytics Data API를 검색하여 '사용'을 클릭한다.

10) 사용자 인증 정보 탭을 클릭한 후, 상단 '+ 사용자 인증 정보 만들기'를 클릭한다.

11) '서비스 계정'을 클릭한다.

12) 서비스 계정이름을 설정하고, '완료'를 클릭한다.

13) 서비스 계정에 새로 생긴 이메일을 클릭후, 복사한다.
14) 상단 '키' 탭을 클릭 후, '키 추가' 클릭, '새 키 만들기'를 클릭한다.

15) JSON 키 유형으로 설정 후, '만들기' 클릭

 

7. GA4에서 해야할 작업

다음 단계 : 구글 분석에서 키를 승인하는 것. 이제 API에 엑세스할 수 있는 프로젝트가 있지만 다음 작업이 필요하다. GA4 속성에 대한 특정 데이터에 대한 엑세스 권한을 부여하므로 Analytics.google.com으로 이동한다.

 

1) 설정 > 계정 > 계정 엑세스 관리 클릭

2) +버튼 클릭 후, 사용자 추가 클릭

3) 상단 13번에서 복사해놓았던 이메일 주소를 붙여넣고, 뷰어 권한으로 추가

4) 속성 > 속성 세부정보에서 속성 ID 복사

 

8. 파이썬으로 해야할 작업

이제 GitHub 저장소의 Python 코드를 다운로드 받으면 아래와 같이 ipynb 파일을 열 수 있다.

 

위 네모박스 부분에 다운로드 받았던 json 파일 이름과, 복사해두었던 GA4 속성 ID를 붙여 넣는다.

 

Google 분석 패키지를 설치해야 라이브러를 실행할 수 있다. 4단계에서 깃허브에 접속하여 패키지 다운로드 코드를 확인하여 다운로드 받아준다.

 

아래 문서에는 사용자가 클릭하는 측정 기준과 측정항목이 나와있다. 여기서 뽑아야 하는 데이터를 확인한다.

 

이제 아래 코드 부분에서 필요한 데이터를 입력한다.

 

이제 코드를 전부 실행해준다. 그러면 아래와 같이 데이터가 잘 불러와지는 걸 확인할 수 있다.

 

 

 

코드 해석

1. 패키지

# Google Analytics Data API의 클라이언트를 초기화합니다. 이를 통해 API 호출을 수행할 수 있습니다.
from google.analytics.data_v1beta import BetaAnalyticsDataClient

# 보고서에 포함될 날짜 범위를 정의합니다. 예를 들어, 특정 기간 동안의 데이터를 요청할 수 있습니다.
from google.analytics.data_v1beta.types import DateRange

# 분석 보고서에서 측정기준을 나타냅니다. 예를 들어, 'country' 또는 'browser'와 같은 값을 사용할 수 있습니다.
from google.analytics.data_v1beta.types import Dimension

# 측정항목을 정의합니다. 예를 들어, 'activeUsers' 또는 'sessions'와 같은 값을 사용할 수 있습니다.
from google.analytics.data_v1beta.types import Metric

# Google Analytics Data API에서 보고서를 실행하는 데 필요한 요청 파라미터를 설정합니다. 이 객체에는 날짜 범위, 차원, 메트릭 등이 포함됩니다.
from google.analytics.data_v1beta.types import RunReportRequest

# 보고서 결과를 정렬하는 방법을 지정합니다. 예를 들어, 특정 메트릭을 기준으로 내림차순 또는 오름차순으로 정렬할 수 있습니다.
from google.analytics.data_v1beta.types import OrderBy

 

2. 환경 변수 설정

# os 모듈을 사용하여 환경 변수를 설정할 수 있습니다.
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'josn 파일 경로 + 이름'

# Google Analytics 4 속성 ID 설정
property_id = '속성 ID'

# Google Analytics Data API 클라이언트 초기화. 이 클라이언트를 통해 API에 요청을 보내고 데이터를 받을 수 있습니다.
client = BetaAnalyticsDataClient()

 

3. 요청 설정 (RunReportRequest)

request = RunReportRequest(
        property='properties/'+property_id,
        dimensions=[Dimension(name="month"), 
                    Dimension(name="sessionMedium")],
        metrics=[Metric(name="averageSessionDuration"), 
                 Metric(name="activeUsers")],
        order_bys = [OrderBy(dimension = {'dimension_name': 'month'}),
                    OrderBy(dimension = {'dimension_name': 'sessionMedium'})],
        date_ranges=[DateRange(start_date="2024-01-01", end_date="today")],
    )

 

  • property='properties/' + property_id: Google Analytics 속성 ID를 지정합니다. 이 ID는 property_id 변수에 저장된 값을 사용하여 설정합니다.
  • dimensions: 분석 보고서에서 사용할 차원들을 정의합니다.
    • Dimension(name="month"): 데이터의 '월'을 기준으로 분류합니다.
    • Dimension(name="sessionMedium"): 세션의 매체(예: 'organic', 'referral')를 기준으로 분류합니다.
  • metrics: 분석 보고서에서 사용할 메트릭들을 정의합니다.
    • Metric(name="averageSessionDuration"): 평균 세션 지속 시간을 측정합니다.
    • Metric(name="activeUsers"): 활성 사용자 수를 측정합니다.
  • order_bys: 보고서 결과를 정렬하는 기준을 정의합니다.
    • OrderBy(dimension={'dimension_name': 'month'}): 월을 기준으로 정렬합니다.
    • OrderBy(dimension={'dimension_name': 'sessionMedium'}): 세션 매체를 기준으로 정렬합니다.
  • date_ranges: 보고서의 날짜 범위를 설정합니다.
    • DateRange(start_date="2024-01-01", end_date="today"): 2024년 1월 1일부터 오늘까지의 데이터를 포함합니다.

 

4. 응답 받기 (run_report 메서드)

response = client.run_report(request)

 

이 코드는 Google Analytics Data API의 클라이언트를 사용하여 보고서 데이터를 요청하고 그 응답을 받는 부분입니다. 다음은 각 부분의 상세 해석입니다.

  • client: 이전에 초기화된 BetaAnalyticsDataClient 객체입니다. 이 객체는 Google Analytics Data API와 상호작용하는 데 사용됩니다.
  • run_report(request): client 객체의 메서드로, request를 인자로 받아 API에 보고서 데이터를 요청합니다.
  • request: RunReportRequest 객체로, 요청하려는 보고서의 날짜 범위, 차원, 메트릭 등을 정의합니다.
  • response: run_report 메서드의 반환값으로, 요청한 보고서 데이터가 포함된 응답 객체입니다. 이 객체는 차원 헤더, 메트릭 헤더, 데이터 행 등을 포함합니다.

동작 과정

  1. 요청 준비: request 객체에는 보고서에 포함할 날짜 범위, 차원, 메트릭 등의 정보가 설정되어 있습니다.
  2. API 호출: client.run_report(request)를 호출하여 Google Analytics Data API에 request에 정의된 조건에 맞는 보고서를 요청합니다.
  3. 응답 수신: API는 요청을 처리한 후 response 객체를 반환합니다. 이 객체에는 요청한 데이터가 포함되어 있습니다.

데이터 추출 결과(예시)

 

5. row 멀티 index 설정 

   # Row index
   row_index_names = [header.name for header in response.dimension_headers]
   row_header = []
   for i in range(len(row_index_names)):
       row_header.append([row.dimension_values[i].value for row in response.rows])

 

  • row_index_names: response.dimension_headers에서 각 측정항목의 API 이름을 추출하여 리스트로 만듭니다. 이는 데이터프레임의 인덱스 이름으로 사용됩니다.
  • row_header: 각 차원의 값을 추출하여 row_header 리스트에 추가합니다. 이 리스트는 나중에 데이터프레임의 MultiIndex로 사용됩니다.

 

주요 요소

  • response: Google Analytics Data API의 run_report 메서드를 호출한 결과로 얻은 응답 객체입니다.
  • response.rows: 응답 객체의 rows 속성으로, 각 행에는 보고서 데이터가 포함되어 있습니다.
  • row.dimension_values: 각 행의 차원 값들을 포함하는 리스트입니다.
  • dimension_values[i]: 차원 값 리스트의 i 번째 요소입니다.
  • value: 차원 값 객체의 value 속성으로, 실제 차원 값이 저장되어 있습니다.

동작 과정

  1. response.rows를 순회: response.rows 리스트의 각 row 객체에 대해 반복합니다.
  2. 두 번째 차원 값 추출: 각 row 객체의 dimension_values 리스트에서 i 번째 요소(dimension_values[i])를 가져옵니다.
  3. 차원 값의 value 추출: i 번째 차원 값 객체의 value 속성을 추출합니다.
  4. 리스트 생성: 모든 차원 값의 value를 모아서 새로운 리스트를 만듭니다.
row_index_named = pd.MultiIndex.from_arrays(np.array(row_header), names = np.array(row_index_names))

 

  • row_header: 각 차원의 값을 담고 있는 리스트입니다. 이 리스트는 이전에 row.dimension_values[i].value와 같은 코드로 채워졌을 것입니다.
  • row_index_names: 각 차원의 이름을 담고 있는 리스트입니다. 예를 들어, 'month', 'sessionMedium' 등이 될 수 있습니다.
  • np.array(row_header): row_header 리스트를 numpy 배열로 변환합니다. 이 배열은 MultiIndex의 각 수준의 값을 나타냅니다.
  • np.array(row_index_names): row_index_names 리스트를 numpy 배열로 변환합니다. 이 배열은 MultiIndex의 각 수준의 이름을 나타냅니다.
  • pd.MultiIndex.from_arrays: 주어진 배열로부터 MultiIndex 객체를 생성합니다.
    • from_arrays 메서드는 여러 배열을 받아서 각각을 MultiIndex의 한 수준으로 사용합니다.
    • names 인자는 각 수준의 이름을 지정합니다.

데이터 추출 결과(예시)

 

 

6. value 삽입 및 데이터 프레임으로 index와 합치기

# 메트릭 이름 추출
metric_names = [header.name for header in response.metric_headers]

 

  • metric_names: 응답 객체의 metric_headers에서 메트릭 이름들을 추출하여 리스트로 만듭니다.
  • response.metric_headers는 각 메트릭의 헤더 정보를 포함하고 있습니다.
  • 리스트 컴프리헨션을 사용하여 각 헤더의 name 속성을 추출합니다.
# 메트릭 값 추출
data_values = []
for i in range(len(metric_names)):
    data_values.append([row.metric_values[i].value for row in response.rows])
  • data_values: 메트릭 값들을 저장할 리스트입니다.
  • for i in range(len(metric_names)): 각 메트릭에 대해 반복합니다.
  • row.metric_values[i].value는 각 행에서 i번째 메트릭의 값을 추출합니다.
  • 각 메트릭의 값을 리스트로 모아서 data_values 리스트에 추가합니다.
# 데이터프레임 생성
output = pd.DataFrame(data=np.transpose(np.array(data_values, dtype='f')), 
                      index=row_index_named, columns=metric_names)

 

  • np.array(data_values, dtype='f'): data_values 리스트를 numpy 배열로 변환합니다. dtype='f'는 배열의 데이터 타입을 float로 설정합니다.
  • np.transpose(...): 배열을 전치(transpose)합니다. 원래 data_values는 메트릭별로 데이터가 정렬되어 있으므로, 이를 전치하여 각 행이 하나의 데이터 레코드가 되도록 합니다.
  • pd.DataFrame(...): numpy 배열을 pandas 데이터프레임으로 변환합니다.
    • data 인자는 전치된 numpy 배열입니다.
    • index 인자는 MultiIndex입니다. 이 인덱스는 이전에 생성된 row_index_named입니다.
    • columns 인자는 메트릭 이름 리스트인 metric_names입니다.

 

참고

 

댓글