Воркшоп: Анализ показателя качества ключевых слов в Google Ads с помощью языка R и пакета rgoogleads

Воркшоп по работе с Google Ads API с помощью языка R и пакета rgoogleads. В ходе которого мы с нуля разберёмся как пройти авторизацию, запрашивать отчёты из Google Ads, и проанализируем показатель качества ключевых слов рекламного аккаунта.

Видео

Тайм коды:

  • 00:00:00 Приветствие
  • 00:01:12 О спикере
  • 00:03:43 Программа воркшопа
  • 00:04:14 Что такое контекстная реклама и сервис Google Ads
  • 00:06:34 Варианты авторизации в пакете rgoogleads
  • 00:07:24 Авторизация в Google Ads с помощью дефолтных параметров пакета rgoogleads
  • 00:10:00 Создание собственных учётных данных для авторизации
  • 00:21:12 Авторизация в Google Ads с помощью собственных учётных данных
  • 00:23:00 Иерархия аккаунтов в Google Ads API
  • 00:24:53 Ограничения при использовании собственных учётных данных
  • 00:25:54 Автоматизация процесса авторизации с помощью переменных среды
  • 00:26:43 Опции пакеа rgoogleads
  • 00:27:34 Запрос отчётов из Google Ads API
  • 00:30:49 GAQL QueryBuilder
  • 00:34:52 Пример запроса отчётов из Google Ads API
  • 00:39:54 Аргументы функции gads_get_report()
  • 00:41:13 Загрузка отчётов из Google Ads API в многопоточном режиме
  • 00:44:34 Запрос объектов рекламного кабинета Google Ads
  • 00:45:49 Что такое показатель качества ключевых слов и как проходит аукцион среди рекламодателей в Google Ads
  • 00:47:47 Что влияет на показатель качества ключевых слов Google Ads
  • 00:48:29 На что влияет показатель качества Google Ads
  • 00:49:16 Пример анализа качества ключевых слов
  • 01:03:36 Ответы на вопросы

Презентация

Материалы к воркшопу

Скрипт 1-google-ads-auth.R

library(rgoogleads)

# простейший способ авторизации
gads_auth('a.seleznev@netpeak.group')

# учётные данные кешируются в файл
gads_auth_cache_path()
gads_open_auth_cache_folder()

# настройка конфигурации авторизации
gads_auth_configure(
  path = 'auth/gads.client.json'
    )

gads_auth('a.seleznow@netpeak.group')

# иерархия аккаунтов
top_accounts <- gads_get_accessible_customers()

# опции
gads_set_login_customer_id(1754107253)

# запрос все иерархии аккаунтов
account_hie <- gads_get_account_hierarchy()

Скрипт 2-google-ads-reporting.R

library(rgoogleads)

# ####################################
# авторизация
gads_auth('a.seleznev@netpeak.group')

# ####################################
# установка клиентского и упраляющего аккаунта
gads_set_login_customer_id("175-410-7253")
gads_set_customer_id("896-697-8643")

# ####################################
# запрос данных используя текст GAQL запроса
## Текст запроса
campaign_query <- "
SELECT 
  campaign.id, 
  campaign.name, 
  segments.date, 
  metrics.clicks, 
  metrics.impressions 
FROM campaign 
WHERE 
  segments.date DURING THIS_MONTH AND metrics.clicks > 0
"

## Запрос данных
campaign_data <- gads_get_report(gaql_query = campaign_query) 

# ####################################
# метаданные и информация о ресурсах
resources <- gads_get_metadata("RESOURCE")
metadata  <- gads_get_metadata("ALL")

fields    <- gads_get_fields("campaign")

# ####################################
# Задаём параметры запроса внутри gads_get_report()
## Повторяем используемый ранее запрос, но через параметры функции
campaign_data_2 <- gads_get_report(
  resource = "campaign", 
  fields   = c("campaign.id", 
               "campaign.name",
               "segments.date", 
               "metrics.clicks",
               "metrics.impressions"), 
  during = "THIS_MONTH",
  where  = "metrics.clicks > 0") 

