如何使用 Python 和 GA4 預測搜索流量

已發表: 2021-04-26

在任何專注於搜索引擎優化 (SEO) 的策略中,數據分析都是必不可少的。 該領域越來越多的專家選擇在有機搜索流量分析中發展自己的職業生涯,有機搜索流量本身俱有與其他完全不同的行為和特殊性:付費搜索、電子郵件、有機社交、直接等。這種感覺,並且由於當今可用的各種工具,與僅僅幾年前相比,這種研究已經成功地發展到了不可想像的程度。

這一重大進步主要是由於新方法和發展的出現,使我們能夠生成分析模型,而不必依賴複雜的數學運算。 我們很幸運能夠使用已經過測試並準備開始使用它們的技術和算法。

在下面的文章中,我們將重點關注為時間序列的一組數據創建預測模型,其中計算的趨勢會根據季節性和先前的周期性進行調整。 更具體地說,我們將通過 Google Analytics 4(以下簡稱 GA4)預測我們資產的自然搜索流量。 有很多選項可以執行此操作,但是對於這種特殊情況,我決定完全在 Python 中執行開發。
本文所依據的腳本由三個明顯不同的部分組成:

  • 數據提取。 如何逐步使用新的 GA4 API 收集自然搜索流量。
  • 數據建模。 使用 Facebook 的開源庫 Prophet 進行時間序列預測。
  • 數據可視化。 顯示趨勢變化和建模預測。

使用 Python 通過其 API 提取 GA4 數據

當我們處理 Google Analytics Data API (GA4) 時,我們首先需要知道的是,GA4 是它的開發狀態。 正如穀歌在其頁面上詳述的那樣,它目前處於早期版本。 具體來說,截至本文撰寫之日,它仍處於 Beta 階段。

需要注意的是,GA4 發佈於 2020 年 10 月 14 日,僅僅過去了幾個月。 事實上,那些已經擁有 Universal Analytics 媒體資源並創建新 GA4 媒體資源的人將能夠繼續並排使用這兩個版本,而沒有任何限制。 不確定 Universal Analytics 屬性何時停止工作。 無論如何,我的建議是盡快創建一個 GA4 類型的新屬性。 這樣,您將擁有更廣泛的數據歷史記錄。 還應該考慮到通過 GA4 的每一天都會集成新功能或改進現有功能。 目前它正在不斷發展。

正因為如此,下面描述的代碼當然可能會有一些小的變化。 儘管可以肯定,它們將是最小的。 例如,我已經遇到過一些小問題,例如在RunReportRequest() 類中將字段“entity”(Alpha 階段)重命名為“property”(Beta 階段)
首先,在構建 API 請求之前,需要了解哪些元素可用。 基本上,這都是關於遵循以下結構:

GA4 Data v1 Beta API 的 RunReportRequest 類型

乍一看,它很直觀,但實際情況卻大不相同。 要提出請求,必須始終至少準備好以下文件:

  • 谷歌 APIS 開發者。
  • 報告 Google Analytics 數據 API (GA4)。

這僅僅是因為字段名稱與官方文檔略有不同,官方文檔以 JSON 格式表示字段。 一個例子是 Filter 類的字段 fieldname。 在 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) 在項目目錄中安裝 Google Analytics 數據庫,將使用該 API 請求:
    pip install google-analytics-data

從這裡開始,您需要做的就是創建請求,如下所示,該請求基本上由三個部分(客戶端、請求和響應)組成,並查看或保存收集的數據。

向 GA4 發出簡單請求的代碼

