Аналогично скрипту на R для облака поисковых слов AdWords сделал и для Директа, но добавил больше интерактивности, благодаря Shiny можно его открыть любым браузером и все изменения в настройках сразу изменяют данные на странице.
Скрипт скачивает поисковые запросы по всем кампаниям в аккаунте за последние 30 дней.
Можно выбрать кампанию, указать анализируемый период внутри 30 дней (по умолчанию стоит последние 7 дней).
Добавлен ползунок для выбора минимальной частоты и ползунок для "зума" слов, слова, шрифт которых становиться слишком большой не показываются на экране, а те что раньше были маленькие - увеличиваются.
Под облаком формируется таблица из слов и относящихся к ним поисковым запросам. Таблица из двух вкладок - слова без конверсий и слова с конверсиями.
Таблицу можно отсортировать по столбцам, задать отображаемое число строк.
Так же можно воспользоваться поиском по таблице. Данные из таблицы можно сохранить в csv файл.

Для запуска скрипта нужно создать файл app.R в отдельной папке.
Сам скрипт ниже. Укажите логин и токен API от нужного аккаунта.
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#library(shiny)
library(ryandexdirect)
library(dplyr)
library(tidyr)
library(tm)
library(wordcloud2)
library(devtools)
#Для получения токена расскоментировать строку ниже
#myToken <- yadirGetToken()
#Полученный токен можно сохранить для постоянного использования
directLogin <- "Ваш_логин"
myToken <-"Ваш_токен"
directSearchQuery <- yadirGetReport(
ReportType = "SEARCH_QUERY_PERFORMANCE_REPORT",
DateRangeType = "LAST_30_DAYS",
DateFrom = NULL,
DateTo = NULL,
FieldNames = c("Date", "CampaignName", "AdGroupId", "AdGroupName", "Query", "Impressions", "Clicks","Cost","Conversions"),
FilterList = NULL,
IncludeVAT = "YES",
IncludeDiscount = "NO",
Login = directLogin,
Token = myToken)
#Преобразование типов в таблице
directSearchQuery$Impressions <- as.integer(as.character(directSearchQuery$Impressions))
directSearchQuery$Conversions <- as.integer(as.character(directSearchQuery$Conversions))
directSearchQuery$Conversions[is.na(directSearchQuery$Conversions)]<-0
directSearchQuery$Date <- as.Date(directSearchQuery$Date)
#Получаем все уникальные кампании из отчета
CampaignNames <- as.character( unique(directSearchQuery$CampaignName))# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Анализ ключевых слов без конверсий"),
fluidRow(
column(4,
selectInput("campany", "Рекламная кампания:",
choices=CampaignNames),
hr(),
dateRangeInput("dates",
"Временной диапазон",
start = Sys.Date()-8,
end = Sys.Date()-1,
min = Sys.Date()-31,
max = Sys.Date()-1,
language = "ru",
format = "dd-mm-yyyy"
),
sliderInput("freq",
"Минимальная частота:",
min = 1, max = 100, value = 5),
sliderInput("size",
"Зум (размер шрифта):",
min = 0.1, max = 20, value = 0.5, step = 0.1)
),
column(8,
wordcloud2Output("wordcloud")
)
),
fluidRow(
column(12,
hr(),
h2("Ститистика по каждому слову"),
tabsetPanel(
id = 'dataset',
tabPanel('Без конверсий', DT::dataTableOutput('wordsThisoutConversion')),
tabPanel('С конверсиями', DT::dataTableOutput('wordsThisConversion'))
),
hr(),
downloadButton('download', 'Скачать таблицу'),
hr()
)
)
)# Define server logic
server <- function(input, output) {
#Таблица со словами с конверсией
ThisConversion <- reactive({
#Выбираем слова с конверсией и добавляем отдельные слова в новую колонку
wordsThisConversion <- directSearchQuery %>%
filter(Conversions!="0", CampaignName == input$campany, Date>=input$dates[1] & Date<=input$dates[2]) %>%
select (Query, Conversions) %>%
mutate(searchWord = strsplit(as.character(Query), " "))
#преобразуем таблицу если конверсий > 0, иначе будет ошибка в unnest()
if(length(wordsThisConversion$Conversions)!=0){
wordsThisConversion <- unnest(wordsThisConversion,searchWord)
wordsThisConversion <- wordsThisConversion %>%
group_by (searchWord) %>%
summarise(Conversion = sum(Conversions), Query = paste(Query, collapse = ', '))
#убираем из таблицы стоп слова
wordsThisConversion <- subset(wordsThisConversion, !(wordsThisConversion$searchWord %in% stopwords("russian")))
}
})
#Таблица со словами без конверсий
ThisoutConversion <- reactive({
#Выбираем слова без конверсий и добавляем отдельные слова в новую колонку
wordsThisoutConversion <- directSearchQuery %>%
filter(Conversions==0,CampaignName == input$campany, Date>=input$dates[1] & Date<=input$dates[2]) %>%
select (Query, Impressions) %>%
mutate(searchWord = strsplit(as.character(Query), " ")) %>%
unnest(searchWord) #преобразум таблицу
wordsThisoutConversion <- wordsThisoutConversion %>%
group_by (searchWord) %>%
summarise(Impressions = sum(Impressions), Query = paste(Query, collapse = ', '))
#убираем из таблицы стоп слова
wordsThisoutConversion <- subset(wordsThisoutConversion, !(wordsThisoutConversion$searchWord %in% stopwords("russian")))
#убираем из таблицы слова с конверсиями
wordsThisoutConversion <- subset(wordsThisoutConversion, !(wordsThisoutConversion$searchWord %in% ThisConversion()$searchWord))
wordsThisoutConversion <- wordsThisoutConversion %>%
filter(Impressions>=input$freq)
})
output$wordcloud <- renderWordcloud2({
#Выводим облако
wordcloud2(ThisoutConversion(), size = input$size, minRotation = 0, maxRotation = 0)
})
output$download <- downloadHandler("bad-words.csv",
content = function(file) {
write.csv(ThisoutConversion(), file)
},
contentType = "text/csv")
output$wordsThisoutConversion <- DT::renderDataTable({
DT::datatable(ThisoutConversion())
})
output$wordsThisConversion <- DT::renderDataTable({
DT::datatable(ThisConversion())
})
}# Run the application
shinyApp(ui = ui, server = server)
Комментарии (4)
Максим М:
июн 20, 2017 at 09:05
Надо попробовать))
Крутая штука!
Дмитрий:
июн 20, 2017 at 08:45
Интересное решение, но почему то проблемы с кодировкой
http://joxi.ru/Dr8j1D7HVXo426
admin:
сен 13, 2017 at 07:24
Попробуйте изменить кодировку в браузере или открыть ссылку в другом
Евген:
дек 16, 2017 at 02:57
Добрый день, работал с Вашим кодам, но получил вот такую ошибку как можно её исправить. http://prntscr.com/ho99nl