Основная информация

Подготовлено в рамках курса “Анализ данных в бизнесе”, МГУ им. М.В. Ломоносова.

# Загрузка необходимых пакетов
# gt: для создания таблиц
# gtsummary: для создания медицинских/статистических сводок
# gtExtras: для расширенных возможностей форматирования таблиц gt
# mlbench: для работы с набором данных PimaIndiansDiabetes
# sjPlot: для создания графиков и таблиц

library(gt)
library(gtsummary)
library(gtExtras)
library(mlbench)
library(sjPlot)
library(dplyr)
library(sparkline)

# Загрузка данных PimaIndiansDiabetes из пакета mlbench
data(PimaIndiansDiabetes, package = "mlbench")

# Описание данных
# Набор данных PimaIndiansDiabetes содержит информацию о женщинах индейского племени Пима,
# включая данные об их медицинских характеристиках и наличии диабета.

# Описательные статистики с использованием gt_plt_summary из пакета gtExtras
# gt_plt_summary визуализирует основные статистики данных
PimaIndiansDiabetes %>% gt_plt_summary()
.
768 rows x 9 cols
Column Plot Overview Missing Mean Median SD
pregnant 017 0.0% 3.8 3.0 3.4
glucose 0199 0.0% 120.9 117.0 32.0
pressure 0122 0.0% 69.1 72.0 19.4
triceps 099 0.0% 20.5 23.0 16.0
insulin 0846 0.0% 79.8 30.5 115.2
mass 067 0.0% 32.0 32.0 7.9
pedigree 0.12.4 0.0% 0.5 0.4 0.3
age 2181 0.0% 33.2 29.0 11.8
diabetes neg and pos
2 categories 0.0%
# Просмотр структуры данных
str(PimaIndiansDiabetes)
## 'data.frame':    768 obs. of  9 variables:
##  $ pregnant: num  6 1 8 1 0 5 3 10 2 8 ...
##  $ glucose : num  148 85 183 89 137 116 78 115 197 125 ...
##  $ pressure: num  72 66 64 66 40 74 50 0 70 96 ...
##  $ triceps : num  35 29 0 23 35 0 32 0 45 0 ...
##  $ insulin : num  0 0 0 94 168 0 88 0 543 0 ...
##  $ mass    : num  33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
##  $ pedigree: num  0.627 0.351 0.672 0.167 2.288 ...
##  $ age     : num  50 31 32 21 33 30 26 29 53 54 ...
##  $ diabetes: Factor w/ 2 levels "neg","pos": 2 1 2 1 2 1 2 1 2 2 ...
# Создание таблицы с описательными статистиками с использованием tbl_summary из пакета gtsummary
# tbl_summary создает сводку для всех переменных в наборе данных
PimaIndiansDiabetes %>% tbl_summary()
Characteristic N = 7681
pregnant 3.0 (1.0, 6.0)
glucose 117 (99, 140)
pressure 72 (62, 80)
triceps 23 (0, 32)
insulin 31 (0, 127)
mass 32 (27, 37)
pedigree 0.37 (0.24, 0.63)
age 29 (24, 41)
diabetes
    neg 500 (65%)
    pos 268 (35%)
1 Median (IQR); n (%)
# Создание таблицы с описательными статистиками с разделением по переменной diabetes
# add_p добавляет p-значения для каждой переменной, указывая на различия между группами
PimaIndiansDiabetes %>% tbl_summary(by = diabetes) %>% add_p()
Characteristic neg, N = 5001 pos, N = 2681 p-value2
pregnant 2.0 (1.0, 5.0) 4.0 (1.8, 8.0) <0.001
glucose 107 (93, 125) 140 (119, 167) <0.001
pressure 70 (62, 78) 74 (66, 82) <0.001
triceps 21 (0, 31) 27 (0, 36) 0.013
insulin 39 (0, 105) 0 (0, 167) 0.066
mass 30 (25, 35) 34 (31, 39) <0.001
pedigree 0.34 (0.23, 0.56) 0.45 (0.26, 0.73) <0.001
age 27 (23, 37) 36 (28, 44) <0.001
1 Median (IQR)
2 Wilcoxon rank sum test
# Создание таблицы с описательными статистиками и указанием формата для непрерывных и категориальных переменных
# statistic задает формат отображения данных
PimaIndiansDiabetes %>% tbl_summary(
  by = diabetes,
  statistic = list(
    all_continuous() ~ "{mean} ({sd})",
    all_categorical() ~ "{n} / {N} ({p}%)"
  )
) %>% add_p()
Characteristic neg, N = 5001 pos, N = 2681 p-value2
pregnant 3.3 (3.0) 4.9 (3.7) <0.001
glucose 110 (26) 141 (32) <0.001
pressure 68 (18) 71 (21) <0.001
triceps 20 (15) 22 (18) 0.013
insulin 69 (99) 100 (139) 0.066
mass 30 (8) 35 (7) <0.001
pedigree 0.43 (0.30) 0.55 (0.37) <0.001
age 31 (12) 37 (11) <0.001
1 Mean (SD)
2 Wilcoxon rank sum test
# Добавление общей строки, которая показывает сводку по всем данным
# add_overall добавляет общие статистики для всех наблюдений
# add_n добавляет общее количество наблюдений
PimaIndiansDiabetes %>% tbl_summary(
  by = diabetes,
  statistic = list(
    all_continuous() ~ "{mean} ({sd})",
    all_categorical() ~ "{n} / {N} ({p}%)"
  )
) %>% add_p() %>% add_overall() %>% add_n()
Characteristic N Overall, N = 7681 neg, N = 5001 pos, N = 2681 p-value2
pregnant 768 3.8 (3.4) 3.3 (3.0) 4.9 (3.7) <0.001
glucose 768 121 (32) 110 (26) 141 (32) <0.001
pressure 768 69 (19) 68 (18) 71 (21) <0.001
triceps 768 21 (16) 20 (15) 22 (18) 0.013
insulin 768 80 (115) 69 (99) 100 (139) 0.066
mass 768 32 (8) 30 (8) 35 (7) <0.001
pedigree 768 0.47 (0.33) 0.43 (0.30) 0.55 (0.37) <0.001
age 768 33 (12) 31 (12) 37 (11) <0.001
1 Mean (SD)
2 Wilcoxon rank sum test
# Преобразование таблицы в формат gt и применение темы gt_theme_guardian для улучшения визуального представления
PimaIndiansDiabetes %>% tbl_summary(
  by = diabetes,
  statistic = list(
    all_continuous() ~ "{mean} ({sd})",
    all_categorical() ~ "{n} / {N} ({p}%)"
  )) %>% add_p() %>% add_overall() %>% add_n() %>% as_gt() %>% gt_theme_guardian()
