R для специалиста по контекстной рекламе

про контекстную рекламу, автоматизацию, R

Выгрузка объявлений Яндекс.Директа с помощью R

Столкнулся с проблемой, при работе с ryandexdirect. Когда пытаюсь выгрузить группы объявлений или сами объявления с помощью функций yadirGetAdGroups и yadirGetAds на большом аккаунте, работа скрипта длится несколько минут и в итоге заканчивается ошибкой.

Если выгружать из одной кампании, то все работает нормально. В итоге для меня рабочий способ такой:


campaigns <- yadirGetCampaign(Logins = login,TokenPath = token,States = "ON")

ad_groups <-
  map_df(
    campaigns$Id, 
    ~       
      { yadirGetAdGroups(Login = login,TokenPath = token,CampaignIds = .x)}
  )

ads <- 
  map_df(
    campaigns$Id,
    ~
      {yadirGetAds(Login = login,TokenPath = token,CampaignIds = .x)}
  )

Выгрузка конверсий по поисковым запросам из Яндекс.Директа

Рекламные системы, в том числе Яндекс.Директ, позволяют просматривать поисковые запросы, по которым были показаны ваши объявления. Это очень полезная функция. С ее помощью можно искать новые ключевые слова и обновлять список минус-слов.

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

На помощь к нам приходит R и ryandexdirect. Я уже писал как устанавливать RStudio и делать выгрузку по ключевым словам. Теперь попробуем выгрузить поисковые запросы.

# проверяем, установлен ли пакет, если нет - устанавливаем его
if(!'ryandexdirect' %in% rownames(installed.packages())){
  install.packages('ryandexdirect')
}

# подключаем пакет
library(ryandexdirect)

# устанавливаем логин в Директе
login <- "ЛОГИН_В_ДИРЕКТЕ"

# выгружаем статистику
report <- yadirGetReport(ReportType = "SEARCH_QUERY_PERFORMANCE_REPORT",
                         DateFrom = Sys.Date() - 30, # начало даты отчета - 30 дней назад
                         DateTo = Sys.Date() - 1,  # по вчера
                         FieldNames = c("Query",
                                        "Impressions",
                                        "Clicks",
                                        "Cost",
                                        "Conversions"),
                         Goals = c("ID_ЦЕЛИ_В_МЕТРИКЕ_1","ID_ЦЕЛИ_В_МЕТРИКЕ_2"), # указываем id целей
                         Login = login,
                         IncludeVAT = "YES")

# преобразовываем столбцы со 2 по 6 в числовой формат; 
# если бы у нас было 3 цели, 
# то столбцов было бы больше и мы бы указывали их так [, 2:7]
report[, 2:6] <- sapply(report[, 2:6], as.numeric)

# меняем все Na на 0
report[is.na(report)] <- 0

# записываем результат в Excel-файл
writexl::write_xlsx(report, "report.xlsx")

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

К сожалению, Алексей (автор ryandexdirect) отказался от дальнейшей работы над пакетом. Тем не менее поисковые запросы чаще выгружаются нормально — баг достаточно редкий.

Подготовка данных для аналитики контекстной рекламы с помощью R

Привет!

Ранее я писал как сделать простую выгрузку данных из Яндекс.Директа с помощью ryandexdirect и нарисовать график изменения трафика. Теперь давайте выгрузим статистику по ключевым словам для последующего анализа.

Запустим RStudio и проверим установлены ли необходимые библиотеки ryandexdirect и tidyverse. Если нет, то устанавливаем. Следующий код проверяет, устанавливает и загружает библиотеки:

if(!'ryandexdirect' %in% rownames(installed.packages())){
  install.packages('ryandexdirect')
}
if(!'tidyverse' %in% rownames(installed.packages())){
  install.packages('tidyverse')
}

library("ryandexdirect")
library("tidyverse")

Теперь создаем таблицу report, в которую выгружаем данные из Директа:

report <- yadirGetReport(ReportType = "CUSTOM_REPORT",
                          DateFrom = Sys.Date() - 30,
                          DateTo = Sys.Date(),
                          FieldNames = c(
                                         "Criteria",
                                         "CampaignName",
                                         "Impressions",
                                         "Clicks",
                                         "Cost",
                                         "Conversions",
                                         "AvgImpressionPosition"),
                          Goals = c(ID_ЦЕЛИ_В_МЕТРИКЕ),
                          IncludeVAT = "YES",
                          Login = "ВАШ_ЛОГИН_В_ДИРЕКТЕ",
                          FilterList = ("Impressions GREATER_THAN 0"))

