Влияют ли на трафик события из прошлого? Определяем при помощи R

Важной задачей в интернет-маркетинге является выявление внешних воздействий, которые, со временем, могли повлиять на полученные результаты. Например, несколько месяцев назад на вашем сайте были введены некоторые улучшения, запущены новые рекламные кампании, был выпущен новый продукт или что-нибудь еще, что косвенно могло повлиять на увеличение прибыли, и вы хотите это оценить. На практике это сделать достаточно сложно, так как возникает множество других событий, которые могут повлиять на результат. Это называется «шум».

Общие сведения о Causal Impact

Команда Google встретилась с подобной проблемой и совместно с Kay H. Brodersen создала алгоритм под названием «Causal Impact» и закодировала его с помощью R. Кроме того, было создано приложение GA Effect, которое позволяет быстро получить результат не залезая в код.

Байесовское моделирование на основе временных рядов, с помощью которого реализован пакет, позволяет оценить, как будут выглядеть ваши показатели, если бы событие не произошло, а затем сравнивает это с реальными событиями (изображение ниже с официальной страницы пакета). Если модель правильная, то, сравнивая различия между ее оценкой и реальностью, вы можете получить обоснованное предположение о значимости события.

CausalImpact R

Я не использую R, что делать?

Для тех, кто не работает с R можно использовать приложение GA Effect для получения быстрых и неглубоких результатов. Для этого нужно зайти в систему под своим аккаунтом Google Analytics, выбрать представление, с которым вы хотите работать и установить предполагаемую дату события в прошлом, влияние которого вы оцениваете. В параметрах также можно указать разные метрики и сезонность, если она есть.

Интерфейс GA Effect

Переходя к вкладке «Results» в интерфейсе приложения, вы увидите, имело ли оцениваемое событие какое-либо влияние на дальнейшие показатели и на сколько. В процентах указана доля влияния.

Интерфейс GA Effect

На первом графике показаны ожидаемое количество сеансов (зеленый график) и то количество сеансов, которое было на самом деле (синий график). Светло зеленый коридор – это 95% интервал предсказанных значений, внутри которого должно было колебаться количество сеансов без оцениваемого события. Нижний график показывает интегральную кривую распределения разницы между действительными и предсказанными числами.

Анализ влияния с помощью пакета CausalImpact R

С чем мы можем столкнуться при запуске рекламы? С тем, что пользователи, которые увидели ее — могут не являться новыми и в любом случае посетили бы наш сайт без ее подключения. Есть ли смысл тратить деньги впустую? Разберем на примере.

У нас есть интернет-магазин, офисы которого расположены в нескольких крупных городах России. Чтобы увеличить трафик, мы запускаем платную рекламу. Для пакета CausalImpact важно знать дату запуска, именно от этой даты пойдет анализ влияния.  Возьмем 22 августа.

Оценивать весь трафик неинформативно, к тому же мы можем столкнуться с очевидными выводами. Поэтому, сегментируем пользователей и оценим влияние подключения рекламы в двух крупных городах — Москве и Санкт-Петербурге. Для этого создадим два сегмента в Google Analytics с фильтром по городам. Нам понадобятся id этих сегментов. Их легко можно найти в строке браузера после применения в отчетах, нам нужна та часть, что идет после символов %3Duser.

То есть, если в адресной строке у вас прописано:

https://analytics.google.com/analytics/web/?hl=ru&pli=1#report/trafficsources-all-traffic/s57619074w108372315p552932016/%3F_u.date00%3D20170801%26_u.date01
%3D20180410%26_.useg%3DuserfsooSZEfQ8uvMFlBx55Zqw/

то в R мы обратимся к нему так: gaid::fsooSZEfQ8uvMFlBx55Zqw.

Установка и подгрузка библиотек

Подгружаем библиотеки, необходимые для работы и прописываем токен, чтобы иметь возможность выгружать данные из Google Analytics (более подробно о том, как пройти процесс аутентификации в Google Analytics я расскажу в другой статье):

install.packages("RGA")
install.packages("stringr")
install.packages("plyr")
install.packages("dplyr") 
install.packages("CausalImpact")

library(RGA)
library(stringr)
library(plyr)
library(dplyr)
library(CausalImpact)

ga_token <- authorize(client.id = "16556896721-ga9hnjhna4iejbtdv1beb7q2iag4k74m.apps.googleusercontent.com",
 client.secret = "pCoCXLL67EO7768ZjF3c_nTi")

Создание датафрейма

Далее, для анализа нам понадобится такая выборка, чтобы у модели была возможность оценить прошлые и будущие данные (относительно даты подключения рекламы). Сперва проанализируем данные по Москве. Так как анализируемое событие произошло 22 августа, то для выборки возьмем данные с 1 августа по 10 октября. Подтягиваем туда необходимые нам метрики и собираем это все в датафрейм.

