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

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

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

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

---
title: "Назва сторінки"
author: "Автор"
date: "2026-10-31" # Динамічна дата компіляції
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}}\)).

#Вступ дані про датасет. опис датасету # Первинний огляд даних (Datatable)
Незвідна інтерактивна таблиця дозволяє зручно переглядати структуру датасету безпосередньо на сторінці сайту.
``` r data(esoph)
# Додаємо розраховану колонку частки захворілих esoph_clean <- esoph %>% mutate( ntotal = ncases + ncontrols, prop_cases = round(ncases / ntotal, 3) )
# Вивід інтерактивної таблиці datatable( esoph_clean, colnames = c(“Вікова група”, “Алкоголь”, “Тютюн”, “Випадки”, “Контролі”, “Всього”, “Частка хворих”), options = list(pageLength = 20, lengthMenu = c(20, 30, 60)), caption = “Таблиця 1: Агреговані дані дослідження раку стравоходу.” ) ```
{=html} <div class="datatables html-widget html-fill-item" id="htmlwidget-f84b3bf6f5f13ad24a41" style="width:100%;height:auto;"></div> <script type="application/json" data-for="htmlwidget-f84b3bf6f5f13ad24a41">{"x":{"filter":"none","vertical":false,"caption":"<caption>Таблиця 1: Агреговані дані дослідження раку стравоходу.<\/caption>","data":[["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88"],["25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","25-34","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","35-44","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","45-54","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","55-64","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","65-74","75+","75+","75+","75+","75+","75+","75+","75+","75+","75+","75+"],["0-39g/day","0-39g/day","0-39g/day","0-39g/day","40-79","40-79","40-79","40-79","80-119","80-119","80-119","120+","120+","120+","120+","0-39g/day","0-39g/day","0-39g/day","0-39g/day","40-79","40-79","40-79","40-79","80-119","80-119","80-119","80-119","120+","120+","120+","0-39g/day","0-39g/day","0-39g/day","0-39g/day","40-79","40-79","40-79","40-79","80-119","80-119","80-119","80-119","120+","120+","120+","120+","0-39g/day","0-39g/day","0-39g/day","0-39g/day","40-79","40-79","40-79","40-79","80-119","80-119","80-119","80-119","120+","120+","120+","120+","0-39g/day","0-39g/day","0-39g/day","0-39g/day","40-79","40-79","40-79","80-119","80-119","80-119","80-119","120+","120+","120+","120+","0-39g/day","0-39g/day","0-39g/day","40-79","40-79","40-79","40-79","80-119","80-119","120+","120+"],["0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","30+","0-9g/day","10-19","20-29","30+","0-9g/day","10-19","0-9g/day","10-19"],[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,3,1,0,0,0,0,0,2,0,2,1,0,0,0,6,4,5,5,3,6,1,2,4,3,2,4,2,3,3,4,9,6,4,3,9,8,3,4,5,6,2,5,5,4,2,0,17,3,5,6,4,2,1,3,1,1,1,1,2,1,2,1,0,1,1,1,2,1],[40,10,6,5,27,7,4,7,2,1,2,1,0,1,2,60,13,7,8,35,20,13,8,11,6,2,1,1,3,2,45,18,10,4,32,17,10,2,13,8,4,2,0,1,1,0,47,19,9,2,31,15,13,3,9,7,3,0,5,1,1,1,43,10,5,2,17,7,4,7,8,1,0,1,1,0,0,17,4,2,3,2,3,0,0,0,0,0],[40,10,6,5,27,7,4,7,2,1,2,1,1,1,2,60,14,7,8,35,23,14,8,11,6,2,1,3,3,4,46,18,10,4,38,21,15,7,16,14,5,4,4,4,3,4,49,22,12,6,40,21,17,6,18,15,6,4,10,7,3,6,48,14,7,2,34,10,9,13,12,3,1,4,2,1,1,18,6,3,5,3,3,1,1,1,2,1],[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0.07099999999999999,0,0,0,0.13,0.07099999999999999,0,0,0,0,0,0.667,0,0.5,0.022,0,0,0,0.158,0.19,0.333,0.714,0.188,0.429,0.2,0.5,1,0.75,0.667,1,0.041,0.136,0.25,0.667,0.225,0.286,0.235,0.5,0.5,0.533,0.5,1,0.5,0.857,0.667,0.833,0.104,0.286,0.286,0,0.5,0.3,0.556,0.462,0.333,0.667,1,0.75,0.5,1,1,0.056,0.333,0.333,0.4,0.333,0,1,1,1,1,1]],"container":"<table class=\"display\">\n <thead>\n <tr>\n <th> <\/th>\n <th>Вікова група<\/th>\n <th>Алкоголь<\/th>\n <th>Тютюн<\/th>\n <th>Випадки<\/th>\n <th>Контролі<\/th>\n <th>Всього<\/th>\n <th>Частка хворих<\/th>\n <\/tr>\n <\/thead>\n<\/table>","options":{"pageLength":20,"lengthMenu":[20,30,60],"columnDefs":[{"className":"dt-right","targets":[4,5,6,7]},{"orderable":false,"targets":0},{"name":" ","targets":0},{"name":"agegp","targets":1},{"name":"alcgp","targets":2},{"name":"tobgp","targets":3},{"name":"ncases","targets":4},{"name":"ncontrols","targets":5},{"name":"ntotal","targets":6},{"name":"prop_cases","targets":7}],"order":[],"autoWidth":false,"orderClasses":false}},"evals":[],"jsHooks":[]}</script>

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

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

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

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

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

3.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"
  )

3.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+ г/день).

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

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

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

3.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)
  )


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

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

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

5 Висновки

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