如何使用 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 发出简单请求的代码

添加到请求变量的任何维度、指标、过滤器、数据顺序、日期范围等都必须添加为链接到变量的类(参见上图“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' )。 出于这个原因,有必要理解并沉浸在前面描述的文档中。

除此之外,必须特别注意变量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)

我希望这篇文章能起到启发作用,并在你的下一个项目中对你有很大的帮助。 如果您想继续了解这种类型的实施或了解更多关于技术数字营销的信息,请与我联系。 您可以在下面我的作者简介中找到更多信息。