Python 및 GA4로 검색 트래픽을 예측하는 방법

게시 됨: 2021-04-26

검색 엔진 최적화(SEO)에 중점을 둔 모든 전략에서 데이터 분석은 필수적입니다. 이 분야에는 유료 검색, 이메일, 유기적 소셜, 다이렉트 등 나머지와 상당히 다른 행동과 특성을 지닌 유기적 검색 트래픽 분석에서 경력을 개발하기로 선택하는 전문가가 점점 더 많아지고 있습니다. 이러한 감각과 오늘날 사용할 수 있는 다양한 도구 덕분에 이러한 종류의 연구는 불과 몇 년 전과 비교할 때 상상할 수 없을 정도로 발전했습니다.

이러한 주요 진전은 주로 복잡한 수학적 연산에 의존하지 않고도 분석 모델을 생성할 수 있게 해주는 새로운 방법론 및 개발의 등장으로 인한 것입니다. 우리는 이미 테스트를 거쳐 작업을 시작할 준비가 된 기술과 알고리즘을 마음대로 사용할 수 있습니다.

아래 기사에서는 계산된 추세가 계절성과 이전 주기성에 맞게 조정되는 시계열 데이터 집합에 대한 예측 모델 생성에 중점을 둘 것입니다. 보다 구체적으로 말하면 Google Analytics 4(이하 GA4)에서 당사 자산의 자연 검색 트래픽을 예측할 것입니다. 이를 수행하기 위한 많은 옵션이 있지만 이 특별한 경우에는 개발을 완전히 Python으로 실행하기로 결정했습니다.
이 문서의 기반이 되는 스크립트는 명확하게 구분되는 세 부분으로 구성됩니다.

  • 데이터 추출 . 새로운 GA4 API를 단계별로 사용하여 자연 검색 트래픽을 수집하는 방법.
  • 데이터 모델링 . 시계열 예측을 위해 Facebook의 오픈 소스 라이브러리인 Prophet을 사용합니다.
  • 데이터 시각화 . 추세 변화 및 모델링된 예측을 표시합니다.

Python을 사용한 API를 통한 GA4 데이터 추출

Google Analytics Data API(GA4)를 다룰 때 가장 먼저 알아야 할 것은 GA4가 개발 상태라는 것입니다. 페이지에 Google이 자세히 설명했듯이 현재 초기 단계입니다. 특히 이 기사가 작성된 날짜를 기준으로 아직 베타 단계에 있습니다.

GA4는 2020년 10월 14일에 발행되었습니다. 몇 달이 지나지 않았습니다. 실제로 유니버설 애널리틱스 속성이 이미 있고 새 GA4 속성을 만드는 사용자는 제한 없이 두 버전을 나란히 계속 사용할 수 있습니다. 유니버설 애널리틱스 속성이 언제 작동을 멈출지는 확실하지 않습니다. 어쨌든 가능한 한 빨리 GA4 유형의 새 속성을 만드는 것이 좋습니다. 이렇게 하면 더 넓은 데이터 기록을 갖게 됩니다. 또한 GA4를 통과하는 날마다 새로운 기능이 통합되거나 기존 기능이 개선된다는 점을 고려해야 합니다. 현재 끊임없는 진화 중입니다.

이 때문에 물론 아래에 설명된 코드에 약간의 변경이 있을 수 있습니다. 확실히, 그것들은 최소한일 것입니다. 예를 들어 RunReportRequest() 클래스 내에서 "entity"(알파 단계) 필드 이름을 "property"(베타 단계)로 바꾸는 것과 같은 사소한 사소한 일을 이미 접했습니다.
무엇보다도 API 요청을 작성하기 전에 사용 가능한 요소에 대한 이해가 필요합니다. 기본적으로 다음 구조를 따르는 것이 전부입니다.

GA4 Data v1 Beta API의 RunReportRequest 유형

언뜻보기에는 매우 직관적이지만 현실은 상당히 다릅니다. 요청하려면 최소한 다음 문서를 항상 준비해야 합니다.

  • 구글 APIS 개발
  • 보고 Google Analytics 데이터 API(GA4).

이는 필드 이름이 JSON 형식으로 필드를 나타내는 공식 문서와 약간 다르기 때문입니다. 예는 Filter 클래스의 필드 필드 이름입니다. Python에서는 이를 field_name으로 설명해야 합니다. 좋은 일반 규칙은 항상 낙타 케이스 유형 필드(예: "fieldName")에서 스네이크 케이스(예: "field_name")로 이동하는 것입니다.