# Статичные даты
campaign_data_3 <- gads_get_report(
  resource = "campaign", 
  fields   = c("campaign.id", 
    "campaign.name",
    "segments.date", 
    "metrics.clicks",
    "metrics.impressions"), 
  date_from = "2022-04-01", date_to = "2022-04-19",
  where  = "metrics.clicks > 0") 

# ####################################
# Использование многопоточности
## задаём список клиентских аккаунтов
client_ids <- c(
  "896-697-8643", 
  "201-949-5809", 
  "263-160-7978", 
  "793-293-9250", 
  "927-254-7535")

gads_set_login_customer_id("175-410-7253")
gads_set_customer_id(client_ids)

## создаём кластер
cl <- parallel::makeCluster(4)

## выполняем запрос в многопоточном режиме
tictoc::tic("Loading in parallel")

multi_account_data <- gads_get_report(
  resource = "campaign", 
  fields   = c("campaign.id", 
    "campaign.name",
    "segments.date", 
    "metrics.clicks",
    "metrics.impressions"), 
  during = "THIS_MONTH",
  where  = "metrics.clicks > 0", 
  cl     = cl) 

tictoc::toc()

## останавливаем кластер
parallel::stopCluster(cl)

## запускаем тот же запрос в последовательном режиме
tictoc::tic("Loading in sequences")

multi_account_data <- gads_get_report(
  resource = "campaign", 
  fields   = c("campaign.id", 
    "campaign.name",
    "segments.date", 
    "metrics.clicks",
    "metrics.impressions"), 
  during = "THIS_MONTH",
  where  = "metrics.clicks > 0") 

tictoc::toc()

# ####################################
## Забираем списки объектов
gads_set_customer_id("927-254-7535")

campaigns <- gads_get_campaigns()
ad_groups <- gads_get_ad_groups()
ads       <- gads_get_ads()
keywords  <- gads_get_keywords(limit = 100)

3-google_ads_quality_score_analisys.R

# подключение пакетов
library(rgoogleads)
library(dplyr)
library(forcats)
library(ggplot2)

# авторизация
gads_auth('a.seleznev@netpeak.group')

# аккаунты
## управляющий аккаунт
gads_set_login_customer_id('175-410-7253')
## рекламный аккаунт
gads_set_customer_id('474-944-7568')

# запрос данных из Google Ads
ads_data <- gads_get_report(
  resource = 'keyword_view', 
  fields = c('customer.descriptive_name', 
             'ad_group_criterion.criterion_id', 
             'ad_group_criterion.final_urls',
             'ad_group_criterion.status',
             'ad_group.id', 
             'ad_group.name',
             'ad_group.status',
             'campaign.id',
             'campaign.name',
             'campaign.status',
             'metrics.impressions',
             'metrics.clicks',
             'metrics.cost_micros',
             'metrics.ctr',
             'metrics.search_top_impression_share',
             'ad_group_criterion.quality_info.creative_quality_score',
             'ad_group_criterion.quality_info.post_click_quality_score',
             'ad_group_criterion.quality_info.search_predicted_ctr', 
             'ad_group_criterion.quality_info.quality_score'),
  where     = c('metrics.impressions > 0', 
                'ad_group_criterion.quality_info.creative_quality_score IN ("ABOVE_AVERAGE", "AVERAGE", "BELOW_AVERAGE")'),
  during    = 'LAST_30_DAYS'
)

# Определяем группу показателя качества для каждого ключевого слова
ads_data <- mutate(ads_data, 
                   qiality_score_group = case_when(
                     ad_group_criterion_quality_info_quality_score <= 4           ~ 'Low',
                     between(ad_group_criterion_quality_info_quality_score, 5, 7) ~ 'Middle',
                     ad_group_criterion_quality_info_quality_score >= 8           ~ 'High'
                   )
)

# Визуализация среднего показателя качества в разрезе кампаний
ads_data %>% 
  group_by(campaign_name) %>% 
  summarise(avg_qs = mean(ad_group_criterion_quality_info_quality_score, na.rm = TRUE)) %>% 
  ggplot(aes(x = fct_reorder(.f = campaign_name, .x = avg_qs, .fun = median), y = avg_qs, fill = avg_qs)) +  
  geom_bar(stat = "identity", position = "dodge") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9)) + 
  scale_fill_gradient(low = hcl(15,100,75), high = hcl(195,100,75)) +
  ggtitle("Average Quality Score by Campaign") +
  xlab('Campaign') +
  ylab('Average Quality Score')

