Шаблон отчёта по ЛР №2 (R)

Базовый анализ данных в R (mtcars)

Author

ФИО студента: Капустинский Артём Евгеньевич

Published

October 8, 2025

Что предстоит сделать

Обработать и проанализировать данные mtcars с использованием базовых приёмов R, dplyr и ggplot2. Результатом является отчёт в формате Quarto, CSV-выборка и сохранённые графики.

Описание датасета mtcars

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

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

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

# Библиотеки
library(dplyr)
Warning: пакет 'dplyr' был собран под R версии 4.4.3

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

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

    intersect, setdiff, setequal, union
library(ggplot2)
Warning: пакет 'ggplot2' был собран под R версии 4.4.3
library(tibble)
Warning: пакет 'tibble' был собран под R версии 4.4.3
library(readr)
Warning: пакет 'readr' был собран под R версии 4.4.3
# Данные
data(mtcars)
mtcars <- as_tibble(mtcars, rownames = "model")

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

Первые и последние строки

head(mtcars, 12)
# A tibble: 12 × 12
   model         mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <chr>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 Mazda RX4    21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2 Mazda RX4 …  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3 Datsun 710   22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4 Hornet 4 D…  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5 Hornet Spo…  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6 Valiant      18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7 Duster 360   14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8 Merc 240D    24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9 Merc 230     22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10 Merc 280     19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
11 Merc 280C    17.8     6  168.   123  3.92  3.44  18.9     1     0     4     4
12 Merc 450SE   16.4     8  276.   180  3.07  4.07  17.4     0     0     3     3
tail(mtcars, 6)
# A tibble: 6 × 12
  model          mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Porsche 914…  26       4 120.     91  4.43  2.14  16.7     0     1     5     2
2 Lotus Europa  30.4     4  95.1   113  3.77  1.51  16.9     1     1     5     2
3 Ford Panter…  15.8     8 351     264  4.22  3.17  14.5     0     1     5     4
4 Ferrari Dino  19.7     6 145     175  3.62  2.77  15.5     0     1     5     6
5 Maserati Bo…  15       8 301     335  3.54  3.57  14.6     0     1     5     8
6 Volvo 142E    21.4     4 121     109  4.11  2.78  18.6     1     1     4     2

Структура и сводка

str(mtcars)
tibble [32 × 12] (S3: tbl_df/tbl/data.frame)
 $ model: chr [1:32] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ...
 $ mpg  : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl  : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
 $ disp : num [1:32] 160 160 108 258 360 ...
 $ hp   : num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
 $ drat : num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt   : num [1:32] 2.62 2.88 2.32 3.21 3.44 ...
 $ qsec : num [1:32] 16.5 17 18.6 19.4 17 ...
 $ vs   : num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
 $ am   : num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
 $ gear : num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
 $ carb : num [1:32] 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 из dplyr/tibble:
glimpse(mtcars)
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…

Преобразование факторов и добавление признаков

mtcars <- mtcars |>
  mutate(
    cyl = factor(cyl),
    am  = factor(am, levels = c(0,1), labels = c("auto","manual")),
    power_to_weight = hp / wt,
    efficiency = mpg / wt
  )
mtcars
# A tibble: 32 × 14
   model         mpg cyl    disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr>       <dbl> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct> <dbl> <dbl>
 1 Mazda RX4    21   6      160    110  3.9   2.62  16.5     0 manu…     4     4
 2 Mazda RX4 …  21   6      160    110  3.9   2.88  17.0     0 manu…     4     4
 3 Datsun 710   22.8 4      108     93  3.85  2.32  18.6     1 manu…     4     1
 4 Hornet 4 D…  21.4 6      258    110  3.08  3.22  19.4     1 auto      3     1
 5 Hornet Spo…  18.7 8      360    175  3.15  3.44  17.0     0 auto      3     2
 6 Valiant      18.1 6      225    105  2.76  3.46  20.2     1 auto      3     1
 7 Duster 360   14.3 8      360    245  3.21  3.57  15.8     0 auto      3     4
 8 Merc 240D    24.4 4      147.    62  3.69  3.19  20       1 auto      4     2
 9 Merc 230     22.8 4      141.    95  3.92  3.15  22.9     1 auto      4     2
10 Merc 280     19.2 6      168.   123  3.92  3.44  18.3     1 auto      4     4
# ℹ 22 more rows
# ℹ 2 more variables: power_to_weight <dbl>, efficiency <dbl>

Сортировка по efficiency (топ-10)

mtcars_top_eff <- mtcars |>
  arrange(desc(efficiency)) |>
  slice_head(n = 10)
mtcars_top_eff
# A tibble: 10 × 14
   model         mpg cyl    disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr>       <dbl> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct> <dbl> <dbl>
 1 Lotus Euro…  30.4 4      95.1   113  3.77  1.51  16.9     1 manu…     5     2
 2 Honda Civic  30.4 4      75.7    52  4.93  1.62  18.5     1 manu…     4     2
 3 Toyota Cor…  33.9 4      71.1    65  4.22  1.84  19.9     1 manu…     4     1
 4 Fiat 128     32.4 4      78.7    66  4.08  2.2   19.5     1 manu…     4     1
 5 Fiat X1-9    27.3 4      79      66  4.08  1.94  18.9     1 manu…     4     1
 6 Porsche 91…  26   4     120.     91  4.43  2.14  16.7     0 manu…     5     2
 7 Datsun 710   22.8 4     108      93  3.85  2.32  18.6     1 manu…     4     1
 8 Toyota Cor…  21.5 4     120.     97  3.7   2.46  20.0     1 auto      3     1
 9 Mazda RX4    21   6     160     110  3.9   2.62  16.5     0 manu…     4     4