Characteristic N Overall, N = 7681 neg, N = 5001 pos, N = 2681 p-value2
pregnant 768 3.8 (3.4) 3.3 (3.0) 4.9 (3.7) <0.001
glucose 768 121 (32) 110 (26) 141 (32) <0.001
pressure 768 69 (19) 68 (18) 71 (21) <0.001
triceps 768 21 (16) 20 (15) 22 (18) 0.013
insulin 768 80 (115) 69 (99) 100 (139) 0.066
mass 768 32 (8) 30 (8) 35 (7) <0.001
pedigree 768 0.47 (0.33) 0.43 (0.30) 0.55 (0.37) <0.001
age 768 33 (12) 31 (12) 37 (11) <0.001
1 Mean (SD)
2 Wilcoxon rank sum test
# Более подробная информация о возможностях пакет gtsummary:
# https://www.danieldsjoberg.com/gtsummary/articles/themes.html

sparkline <- "blue"
final_value <- "red"
range_low <- "yellow"
range_high <- "purple"
type <- "lightgrey"

spkl_palette <- c(sparkline, final_value, range_low, range_high, type)

palette = spkl_palette
PimaIndiansDiabetes %>%
  group_by(diabetes) %>%
  # for gtExtras' sparkline, a list of values needs to be provided
  summarise(chart = list(glucose), .groups = "drop") %>%
  gt() %>%
  gtExtras::gt_plt_sparkline(chart, palette = spkl_palette)
diabetes chart
neg 93.0
pos 126.0
#более подробная информация: https://www.danieldsjoberg.com/gtsummary/articles/themes.html

PimaIndiansDiabetes %>%
  group_by(diabetes) %>%
  # for gtExtras' sparkline, a list of values needs to be provided
  summarise(chart = list(glucose), .groups = "drop") %>%
  gt() %>%
  gtExtras::gt_plt_dist(chart)
diabetes chart
neg
pos
PimaIndiansDiabetes %>% group_by(pregnant) %>%  summarise(amount = n()/dim(PimaIndiansDiabetes)[1]*100) %>% gt() %>% 
  gt_plt_bar_pct(
    column = amount,
    scaled = TRUE,
    fill = "forestgreen", labels = TRUE) 
pregnant amount
0
14.5%
1
17.6%
2
13.4%
3
9.8%
4
8.9%
5
7.4%
6
6.5%
7
5.9%
8
4.9%
9
3.6%
10
3.1%
11
1.4%
12
1.2%
13
1.3%
14
0.3%
15
0.1%
17
0.1%
d1 <- PimaIndiansDiabetes %>% group_by(pregnant) %>%  summarise(amount2 = n(), amount = n()/dim(PimaIndiansDiabetes)[1]*100)
d1$amount1 <- cumsum(d1$amount)
d1 %>% gt() %>% 
  gt_plt_bar_pct(
    column = amount1,
    scaled = TRUE,
    fill = "forestgreen", labels = TRUE) %>% cols_label("pregnant"~"Кол-во беременности", 
                                                        "amount2" ~ "Абсолютное соотношение", 
                                                        "amount" ~ "% соотношение", "amount1" ~ "Кумулятивное соотношение") %>% 
  fmt_number(
    columns = amount,
    decimals = 1,
    use_seps = FALSE
  )
Кол-во беременности Абсолютное соотношение % соотношение Кумулятивное соотношение
0 111 14.5
14.5%
1 135 17.6
32%
2 103 13.4
45.4%
3 75 9.8
55.2%
4 68 8.9
64.1%
5 57 7.4
71.5%
6 50 6.5
78%
7 45 5.9
83.9%
8 38 4.9
88.8%
9 28 3.6
92.4%
10 24 3.1
95.6%
11 11 1.4
97%
12 9 1.2
98.2%
13 10 1.3
99.5%
14 2 0.3
99.7%
15 1 0.1
99.9%
17 1 0.1
100%
#разные функции спарклайнов: gt_plt_bar_stack(), gt_plt_bar(), gt_plt_dist(), gt_plt_percentile(), gt_plt_point(), gt_plt_sparkline(), gt_plt_winloss()