R4marketing | канал Алексея Селезнёва | Язык R
4.28K subscribers
59 photos
11 files
1.21K links
Автор канала Алексей Селезнёв, украинский аналитик, автор ряда курсов по языку R и пакетов расширяющих его возможности.

В канале публикуются статьи, доклады, новости, уроки и заметки по языку R.

Для связи: @AlexeySeleznev
Реклама: http://bit.ly/39MwJCY
Download Telegram
​​Интересную мысль описал автор статьи "Do write positive code".

Ранее я не задумывался о том, что надо стремится к тому, что бы не использовать в коде отрицания, если это возможно. Тем более не использовать двойные и тройные отрицания.

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

Цитата из статьи:
Как только вы говорите мозгу "Не думай о слоне", первое о чём он начинает думать - это конечно слон!

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

 
# bad
if (!file.exists(some_file_name))
{
# do something
}
else
{
# do some other thing
}

#------------------------------------
# good
if (file.exists(some_file_name))
{
# do something
}
else
{
# do some other thing
}


#заметки_по_R
​​Актуализировал одну старенькую статью "Как визуализировать показатель качества ключевых слов — рецепт скрипта на языке R".

Полезна она будет интернет маркетологам работающим в Google Ads.

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

Так же в статье вы найдёте рекомендации по тому, какие действия необходимо предпринимать по построенной визуализации, для повышения эффективности рекламных кампаний.

#статьи_по_R
​​Собрал из всех своих пакетов коллекцию для интернет маркетинга galigor.

На самом деле galigor был создан пару лет назад, но на CRAN я его тогда не опубликовал.

На данный момент galigor состоит из 8ми пакетов:

- rgoogleads - пакет для работы с Google Ads API
- ryandexdirect - пакет для работы с API Яндекс.Директ
- rym - пакет для работы с Яндекс.Метрикой
- rfacebookstat - пакет для работы с Facebook MArketing API
- rmytarget - пакет для работы с API MyTarget
- rvkstat - пакет для работы с API Вконтакте
- rappsflyer -пакет для работы с AppsFlyer Pull API
- getProxy - пакет позволяющий обходить блокировку заблокированных в вашей стране сервисов.

Пакет timeperiodsR я в эту коллекцию не включил т.к. прямого отношения к интернет маркетингу он не имеет.

Установить коллекцию можно стандартной командой install.packages('galigor').

#новости_и_релизы_R
​​Первой моей публикацией на Хабре была "Обзор пакетов для интернет маркетинга, часть 1".

С тех пор прошло почти 3 года, появилось много новых, полезных пакетов, которые могут очень сильно упростить повседневную рутину интернет маркетологам и веб аналитикам.

В связи с чем сегодня, спустя три года после первой публикации, я опубликовал продолжение "Обзор R пакетов для интернет маркетинга, часть 2".

#статьи_по_R
​​ Какой объем текста на странице увеличит видимость в Google и Яндекс?
Сколько фотографий товара должно быть на карточке?
Какие позиции занимают сайты конкурентов по вашей семантике?
Как влияют на ранжирование обновления алгоритмов поисковых систем?
Какие работы над сайтом показывают эффективность, а какие нет?

Представляем обновленную версию SEOWORKплатформу аналитики и контроля SEO, где вы можете получить ответы на эти вопросы буквально в 2 клика.

За последнее время мы полностью обновили основные модули платформы и внедрили новые инструменты. Теперь вы можете:
- отследить динамику по своему сайту в сравнении с сайтами конкурентов по вашему семантическому ядру, по группе страниц или запросов,
- оценить эффективность проводимых работ, провести a/b тесты, рассчитать сколько фото товара и какой объем SEO текста должен быть на странице за счет аналитики сегментов (групп страниц или запросов),
- построить BI отчеты по любым сегментам в разрезе видимости, спроса или трафика, нажав одну кнопку,
- всегда иметь под рукой наглядную картину в динамике по трафику и видимости проекта.

Работать с платформой стало значительно проще, такой функционал будет актуален не только для SEO-специалистов, но и для руководителя проекта, product менеджера и маркетолога.

И это лишь малая часть функционала платформы!

Зарегистрируйтесь на сайте и получите тестовый доступ
​​4 пайплайна в magrittr