ID <- "772932056" #id представления, из которого берем данные

date.start <- "2017-08-01" # Дата начала сбора данных
date.end <- "2017-10-09" # Последняя дата сбора данных

# Устанавливаем даты
dates <- seq(as.Date(date.start), as.Date(date.end), by = "days")

#Собираем таблицу
sum.data <- do.call(rbind, lapply(dates, function(d) {
  print(d)
  get_ga(profileId = ID,
         start.date = d,
         end.date = d,
         dimensions = "ga:date",
         metrics = "ga:sessions, ga:transactions, ga:transactionRevenue",
         segment = 'gaid::fsooSZEfQ8uvMFlBx55Zqw')
}))

Запускаем CausalImpact

При запуске sum.data в консоли будем наблюдать подгрузку данных по дням. Когда процесс закончится, приступаем к записи вектора сеансов по дням в отдельную переменную. А затем, добавим разделение временного периода на две части — до и после даты подключения рекламы.

# Создаем вектор значений
time.points <- seq.Date(as.Date("2017-08-01"), by = 1, length.out = 70)
data <- zoo(cbind(sum.data$sessions), time.points)

# Периоды до и после даты события
pre.period <- as.Date(c("2017-08-01", "2017-08-22"))
post.period <- as.Date(c("2017-08-23", "2017-10-09"))

Собственно, теперь вызываем пакет CausalImpact. Если у вас имеется сезонность — периодические колебания на графиках, то ее также необходимо отразить. В данном случае используется недельная сезонность в параметре nseasons.

# Подключение пакета (есть сезонность)
impact <- CausalImpact(data, pre.period, post.period, model.args = list(niter = 5000, nseasons = 7))
plot(impact)
summary(impact)

Чтобы получить более подробный отчет, вызовите функцию summary(impact, "report").

Итак, что мы видим?

Применение CausalImpact R для Москвы

На графике сплошной черной линией показано действительное количество сеансов, а пунктирной — предсказанное количество без подключения рекламы, также известное как гипотетическое предсказание (голубая область — это 95-процентный интервал предсказания, в котором могло бы колебаться количество сеансов без подключения платной рекламы).

Верхний график — истинные значения сеансов, средний — разница между действительными и предсказанными числами, а нижний показывает интегральную кривую распределения разницы двух чисел.

Статистика пакета CausalImpact R

Подключение рекламного трафика увеличило посещения на 15% (пункт Relative effect). Это означает, что положительный эффект, наблюдаемый в период вмешательства, статистически значим и вряд ли может быть вызван случайными колебаниями. График реальных данных в конце периода не возвращается к предсказанным значениям, что говорит о долгосрочном эффекте.

Пришло время проанализировать данные для следующего сегмента — Санкт-Петербурга.

Здесь картинка получилась иная, после подключения рекламы сеансы быстро поскакали вверх:

Применение CausalImpact R для Санкт-Петербурга

Видим большой разрыв между действительными и предсказанными значениями. В свою очередь отчет это подтверждает и говорит об увеличении количества сеансов на 80%!  Это в 5 раз больше, чем в Москве.

Результаты

Почему рассматривая такие крупные города как Москва и Санкт-Петербург мы получили такие разные результаты? В Москве после подключения рекламы количество сеансов увеличилось на 15%, а в Питере на 80%.

Дело в том, что процент новых пользователей в Санкт-Петербурге выше, чем в Москве. Соответственно, в Москве по рекламе могли приходить пользователи, уже знакомые с брендом, которые могли бы прийти и без использования дополнительного трафика. Ставится вопрос о целесообразности использования рекламы в Москве и возможности захвата новых территорий в Питере 🙂

Выводы

Не забывайте, что слепо доверять статистике опасно, и, хотя CasualImpact может быть мощным инструментом, не верьте в его результаты, не вникнув в его модельные предположения. Их несколько:

  • Убедитесь, что событие, которое вы тестируете, не влияло на предыдущий период также сильно, как на следующий. То есть, должна быть установлена дата, с которой и началось возможное влияние. В нашем случае до 22 августа подключения рекламы не было.
  • Узнайте, может ли быть результат до начала даты рассматриваемого события. Попробуйте запустить фиктивное событие перед реальным — вы не увидите никаких изменений.
  • Временной период должен быть таким, чтобы модели было достаточно предыдущих значений и, чтобы она могла отобразить влияние уже на следующем временном отрезке, идущим за датой предполагаемого события.

Ссылки:

Екатерина Шипова

Магистр прикладной математики и информатики, веб-аналитик. Сертифицированный специалист Google Аnalytics и Яндекс.Метрика.