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

Базовый анализ данных в R: dplyr + ggplot2 (датасет mtcars)

Author

ФИО студента: ____________________

Published

September 17, 2025

Цель: освоить базовые операции анализа данных в R на практике: загрузка и обзор данных, фильтрация, агрегирование, создание признаков и визуализация.

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

# Установка пакетов (раскомментируйте при первом запуске)
# install.packages(c("tidyverse", "readxl"))

library(tidyverse)   # включает dplyr, ggplot2, readr, tidyr и др.
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.2     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.4     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)      # чтение Excel (при необходимости)

1. Датасет mtcars (краткое описание)

Встроенный в R набор данных mtcars содержит технические характеристики 32 моделей автомобилей 1973–74 годов. Ключевые переменные:

  • mpg — расход топлива (мили на галлон);
  • cyl — число цилиндров;
  • disp — рабочий объём (куб. дюймы);
  • hp — мощность (л.с.);
  • drat — передаточное число заднего моста;
  • wt — масса (1000 фунтов);
  • qsec — время четверти мили (сек);
  • vs — тип двигателя (0 = V-образный, 1 = рядный);
  • am — тип трансмиссии (0 = автомат, 1 = механика);
  • gear — число передач;
  • carb — число карбюраторов.
data("mtcars")
mtcars <- tibble::rownames_to_column(mtcars, var = "model")  # переносим имена строк в отдельную колонку
head(mtcars)

2. Теоретический минимум (шпаргалка)

2.1. Чтение данных

# CSV
#df <- readr::read_csv("data.csv")

# Excel
#df_xlsx <- readxl::read_excel("data.xlsx", sheet = 1)

2.2. Обзор и структура

head(mtcars, 10)
tail(mtcars, 5)
dim(mtcars)     # атрибуты: nrow, ncol можно получить также через nrow(mtcars), ncol(mtcars)
[1] 32 12
names(mtcars)   # имена столбцов
 [1] "model" "mpg"   "cyl"   "disp"  "hp"    "drat"  "wt"    "qsec"  "vs"   
[10] "am"    "gear"  "carb" 
str(mtcars)
'data.frame':   32 obs. of  12 variables:
 $ model: chr  "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ...
 $ mpg  : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl  : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp : num  160 160 108 258 360 ...
 $ hp   : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt   : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec : num  16.5 17 18.6 19.4 17 ...
 $ vs   : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am   : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear : num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb : num  4 4 1 1 2 1 4 2 2 4 ...
summary(mtcars)
    model                mpg             cyl             disp      
 Length:32          Min.   :10.40   Min.   :4.000   Min.   : 71.1  
 Class :character   1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8  
 Mode  :character   Median :19.20   Median :6.000   Median :196.3  
                    Mean   :20.09   Mean   :6.188   Mean   :230.7  
                    3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0  
                    Max.   :33.90   Max.   :8.000   Max.   :472.0  
       hp             drat             wt             qsec      
 Min.   : 52.0   Min.   :2.760   Min.   :1.513   Min.   :14.50  
 1st Qu.: 96.5   1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89  
 Median :123.0   Median :3.695   Median :3.325   Median :17.71  
 Mean   :146.7   Mean   :3.597   Mean   :3.217   Mean   :17.85  
 3rd Qu.:180.0   3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90  
 Max.   :335.0   Max.   :4.930   Max.   :5.424   Max.   :22.90  
       vs               am              gear            carb      
 Min.   :0.0000   Min.   :0.0000   Min.   :3.000   Min.   :1.000  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
 Median :0.0000   Median :0.0000   Median :4.000   Median :2.000  
 Mean   :0.4375   Mean   :0.4062   Mean   :3.688   Mean   :2.812  
 3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
 Max.   :1.0000   Max.   :1.0000   Max.   :5.000   Max.   :8.000  
glimpse(mtcars) # из dplyr
Rows: 32
Columns: 12
$ model <chr> "Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "H…
$ mpg   <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8…
$ cyl   <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8…
$ disp  <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 1…
$ hp    <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 18…
$ drat  <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92…
$ wt    <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3…
$ qsec  <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 1…
$ vs    <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0…
$ am    <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0…
$ gear  <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3…
$ carb  <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2…

