1 Структура R Markdown та налаштування метаданих (YAML Header)

При створенні вебсайтів, дашбордів або лабораторних практикумів за допомогою R Markdown першим і найважливішим елементом документа є YAML-заголовок (Header). Він знаходиться на самому початку файлу і обмежується трьома дефісами з двох боків (---).

1.1 Ключові параметри YAML для генерації вебсторінок

Нижче наведено розбір основних блоків конфігурації YAML, які забезпечують коректний рендеринг документа на вебсайті:

---
title: "Назва сторінки"
author: "Автор"
date: "2026-11-01" # Динамічна дата компіляції
output:
  html_document:
    toc: true               # Включення змісту (Table of Contents)
    toc_depth: 3            # Глибина заголовків у змісті (від # до ###)
    toc_float:              # Плаваючий бічний зміст
      collapsed: false      # Не згортати розділи за замовчуванням
      smooth_scroll: true   # Плавне прокручування до розділів
    theme: flatly           # Візуальна тема сайту (flatly, lumen, paper тощо)
    highlight: tango        # Стиль підсвічування синтаксису коду
    number_sections: true   # Автоматична нумерація розділів
---

1.1.1 Параметри для публікації на сайті (R Markdown Websites / Bookdown):

  • toc_float — створює зручну навігаційну панель зліва, яка залишається на екрані при прокручуванні сторінки.
  • theme — відповідає за загальний дизайн сайту (bootstrap-теми: flatly, simplex, cosmo, united).
  • code_folding: show — дозволяє відвідувачам сайту згортати або розгортати блоки коду за бажанням.

2 Вступ до аналізу даних датасету esoph

Набір даних esoph описує результати дослідження раку стравоходу (Esophageal Cancer), проведеного у Франції. Організація даних відповідає дизайну «випадок-контроль» (Case-Control Study), де аналізується вплив двох основних чинників — споживання алкоголю (alcgp) та тютюнопаління (tobgp) у різних вікових групах (agegp).

2.1 Опис змінних:

  • agegp — вікова група пацієнтів (25–34, 35–44, 45–54, 55–64, 65–74, 75+ років).
  • alcgp — добова доза алкоголю (0–39, 40–79, 80–119, 120+ г/день).
  • tobgp — добова доза тютюну (0–9, 10–19, 20–29, 30+ г/день).
  • ncases — кількість підтверджених випадків захворювання (група «Випадок»).
  • ncontrols — кількість людей без захворювання (група «Контроль»).

Важливе зауваження: Оскільки датасет агрегований за групами, порівнювати абсолютну кількість хворих без урахування розміру контрольної групи некоректно. Для аналізу ми розраховуємо частку захворілих (\(\text{Prop} = \frac{\text{ncases}}{\text{ncases} + \text{ncontrols}}\)).


3 Первинний огляд даних (Datatable)

Незвідна інтерактивна таблиця дозволяє зручно переглядати структуру датасету безпосередньо на сторінці сайту.

data(esoph)

# Додаємо розраховану колонку частки захворілих
esoph_clean <- esoph %>% 
  mutate(
    ntotal = ncases + ncontrols,
    prop_cases = round(ncases / ntotal, 3)
  )

# Вивід інтерактивної таблиці
datatable(
  esoph_clean,
  colnames = c("Вікова група", "Алкоголь", "Тютюн", "Випадки", "Контролі", "Всього", "Частка хворих"),
  options = list(pageLength = 10, lengthMenu = c(10, 25, 50)),
  caption = "Таблиця 1: Агреговані дані дослідження раку стравоходу."
)

4 Візуалізація та аналіз факторів ризику

4.1 Розподіл частоти захворюваності за віковими групами (Box Plot)

Діаграма розмаху відображає варіабельність частки захворілих у підгрупах для кожної вікової категорії.

ggplot(esoph_clean, aes(x = agegp, y = prop_cases, fill = agegp)) +
  geom_boxplot(alpha = 0.7, outlier.color = "red", outlier.size = 2) +
  geom_jitter(width = 0.2, alpha = 0.5, size = 1.5) +
  scale_fill_viridis_d(option = "viridis") +
  labs(
    title = "Розподіл частки захворілих на рак стравоходу за віком",
    x = "Вікова група (роки)",
    y = "Частка захворілих (Proportion)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.position = "none"
  )

