Сколько прибыли вы не получили в Google Ads из-за нехватки бюджета или низкого рейтинга ключевых слов? Стандартные отчеты не позволяют это проанализировать, но я знаю способ, как подсчитать эти данные с помощью языка программирования R.
В октябре 2015-го года в блоге я описывал алгоритм для определения количества потерянных конверсий
Возможно, изначально этот метод покажется более сложным, но, потратив некоторое время, в дальнейшем вы сможете бесплатно обновлять данные и контролировать потери показов и дохода по всем рекламным кампаниям. К тому же алгоритм был усовершенствован, теперь он предназначен больше для ecommerce проектов и главная его задача — оценка потерянного дохода, а не конверсий.
Данное решение реализовано на языке R, он предназначен для статистической обработки данных и визуализации информации.
Что необходимо для реализации алгоритма?
- На сайте должен быть установлен код отслеживания электронной коммерции, и соответственно в Google Analytics должны отслеживаться данные о совершенных транзакциях.
- Аккаунт Google Analytics должен быть связан с Google Ads.
- На ПК должен быть установлен язык R, для этого пройдите по ссылке, скачайте и установите последнюю версию.
- Для более удобной работы в R предлагаю также скачать и установить RStudio, именно в этой среде программирования мы будем запускать скрипт.
- Должен быть создан Developer Client в консоли разработчика Google, об этом более подробно я расскажу далее.
- Самое трудное, что понадобится сделать, это получить токен разработчика Google Ads для доступа к API Google Ads.
Если перечисленные пункты вас не смущают, то можем двигаться дальше.
Как создать Developer Client в консоли разработчика Google?
Практически на каждый вышеперечисленный пункт я привел ссылку на справочную информацию, осталось рассмотреть процесс создания Developer Client. 1. Перейдите по этой ссылке в консоль разработчика и откройте меню «Product & Services» с помощью кнопки в левом верхнем углу.
Запуск скрипта в RStudio
Для перехода к этому шагу должны быть реализованы шесть пунктов, описанных в начале статьи. На это может уйти несколько дней.
1. Подключаем необходимые пакеты R
Открываем RStudio и вставляем следующую часть R-скрипта в область «Source».
#1. Установка и подключение требуемых пакетовinstall.packages("curl")require("curl")install.packages("bitops")require("bitops")install.packages("devtools")require("devtools")install.packages("RGoogleAnalytics")require(RGoogleAnalytics)install_github('jburkhardt/RAdwords')require(RAdwords)
Для запуска первой части скрипта выделите его с помощью мыши и нажмите «Ctrl + Enter». Таким образом будет запущен процесс установки требуемых пакетов, а на экране появится окно, отображающее прогресс установки.
2. Устанавливаем переменные
Теперь стоит задать все переменные, которые понадобятся для дальнейшей работы скрипта. Вставьте представленный ниже код после первого фрагмента кода, который мы добавили для установки требуемых пакетов.
#2. Объявление переменныхclienid <- "150487456763-XXXXXXXXXXXXXXX.apps.googleusercontent.com" #Client ID из google consolesecret <- "TUXXXXXXXXXXXX_TknUI" #Client secret из google consolega_view <- "ga:XXXXXXXX" #ID представления из Google Analyticsadwords_id <- "XXX-XXX-XXXX" #ID аккаунта Google AdWords#Период, за который необходимо определить объём потерянного доходаstart_period <- c(day = "01", month = "01", year = "2016")end_period <- c(day = "20", month = "03", year = "2016")
;Эту часть скрипта придётся немного доработать, заполнив переменные нужными значениями. 2.1. Для переменной «clienid» введите id клиента, полученное в консоли разработчика. 2.2. Переменной «secret» соответственно необходимо присвоить показатель Client Secret из предыдущего пункта. 2.3. Переменной «ga_view» нужно присвоить ID представления в Google Analytics. Для этого в интерфейсе Google Analytics перейдите в меню «Администратор», после чего в области «Представление» нажмите «Настройки представления».
3. Аутентификация в Google Analytics
3.1. Следующий шаг — аутентификация в Google Analytics. Для её прохождения в пакете «RGoogleAnalytics» есть команда «Auth». Добавьте в скрипт следующие строки.
#3. Аутентификация в сервисах.#3.1. Аутентификация в Google Analyticsga_auth <- Auth(clienid,secret)
Выделите эту часть скрипта и нажмите «Ctrl+Enter». 3.2. Сразу после этого в консоли, которая по умолчании располагается в нижнем левом углу RStudio, появится запрос: хотите ли вы сохранить учётные данные авторизации в аккаунте Google. Я советую ответить на этот вопрос отказом, написав «No». Далее в консоли будет сгенерирована ссылка, скопируйте её и вставьте в браузер.
4. Аутентификация в Google Ads
4.1. Для аутентификации в Google Ads необходимо использовать команду «doAuth». Скопируйте и вставьте после всех предыдущих строк в RStudio следующую часть кода:
#3.2. Аутентификация в Google AdWordsadwords_auth <- doAuth(F)
;Выделите этот фрагмент скрипта с помощью мыши и нажмите «Ctrl+Enter». 4.2. Потребуется вставить учетные данные client ID и Secret, которые были сгенерированы на шаге «Как создать Developer Client в консоли разработчика Google». 4.3. Далее понадобится ввести токен разработчика Ads API (о том, как его получить подробно расписано здесь). Если уже есть подтверждённый токен, его можно найти в управляющем аккаунте Google Ads. Для этого перейдите в настройки аккаунта и нажмите на иконку с изображением шестерёнки в верхнем правом углу интерфейса. В настройках выберите «Центр Ads API». Хочу отметить, что для работы скрипта у токена должен быть как минимум базовый уровень доступа.
5. Добавляем последний фрагмент R-скрипта
Вставьте завершающую часть скрипта под всеми предыдущими вставленными фрагментами, выделите её и нажмите Ctrl+Enter.
#4.Запрос данных из сервисов.#4.1. Получение данных из Google Analytics#4.1.1. Описание запроса к Google Analyticsquery.list <- Init(start.date = paste(start_period["year"],start_period["month"],start_period["day"],sep = "-"), end.date = paste(end_period["year"],end_period["month"],end_period["day"],sep = "-"), dimensions = "ga:adwordsCampaignID, ga:campaign", metrics = "ga:transactions,ga:transactionRevenue", filters = "ga:medium==cpc, ga:source==google", table.id = ga_view)#4.1.2. Создание объекта API запроса к Google Analyticsga.query <- QueryBuilder(query.list)#4.1.3. Получение данных из Google Analytics в RgaData <- GetReportData(ga.query, ga_auth, split_daywise = FALSE, paginate_query = FALSE)#4.2. Получение данных из Google AdWords#4.2.1. Описание API запроса к Google AdWords.body <- statement(select=c('CampaignId', 'Impressions', 'Clicks', 'Cost', 'Ctr', 'SearchBudgetLostImpressionShare', 'SearchRankLostImpressionShare ', 'ContentBudgetLostImpressionShare', 'ContentRankLostImpressionShare'), report="CAMPAIGN_PERFORMANCE_REPORT", start=paste0(start_period["year"],start_period["month"],start_period["day"]), end=paste0(end_period["year"],end_period["month"],end_period["day"]))#4.2.2. Отправка запроса в Google AdWordsadwordsData <- getData(clientCustomerId = adwords_id, google_auth = adwords_auth, statement = body, transformation = T, apiVersion = "201605")#5. Подготовка итоговой таблицы.#5.1. Соединяем данные из Google Analytics и Google AdWords в одну таблицуtotalData <- merge(gaData, adwordsData, by.x = "adwordsCampaignID", by.y = "CampaignID", all.x = TRUE)#5.2. Заменяем пропущенные значения нулямиfor (i in 1:length(totalData)){ totalData[which(is.na(totalData[i])),i] <- 0}#5.3. Итоговые вычисления количества потерянных транзакций и доходаtotalData$lostImpressionByBudgetSearch <- round(totalData$Impressions / (1-totalData$SearchLostIS_budget) - totalData$Impressions,0)totalData$lostImpressionByRankSearch <- round(totalData$Impressions / (1-totalData$SearchLostIS_rank) - totalData$Impressions,0)totalData$lostImpressionByBudgetDisplay <- round(totalData$Impressions / (1-totalData$ContentLostIS_budget) - totalData$Impressions,0)totalData$lostImpressionByRankDisplay <- round(totalData$Impressions / (1-totalData$ContentLostIS_rank) - totalData$Impressions,0)totalData$lostImpressionByBudget <- totalData$lostImpressionByBudgetSearch + totalData$lostImpressionByBudgetDisplaytotalData$lostImpressionByRank <- totalData$lostImpressionByRankSearch + totalData$lostImpressionByRankDisplaytotalData$lostClicksByBudget <- round(totalData$lostImpressionByBudget * (totalData$CTR),0)totalData$lostClicksByRank <- round(totalData$lostImpressionByRank * (totalData$CTR),0)totalData$lostTransactionsByBudget <- ifelse(is.nan(round(totalData$lostClicksByBudget * (totalData$transactions / totalData$Clicks),0)),0,round(totalData$lostClicksByBudget * (totalData$transactions / totalData$Clicks),0))totalData$lostTransactionsByRank <- ifelse(is.nan(round(totalData$lostClicksByRank * (totalData$transactions / totalData$Clicks),0)),0,round(totalData$lostClicksByRank * (totalData$transactions / totalData$Clicks),0))totalData$lostTransactions <- totalData$lostTransactionsByBudget + totalData$lostTransactionsByRanktotalData$lostRevenueByBudget <- ifelse(is.nan(round(totalData$lostTransactionsByBudget * (totalData$transactionRevenue / totalData$transactions),0)), 0,round(totalData$lostTransactionsByBudget * (totalData$transactionRevenue / totalData$transactions),0))totalData$lostRevenueByRank <- ifelse(is.nan(round(totalData$lostTransactionsByRank * (totalData$transactionRevenue / totalData$transactions),0)), 0, round(totalData$lostTransactionsByRank * (totalData$transactionRevenue / totalData$transactions),0))totalData$lostRevenue <- ifelse(is.nan(totalData$lostRevenueByBudget + totalData$lostRevenueByRank),0,totalData$lostRevenueByBudget + totalData$lostRevenueByRank)#6. Выгрузка рассчитаной таблицы в csv файлwrite.table(totalData, file='lostRevenue.csv', sep = ";", dec = ",", row.names = FALSE)#7. Визуализация в виде круговой лиаграммыlost_revenue <- c('полученный доход' = sum(totalData$transactionRevenue), 'потерянный по бюджету' = sum(totalData$lostRevenueByBudget), 'потерянный по рейтингу' = sum(totalData$lostRevenueByRank))pie(lost_revenue,col = c("green", "red", "firebrick"))
Скрипт оценки потерянного дохода готов. В нижнем правом углу RStudio появится диаграмма, оценивающая общие потери дохода. Также на ней отдельно видно потери, связанные с низким рейтингом или нехваткой бюджета.
Три совета по использованию скрипта
- При повторном запуске не требуется запускать весь скрипт. Если вы прервали сессию R, то не стоит, к примеру, повторно устанавливать пакеты — достаточно просто подключить пакеты «RAdwords» и «RGoogleAnalytics». Для этого активируйте следующий скрипт.
;2. Токен Google Analytics имеет определённый срок жизни, в связи с чем при повторном запуске скрипта могут возникнуть проблемы с аутентификацией в данном сервисе. Если вы столкнулись с такой проблемой, то можете пройти повторную валидацию токена с помощью команды «ValidateToken».#Подключение требуемых пакетовrequire(RGoogleAnalytics)require(RAdwords)
;3. Для повторной аутенфикации в Google Analytics понадобятся учетные данные, которые вы сохранили в начале работы. Если нужно получить данные из другого аккаунта Google, удалите файли google.auth.RData в рабочей директории R, это можно сделать с помощью следующего скрипта.ValidateToken(ga_auth)
;Далее удалите созданный ранее объект аутентификации к Google Ads или Google Analytics (в нашем примере для Google Ads — это объект «adwords_auth», для Google Analytics — «ga_auth»). Для прохождения полной повторной аутентификации в сервисах воспользуйтесь следующим скриптом;#Удаление файла с учётными данными в ходе сессии R:system("rm .google.auth.RData")
#Удаление объектов аутентификации в ходе R сессииrm(adwords_auth)rm(ga_auth)#Повторная аутентификацияadwords_auth <- doAuth(F)ga_auth <- Auth(clienid,secret)
Как визуализировать полученную информацию?
1. Строим диаграмму с помощью языка R
Возможности визуализации в R достаточно обширны, но для того, чтобы ими овладеть, придется потратить достаточно много времени. Один из вариантов визуализации в R построить диаграмму с помощью пакета ggplot2.
1.1. Устанавливаем и подключаем пакет:
install.packages("ggplot2")require("ggplot2")
;1.2. Формируем дата фрейм на основе которого будем строить гистограмму.
#Формируем данные для гистограммыHistData <- rbind(data.frame(subset(totalData, select = c("Campaign", "transactionRevenue")), Type = "GottenRevenue"), setNames(data.frame(subset(totalData, select = c("Campaign", "lostRevenueByBudget")), Type = "LostByBudget"), c("Campaign", "transactionRevenue","Type")), setNames(data.frame(subset(totalData, select = c("Campaign", "lostRevenueByRank")), Type = "LostByRank"), c("Campaign", "transactionRevenue","Type")))HistData <- HistData[!is.nan(HistData$transactionRevenue),]
;1.3. Строим столбчатую диаграмму на основе полученных данных в R.
#Строим гистограмму на основе пакета ggplot2ggplot(HistData, aes(x = Campaign, y = transactionRevenue, fill = Type))+geom_bar(stat = "identity", position = "fill")+scale_fill_manual(values=c("forestgreen", "firebrick1", "tan1"))+theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 7))+ggtitle("Lost Conversion rate")
2. Работаем с данными в CSV-файле
Для более привычной работы с диаграммами можно выгрузить итоговую таблицу со всеми расчётами в виде CSV-файла в рабочую директорию (пример таблицы). 2.1. Выгружаем данные. Чтобы найти папку, в которую по умолчанию был сохранён файл, выполните следующую команду.
getwd()
;Немного изменив одну строку скрипта, можно самостоятельно указать путь, куда планируете сохранить CSV-файл. Для сохранения в папку по умолчанию строка выглядит так:
write.table(totalData, file='lostRevenue.csv', sep = ";",dec = ",", row.names = FALSE)
Для того, чтобы изменить папку назначения к примеру в папку Data на диске C пропишите путь перед названием файла. Хочу заметить, что папка должна быть создана перед запуском скрипта.
write.table(totalData, file='c:/Data/lostRevenue.csv', sep = ";",dec = ",", row.names = FALSE)
Если в системе по умолчанию установлены региональные настройки США, а не СНГ, можете изменить разделитель между полями и целой или дробной частью скрипта с помощью параметров «sep» и «dec». Соответственно для американских региональных настроек следует изменить строку следующим образом.
write.table(totalData, file='c:/Data/lostRevenue.csv', sep = ",",dec = ".", row.names = FALSE)
;Либо просто опустить параметры «sep» и «dec», так как по умолчанию они принимают американский формат CSV.
write.table(totalData, file='c:/Data/lostRevenue.csv', row.names = FALSE)
2.2. Описание полей CSV-файла.
Поле | Описание |
adwordsCampaignID | ID рекламной кампании |
campaign | Название рекламной кампании |
transactions | Количество полученных транзакций по рекламной кампании |
transactionRevenue | Сумма полученного дохода от рекламной кампаний в валюте аккаунта Google Analytics |
Impressions | Количество полученных показов |
Clicks | Количество полученных кликов |
Cost | Сумма, потраченная на рекламную кампанию в валюте аккаунта Google Ads |
CTR | Кликабельность рекламной кампании |
SearchLostIS(budget) | Процент потерянных показов в поиске в связи с преждевременным расходованием дневного бюджета |
SearchLostIS(rank) | Процент потерянных показов в поиске в связи с низким рейтингом |
ContentLostIS(budget) | Процент потерянных показов в контекстно медийной сети в связи с преждевременным расходованием дневного бюджета |
ContentLostIS(rank) | Процент потерянных показов в контекстно медийной сети в связи с низком рейтингом |
lostImpressionByBudgetSearch | Количество потерянных показов в поиске в связи с преждевременным расходованием дневного бюджета |
lostImpressionByRankSearch | Количество потерянных показов в поиске в связи с низким рейтингом |
lostImpressionByBudgetDisplay | Количество потерянных показов в контекстно медийной сети в связи с преждевременным расходованием дневного бюджета |
lostImpressionByRankDisplay | Количество потерянных показов в контекстно медийной сети в связи с низком рейтингом |
lostImpressionByBudget | Общее количество потерянных показов в связи с преждевременным расходованием дневного бюджета |
lostImpressionByRank | Общее количество потерянных показов в связи с низким рейтингом |
lostClicksByBudget | Общее количество потерянных кликов в связи с преждевременным расходованием дневного бюджета |
lostClicksByRank | Общее количество потерянных кликов в связи с низким рейтингом |
lostTransactionsByBudget | Общее количество потерянных транзакций в связи с преждевременным расходованием дневного бюджета |
lostTransactionsByRank | Общее количество потерянных транзакций в связи с низким рейтингом |
lostTransactions | Общее количество потерянных транзакций |
lostRevenueByBudget | Общая сумма потерянного дохода в связи с преждевременным расходованием дневного бюджета |
lostRevenueByRank | Общая сумма потерянного дохода в связи с низким рейтингом |
lostRevenue | Общая сумма потерянного дохода |
2.3. Обработка данных. На основе этого файла можно строить графики или таблицы для дальнейшего анализа в любом редакторе электронных таблиц: Microsoft Excel, Google Spreadsheets, LibreOffice и другие.
Если вы все сделали правильно, у вас получится вот такой код.
Выводы
1. Для реализации алгоритма необходимо:
- настроенное отслеживание транзакций в Google Analytics;
- установленная связь между Google Analytics и Google Ads;
- установленный язык R на ПК и инструмент для работы с ним — RStudio;
- Developer Client в консоли разработчика Google;
- токен разработчика Google Ads для доступа к API Google Ads.
2. Чтобы запустить скрипт в RStudio, нужно:
- подключить пакеты «devtools», «RGoogleAnalytics» и «RAdwords»;
- установить переменные «clienid», «secret», «ga_view», «adwords_id», «start_period» и «end_period»;
- пройти аутентификацию в Google Analytics и Google Ads;
- запустить скрипт.
3. Чтобы визуализировать информацию, нужно освоить язык R или скачать данные в формате CSV-файла и обработать их в привычном редакторе таблиц. Используя полученную информацию, можно определить, в каких рекламных кампаниях и по какой причине теряется доход. А на основании этой информации — перераспределить бюджет, изменить ставки или проработать ключевые слова с целью повышения показателя качества. Кстати, более подробно о том, как повысить показатель качества, можно узнать
Комментарии (20)
Последние комментарии
Чтобы оставить комментарий, нужно войти