Если все будет работать, как запланировано, к апрелю следующего года наш корпоративный веб-сайт будет более заметен в Google Поиске, чем сайт нашего ближайшего конкурента🚀. Что ж, это смелое заявление, вы может подумать, но можно ли подтвердить это данными?

Темы этой статьи:

  • Что такое индекс видимости SISTRIX?
  • Что такое Пророк (облегченное введение)?
  • Пошаговый пример Python с Google Colab

Что такое индекс видимости SISTRIX?

В общем, SISTRIX Toolbox — это хорошо известный коммерческий SEO-инструмент, который позволяет маркетологам, SEO-специалистам и другим специалистам анализировать эффективность веб-сайтов, например, исследовать ключевые слова или создавать тексты, оптимизированные для поисковых систем.

Вкратце SISTRIX описывает индекс видимости следующим образом:

С помощью индекса видимости вы можете понять, как развивался ваш домен с Google. Независимо от внешних воздействий, вы можете видеть, успешна ли ваша деятельность по SEO или она движется в неправильном направлении. Влияние обновлений Google на ваш рейтинг также очень точно отображается в Индексе видимости.[1]

Основываясь на этом объяснении, можно сделать вывод, что в ситуации, когда ваша видимость выше, чем у конкурентов, ваши собственные органические результаты в среднем занимают более видное место в поиске Google, что, безусловно, является сильным упрощением. но звучит как достойная цель с точки зрения маркетологов.

Расчет KPI индекса видимости основан на трехэтапном подходе, который учитывает ранжирование определенных ключевых слов, их объем поиска, а также «ожидаемую вероятность клика». Эти факторы взвешиваются и приводят к итоговому индексу видимости для определенного домена или даже URL¹. Фактически, SISTRIX уже указывает, что индекс видимости можно использовать в качестве эталона для сравнения с конкурентами [1].

Тем не менее, нужно учитывать, что мы наблюдаем динамический процесс, а это означает, что, как мы работаем над нашим сайтом, так и наш конкурент. Исходя из предположения, что каждая компания следует своей текущей стратегии SEO, и поскольку SISTRIX отфильтровывает внешнее влияние, как указано выше, было бы интересно посмотреть, достигнем ли мы, и если да, то когда, большей видимости, чем наши конкуренты. С другой стороны, это также показало бы, есть ли опасность того, что наши конкуренты обойдут нас в среднесрочной или долгосрочной перспективе.

Итак, почему бы не добавить компонент прогнозирования в чистое сравнительное тестирование?

Вот тут-то и появляется Пророк…

Что такое пророк Facebook?

Prophet — это программное обеспечение для прогнозирования с открытым исходным кодом, которое первоначально было выпущено основной командой Facebook по обработке и анализу данных в 2017 году [2]. По словам авторов статьи Prophet, Prophet предназначен для прогнозирования временных рядов бизнеса, которые имеют несколько характеристик. К ним относятся, например, сезонные эффекты на еженедельной или ежегодной основе, а также изменения в определенные даты, например Рождество, или эффекты, вызванные праздниками. Более того, изменения основного тренда могут происходить из-за изменений на рынке или других факторов [3]. Эти аспекты приводят к трудностям в получении разумных прогнозов с помощью полностью автоматизированных методов [3].

Пакет Prophet пытается решить эти аспекты с помощью разложимой модели, состоящей из трех компонентов.

y(t) = g(t) + s(t) + h(t) + et

где

  • g(t) — функция тренда, которая моделирует непериодические изменения значения временного ряда,
  • s(t) представляет собой периодические изменения (например, еженедельную и годовую сезонность).
  • h(t) представляет влияние праздников, которые происходят по потенциально нерегулярному графику в течение одного или нескольких дней (при наличии),
  • et представляет любые идиосинкразические изменения, которые не учитываются моделью [3].