Аналіз: Найвища частка захворюваності концентрується у вікових групах 55–64 та 65–74 роки, що свідчить про вікозалежне зростання онкологічного ризику.

4.2 Порівняння кількості хворих та контролів (Bar Plot)

Стовпчаста діаграма дозволяє наочно порівняти загальне співвідношення осіб у групах «Випадок» та «Контроль» у кожній віковій категорії.

# Переведення даних у довгий формат
esoph_long <- esoph %>% 
  pivot_longer(cols = c(ncases, ncontrols), names_to = "Status", values_to = "Count") %>% 
  mutate(Status = factor(Status, levels = c("ncases", "ncontrols"), labels = c("Хворі", "Здорові")))

ggplot(esoph_long, aes(x = agegp, y = Count, fill = Status)) +
  geom_col(position = "dodge", color = "white") +
  scale_fill_manual(values = c("Хворі" = "#e74c3c", "Здорові" = "#2ecc71")) +
  labs(
    title = "Співвідношення кількості хворих та здорових осіб за віком",
    x = "Вікова група (роки)",
    y = "Загальна кількість осіб у вибірці",
    fill = "Група"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.position = "top"
  )

4.3 Вплив алкоголю та тютюнопаління на частку захворілих (Scatter Plot & Lines)

Аналіз середньої частки захворілих залежно від поєднання категорій споживання тютюну та алкоголю.

# Агрегація середнього ризику за групами тютюну та алкоголю
scatter_data <- esoph_clean %>% 
  group_by(tobgp, alcgp) %>% 
  summarise(mean_prop = mean(prop_cases), .groups = "drop")

ggplot(scatter_data, aes(x = tobgp, y = mean_prop, color = alcgp, group = alcgp)) +
  geom_point(size = 3.5, alpha = 0.9) +
  geom_line(linewidth = 1.2) +
  scale_color_brewer(palette = "YlOrRd", name = "Алкоголь (г/день)") +
  labs(
    title = "Середня частка захворілих залежно від дози тютюну та алкоголю",
    x = "Рівень споживання тютюну (г/день)",
    y = "Середня частка захворілих"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    panel.grid.minor = element_blank()
  )

Аналіз: Спостерігається чіткий синергічний ефект: найвища частка захворілих фіксується при одночасному високому споживанні алкоголю (80–120+ г/день) та тютюну (30+ г/день).

4.4 Розподіл частоти захворюваності у підгрупах (Density Plot)

Графік щільності показує загальний характер розподілу розрахованих часток захворюваності серед усіх досліджених підгруп.

ggplot(esoph_clean, aes(x = prop_cases)) +
  geom_density(fill = "#e74c3c", alpha = 0.5, color = "#c0392b", linewidth = 1) +
  labs(
    title = "Щільність розподілу часток захворюваності в підгрупах",
    x = "Частка захворілих (Proportion)",
    y = "Щільність ймовірності (Density)"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))

4.5 Карта інтенсивності ризику (Heatmap)

Теплокарта надає наочну оцінку захворюваності (%) залежно від поєднання віку пацієнтів та дози споживаного алкоголю.

# Агрегація показників для теплокарти
heatmap_data <- esoph_clean %>% 
  group_by(agegp, alcgp) %>% 
  summarise(
    total_cases = sum(ncases),
    total_obs = sum(ntotal),
    .groups = 'drop'
  ) %>% 
  mutate(rate = round((total_cases / total_obs) * 100, 1))

