Воркшоп: Анализ показателя качества ключевых слов в 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, %')


Оставьте комментарий

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

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

Вверх ↑