Подбирая каждый из компонентов, Prophet автоматически создает модель для прогнозирования значений временного ряда y(t). В целом, Prophet определяет прогнозирование как проблему подбора кривой и не учитывает в явном виде структуру временной зависимости временного ряда [3]. Последнее является одним из самых серьезных критических замечаний в адрес Prophet, например, Menculini et al. обнаружили, что традиционные модели ARIMA работают намного лучше, чем Prophet [4, 5]. В ответ на это Facebook выпустил NeuralProphet, который является расширением Prophet [6], основанным на глубоком обучении. Тем не менее, мы попробуем Prophet… возможно, мы сможем сравнить другие подходы в другом посте.

Теперь, когда мы лучше понимаем SISSTRIX и Prophet, пришло время засучить рукава и приступить к работе! ⚒️

Примечание. Подробное (математическое) объяснение вы можете найти в статье Prophet здесь[3].

Пошаговый пример Python с Google Colab 🐍

1. Экспортируйте индекс видимости вашего домена и ваших конкурентов

Во-первых, нам нужно получить временной ряд индекса видимости. Самый простой способ — экспортировать CSV-файл, содержащий ежедневные значения видимости за последние 100 дней. Для этого в нашей учетной записи SISTRIX выберите домен, который вы хотите проанализировать, и перейдите к «Индексу видимости». Первый визуальный элемент «Индекс видимости: ежедневные обновления (мобильные устройства)» позволяет получить данные. Просто нажмите значок шестеренки в правой части диаграммы и выберите "Загрузить диаграмму".

После этого мы выбираем «CSV» и снимаем флажок «Экспорт графика с этим полем», поскольку нас интересуют только данные. Теперь вы можете экспортировать файл.

Чтобы ознакомиться с данными, вы можете открыть их в любом текстовом редакторе, например, Notepad++. Файл содержит два столбца, разделенных точкой с запятой. Первый представляет дату, а второй — индекс видимости для этого дня.

Date;domain-a.de
18.09.2022;0.0203
19.09.2022;0.0265
20.09.2022;0.0248
21.09.2022;0.02
22.09.2022;0.0216
23.09.2022;0.0311
24.09.2022;0.0309
25.09.2022;0.0312
26.09.2022;0.0284
...
...
...

Вы можете повторить описанные выше шаги с несколькими доменами, например доменами ваших прямых конкурентов или других соответствующих SEO-игроков. В результате вы получите ряд временных рядов, которые мы будем использовать в последующих шагах.

2. Загрузите данные в Google Colab через Google Диск.

Просто загрузите соответствующие файлы CSV на свой Google Диск, откройте новый блокнот Colab, подключитесь к среде выполнения и щелкните значок «Файлы» слева. После этого выберите значок с логотипом Диска.

Теперь вам нужно согласиться с условиями использования и авторизоваться в своей учетной записи Google. После того, как вы выполните все шаги, ваши папки на Диске станут доступны в проводнике файлов Colab, и вы сможете использовать их в Colab.

3. Импортируйте пакеты Python и загрузите данные

После установки нашего Google Диска и загрузки наших CSV-файлов SISTRIX мы можем начать анализировать данные и создавать наши прогнозы.

Во-первых, мы устанавливаем текущую версию Prophet через pip и импортируем дополнительные соответствующие пакеты (они предустановлены в Colab).

!pip install prophet # install prophet package via pip

import pandas as pd # data handling
from prophet import Prophet # prophet model, plots, etc.
import matplotlib.pyplot as plt # plotting, visualization
import seaborn as sns # plotting, visualization

Теперь мы можем загрузить наши кадры данных. Чтобы сэкономить часть работы, мы уже определили правильные имена столбцов. Пророк ожидает, что столбец даты будет помечен как ds, а столбец значений — как y. После проверки текущего формата фреймов данных с помощью метода info() мы видим, что нам нужно преобразовать столбец ds в допустимый формат даты и времени [7].

