Если все будет работать, как запланировано, к апрелю следующего года наш корпоративный веб-сайт будет более заметен в 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.