ggplot(heatmap_data, aes(x = agegp, y = alcgp, fill = rate)) +
  geom_tile(color = "white", linewidth = 0.8) +
  geom_text(aes(label = paste0(rate, "%")), color = "white", fontface = "bold", size = 3.8) +
  scale_fill_viridis_c(option = "magma", direction = -1, name = "Захворюваність (%)") +
  labs(
    title = "Теплокарта захворюваності (%) за віком та рівнем алкоголю",
    x = "Вікова група (роки)",
    y = "Рівень споживання алкоголю (г/день)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )


5 Завдання для самостійної роботи

Оберіть один із стандартних навчальних датасетів R (наприклад, ToothGrowth, PlantGrowth або InsectSprays або залиште для опису наявний датасет esoph) та виконайте наступні кроки:

  1. Опишіть коротко обраний датасет та його змінні.
  2. Опишіть отримані графіки та закономірності на них.
  3. Напишіть короткий висновок за даними обраного датасету.

5.1 Обраний датасет: ToothGrowth

5.1.1 Опис датасету та змінних

Датасет ToothGrowth містить результати експерименту про вплив вітаміну C на ріст зубів у 60 морських свинок. Тварини отримували одну з трьох доз вітаміну C (0.5, 1 або 2 мг/день) одним із двох способів: з апельсиновим соком або у вигляді аскорбінової кислоти.

  • len — довжина клітин зуба (результат експерименту);
  • supp — спосіб подачі: OJ — апельсиновий сік, VC — аскорбінова кислота;
  • dose — доза вітаміну C: 0.5, 1 або 2 мг/день.
data(ToothGrowth)
 
tg <- ToothGrowth %>%
  mutate(
    dose = factor(dose),
    supp = factor(supp, levels = c("OJ", "VC"),
                  labels = c("Апельсиновий сік", "Аскорбінова кислота"))
  )
 
tg_summary <- tg %>%
  group_by(supp, dose) %>%
  summarise(mean_len = round(mean(len), 2), .groups = "drop")
 
kable(tg_summary,
      col.names = c("Спосіб подачі", "Доза (мг/день)", "Середня довжина"),
      caption = "Таблиця 2: Середня довжина зубів за групами")
Таблиця 2: Середня довжина зубів за групами
Спосіб подачі Доза (мг/день) Середня довжина
Апельсиновий сік 0.5 13.23
Апельсиновий сік 1 22.70
Апельсиновий сік 2 26.06
Аскорбінова кислота 0.5 7.98
Аскорбінова кислота 1 16.77
Аскорбінова кислота 2 26.14

5.1.2 Графіки та закономірності

5.1.2.1 Довжина зубів залежно від дози (Box Plot)

ggplot(tg, aes(x = dose, y = len, fill = supp)) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_manual(values = c("Апельсиновий сік" = "#f39c12",
                               "Аскорбінова кислота" = "#3498db")) +
  labs(
    title = "Довжина зубів залежно від дози та способу подачі",
    x = "Доза вітаміну C (мг/день)",
    y = "Довжина зубів",
    fill = "Спосіб подачі"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        legend.position = "top")

Аналіз: Зі збільшенням дози довжина зубів зростає. При дозах 0.5 і 1 мг апельсиновий сік дає кращий результат, ніж аскорбінова кислота. При дозі 2 мг різниці майже немає.

5.1.2.2 Середня довжина зубів за групами (Line Plot)

ggplot(tg_summary, aes(x = dose, y = mean_len, colour = supp, group = supp)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3.5) +
  scale_colour_manual(values = c("Апельсиновий сік" = "#f39c12",
                                 "Аскорбінова кислота" = "#3498db")) +
  labs(
    title = "Середня довжина зубів залежно від дози",
    x = "Доза вітаміну C (мг/день)",
    y = "Середня довжина зубів",
    colour = "Спосіб подачі"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        legend.position = "top")

Аналіз: Обидві лінії йдуть вгору. Лінія соку вища, але при дозі 2 мг лінії сходяться (26.06 і 26.14).

5.1.2.3 Розподіл довжини зубів (Density Plot)

ggplot(tg, aes(x = len, fill = dose)) +
  geom_density(alpha = 0.5, colour = NA) +
  scale_fill_viridis_d(name = "Доза (мг/день)") +
  labs(
    title = "Розподіл довжини зубів за дозами",
    x = "Довжина зубів",
    y = "Щільність"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        legend.position = "top")

Аналіз: Чим більша доза, тим правіше розташований розподіл, тобто тим довші зуби у більшості тварин.

5.1.3 Висновок

  1. Доза вітаміну C — головний фактор: що більша доза, то довші зуби (середня довжина зростає з 10.6 до 26.1).
  2. При малих дозах (0.5 і 1 мг) апельсиновий сік ефективніший за аскорбінову кислоту.
  3. При дозі 2 мг спосіб подачі вже не має значення: результат однаковий.

6 Висновки

  1. Фактори ризику: Вживання алкоголю та тютюнопаління є основними модифікованими чинниками підвищення ризику розвитку раку стравоходу.
  2. Вікова залежність: Імовірність виникнення захворювання суттєво зростає у старших вікових групах (пік припадає на вік 55–74 роки).
  3. Методологія: При аналізі агрегованих медичних даних типу Case-Control необхідно оперувати відносними показниками (частка захворілих), що забезпечує наукову коректність висновків.