# dataframe for domain a
a_daily_sistrix = pd.read_csv('/content/drive/MyDrive/2022-12-27_domain_a_mobile_daily.csv',
                               delimiter=';',
                               header=0,
                               names=['ds', 'y'],
                               encoding='utf-8')

# dataframe for domain b
b_daily_sistrix = pd.read_csv('/content/drive/MyDrive/2022-12-27_domain_b_mobile_daily.csv',
                               delimiter=';',
                               header=0,
                               names=['ds', 'y'],
                               encoding='utf-8')


# check the properties of both dataframes
a_daily_sistrix.info()
print('\n###############\n')
b_daily_sistrix.info()

# one can see that the "ds" column has the Dtype "object"
# we need to convert it to a valid datetime 
a_daily_sistrix['ds'] = pd.to_datetime(a_daily_sistrix['ds'], format='%d.%m.%Y')
b_daily_sistrix['ds'] = pd.to_datetime(b_daily_sistrix['ds'], format='%d.%m.%Y')

4. Визуально осмотрите оба временных ряда

Чтобы лучше понять оба временных ряда, мы можем изобразить их в виде линейных диаграмм.

# set a default plot style and increase the size of the figure
sns.set_style("whitegrid")
plt.figure(figsize=(25,8))

# plot two line charts, one for each domain (dataframe)
sns.lineplot(x = 'ds', y = 'y', data=a_daily_sistrix, color='b', lw=3)
sns.lineplot(x = 'ds', y = 'y', data=b_daily_sistrix, color='orange', lw=3)

# set plot title, axis labels and a custom legend
plt.title("Comparison of Domain A and Domain B", fontsize=15)
plt.xlabel('Date', fontsize=15)
plt.xticks(fontsize=15)
plt.ylabel('Visibility Index', fontsize=15)
plt.yticks(fontsize=15)
plt.legend(labels=['Domain A','Domain B'], facecolor='white')

что приводит к этой цифре:

Диаграммы иллюстрируют изменение индекса видимости двух доменов за последние 100 дней. Глядя на домен А, можно заметить слегка положительную тенденцию, начиная с 0,02 в сентябре и повышаясь примерно до 0,03 в конце декабря. Примечательно, что есть четыре выброса, когда индекс подскочил до значений около 0,1, но затем вернулся к предыдущим сопоставимым значениям. Поэтому будет интересно посмотреть, как Пророк справится с этими значениями (для улучшения производительности модели мы могли бы их удалить). Напротив, домен B, кажется, следует отрицательной тенденции, начиная с 0,06, а затем постепенно снижаясь примерно до 0,04. Более того, выбросы не могут быть идентифицированы. При ближайшем рассмотрении мы видим, что есть несколько дат, например, примерно 7 декабря 2022 г., когда домен А уже на короткое время опережает домен Б. Итак, мы могли бы спросить:

В какой момент времени домен А обгоняет домен Б в долгосрочной перспективе?🎯

Следуя консервативному подходу, наше определение «долгосрочной перспективы» может быть моментом времени, когда более низкая прогнозируемая видимость домена А (yhat_lower) всегда выше прогнозируемой более высокой видимости домена Б. (yhat_upper), чтобы мы могли быть «уверены», что домен A более заметен, чем B. Теперь, когда мы определили цель нашего анализа, мы можем приступить к обучению наших моделей прогнозирования.

5. Создавайте модели и прогнозы Пророка

Мы подгоняем две модели, по одной на домен, создавая два новых объекта Prophet. Любые настройки процедуры прогнозирования передаются в конструктор. Затем мы вызываем его метод fit и передаем исторические кадры данных обоих доменов. После этого мы создаем два фрейма данных, содержащих исторические даты и дополнительные 100 дат в будущем, которые мы хотим предсказать, используя вспомогательный метод make_future_dataframe(). Наконец, мы создаем наш прогноз исторических и будущих дат, используя метод predict [7].

# instanciate one Prophet object for each domain
a_model = Prophet()
b_model = Prophet()