В FieldNames мы добавили конверсии (Conversions), поэтому в параметре Goals надо указать какие именно конверсии нас интересуют.

Запускаем наш код и получаем таблицу с такими столбцами: ключевое слово, название кампании, показы, клики, стоимость с НДС, конверсии, средняя позиция показа. Сразу замечаем странное: показатели конверсии и средней позиции показа выровнены по левой стороне.

Это происходит из-за того, что в этих столбцах данные со строковым типом. Давайте проверим тип данных в наших столбцах:

lapply(report, class)

Все верно, два последних столбца — это не числа, а текст.

С текстом работать не получится. Будем делать преобразование типа данных:

report$AvgImpressionPosition <- as.numeric(report$AvgImpressionPosition)
report$Conversions_ID_ЦЕЛИ_В_МЕТРИКЕ_LSC <- as.numeric(report$Conversions_ID_ЦЕЛИ_В_МЕТРИКЕ_LSC)

в обоих случаях мы скорее всего получим предупреждения:
NAs introduced by coercion

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

При преобразовании в числовой формат мы получаем такое предупреждение. Давайте заменим эти Na на 0:

report[is.na(report)] <- 0

Было

Стало

Получили таблицу с нормальными данными. Ее можно быстро отсортировать, кликнув на название столбца.
Но таблице явно чего-то не хватает. Давайте добавим столбцы со средней стоимостью клика, CTR, конверсией и стоимостью конверсии.

Создадим новую таблицу report_2 и добавим туда новые столбцы:

report_2 <- report %>% 
  mutate(CTR = round((Clicks/Impressions)*100,2),
         CPC = round(Cost/Clicks,2),
         CR = round((Conversions_ID_ЦЕЛИ_В_МЕТРИКЕ_LSC/Clicks)*100,2),
         CPA = round(Cost/Conversions_ID_ЦЕЛИ_В_МЕТРИКЕ_LSC,0))

Наши показатели добавлены в новую таблицу.

Кажется, снова нужно их поправить. Теперь еще и Inf добавился — из-за деления на ноль.
Следующий код поможет нам зачистить эти значения:

is.na(report_2)<-sapply(report_2, is.infinite)
report_2[is.na(report_2)]<-0

Вместо ошибок — нули. Может, и не очень правильно, но гораздо красивее. Можно пользоваться этой таблицей для аналитики и принятия решений по корректировке ставок.

Построение графиков в R с помощью функции plot

В предыдущем посте мы получили данные из Директа. А что если нам хочется их визуализировать?

Давайте возьмем скрипт из предыдущего поста и потренируемся на нем. Заменим в нашем скрипте периоды отчета: с 7 до 30 дней. Это чтобы график был интереснее.

library(ryandexdirect)
report <- yadirGetReport(ReportType = "CUSTOM_REPORT",
                         DateRangeType = "LAST_30_DAYS",
                         FieldNames = c("Date", "Clicks", "Cost"),
                         Login = "ВАШ_ЛОГИН_В_ДИРЕКТЕ")

Теперь нарисуем график, который отражает изменение трафика по дням. В R особой популярностью пользуется пакет ggplot2, но мы воспользуемся встроенной функцией plot:

plot(report$Date, # столбец с данными для оси x
     report$Clicks, # столбец с данными для оси y
     type = "l", # тип визуализации - линия
     xlab = "Days", # Название оси x
     ylab = "Clicks", # Название оси y
     main = "Clicks from Yandex Direct", # Название графика
     ylim = c(0,4000), # ограничение оси y
     col = "blue", # цвет линии
     lwd = 3) # толщина линии

Каждую строку параметров я подписал. Все, что написано в строке после знака # не воспринимается как код и используется как заметки.

В результате у нас получился такой график, на котором хорошо заметен недельный цикл нашего трафика:

Подробнее о том, как пользоваться функцией plot, можно прочитать тут.

Быстрый способ выгрузки статистики из Яндекс.Директа с помощью R