添加到請求變量的任何維度、指標、過濾器、數據順序、日期範圍等都必須添加為鏈接到變量( 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' )。 出於這個原因,有必要理解並沉浸在前面描述的文檔中。

除此之外,必須特別注意變量os.environ [“GOOGLE_APPLICATION_CREDENTIALS”] ,它將包含先前在步驟 2 中下載的文件的路徑。這行代碼將避免在管理權限時出現一些問題谷歌 API。

如果代碼已正確執行,您將看到如下所示的結果: {Date, Events}, {20210418, 934}, {...}, ...。

抓取數據³

通過與其他數據集的無縫連接來擴展您的分析。 根據來自您的 CRM、監控解決方案或任何其他來源的反向鏈接、SEO 流量、排名和自定義數據集的數據分析您的 SEO 策略。
學到更多

通過 Facebook Prophet 進行數據預測

如今,有許多免費和現有的選項可以根據數據歷史執行任何類型的預測。 在這種特定情況下,我選擇了 Prophet 庫,但它到底是什麼?

它是由 Facebook 的數據科學團隊創建的開源庫(可用於 R 和 Python),用於基於加法模型估計時間序列數據集的行為,其中非線性趨勢調整為每日季節性、每周和每年的服用量考慮到假期的影響。
回到建議的實現(有機搜索流量預測),首先要做的是安裝以下庫:

  • 熊貓( pip install pandas )。 管理和分析數據結構。
  • 情節( pip install plotly )。 創建各種圖形。
  • 先知( conda install -c conda-forge fbprophet -y )。

然後,與往常一樣,您必須執行與這些庫關聯的導入。 在此之後,您唯一要做的就是執行預測的建模及其相應的可視化。 為此,對於 Prophet,您只需遵循以下流程:

  • 使用所需屬性初始化一個新的 Prophet 對像以生成預測。
  • 請求 fit 方法,將從 GA4 中提取的數據作為數據幀傳遞給它。 在某些情況下,此請求可能需要幾秒鐘。 帶有收集數據的數據框必須只包含兩個名稱始終相同的列:ds(日期類型字段)和 y(要研究的指標)。
  • 創建一個新的未來數據框,設置從所選日期範圍內預測應達到的周期數以及聚合數據的頻率(每週、每月等)
  • 請求 predict 方法,它將為新的未來數據幀的每一行分配一個預測值 (yhat)。
  • 請求 plot 方法能夠查看生成的預測。
  • 請求 plot_components 方法,該方法有助於直觀地了解數據的趨勢和季節性。
 m = 先知()
m.fit(df)
未來 = m.make_future_dataframe(週期=365)
預測 = m.predict(未來)
m.plot(預測)
m.plot_components(預測)
plt.show()

儘管只需六個步驟即可生成所需的預測,而且看起來相對簡單,但必須考慮幾個因素,這將是生成預測的關鍵。 它們都以一種或另一種方式影響預測的針對性。 最後,它是關於生成符合邏輯的預測,在本文的例子中,我們的自然搜索流量。 為此,有必要了解 Prophet 的一些更高級的設置。

  • 特殊的日子和假期。 有可能增加特殊的日子。
  • 異常值。 如果它們影響估計,則必須消除它們。
  • 變化點。 檢測分析時間內的趨勢變化。
  • 診斷。 根據數據的歷史研究,基於預測誤差測量的驗證。
  • 增加。 在線性或邏輯之間進行選擇。
  • 季節性。 在加法或乘法之間進行選擇。

所有這些以及更多的選項都在 Prophet 庫的文檔中得到了完美的詳細說明。

創建完整的腳本以可視化流量預測

現在剩下的就是將拼圖的所有部分連接到一個腳本中。 解決此類難題的常用方法是為每個先前詳細的流程創建一個函數,以便它們可以以有序和乾淨的方式執行:

 def ga4(property_id, start_date, end_date):
[…]

def 預測(dim,met,per,freq):
[…]

如果 __name__ == "__main__":
維度,指標 = ga4(PROPERTY_ID,START_DATE,END_DATE)
預測(維度、度量、週期、頻率)

在可視化預測的最終結果之前,最好先查看分析的自然搜索流量。

乍一看,您可以看到所採取的不同策略和行動如何隨著時間的推移產生影響。 與其他渠道(例如,付費搜索活動)不同,自然搜索產生的流量通常很少有明顯的波動(谷底或高峰)。 它往往會隨著時間的推移逐漸增長或下降,有時會受到季節性事件的影響。 通常,明顯的波動與搜索引擎算法(谷歌、必應等)的更新有關。

腳本的輸出如下圖所示,其中詳細介紹了趨勢、季節性、預測或數據頻率等重要因素。
如果我們分析得到的預測,可以得出一個通用的結論:“如果我們繼續採用迄今為止實施的相同的 SEO 策略,來自搜索引擎的流量將繼續逐漸增長”。 我們可以確保“我們為提高網站性能、生成優質內容、提供相關鏈接等所做的努力是值得的”。

可視化趨勢、季節性和預測、自然搜索流量的趨勢

最後,我將完整地共享代碼,以便您只需複制它並在 Python 的 IDE(集成開發環境)中運行它。 不用說,上面提到的所有庫都必須已安裝才能正常運行。

 將熊貓導入為 pd
導入 fbprophet
從 fbprophet 導入 Prophet
從 fbprophet.plot 導入 add_changepoints_to_plot
將 matplotlib.pyplot 導入為 plt
導入操作系統

從 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(property_id, start_date, end_date):
客戶端 = BetaAnalyticsDataClient()

request = RunReportRequest(property='properties/' + property_id,
尺寸=[尺寸(名稱='日期')],
指標=[指標(名稱='eventCount')],
date_ranges=[DateRange(start_date=start_date,
結束日期=結束日期)],
維度過濾器=過濾器表達式(
and_group=FilterExpressionList(表達式=[
FilterExpression(filter=Filter(field_name='sessionDefaultChannelGrouping',
string_filter=Filter.StringFilter(
value='有機搜索',
match_type=Filter.StringFilter.MatchType(
1)))),
FilterExpression(filter=Filter(field_name='eventName',
string_filter=Filter.StringFilter(
值='session_start',
match_type=Filter.StringFilter.MatchType(
1))))
]))
)

響應 = client.run_report(request)

x, y = ([] for i in range(2))
對於 response.rows 中的行:
x.append(row.dimension_values[0].value)
y.append(row.metric_values[0].value)
打印(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(data, columns=['ds', 'y'])

m =先知(增長='線性',
changepoint_prior_scale=0.5,
季節性模式='添加劑',
daily_seasonality=假,
每週_季節性=真,
yearly_seasonality=真,
假期=無,
)
m.fit(df)
未來 = m.make_future_dataframe(週期=p,頻率=f)
預測 = m.predict(未來)

打印(預測[['ds','yhat','yhat_lower','yhat_upper']].head())

fig = m.plot(預測,xlabel='Date',ylabel='Visits')
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)

我希望這篇文章能起到啟發作用,並在你的下一個項目中對你有很大的幫助。 如果您想繼續了解這種類型的實施或了解更多關於技術數字營銷的信息,請與我聯繫。 您可以在下面我的作者簡介中找到更多信息。