# fit hostorical data
a_model.fit(a_daily_sistrix)
b_model.fit(b_daily_sistrix)

# create two empty dataframes of the next 100 dates (forecast) and history
# include_history=True is set by default
a_future = a_model.make_future_dataframe(periods=100, include_history=True)
b_future = b_model.make_future_dataframe(periods=100, include_history=True)

# create a forecast for each date in the "future" dataframe
a_forecast = a_model.predict(a_future)
b_forecast = b_model.predict(b_future)

В результате мы получаем два датафрейма, a_forecast и b_forecast, которые состоят из 16 столбцов и 201 строки. Мы уже знакомы со столбцом ds, на который мы сделали прогноз. Для каждой даты (строки) мы можем видеть прогнозируемое значение yhat, а также нижний и верхний интервалы неопределенности yhat_lower и yhat_upper.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 201 entries, 0 to 200
Data columns (total 16 columns):
 #   Column                      Non-Null Count  Dtype         
---  ------                      --------------  -----         
 0   ds                          201 non-null    datetime64[ns]
 1   trend                       201 non-null    float64       
 2   yhat_lower                  201 non-null    float64       
 3   yhat_upper                  201 non-null    float64       
 4   trend_lower                 201 non-null    float64       
 5   trend_upper                 201 non-null    float64       
 6   additive_terms              201 non-null    float64       
 7   additive_terms_lower        201 non-null    float64       
 8   additive_terms_upper        201 non-null    float64       
 9   weekly                      201 non-null    float64       
 10  weekly_lower                201 non-null    float64       
 11  weekly_upper                201 non-null    float64       
 12  multiplicative_terms        201 non-null    float64       
 13  multiplicative_terms_lower  201 non-null    float64       
 14  multiplicative_terms_upper  201 non-null    float64       
 15  yhat                        201 non-null    float64       
dtypes: datetime64[ns](1), float64(15)
memory usage: 25.2 KB

Мы также можем быстро просмотреть оба кадра данных прогноза, например, один из домена A:

Поскольку ряды чисел довольно сложно понять, давайте посмотрим на оба графика прогноза, используя метод plot.

# plot both forecasts
fig1 = a_model.plot(a_forecast, figsize=(15, 8),xlabel="Date", ylabel="Visibility")
fig1.suptitle('Visibility Forecast Domain A', fontsize=15)

fig2 = b_model.plot(b_forecast, figsize=(15, 8),xlabel="Date", ylabel="Visibility")
fig2.suptitle('Visibility Forecast Domain B', fontsize=15)

Что создает следующие графики для домена A

и домен Б

Как мы видим, Prophet улавливает визуально выявленные положительные и отрицательные тенденции доменов A и B, а также некоторые сезонные компоненты.

Примечание. Судя по визуальному осмотру, эффективность прогноза довольно сомнительна. Чтобы лучше понять качество, мы могли бы выполнить перекрестную проверку и рассчитать метрики ошибок. Кроме того, мы могли бы использовать настройку гиперпараметров и другие методы для улучшения прогноза, но это выходит за рамки этой статьи…



Чтобы разложить прогноз и лучше понять его компоненты, мы можем использовать plot_components

# plot forecast components. weekly_start=1 sets the start of the week to Monday 
a_model.plot_components(a_forecast, weekly_start=1)
b_model.plot_components(b_forecast, weekly_start=1)

который возвращает, как мы и ожидали, положительную тенденцию для домена А,

отрицательная тенденция для домена B и еженедельная сезонность для обоих доменов.

Теперь, когда у нас есть все прогнозируемые данные об индексе видимости на следующие 100 дней, а также нижняя и верхняя границы прогноза, мы можем, наконец, подкрепить наше смелое заявление с самого начала данными.

6. Сравните оба домена

Мы пытаемся найти ответ на вопрос

В какой момент времени домен А обгонит домен Б в долгосрочной перспективе?