계속하기 전에 잠시 멈추고 프로젝트를 초기화하겠습니다. Python에서 스크립트를 개발할 때 대부분의 경우와 마찬가지로 필요한 라이브러리를 가져오고 실행 환경을 준비하는 데 약간의 시간을 소비해야 합니다.

  • Python에서 새 프로젝트를 만듭니다. 이 경우 PyCharm 소프트웨어가 사용되었습니다.
  • Google Cloud Platform에서 Google Analytics Data API를 활성화하고 생성된 서비스 계정 파일(JSON 유형)을 다운로드하여 Python 프로젝트가 생성된 폴더에 저장합니다. 이 파일을 열 때 client_email 필드의 값을 복사해야 합니다. 이 값은 [email protected]과 같을 것입니다.
  • 이 client_email 값을 데이터가 추출될 GA4 속성에 추가합니다. 사용자 관리 섹션에서 이 작업을 수행해야 합니다. 최소한 '읽기 및 분석' 권한 수준을 부여해야 합니다.
  • 클라이언트 터미널(PyCharm)을 통해 API 요청이 생성될 프로젝트 디렉토리에 Google 애널리틱스 데이터 라이브러리를 설치합니다.
    pip install google-analytics-data

이제부터는 기본적으로 3가지 부분(클라이언트, 요청, 응답)으로 구성된 요청을 생성하고 수집된 데이터를 보거나 저장하기만 하면 됩니다.

GA4에 간단한 요청을 하기 위한 코드

요청 변수에 추가된 모든 차원, 측정항목, 필터, 데이터 순서, 날짜 범위 등은 변수에 연결된 클래스(이전 이미지 "RunReportRequest 유형" 참조)로 추가되어야 합니다( metrics = [Metric (..)] ). 이렇게 하면 수집할 데이터의 구조를 훨씬 쉽게 이해할 수 있습니다. 이러한 의미에서 최고 수준의 각 클래스에 대해 특정 수입이 수행되어야 합니다. 즉, 특정 시간 범위에 대한 측정기준과 측정항목을 추가하려면 최소한 다음 개체가 필요합니다.

 google.analytics.data_v1beta 가져오기에서 BetaAnalyticsDataClient
google.analytics.data_v1beta.types 가져오기 RunReportRequest에서
google.analytics.data_v1beta.types 가져오기 DateRange에서
google.analytics.data_v1beta.types 가져오기 차원에서
google.analytics.data_v1beta.types 가져오기 측정항목에서

물론 특정 변수( name = 'eventCount' )에 특정 값을 추가하는 것도 가능합니다. 이러한 이유로 앞에서 설명한 설명서를 이해하고 침몰하는 것이 필수적입니다.

이 외에도 2단계에서 이전에 다운로드한 파일의 경로를 포함하는 os.environ [“GOOGLE_APPLICATION_CREDENTIALS”] 변수에 특별한 주의를 기울여야 합니다. 이 코드 줄은 구글 API.

코드가 올바르게 실행되면 {Date, Events}, {20210418, 934}, {…}, …

온크롤 데이터³

추가 데이터 세트에 대한 원활한 연결로 분석을 확장하십시오. CRM, 모니터링 솔루션 또는 기타 소스의 백링크, SEO 트래픽, 순위 및 사용자 지정 데이터 세트에 대한 데이터를 기반으로 SEO 전략을 분석합니다.
더 알아보기

Facebook Prophet을 통한 데이터 예측

요즘에는 데이터 기록을 기반으로 모든 유형의 예측을 수행할 수 있는 무료 및 기존 옵션이 많이 있습니다. 이 특정한 경우에 나는 Prophet 라이브러리를 선택했지만, 그것이 실제로 무엇입니까?

비선형 추세가 일별 계절성, 주별 및 연도별로 조정되는 가법 모델을 기반으로 시계열 데이터 세트의 동작을 추정하기 위해 Facebook의 데이터 과학 팀에서 만든 오픈 소스 라이브러리(R 및 Python에서 사용 가능)입니다. 휴가의 영향을 고려합니다.
제안된 구현(유기적 검색 트래픽 예측)으로 돌아가서 가장 먼저 할 일은 다음 라이브러리를 설치하는 것입니다.

  • 팬더( pip install pandas ). 데이터 구조를 관리하고 분석합니다.
  • Plotly ( pip install plotly ). 모든 종류의 그래픽 생성.
  • 예언자( conda install -c conda-forge fbprophet -y ).