# Визуализация по группированному показателю качества
ads_data %>% 
  group_by(campaign_name, qiality_score_group) %>% 
  summarise(keywords_count = n_distinct(ad_group_criterion_criterion_id)) %>% 
  ggplot(aes(x = campaign_name, y = keywords_count,fill = qiality_score_group))+  
  geom_col(stat = "count", position = "fill") +  
  scale_fill_manual(breaks=c("High","Middle","Low"),
                    values=c(High = "forestgreen", 
                             Middle = "tan1" , 
                             Low = "firebrick1"))+  
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9))+  
  ggtitle("Number of keywords by Quality Score Group") +
  xlab('Campaign') +
  ylab('Kweywords number')

# Визуализация по релевантности объявления
ggplot(ads_data, aes(x = campaign_name, fill = ad_group_criterion_quality_info_creative_quality_score))+  
  geom_bar(stat = "count", position = "fill")+   
  scale_fill_manual(values=c("forestgreen", "tan1" , "firebrick1","grey" ))+  
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9), 
        legend.position = 'bottom')+  
  ggtitle("Landing page experience by Campaign") +
  xlab('Campaign') +
  ylab('Kweywords number')

# Визуализация по качеству целевой страницы
ggplot(ads_data, aes(x = campaign_name, fill = ad_group_criterion_quality_info_post_click_quality_score))+  
  geom_bar(stat = "count", position = "fill")+   
  scale_fill_manual(values=c("forestgreen", "tan1" , "firebrick1","grey" ))+  
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9), 
        legend.position = 'bottom')+  
  ggtitle("AdRelevance by Campaign") +
  xlab('Campaign') +
  ylab('Kweywords number')

# Визуализация по ожидаемому значению CTR
ggplot(ads_data, aes(x = campaign_name, fill = ad_group_criterion_quality_info_search_predicted_ctr))+  
  geom_bar(stat = "count", position = "fill")+   
  scale_fill_manual(values=c("forestgreen", "tan1" , "firebrick1","grey" ))+  
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 9), 
        legend.position = 'bottom')+  
  ggtitle("Expected CTR by Campaign") +
  xlab('Campaign') +
  ylab('Kweywords number')

# оценка % показа над результатами поиска
ads_data %>% 
  group_by(qiality_score_group) %>% 
  mutate(med_impression_share = median(search_top_impression_share)) %>% 
  ggplot(aes(x = fct_relevel(qiality_score_group, "Low", "Middle", "High"), y = search_top_impression_share, fill = med_impression_share))+
  geom_boxplot(outlier.color = "grey", outlier.stroke = F) +
  scale_fill_gradient(high = hcl(15,100,75), low = hcl(195,100,75)) +
  scale_y_continuous(labels = scales::percent_format()) +
  theme(legend.position = 'none') +
  ggtitle("Search Top Impression Share by Quality Score Group") +
  xlab('Quality Score Group') +
  ylab('Search Top Impression Share, %')

# CTR в зависимости от группы показателя качества
ads_data %>% 
  group_by(qiality_score_group) %>% 
  mutate(med_ctr = median(ctr)) %>% 
  ggplot(aes(x = fct_relevel(qiality_score_group, "Low", "Middle", "High"), y = ctr, fill = med_ctr))+
  geom_boxplot(outlier.color = "grey", outlier.stroke = F) +
  scale_fill_gradient(high = hcl(15,100,75), low = hcl(195,100,75)) +
  scale_y_continuous(labels = scales::percent_format()) +
  theme(legend.position = 'none') +
  ggtitle("Search Top Impression Share by Quality Score Group") +
  xlab('Quality Score Group') +
  ylab('Search Top Impression Share, %')


Доклад: Как работать с API Google Analytics на языке R с помощью пакета googleAnalyticsR (8P Online Edition 2020)

9 июля впервые конференция 8P прошла в online формате, в связи с Covid-19.

На конференции я выступил с воркшопом, в ходе которого показал как с помощью языка R и пакета googleAnalyticsR работать с API Google Analytics.