и определил «долгосрочную перспективу» как момент времени, когда более низкая прогнозируемая видимость домена A (yhat_lower) всегда выше, чем более высокая прогнозируемая видимость домена B (yhat_upper).

На следующем рисунке прогнозируемый индекс видимости yhat обоих доменов показан в виде сплошной линии, а также нижняя граница домена A, а также верхняя граница домена B в виде пунктирных линий.

# increase the size of the figure
plt.figure(figsize=(25,8))

# plot domain a's predicted value and lower bound (only dates in the future)
sns.lineplot(x = 'ds', y = 'yhat', data=a_forecast[a_forecast['ds']>='2022-12-29'], color='b')
sns.lineplot(x = 'ds', y = 'yhat_lower', data=a_forecast[a_forecast['ds']>='2022-12-29'], color='b', linestyle='--')

# plot domain b's predicted value and upper bound (only dates in the future)
sns.lineplot(x = 'ds', y = 'yhat', data=b_forecast[a_forecast['ds']>='2022-12-29'], color='orange')
sns.lineplot(x = 'ds', y = 'yhat_upper', data=b_forecast[a_forecast['ds']>='2022-12-29'], color='orange', linestyle='--')

# set plot title, axis labels and a custom legend
plt.title("Forecast of Domain A and Domain B", fontsize=15)
plt.xlabel('Date', fontsize=15)
plt.ylabel('Visibility Index', fontsize=15)
plt.legend(labels=['Domain A - Predicted', 'Domain A - Lower', 'Domain B - Predicted', 'Domain B - Upper'], facecolor='white')

Только рассматривая пунктирные линии (верхняя и нижняя границы), мы видим, что домен А становится более заметным, чем домен Б, в начале апреля 2023 года. С этого момента даже самые низкие предсказанные значения, основанные на декомпозиции предположительно по понедельникам, Домена А равны или даже превышают значения Домена В.

Итак, наш оператор болта будет таким:

Если все пойдет по плану, к апрелю следующего года веб-сайт нашей компании будет более заметен в Google Поиске, чем сайт нашего ближайшего конкурента🚀…. и мы обязательно покажем нашу причудливую линейную диаграмму 😉

Спасибо за чтение! Надеюсь, вам понравилась статья, и вы смогли почерпнуть несколько вдохновляющих аспектов.

Источники

[1] Поддержка SISTRIX(n.d.). Индекс видимости SISTRIX — объяснение, предыстория и расчет. Проверено 19 декабря 2022 г. https://www.sistrix.com/support/sistrix-visibility-index-explanation-background-and-calculation/.

[2] Taylor, S.J., Letham B. (23 февраля 2017 г.).Пророк: масштабное прогнозирование. Мета-исследования. https://research.facebook.com/blog/2017/2/prophet-forecasting-at-scale/.

[3] Тейлор, С.Дж., и Летам, Б. (2017). Масштабное прогнозирование. PeerJ Inc. https://doi.org/10.7287/peerj.preprints.3190v2.

[4] Менкулини, Л., Марини, А., Пройетти, М., Гаринеи, А., Бозза, А., Моретти, К., и Маркони, М. (2021). Сравнение Prophet и Deep Learning с ARIMA при прогнозировании оптовых цен на продукты питания (arXiv:2107.12770). архив https://doi.org/10.48550/arXiv.2107.12770.

[5] Box, G.E.P., Jenkins, G.M., Reinsel, G.C., & Ljung, G.M. (2015). Анализ временных рядов: прогнозирование и контроль (5-е изд.). Джон Уайли и сыновья.

[6] Трибе О., Хевамалаге Х., Пилюгина П., Лаптев Н., Бергмейр К. и Раджагопал Р. (2021). NeuralProphet: Объяснимое прогнозирование в масштабе (arXiv:2111.15397). архив https://doi.org/10.48550/arXiv.2111.15397

[7] Документация Пророка. (н.д.). Быстрый старт. Проверено 28 декабря 2022 г. https://facebook.github.io/prophet/docs/quick_start.html#python-api.