10 Volvo 142E   21.4 4     121     109  4.11  2.78  18.6     1 manu…     4     2
# ℹ 2 more variables: power_to_weight <dbl>, efficiency <dbl>

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

Авто с mpg > 25 и wt < 2.5

mtcars_filtered <- mtcars |>
  filter(mpg > 25, wt < 2.5)
  
mtcars_filtered |> select(model, mpg, wt)
# A tibble: 6 × 3
  model            mpg    wt
  <chr>          <dbl> <dbl>
1 Fiat 128        32.4  2.2 
2 Honda Civic     30.4  1.62
3 Toyota Corolla  33.9  1.84
4 Fiat X1-9       27.3  1.94
5 Porsche 914-2   26    2.14
6 Lotus Europa    30.4  1.51

Сохранение выборки нужных столбцов в CSV

mtcars_selection <- mtcars |>
  select(model, mpg, hp, cyl, am)

# Сохраняем рядом с отчётом
write_csv(mtcars_selection, "mtcars_selection.csv")
mtcars_selection
# A tibble: 32 × 5
   model               mpg    hp cyl   am    
   <chr>             <dbl> <dbl> <fct> <fct> 
 1 Mazda RX4          21     110 6     manual
 2 Mazda RX4 Wag      21     110 6     manual
 3 Datsun 710         22.8    93 4     manual
 4 Hornet 4 Drive     21.4   110 6     auto  
 5 Hornet Sportabout  18.7   175 8     auto  
 6 Valiant            18.1   105 6     auto  
 7 Duster 360         14.3   245 8     auto  
 8 Merc 240D          24.4    62 4     auto  
 9 Merc 230           22.8    95 4     auto  
10 Merc 280           19.2   123 6     auto  
# ℹ 22 more rows

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

По комбинациям cyl × am

agg_cyl_am <- mtcars |>
  group_by(cyl, am) |>
  summarise(
    n = n(),
    mean_mpg = mean(mpg),
    median_hp = median(hp),
    .groups = "drop"
  )
agg_cyl_am
# A tibble: 6 × 5
  cyl   am         n mean_mpg median_hp
  <fct> <fct>  <int>    <dbl>     <dbl>
1 4     auto       3     22.9      95  
2 4     manual     8     28.1      78.5
3 6     auto       4     19.1     116. 
4 6     manual     3     20.6     110  
5 8     auto      12     15.0     180  
6 8     manual     2     15.4     300. 

Средний mpg по числу передач (gear) + bar chart

mpg_by_gear <- mtcars |>
  group_by(gear) |>
  summarise(mean_mpg = mean(mpg), .groups = "drop")

# Столбчатая диаграмма
p_bar <- ggplot(mpg_by_gear, aes(x = factor(gear), y = mean_mpg)) +
  geom_col() +
  geom_text(aes(label = round(mean_mpg, 1)), vjust = -0.5, size = 4) +
  labs(x = "Число передач (gear)", y = "Средний mpg", title = "Средний расход (mpg) по числу передач") +
  theme_minimal()

p_bar

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

Scatter plot: wt vs mpg

p_scatter <- ggplot(mtcars, aes(x = wt, y = mpg, color = cyl, shape = am)) +
  geom_point(size = 3, alpha = 0.85) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(x = "wt", y = "mpg", color = "cyl", shape = "am",
       title = "Связь веса и экономичности") +
  theme_minimal()

p_scatter
`geom_smooth()` using formula = 'y ~ x'
Warning in qt((1 - level)/2, df): созданы NaN
Warning in max(ids, na.rm = TRUE): у 'max' нет не пропущенных аргументов;
возвращаю -Inf

Boxplot mpg по am с фасетами по cyl

p_box <- ggplot(mtcars, aes(x = am, y = mpg, fill = am)) +
  geom_boxplot(alpha = 0.7, outlier.shape = 21) +
  facet_wrap(~ cyl) +
  labs(x = "Тип трансмиссии (am)", y = "mpg", title = "Распределение mpg по типу трансмиссии, фасеты по cyl") +
  theme_minimal() +
  theme(legend.position = "none")

p_box

Сохранение лучших двух графиков

# Сохраним scatter и bar chart как наиболее информативные
ggsave("plot_scatter_wt_mpg.png", plot = p_scatter, width = 7, height = 5, dpi = 300)
`geom_smooth()` using formula = 'y ~ x'
Warning in qt((1 - level)/2, df): созданы NaN
Warning in max(ids, na.rm = TRUE): у 'max' нет не пропущенных аргументов;
возвращаю -Inf
ggsave("plot_mpg_by_gear_bar.png", plot = p_bar, width = 7, height = 5, dpi = 300)

Выводы

  1. Базовая предобработка показала снижение дальности движения с ростом веса.
  2. С ростом количества цилиндров дальность снижается.
  3. Самая высокая дальность хода была при 4 передачах.