Пайаплан операторы позволяют повысить читаемость кода, за счёт того, что выстраивают операции последовательно, и позволяют избегать вложенности функций друг в друга. По сути пайплан берёт результат прошлой операции, и передаёт его в качестве первого аргумента следующей.

Многие используют базовый пайплан %>%, но на самом деле в magrittr помимо базового есть ещё 3 дополнительных пайплайна.

Ниже приведу описание этих пайпланов.


● Базовый оператор %>%

Самый распространённый пайплан оператор, который известен всем пользователям tidyverse.

mtcars %>%
filter(mpg > 30) %>%
select(mpg:wt)



● Tee Pipe %T>%

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

iris %T>%
plot %>%
group_by(Species) %>%
summarize(
MaxSepalLength = max(Sepal.Length),
MinSepalLength = min(Sepal.Length)
)



● Exposition Pipe %$%

Данный оператор позволяет избежать дублирования имени объекта по примеру того, как это реализовано в tidyverse. Например, работая с базовым data.frame, для фильтрации данных внутри квадратных скобок вам необходимо дублировать имя data.frame.

iris[iris$Sepal.Length < 5.0, ]


Оператор %$% позволяет избегать этого дублирования:

iris %$% iris[Sepal.Length < 5.0, ]

Ещё один пример использования:

iris %$% plot(Sepal.Length, Sepal.Width)



● Оператор присваивания %<>%

Данный оператор переопределяет значение первого объекта цепочки.

x <- c(1,2,3,4)
x %<>% sum



Ссылки:
- Примеры кода заимствованы из этой статьи

#заметки_по_R
​​Завтра в 12:30 буду вести в Yagla вебинар "Как работать с API Google Analytics 4 на языке R".

По уровню рассчитан даже на тех кто вообще про язык R не слышал:

- Что такое язык R и в чём его преимущества;
- Установка языка R и среды установки RStudio на Windows;
- Настраиваем проект в Google Cloud Console, для работы с Google Analytics API;
- Установка дополнительных пакетов расширяющих возможности языка R;
- Пример работа с API Google Analytics 4 на языке R.

Ссылки:
- Регистрация

#вебинары
​​Как добавить ярлыки данных в ggplot2

Добавить на график подписи можно с помощью слоя geom_text(). Агрумент vjust позволяет вам менять положение подписи выше или ниже самого столбца.

В свою очередь geom_text() поддерживает следующие эстетики:

● label - текст подписей
● alpha - прозрачность
● angle - угол наклона
● colour - цвет текста
● family - шрифт
● fontface - тип шрифта, жирный, курсив и т.д.
● group - группировка
● hjust - горизонтальное смещение текста относительно визуализации
● lineheight - межстрочный интервал
● size - размер шрифта
● vjust - вертикальное смещение текста относительно визуализации

Пример кода для построения графика с подписями данных:
 
library(ggplot2)

# счётчик случайных чисел
set.seed(123)

# тестовый набор данных
data <- data.frame(x = sample(LETTERS[1:6], 300, replace = TRUE))

# Способ 1: используем переменную ..count..
ggplot(data, aes(x = factor(x), fill = factor(x))) +
geom_bar() +
geom_text(
aes(label = ..count..),
stat = "count",
vjust = 1.5,
colour = "white"
)

# Способ 2: Предварительная агрегация данных
data %>%
dplyr::count(x, name = 'Freq') %>%
ggplot(aes(x = x, y = Freq, fill = x)) +
geom_bar(stat = "identity") +
geom_text(
aes(label = Freq),
vjust = -1,
colour = "gray32",
fontface = 'bold'
)


Ссылки:
- на создание поста подтолкнула статья "Adding text labels to ggplot2 Bar Chart"

#заметки_по_R
​​5 крутых приемов, которые улучшат работу на R

Рассмотрим пять крутых приемов работы на R, которые просто необходимо знать. Они разнятся в применении, но задействуются в большинстве существующих проектов.

Содержание:

- Запуск кода Python на R
- Чтение/импорт и преобразование файлов
- Нахождение структуры объектов
- Просмотр первой или последней части табличной структуры
- Чтение/экспорт данных в Google Sheets

#статьи_по_R
​​Отличная новость, Александр Гинько (@alexan805) завершил перевод "Mastering Shiny". В течении следующих нескольких недель будет происходить ее редактура, верстка и предпечатная подготовка. После этого всем, кто прислал автору перевода свою почту, будет отправлено письмо с промокодом на скидку 22-25% для предзаказа книги (доступны бумажная и электронная версии)!