그런 다음 항상 그렇듯이 이러한 라이브러리와 관련된 가져오기를 수행해야 합니다. 그 후에는 예측 모델링 및 해당 시각화를 수행하기만 하면 됩니다. 이렇게 하려면 Prophet의 경우 다음 절차만 수행하면 됩니다.

  • 원하는 속성으로 새 Prophet 개체를 초기화하여 예측을 생성합니다.
  • 적합 방법을 요청하고 GA4에서 추출한 데이터를 데이터 프레임으로 전달합니다. 이 요청은 경우에 따라 몇 초가 걸릴 수 있습니다. 수집된 데이터가 있는 데이터 프레임은 이름이 항상 동일한 두 개의 열, 즉 ds(날짜 유형 필드)와 y(연구할 메트릭)로만 구성되어야 합니다.
  • 선택한 날짜 범위에서 예측에 도달해야 하는 기간의 수와 데이터가 집계되는 빈도(주별, 월별 등)를 설정하는 새 미래 데이터 프레임을 만듭니다.
  • 새로운 미래 데이터 프레임의 각 행에 예측 값(yhat)을 할당하는 예측 방법을 요청합니다.
  • 생성된 예측을 볼 수 있도록 플롯 메서드를 요청합니다.
  • 데이터의 추세와 계절성을 시각적으로 이해하는 데 도움이 되는 plot_components 메서드를 요청합니다.
 m = 예언자()
m.fit(df)
미래 = m.make_future_dataframe(마침표=365)
예측 = m.predict(미래)
m.plot(예측)
m.plot_components(예측)
plt.show()

원하는 예측이 단 6단계로 생성되었고 비교적 간단해 보이지만 예측을 생성하는 데 핵심이 될 몇 가지 요소를 고려해야 합니다. 그것들은 모두 어떤 식으로든 예측의 적절성에 영향을 미칩니다. 결국, 이 기사의 경우 자연 검색 트래픽의 논리에 맞는 예측을 생성하는 것입니다. 이를 위해서는 Prophet의 고급 설정에 대한 이해가 필요합니다.

  • 특별한 날과 휴가. 특별한 날을 추가할 가능성이 있습니다.
  • 이상치. 추정에 영향을 미치는 경우 제거해야 합니다.
  • 변경점. 분석 시간에 따른 추세 변화 감지.
  • 진단. 데이터의 과거 연구에 따른 예측 오차 측정을 기반으로 한 검증입니다.
  • 증가하다. 선형 또는 로지스틱 중에서 선택.
  • 계절성. 덧셈과 곱셈 중 선택.

이 모든 옵션과 더 많은 옵션은 이 Prophet 라이브러리 문서에 완벽하게 설명되어 있습니다.

교통 예측을 시각화할 수 있는 완전한 스크립트 작성

이제 남은 것은 모든 퍼즐 조각을 하나의 스크립트로 결합하는 것입니다. 이러한 유형의 퍼즐을 해결하는 일반적인 방법은 이전에 상세하게 설명된 각 프로세스에 대한 함수를 생성하여 질서 있고 깔끔한 방식으로 실행할 수 있도록 하는 것입니다.

 def ga4(속성 ID, 시작 날짜, 종료 날짜):
[…]

def 예측(dim, met, per, freq):
[…]

__name__ == "__main__"인 경우:
측정기준, 측정항목 = ga4(PROPERTY_ID, START_DATE, END_DATE)
예측(차원, 측정항목, PERIODS, FREQ)

예측의 최종 결과를 시각화하기 전에 분석된 유기적 검색 트래픽을 살펴보는 것이 좋습니다.

언뜻 보기에 취한 다양한 전략과 조치가 시간이 지남에 따라 어떻게 영향을 미쳤는지 알 수 있습니다. 다른 채널(예: 유료 검색 캠페인)과 달리 자연 검색에서 생성된 트래픽은 일반적으로 감지할 수 있는 진동(계곡 또는 피크)이 거의 없습니다. 시간이 지남에 따라 점차 증가하거나 감소하는 경향이 있으며 때로는 계절적 사건의 영향을 받습니다. 일반적으로 눈에 띄는 변동은 검색 엔진 알고리즘(Google, Bing 등)의 업데이트와 관련이 있습니다.

