О веб-аналитике, интернет-рекламе и анализе данных.
Сергей Макаров
О веб-аналитике, интернет-рекламе и анализе данных.

Почему страницы входа лучше анализировать в Метрике, чем в GA?

Опишу очередную недоделку GA.

Определяем симптом.
ga trafic

Почему неиндексированный поиск и страницы корзины получают столько трафика в отчетах?

Все дело в переопределении сеанса и стандартной модели атрибуции GA. Всеми любимый пример с чаем: пользователь зашел с organic → набрал товаров и перешел в корзину → пошел пить чай на 30 минут → переоткрыл корзину → в GA уходит новая сессия с параметрами: канал = organic и landingPagePath = корзина.

Самый быстрый способ лечения: анализировать страницы входа в метрике. Только атрибуцию выставить “Последний переход”.

0 комментариев

Native js vs jquery для отслеживания событий

Всегда было интересно, что лучше использовать для отслеживания событий: native js или jquery.

Решил проверить 3 селектора: querySelectorAll, getElementsByClassName и $(‘.classname’).

Первый тест на скорость. Вот результаты с jsperf.com

d58181aa38

Метрика operations per second — количество исполнений скрипта в секунду.

По чарту очевидно: getElementsByClassName быстрее остальных. На втором месте селектор jquery, а затем querySelectorAll.

Теперь сравним селекторы в бою. Настроим отслеживание клика одного элемента и проверим количество событий в GA.


// Отслеживание клика на категории рекомендаций в карточке jquery
$('.classname').on('click', function (){ 
	dataLayer.push({
        'event':'addEvents_makeActions',
        'action_cat':'Карточка',
        'action_name':'Рекомендации jQuery',
        'action_param': ''
     });
});

// Отслеживание клика на категории рекомендаций в карточке querySelectorAll
var selector= document.querySelectorAll('.classname');
for (var i = 0; i < selector.length; i++) {
	selector[i].addEventListener('click', function(e) {
			dataLayer.push({
        		'event':'addEvents_makeActions',
        		'action_cat':'Карточка',
        		'action_name':'Рекомендации querySelectorAll',
        		'action_param': ''
      		});
	}, false)
}
   
// Отслеживание клика на категории рекомендаций в карточке getElementsByClassName
var selector = document.getElementsByClassName('classname');
for (var i = 0; i < selector.length; i++) {
	selector[i].addEventListener('click', function(e) {
			dataLayer.push({
        		'event':'addEvents_makeActions',
        		'action_cat':'Карточка',
        		'action_name':'Рекомендации getElementsByClassName',
        		'action_param': ''
      		});
	}, false)
}

Результаты:

e6b21ea22f

Я сделал такой вывод: если на сайте уже стоит jquery, то используйте, что хотите. Если jquery нет, то не стоит его ставить отдельно, лучше трекать через js.

0 комментариев

Загрузка сегментов в GA с помощью googleAnalyticsR

Расскажу, как передавать сегменты клиентов в Google Analytics, чтобы использовать в списках ремаркетинга AdWords.

Требования:
— У вас настроен сбор client id. Если нет, то Simo Ahava описал хороший способ.
— Вы настроили кастомный параметр, в который хотите передавать сегмент. В данном примере это dimension18.
— Вы можете связать cid и реальные покупки клиента. У меня  id транзакции в GA совпадает с id транзакции CRM, поэтому я смогу сделать связку.
— Нужны данные о продажах. Ограничусь минимальным набором: дата покупки, id клиента, сумма покупки.
— R и RStudio. Как установить googleAnalyticsR.

Получаем данные из CRM. В моем случае это продакшн база сайта.


library(DBI)
library(RMySQL)
proddb = dbConnect(MySQL(), user="ваш_логин", password="ваш_пароль",
                   dbname="название_бд", host="ваш_хост", port="номер_порта")

mysql_data = dbGetQuery(proddb, "SELECT orderId, date, phone, price from table")

Получили данные. Проверим на выбросы.


boxplot(mysql_data$price)$out

Нашли аутлаеров и скорректировали запрос к бд. Идем дальше.

Делаем сегментацию. Можно начать с простой RFM.


library(easyRFM)
result = rfm_auto(mysql_data,id="phone",payment="price",
                   date="date")
rfm_data = result$rfm
rfm_data$rfm = paste(rfm_data$RecencyClass,rfm_data$FrequencyClass,rfm_data$MonetaryClass,sep = "")

Теперь сдожойним данные сегментации с cid.


# Подключаем библиотеки
library(googleAuthR)
library(googleAnalyticsR)