2.3. Выборка, фильтрация, сортировка (dplyr)

mtcars %>% select(model, mpg, cyl, hp)
mtcars %>% filter(cyl == 6, mpg > 20)
mtcars %>% arrange(desc(mpg), wt)

2.4. Создание признаков (mutate / transmute)

mtcars %>% mutate(power_to_weight = hp / wt,
                  is_manual = am == 1)
mtcars %>% transmute(model, mpg_z = scale(mpg)[,1])

2.5. Группировки и агрегирование (group_by / summarise)

mtcars %>%
  group_by(cyl) %>%
  summarise(
    n = n(),
    mpg_mean = mean(mpg),
    hp_median = median(hp)
  )

2.6. Перестройка таблиц (pivot_longer / pivot_wider)

long <- mtcars %>%
  pivot_longer(cols = c(mpg, hp, wt),
               names_to = "metric",
               values_to = "value")

wide <- long %>%
  pivot_wider(names_from = metric, values_from = value)

2.7. Работа с пропусками

anyNA(mtcars)
[1] FALSE
mtcars %>% replace_na(list(hp = 0))               # пример замены NA в одном столбце
mtcars %>% drop_na(mpg, hp)                       # удаление строк с NA в указанных столбцах

2.8. Факторы и метки

mtcars %>%
  mutate(
    cyl = factor(cyl),
    am = factor(am, labels = c("auto", "manual"))
  ) %>%
  count(cyl, am)

2.9. Базовая визуализация (ggplot2)

# Точечная диаграмма
ggplot(mtcars, aes(wt, mpg, color = factor(cyl))) +
  geom_point(size = 2) +
  labs(x = "Вес (1000 фунтов)", y = "MPG", color = "Цилиндры")

# Гистограмма
ggplot(mtcars, aes(mpg)) +
  geom_histogram(bins = 10)

# Boxplot
ggplot(mtcars, aes(factor(cyl), mpg)) +
  geom_boxplot()

2.10. Сохранение результатов

readr::write_csv(mtcars, "mtcars_out.csv")
ggsave("scatter_wt_mpg.png", width = 7, height = 5, dpi = 150)

3. Задания

Часть A. Обзор и предобработка

  1. Выведите первые 12 строк и последние 6 строк mtcars.
  2. Отобразите структуру и краткую сводку по данным (str(), summary(), glimpse()).
  3. Преобразуйте переменные cyl и am в факторы; для am назначьте метки auto/manual.
  4. Добавьте признаки: power_to_weight = hp / wt и efficiency = mpg / wt.
  5. Отсортируйте таблицу по efficiency по убыванию, выведите топ-10.

Часть B. Фильтрация и выборки

  1. Отберите автомобили с mpg > 25 и wt < 2.5 (покажите model, mpg, wt).
  2. Сформируйте таблицу из столбцов model, mpg, hp, cyl, am и сохраните в mtcars_selection.csv.

Часть C. Группировки и агрегирование

  1. Посчитайте для каждой комбинации cyl × am: количество авто, средний mpg, медианный hp.
  2. Найдите средний mpg по числу передач gear и визуализируйте bar chart (с подписью значений над столбцами).

Часть D. Визуализация

  1. Постройте scatter plot wt vs mpg, цвет = cyl, форма точки = am, добавьте тренд geom_smooth(method="lm").
  2. Постройте boxplot mpg по am с фасетами по cyl.
  3. Сохраните лучшие два графика с помощью ggsave().

Часть E. Дополнительно (опционально)

  1. Постройте pairwise-диаграммы для подмножества признаков (GGally::ggpairs), сравните распределения.
  2. Переведите model в отдельный фактор и выделите топ-5 моделей по efficiency, отметьте их на графике.

Контрольные вопросы

  1. Для чего используют mutate() и чем он отличается от transmute()?
  2. Зачем переводить числовые кодировки в факторы (напр., am, cyl)?
  3. Чем pivot_longer() отличается от pivot_wider() и когда они применяются?
  4. Что показывает geom_boxplot() и как интерпретировать усики и выбросы?
  5. Почему важно сохранять репрезентативные визуализации (оси, подписи, шкалы)?