스크립트의 출력은 추세, 계절성, 예측 또는 데이터 빈도와 같은 중요한 요소가 자세히 설명된 다음 이미지에서 볼 수 있습니다.
얻은 예측을 분석하면 "지금까지 구현된 것과 동일한 SEO 전략을 계속하면 검색 엔진의 트래픽이 점진적으로 계속 증가할 것"이라는 일반적인 결론을 내릴 수 있습니다. 우리는 "웹사이트의 성능 개선, 양질의 콘텐츠 생성, 관련 링크 제공 등을 위한 우리의 노력이 가치가 있었다"고 확신할 수 있습니다.

유기적 검색 트래픽의 추세, 계절성 및 예측, 추세 시각화

결론적으로 코드 전체를 공유하여 Python의 IDE(통합 개발 환경)에서 복사하여 실행하기만 하면 됩니다. 이것이 제대로 실행되려면 위에서 언급한 모든 라이브러리가 설치되어 있어야 한다는 것은 말할 필요도 없습니다.

 pandas를 pd로 가져오기
가져오기 fbprophet
fbprophet에서 가져오기 예언자
fbprophet.plot에서 가져오기 add_changepoints_to_plot
matplotlib.pyplot을 plt로 가져오기
수입 OS

google.analytics.data_v1beta 가져오기에서 BetaAnalyticsDataClient
google.analytics.data_v1beta.types 가져오기 DateRange에서
google.analytics.data_v1beta.types 가져오기 차원에서
google.analytics.data_v1beta.types 가져오기 측정항목에서
google.analytics.data_v1beta.types 가져오기 필터에서
google.analytics.data_v1beta.types 가져오기 FilterExpression에서
google.analytics.data_v1beta.types에서 FilterExpressionList 가져오기
google.analytics.data_v1beta.types 가져오기 RunReportRequest에서

재산_
START_DATE = '2020-01-01'
END_DATE = '2021-03-31'
기간 = 4
주파수 = 'M'

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "[여기에 자격 증명이 있는 json 파일의 경로 추가]"

def ga4(속성 ID, 시작 날짜, 종료 날짜):
클라이언트 = BetaAnalyticsDataClient()

요청 = RunReportRequest(속성='속성/' + property_id,
차원=[차원(이름='날짜')],
측정항목=[측정항목(이름='eventCount')],
date_ranges=[DateRange(start_date=start_date,
end_date=end_date)],
dimension_filter=FilterExpression(
and_group=FilterExpressionList(표현식=[
FilterExpression(filter=Filter(field_name='sessionDefaultChannelGrouping',
string_filter=Filter.StringFilter(
값='자연 검색',
match_type=Filter.StringFilter.MatchType(
1)))),
FilterExpression(filter=Filter(field_name='eventName',
string_filter=Filter.StringFilter(
값 = '세션_시작',
match_type=Filter.StringFilter.MatchType(
1))))
]))
)

응답 = client.run_report(요청)

x, y = (범위(2)의 i에 대한 [])
response.rows의 행:
x.append(row.dimension_values[0].value)
y.append(row.metric_values[0].value)
print(row.dimension_values[0].value, row.metric_values[0].value)

반환 x, y

def 예측(x, y, p, f):
print('예언자 %s' % fbprophet.__version__)

데이터 = {'ds': x, 'y': y}
df = pd.DataFrame(데이터, 열=['ds', 'y'])

m = 예언자(성장='선형',
changepoint_prior_scale=0.5,
Seasonity_mode='첨가제',
Daily_seasonality=거짓,
Weekly_seasonality=참,
yearly_seasonality=참,
휴일=없음,
)
m.fit(df)
미래 = m.make_future_dataframe(마침표=p, 주파수=f)
예측 = m.predict(미래)

print(예측[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())

fig = m.plot(예측, xlabel='날짜', ylabel='방문수')
add_changepoints_to_plot(fig.gca(), m, 예측)
m.plot_components(예측)
plt.show()

__name__ == "__main__"인 경우:
channel_group, event_count = ga4(PROPERTY_ID, START_DATE, END_DATE)
예측(channel_group, event_count, PERIODS, FREQ)

이 기사가 영감을 주고 다음 프로젝트에서 큰 도움이 되기를 바랍니다. 이러한 유형의 구현에 대해 계속 배우고 싶거나 기술적인 디지털 마케팅에 대해 자세히 알아보려면 저에게 연락하십시오. 아래의 저자 프로필에서 더 많은 정보를 찾을 수 있습니다.