service_token = gar_auth_service("ваш_service_token.json")

# id представления GA
ga_view = 'id_представления'

# Указываем диапазон дат.
start_date = "2016-01-01"
end_date  = as.character.Date(Sys.Date() - 1)

# Выгружаем данные по транзакциям
ga_transactions = google_analytics_4(ga_view, 
                                     date_range = c(start_date,end_date),
                                     dimensions=c('transactionId','dimension1'), 
                                     metrics = c('transactionRevenue'),
                                     anti_sample = TRUE)

# Формируем таблицу для отправки в Google Analytics
library(sqldf)
get_rfm = sqldf("SELECT DISTINCT merge_data.dimension1 AS dimension1, rfm_data.rfm AS dimension18 FROM 
(SELECT * FROM mysql_data JOIN ga_transactions ON mysql_data.orderId = ga_transactions.transactionId) AS merge_data JOIN rfm_data ON merge_data.phone = rfm_data.phone")

head(get_rfm)
             dimension1 dimension18
1 1414965770.1485039352         455
2  273724521.1480928137         355
3  778576015.1471948435         555
4 1038165458.1456421858         555
5 1534727395.1487304449         555
6  882453544.1469718993         555

Получили сегмент для каждого cid. Теперь загрузим в GA. Есть 2 пути:
— Передать данные с помощью Custom Data import и Management API
— Передать с помощью Measurement Protocol

Custom Data import

Суть метода: формируем файл из нашего датафрейма и отправляем в GA с помощью Management API.


ga_import = ga_custom_upload_file(id_представления, 
                                  "id_ресурса", 
                                  "id_импорта", 
                                  get_rfm)
ga_custom_upload(upload_object = ga_import)

У этого метода серьезные ограничения.

  1. Нельзя загрузить больше 10 GB на ресурс. Для больших проектов этот лимит исчерпается быстро. Выход: удалять старые загрузки.
  2. Из справки: Users, who didn’t visit the site in the 10 days prior to the data upload, will be added to remarking lists upon their next visit to the site. На практике это означает, что списки ремаркетинга получатся урезанными. Если для вас это критично, то посмотрим следующий способ.

Measurement Protocol

Можно отправить данные с помощью Measurement Protocol. Имейте в виду, при отправке запросов в Google Analytics генерируется новая сессия.


library(googleMeasureR)
library(stringi)

for (row in 1:nrow(get_rfm)){
  random = stri_rand_strings(n=1, length=18, pattern="[A-Za-z0-9]")
  gmr_post(list(v=1,t="event",tid="id_ресурса",cid=get_rfm$dimension1[row],ec="rfm_send",ea="rfm_v1",cd18=get_rfm$dimension18[row],z=random))
}
0 комментариев

4 управленческих решений для оценки трафика

Из выступлений Ильи Красинского:

Существует всего 4 управленческих решений для рекламных кампаний:
— Отключить, если не сходится совсем
— Донастроить/Доработать
— Не трогать: работает и работает
— Усилить

Опишу каждый пункт и дополню примерами.

Отключить, если не сходится совсем

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

Илья Красинский советует разделять доход на прямой и косвенный.

Прямой доход оценивается по атрибуции last click.

Косвенный доход учитывает ассоциированные конверсии. Но тут есть хитрости подсчета:

Ассоциированный доход по бесплатному трафику включает цепочки конверсий по last click и цепочки, где бесплатный канал трафика был последний.

Ассоциированный доход по всем каналам суммирует ценность всех ассоциированных конверсий.

Для наглядности, слайд из презентации Красинского:

оценка рекламных источников

Если затраты на рекламную кампанию сильно больше, чем прямой и косвенный доход, то отключаем кампанию.

Донастроить/Доработать

Донастраиваем, если кампания сходится хотя бы по косвенному доходу.

Примеры доработки:
— Отключить семантику с низким CR(%) и ROI
— Добавить минус слов
— Расширить объявления
— Сделать релевантные объявления
— Провести А/Б тест объявлений
— Почистить площадки
— Подключить оптимизатор
— Оптимизировать таргетинги

Не трогать: работает и работает

Если кампания сходится по прямому доходу.

Усилить

Если кампания сходится по прямому доходу и есть потенциал расширения. Например: высокий ROI, узкий таргетинг.

Как усилить:
— Расширить семантику
— Повысить ставки
— Убрать операторы соответствия ключевых слов
— Добавить новые форматы объявлений
— Расширить таргетинги
— Протестировать АРФ и ДРФ

0 комментариев