В ноябре 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.