Продолжить чтение «Доклад: Как работать с API Google Analytics на языке R с помощью пакета googleAnalyticsR (8P Online Edition 2020)»

Доклад: Как через R коннектор получить данные из Вконтакте в Power BI

В декабре 2020 года прошла вторая ежегодная конференция по построению продвинутых отчётов в Excel и Power BI. На которой я выступил с докладом «Как через R коннектор получить данные из Вконтакте в Power BI».

Продолжить чтение «Доклад: Как через R коннектор получить данные из Вконтакте в Power BI»

Доклад: Учим язык R на примере SQL запросов (Product Star Conference)

Опубликовал запись своего доклада «Учим язык R на примере SQL запросов», который я провёл в прошлую субботу в рамках конференции Product Star Conference.

SQL знает любой программист, и по-хорошему должен знать любой аналитик, т.е. это более популярный язык чем R и Python. И я в свою очередь выучил SQL на несколько лет раньше чем приступил к изучению R. В тот момент мне не хватало аналогично вебинара, который бы дал вводную информацию для старта в R на понятном на тот момент для меня SQL.

Продолжить чтение «Доклад: Учим язык R на примере SQL запросов (Product Star Conference)»

Доклад: Разработка telegram бота для получения данных из Яндекс Метрики с помощью языка R (ZM CONF — 2, 27.08.2020)

Запись доклада с конференции ZM Conf — 2 которая прошла 27 августа 2020 года.

Продолжить чтение «Доклад: Разработка telegram бота для получения данных из Яндекс Метрики с помощью языка R (ZM CONF — 2, 27.08.2020)»

Вебинар: Основы Python. Библиотека Pandas (29.07.2020)

Провели совместный с Productstar вебинар «Основы Python. Библиотека Pandas.».

Тезисы:

  • Установим дистрибутив Anaconda
  • Разберёмся с основными структурами данных в библиотеке Pandas
  • Научимся загружать данные с помощью библиотеки Pandas
  • Выполним основные операции по преобразованию данных и эквивалентные сводным таблицам в Excel
Продолжить чтение «Вебинар: Основы Python. Библиотека Pandas (29.07.2020)»

Видео запись R meetup: Чем нас порадует dplyr 1.0.0

Данный митап был организован Европейским Университетом в Спб.

Посвящён митап новым возможностям популярного R пакета dplyr версии 1.0.0.

В ходе митапа я провёл обзор 4 статей автора dplyr, Хедли Викхема, в которых он рассказывал о грядущих изменениях.

Продолжить чтение «Видео запись R meetup: Чем нас порадует dplyr 1.0.0»

Вебинар: Сколько денег приносит ваш контент (Нетология 10.02.2019)

Мало создать контент, нужно ещё понимать, приносит ли он деньги — и сколько. Контент-маркетологу или редактору сайта это важно для собственного роста, а руководителю отдела маркетинга или бизнесмену — чтобы понимать, когда ждать прибыль.

Организатор: Нетология

Продолжить чтение «Вебинар: Сколько денег приносит ваш контент (Нетология 10.02.2019)»

Доклад: Как маркетологу избавиться от рутины с помощью языка R (Automation Day 2018)

15 декабря прошла онлайн конференция Automation Day посвящённая процессу автоматизации рутинных задач. Где я выступил с докладом «Как маркетологу избавиться от рутины с помощью языка R.

Продолжить чтение «Доклад: Как маркетологу избавиться от рутины с помощью языка R (Automation Day 2018)»

Вебинар: Как автоматизировать работу с данными Яндекс.Метрики с помощью языка R и пакета rym (CyberMarketing)

Со временем, у многих бизнесов возникают вопросы, на которые нельзя ответить с помощью стандартного интерфейса отчётов Яндекс Метрики. Менеджменту, в свою очередь, часто нужны простые ответы на сложные вопросы. В таком случае, можно работать с данными из Метрики в сторонних интерфейсах и объединять их с данными из других систем, будь то CRM, системы учёта и так далее. В докладе будет идти речь о том, как это делать. 

Продолжить чтение «Вебинар: Как автоматизировать работу с данными Яндекс.Метрики с помощью языка R и пакета rym (CyberMarketing)»

Создайте бесплатный сайт или блог на WordPress.com.

Вверх ↑