Давайте представим — вы управляете рекламным кабинетом в Янденс.Директе и каждый день просматриваете отчеты по эффективности рекламы. Можно это делать через веб-интерфейс, воспользоваться Яндекс.Метрикой либо сторонним сервисом аналитики. Но что делать если вы хотите больше контроля и гибкости?

На помощь приходит API Директа, с помощью которого можно выгружать статистику для последующего анализа. Самым простым способом является язык программирования R. Он создан для анализа данных и успел обрасти огромным количеством пакетов, которые позволяют делать очень многое.

Одним из таких пакетов является ryandexdirect. Его создал Алексей Селезнев из агентства Netpeak. К сожалению, Алексей отказался от дальнейшей работы над пакетом, тем не менее ryandexdirect остается самой простой точкой входа в API Директа.

Итак, что же нужно сделать, чтобы начать пользоваться R и выгружать аналитику из рекламного кабинета? Во-первых, нужно установить сам R и RStudio (из Википедии: «RStudio — свободная среда разработки программного обеспечения с открытым исходным кодом для языка программирования R, который предназначен для статистической обработки данных и работы с графикой»).

Скачиваем R и RStudio

После установки RStudio запускаем его.
Перед нами окно программы, в которой мы будем работать. Слева — консоль, справа окна, в которых будет много полезной информации. Слева в меню нажимаем на плюсик и выбираем создание нового файла, а именно R scritp. Появляется блокнот, в котором мы будем писать код.

Давайте попробуем что-нибудь написать и запустить.

a <- 7
b <- 8
c <- a + b
c

мы создали 3 переменные: a, b, c.

<- — это знак присваивания. Мы присвоили переменной a значение 7, а переменной b — 8.
c мы сделали суммой a и b. И в конце вывели полученное значение c. Чтобы запустить код, надо выделить его и нажать на Run либо сочетанием клавиш Ctr + Enter (Cmd + Enter для мака). Запускаем код.
Теперь в окне справа мы можем видеть текущие значения переменных.

Выгрузка данных из Директа

Теперь переходим непосредственно к импорту статистики из Директа.
Во-первых, необходимо установить ryandexdirect. Запускаем такой код:

install.packages("ryandexdirect")

Больше нам эта строчка не понадобится — ryandexdirect установлен в R. Ее можно удалить.

Пишем код для импорта статистики:

library(ryandexdirect)
report <- yadirGetReport(ReportType = "CUSTOM_REPORT",
                         DateRangeType = "LAST_7_DAYS",
                         FieldNames = c("Date", "Clicks", "Cost"),
                         Login = "ВАШ_ЛОГИН_В_ДИРЕКТЕ")

Первая строка кода означает загрузку пакета ryandexdirect. Далее мы создаем переменную report, в которую помещаем наш отчет. Отчет генерируется функцией yadirGetReport. В параметрах мы указываем, что это статистика с произвольными группировками. В FieldNames перечисляем поля нашего отчета.

При запуске отчета вас должно перекинуть в браузер на страницу авторизации. Оттуда нужно скопировать код и вставить его в консоль RStudio. Нам будет предложено сохранить токен для того, чтобы больше не авторизовываться. Токен будет сохранен в рабочей папке.

В итоге мы получаем таблицу в 3 столбцами, которые перечислили в FieldNames. В нашем случае это: Дата, Клики, Стоимость. Поля, которые можно использовать в выгрузке, описаны тут. Там же указана и совместимость с типом отчета (в нашем примере — это был «CUSTOM_REPORT»).

Наш отчет содержит данные за 7 дней. Даты отчета можно указывать произвольно. Тогда вместо DateRangeType нужно указывать параметры DateFrom и DateTo. Даты указываются в кавычках в формате ГГГГ-ММ-ДД. Например:

DateFrom = "2022-08-01",
DateTo = "2022-08-07"

Спасибо Алексею за его работу и возможность так удобно выгружать данные из Директа.

Привет!

Меня зовут Артём. Я — специалист по контекстной рекламе. В данный момент работаю руководителем направления контекстной рекламы в СберЗдоровье.

Некоторое время назад я познакомился с языком программирования R и библиотеками к нему, которые могут сильно упростить жизнь специалисту по контексту. Данный блог решил завести для того, чтобы сохранять тут готовые скрипты.

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

По любым вопросам можно писать мне в Телеграм.