Если вы еще не успели прислать электронный адрес для получения промокода на максимальную скидку от переводчика, сейчас самое время это сделать написав Александру в telegram или facebook. Спешите, время предзаказа – это время лучших скидок! Но промокод придет не сразу, а только после верстки и ценообразования книги.

По ссылке можно ознакомиться с фрагментом перевода. А именно с главой 19 "Модули Shiny".

Ссылки:
- telegram автора перевода, Александра Гинько
- facebook автора перевода
- фрагмент перевода, 19 глава
- фрагмент перевода "Динамическая фильтрация"

#книги_по_R
This media is not supported in your browser
VIEW IN TELEGRAM
“Путь генерального директора”

👨🏼‍🎓Когда еще тебе представится возможность лично задать вопрос генеральному директору самой крупной EdTech компании в России?
Узнать, какая IT профессия будет приносить реальный доход в 2к22, сколько ты будешь зарабатывать в первый, второй, третий год - если начнешь кодить прямо сейчас, и правда ли, что 60% разработчиков гуманитарии?

🚀Спроси всё что хочешь, и даже больше 22 сентября!

Александр Волчек, гендир GeekBrains расскажет о том, какой путь он прошел, от простого программиста - до первого лица GeekBrains, поделится секретами индустрии. Будет много инсайтов о профессиях в IT, - и никакой воды.

📅Выступление начнется в 19:00 не пропусти, осталось 3 дня до окончания регистрации!
Вход бесплатный --> https://gb.ru/link/8nY~VF
​​Актуализировал ещё одну статью - "Как оценить потерянный доход в Google Ads с помощью языка R".

В статье описан подход расчёта недополученного дохода в Google Ads, от авторизации в API до визуализации и интерпретации результатов.

Расчёт основан на данных о проценте полученных показов в поисковой и медийной сети, CTR и среднем чеке.

Пакеты которые используются в статье:

rgoogleads - пакет для работы с Google Ads API
googleAnalyticsR - пакет для работы с Google Analytics API
ggplot2 - визуализация данных
dplyr - манипуляция данными
tidyr - очистка данных

Содержание:
- Что необходимо для реализации алгоритма?
- Как создать Developer Client в консоли разработчика Google?
- Запуск скрипта в RStudio
- Авторизация в сервисах
- Загрузка данных из Google Ads и Google Analytics
- Визуализация данных
- Какие действия можно предпринять по данным диаграммам
- Работаем с данными в CSV-файле
- Выводы

#статьи_по_R
​​Как создать диаграмму датчик с помощью ggplot2

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

Ниже приведу пример кода для создания диаграмм датчиков. Данный пример базируется на geom_react().

# тестовый набор данных
df <- tibble(
variable = c("Carbohydrates", "Warming", "NGTnotPresent", "DrainNotPresent", "DrEaMing"),
percentage = c(0.67,0.33,0.86,0.78,0.58)
) %>%
mutate(group = case_when(
percentage < 0.6 ~ "red",
percentage >= 0.6 & percentage < 0.8 ~ "orange",
TRUE ~ "green"
),
label = paste0(percentage * 100, "%"),
title = recode(variable,
Carbohydrates = "Preoperative\ncarbohydrate loading",
Warming = "Intraoperative\nwarming",
NGTnotPresent = "Patients without a\nnasogastric tube\non arrival in recovery",
DrainNotPresent = "Patients without an\nabdominal drain\non arrival in recovery",
DrEaMing = "Patients DrEaMing on\npostoperative day 1")
)

# визуализация
ggplot(df, aes(fill = group, ymax = percentage, ymin = 0, xmax = 2, xmin = 1)) +
geom_rect(aes(ymax=1, ymin=0, xmax=2, xmin=1), fill ="#ece8bd") +
geom_rect() +
coord_polar(theta = "y",start=-pi/2) + xlim(c(0, 2)) + ylim(c(0,2)) +
geom_text(aes(x = 0, y = 0, label = label, colour=group), size=6.5, family="Poppins SemiBold") +
geom_text(aes(x=1.5, y=1.5, label=title), family="Poppins Light", size=4.2) +
facet_wrap(~title, ncol = 5) +
theme_void() +
scale_fill_manual(values = c("red"="#C9146C", "orange"="#DA9112", "green"="#129188")) +
scale_colour_manual(values = c("red"="#C9146C", "orange"="#DA9112", "green"="#129188")) +
theme(strip.background = element_blank(),
strip.text.x = element_blank()) +
guides(fill=FALSE) +
guides(colour=FALSE)


