В ноябре 2018 года я запустил телеграм канал R4marketing посвящённый языку R. Публикации канала разделены по рубрикам, одна из таких рубрик - "Заметки по R". В неё входят небольшие заметки, с интересным или полезными советами по использованию языка R, заимствованные из прочитанных статей, подсмотренные в различных чатах или взятые из собственной практики работы в R.

Этой статьёй я начинаю серию публикаций состоящих из подборок наиболее полезных заметок канала R4marketing. Первая статья данной серии посвящена визуализации данных.
Содержание
Если вы интересуетесь анализом данных возможно вам будут полезны мои telegram и youtube каналы. Большая часть контента которых посвящены языку R.
Построение интерактивных воронок.
Построение диаграммы Парето.
Построение круговых диаграмм в ggplot2.
Как добавить ярлыки данных в ggplot2.
Построение диаграммы гантелей.
Построение интерактивных воронок
Воронка - наиболее часто используемый способ визуализации этапов продажи, направленный на выявления проблемных шагов на пути к заключению сделки.
Особого пояснения тут не требуется, ниже приведён пример кода для построения интерактивной воронки на базе пакета highcharter.
library(dplyr) library(highcharter) # установка темы options( highcharter.theme = hc_theme_smpl( tooltip = list(valueDecimals = 2) ) ) # тестовые данные df <- data.frame( x = c(0, 1, 2, 3, 4), y = c(975, 779, 584, 390, 200), name = c("Leads", "Sales Call", "Follow Up", "Conversion", "Sale") ) %>% arrange(-y) # построение визуализации hc <- df %>% hchart( "funnel", hcaes(x = name, y = y), name = "Sales Conversions" ) # выводим график в Viewer hc
Пример воронки, полученный с помощью приведённого примера кода:

Данная заметка заимствованна из статьи "Funnel Chart in R-Interactive Funnel Plot".
Построение диаграммы Парето
Диаграмма Парето является графическим отображением правила Парето. В менеджменте качества применение этого правила показывает, что значительное число несоответствий и дефектов возникает из-за ограниченного числа причин. Коротко правило Парето формулируется как 80 на 20. Например, если применить это правило по отношению к дефектам, то окажется, что 80 процентов дефектов возникает из-за 20 процентов причин.
Более подробно о том как используется диаграмма Парето можно почитать вот тут.
Ниже пример построения диаграммы Парето с помощью пакета qcc.
library(qcc) # тестовые данные df <- data.frame( product = c('A', 'B', 'C', 'D', 'E', 'F'), count = c(40, 57, 50, 82, 17, 16) ) # диаграмма парето pareto.chart( df$count, main = 'Pareto Chart', col = heat.colors(length(df$count)) )
Результат выглядит примерно вот так:

Эта заметка родилась из статьи "How to Create Pareto Chart in R".
Построение круговых диаграмм в ggplot2
Несмотря на то, что круговая диаграмма один из самых неудачных способов визуализации данных, она в то же время является одним из наиболее часто используемых типов диаграмм.
Но если вы попробуете поискать geom_pie() среди прочих, доступных в ggplot2 геомов, то ваши поиски не увенчаются успехом. Стандартной отдельной функции под построение круговой диаграммы в ggplot2 нет.
Но, построить круговую диаграмму в ggplot2 тем не менее можно. По умолчанию графики в ggplot2 строятся в декартовой системе координат. Если вы построите нормированную столбчатую диаграмму, и переведёте её из декартовой в полярную систему координат, то получите круговую диаграмму.
Для перевода в полярную систему координат используйте функцию coord_polar().
Ниже пример построения круговой диаграммы:
library(ggplot2) # генерируем тестовые данные d <- data.frame( Slices = c("Writing code", "Staring at plot", "Fixing code", "Enjoying plot") |> rep(2), Time = c(1, 5, 4, 2, 1, 1, 1, 2), When = c("Before reading this post", "After reading this post") |> rep(each = 4) ) |> transform( # Относительные временные диапазоны Time_relative = Time / ave(Time, When, FUN = sum), Slices = factor(Slices, levels = unique(Slices)), When = factor(When, levels = unique(When)) ) # строим круговую диаграмму ggplot(d, aes(x = 1, y = Time_relative, fill = Slices)) + facet_grid(cols = vars(When)) + # преобразуем систему координат в полярную # для построения круговой диаграммы coord_polar(theta = "y") + # создаём столбчатую диаграмму с позицией stacked geom_col(position = position_stack(reverse = TRUE), color = "tan3", size = 3, show.legend = FALSE) + # Добавляем описание секторов geom_text(aes(label = Slices), position = position_stack(vjust = 0.5, reverse = TRUE)) + # очищаем тему theme_void() + labs(title = "Относительное время, потраченное на построение круговых диаграмм с помощью ggplot2")
График построенный с помощью приведённого выше кода выглядит следующим образом:

Код этой заметки был подсмотрен в статье "ggplot: Easy as pie (charts)".
Как добавить ярлыки данных в 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".
Построение диаграммы гантелей
Рассмотрим ещё одно расширение для ggplot2 - ggalt.
Диаграммы гантелей (также называются диаграммой ДНК) являются альтернативным вариантом визуализации для показа изменений между двумя точками данных. Диаграмма получила свое название из-за сходства с гантелями, когда они находятся в горизонтальном положении.
Пример построения диаграммы гантелей в R:
library(tidyverse) library(tidyquant) library(ggalt) # приводим данные к нужному виду mpg_by_year_tbl <- mpg %>% select(hwy, year, model, class) %>% pivot_wider( names_from = year, values_from = hwy, id_cols = c(class, model), values_fn = function(x) mean(x, na.rm = TRUE), names_prefix = "year_" ) %>% mutate(model = fct_reorder(model, year_2008)) %>% drop_na() # строим график mpg_by_year_tbl %>% ggplot(aes(x = year_1999, xend = year_2008, y = model, group = model)) + geom_dumbbell( colour="#a3c4dc", colour_xend="#0e668b", size=4.0, dot_guide=TRUE, dot_guide_size=0.15, dot_guide_colour = "grey60" )
Выглядит диаграмма гантелей построенная с помощью приведённого выше кода так:

В написании данной заметки использовался материал статьи "ggalt: Make a Dumbbell Plot to Visualize Change in ggplot2".
Заключение
Надеюсь вам были полезные приведённые в статье 5 заметок по визуализации данных в R и они найдут отклик в решении ваших задач.
Делитесь в комментариях своими заметками по работе в R, или примерами нетипичных диаграмм которые используете.
Ну и конечно, буду рад видеть вас среди подписчиков канала R4marketing.
