Лабораторная работа №9 (R)

Визуализация данных в ggplot2

Author

ФИО студента: Чигирев Яромир Алексеевич

Published

November 13, 2025

0. Подготовка окружения

library(ggplot2); library(dplyr); set.seed(42)
Warning: пакет 'ggplot2' был собран под R версии 4.3.3
Warning: пакет 'dplyr' был собран под R версии 4.3.2

Присоединяю пакет: 'dplyr'
Следующие объекты скрыты от 'package:stats':

    filter, lag
Следующие объекты скрыты от 'package:base':

    intersect, setdiff, setequal, union

1. Данные для заданий

n <- 80
df <- data.frame(
  age = sample(18:70, n, replace=TRUE),
  weight = rnorm(n, 70, 12),
  height = rnorm(n, 170, 10),
  gender = sample(c("Male","Female"), n, replace=TRUE),
  sport = sample(c("Yes","No"), n, replace=TRUE)
) |> mutate(BMI = weight/(height/100)^2)
head(df,8)
  age   weight   height gender sport      BMI
1  66 53.58063 169.9818 Female    No 18.54399
2  54 75.19382 165.7174   Male    No 27.38078
3  18 60.26328 163.8633 Female    No 22.44344
4  42 87.32922 149.7532   Male   Yes 38.94101
5  27 64.82265 157.7525   Male    No 26.04799
6  53 77.86777 171.7952 Female   Yes 26.38371
7  35 73.86310 175.6762 Female    No 23.93325
8  66 60.59393 165.0712   Male    No 22.23752

2. Задания

A. Распределение

ggplot(df, aes(x = BMI)) +
  geom_histogram(aes(y = after_stat(density), fill = gender), 
                 bins = 10, position = "identity", alpha = 0.6) +
  geom_density() +
  labs(title = "Распределение BMI по полу", x = "Индекс массы тела", y = "Плотность") +
  theme_classic()

B. Взаимосвязь

ggplot(df, aes(x = age, y = BMI, color = gender, shape = sport)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Зависимость BMI от возраста", 
       x = "Возраст", 
       y = "Индекс массы тела") +
  theme_classic()
`geom_smooth()` using formula = 'y ~ x'

C. Сравнение групп

ggplot(df, aes(x = gender, y = BMI, fill = factor(gender))) +
  geom_boxplot(show.legend = FALSE) +
  labs(title = "Распределение BMI по полу", x = "Пол", y = "Индекс массы тела") +
  theme_minimal()

ggplot(df, aes(x = gender, y = height)) +
  geom_violin(aes(color = gender, fill = gender), alpha = 0.1, show.legend = FALSE) +
  stat_summary(fun = median) +
  facet_wrap(~gender, scales = "free") +
  labs(title = "Распределение роста по полу", x = "Пол", y = "Рост") +
  theme_minimal()
Warning: Removed 1 row containing missing values or values outside the scale range
(`geom_segment()`).
Removed 1 row containing missing values or values outside the scale range
(`geom_segment()`).

D. Средние по группам

dfs <- df %>%
  group_by(gender, sport) %>%
  summarise(mean_BMI = mean(BMI, na.rm = TRUE), .groups = 'drop')

ggplot(dfs, aes(x = gender, y = mean_BMI, fill = sport)) +
  geom_col(position = "dodge") +
  labs(title = "Средний BMI по полу и занятиям спортом", 
       x = "Пол", y = "Средний BMI") +
  theme_classic()

E. Дополнительно

ggplot(df, aes(x = gender, y = BMI, fill = gender)) +
  geom_boxplot(show.legend = FALSE) +
  facet_wrap(~sport) +
  scale_fill_manual(values = c("Male" = "steelblue", "Female" = "pink")) +
  labs(title = "Распределение BMI по полу и занятиям спортом",
       x = "Пол", y = "BMI") +
  theme_minimal()

3. Краткие выводы

Распределение индекса массы тела демонстрирует гендерные различия, у мужчин наблюдается более высокий средний показатель по сравнению с женщинами. Интересно, что занятие спортом не оказывает особого влияния на средние показатели BMI в гендерных группах.
Анализ взаимосвязи возраста и BMI выявил слабую положительную корреляцию у мужчин, но отрицательную у женщин, что частично соответствует общеизвестной тенденции изменения массы тела с возрастом. При этом распределение роста по полу соответствует биологическим различиям - мужчины в среднем имеют более высокий рост.