Ссылки:
- Пример кода подсмотрен в статье "Generating gauge plots in ggplot2"

#заметки_по_R
🔥1
​​Релиз rmytarget 2.3.1

Не так давно в официальном канале API MyTarget была новость, о том, что в ближайшем будущем будет прекращена поддержка API статистики 2ой версии. Немного позже, там же, появилась новость о том, что по многочисленным просьбам пока на неопределённый срок поддержка API 2ой версии продлена.

В общем я решил не ждать, пока на самом деле поддержка API статистики второй версии будет прекращена, и доработал пакет rmytarget таким образом, что функция myTarGetStats() теперь поддерживает работу как с 2ой, так и 3ей версии API статистики.

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

При работе с 3ей версией API вам становятся доступны новые аргументы:

attribution
banner_status
campaign_status
sort_by
sort_direction
package_id

К сожалению API статистики v3 не отдаёт данные с разбивкой на даты, для этого вам придётся использовать циклы, или другие способы итерирования. В будущем я планирую доработать функцию, и она сама будет разбивать запрос по дням по необходимости.

Также в rmytarget были добавлены ещё несколько новых функций:

myTarGetGoalsStats() - для загрузки статистики по целям
myTarGetGetGoalList() - для загрузки списка целей рекламного аккаунта

Установить новую версию пакета можно с CRAN: install.packages('rmytarget')

Ссылки:
- Документация к API Статистики v3
- NEWS rmytarget

#релизы_R
​​Статья "Скучно, просто и ограниченно — все это изотоническая регрессия".

Посвящена пакету cir.

Содержание:
- Минутка теории
- Методология
- Расчеты

#статьи_по_R
​​Пятничное!

Интерактивные аналоговые часы на R.

Эти аналоговые часы автор написал используя пакет grid.

Код запускать со звуком.

library(grid)
#install.packages("beepr")


DrawClock <- function(hour, minute, second) {

t <- seq(0, 2*pi, length=13)[-13]
x <- cos(t)
y <- sin(t)


grid.newpage()
pushViewport(dataViewport(x, y, gp=gpar(lwd=3)))

# Фон часов
grid.circle(x=0, y=0, default="native", r=unit(1, "native"))

# Часовая стрелка
hourAngle <- pi/2 - (hour + minute/60)/12*2*pi
grid.segments(0, 0, 0.6*cos(hourAngle), .6*sin(hourAngle), default="native", gp=gpar(lex=4, col="red"))

# Минутная стрелка
minuteAngle <- pi/2 - (minute)/60*2*pi
grid.segments(0, 0, 0.8*cos(minuteAngle), .8*sin(minuteAngle),default="native", gp=gpar(lex=2))

# Секундная стрелка
secondAngle <- pi/2 - (second)/60*2*pi
grid.segments(0, 0,
0.8*cos(secondAngle), .7*sin(secondAngle), default="native", gp=gpar(lex=1, col = "blue"), draw=TRUE)
grid.circle(0,0, default="native", r=unit(1, "mm"), gp=gpar(fill="white"))
}


AnalogClock <- function() {
while(TRUE){
hh <- as.integer(format(Sys.time(), format="%H"))
mm <- as.integer(format(Sys.time(), format="%M"))
ss <- as.integer(format(Sys.time(), format="%S"))
Sys.sleep(1)
DrawClock(hh,mm,ss)
beepr::beep(sound = 1, expr = NULL)
}
}

#Запускаем часы
AnalogClock()


Ссылки:
- Код заимствован из статьи "Little useless-useful R functions – Useless analog and digital clocks"

#заметки_по_R
​​Совмещение R и Python Зачем, когда и как (доклад, статья и презентация)

Автор: Ирина Голощапова

Доклад:

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


Статья:

Последняя редакция статьи 8 ноября 2018 года, тут уже в общем всё актуально, и приведённые примеры написаны на основе reticulate, официальной разработки RStudio.


Ссылки:
- Видео доклада
- Презентация
- Статья

#доклады_по_R
#статьи_по_R
Опубликовал видео вебинара "Как работать с API Google Analytics 4 на языке R, воркшоп для новичков", который я вёл 15 сентября в Yagla.

Тайм коды:
00:00 Вступление
00:51 План вебинара
02:15 Преимущества языка R
03:10 Установка языка R и среды разработки RStudio на Windows
05:05 Настройка проекта в Google Cloud Console для работы с Google Analytics API
10:44 Краткий обзор RStudio
11:32 Установка и подключение пакетов в R
12:55 Авторизация в Google Analytics API
14:44 Загрузка данных из Google Analytics 4 в R
19:28 Визуализация данных об объёме трафика из Google Analytics в R с помощью ggplot2
20:57 Запрашиваем данные о количестве совершённых событий из Google Analytics 4 в R
21:30 Переформатирование данных о событиях с помощью пакета tidyr
23:00 Визуализация данных о количестве событий в R

В презентации вы найдёте промокод с 40% скидкой на покупку моего курса "Язык R для интернет марктинга".

Ссылки:
- Видео
- Презентация
- Код

#вебинары
​​process mining: 100 строк кода и генератор логов у нас в руках

Автор: Илья Шутов (@iMissile)

Заступая на территорию proccess mining, каждый участник рано или поздно будет нуждаться в наборе логов событий, отражающих те или иные специфические моменты в процессах. Эти логи нужны как на этапе демонстрации решения, подсвечивания определенных вопросов, так и для отработки алгоритмов или же тестов на производительность. Оба рекомендуемых сценария «взять с продуктивных систем» или «взять из интернета» терпят фиаско. Как правило, это очень
малые датасеты, слабо удовлетворяющие потребностям как по наполнению, так и по объему.

Остается вариант — написать генератор правдоподобных логов самостоятельно.

Содержание:
- Постановка задачи
- Генератор событий
- Конфигурация процессов
- Код генератора
- Заключение

#статьи_по_R
​​Недавно случайно наткнулся на httr2, т.е. Хедли работает над новым интерфейсом для взаимодействия с различными API.

Установить httr2 пока можно только с GitHub: devtools::install_github("r-lib/httr2")

Ключевые отличия httr2 от предшественника httr:

● Теперь вы можете создавать и изменять запрос, не выполняя его. Это означает, что теперь есть одна функция для выполнения запроса и получения результата: req_perform(). (Если вы хотите обрабатывать ответ по мере его поступления, используйте вместо этого req_stream()). req_perform() заменяет httr::GET(), httr::POST(), httr::DELETE() и т.д.

● Ошибки HTTP автоматически преобразуются в ошибки R. Используйте req_error(), чтобы переопределить значения по умолчанию (которые превращают все ответы 4xx и 5xx в ошибки) или добавить дополнительные сведения в сообщение об ошибке.

● Вы можете автоматически повторить попытку, если запрос завершится неудачно или возникнет временная ошибка HTTP (например, запрос столкнулся с каким то лимитом, код ошибки 429). req_retry() определяет максимальное количество повторных попыток, какие статусы ответа являются временными и задавать паузу между попытками отправки запросов.

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

● Улучшена работа с секретными данными, для этого используйте функции семейства secret_*().

● Вы можете автоматически кэшировать все кешируемые результаты с помощью req_cache().

Сам синтаксис нового httr2 стал более читабельным, ниже приведу описание основных функций:

Компоновка запроса
- request() - создание запроса
- req_headers() - добавить заголовки
- req_url_query() - добавить параметры
- req_method() - изменить метод запроса, по умолчанию GET
- req_body_*() - создания тела запроса
- req_perform() - отправка запроса
- req_dry_run() - предпросмотрт запроса, перед отправкой на сервер
- req_retry() - позволяет задать условия выполнения повторного запроса, в случае ошибки

● Извлечение компонентов ответа
- resp_body_*() - извлечь тело ответа
- resp_status() - извлечь код статуса
- resp_status_desc() - извлечь описание кода статуса
- resp_headers() - извлечь заголовки ответа
- resp_content_type() - узнать формат данных полученного ответа

Ниже приведу небольшой пример кода с использованием httr2.

# install.packages("devtools")
# devtools::install_github("r-lib/httr2")

library(httr2)

request('http://httpbin.org/post') %>%
req_method("POST") %>%
req_body_json(list(a = 1, b = 2, c = 3)) %>%
req_headers(Name = "Alexey") %>%
req_perform() %>%
resp_body_json()

Ссылки:
- README на GitHub

#заметки_по_R