Обработка пропусков на наборе данных Palmer Penguins
Author
ФИО студента: ____________________
Published
September 26, 2025
Цель: на практике отработать выявление и обработку пропусков в реальном датасете palmerpenguins: диагностика пропусков, удаление, заполнение (медиана/мода), групповое заполнение по видам/островам, оценка эффекта на распределения и визуализации.
0. Подготовка окружения
# Установка пакетов при необходимости:# install.packages(c("palmerpenguins", "tidyverse", "skimr", "naniar"))library(tidyverse) # dplyr, ggplot2, tidyr, readr, etc.
── 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(palmerpenguins) # данные о пингвинах
Attaching package: 'palmerpenguins'
The following objects are masked from 'package:datasets':
penguins, penguins_raw
library(skimr) # удобный обзор данныхlibrary(naniar) # визуализация и работа с пропусками
Attaching package: 'naniar'
The following object is masked from 'package:skimr':
n_complete
1. Данные Palmer Penguins (кратко)
Набор данных о пингвинах с островов Палмер (Антарктика). Содержит измерения трёх видов пингвинов: Adélie, Chinstrap, Gentoo.
Ключевые переменные (с пропусками в некоторых столбцах): - species — вид, - island — остров, - bill_length_mm, bill_depth_mm — длина и глубина клюва (мм), - flipper_length_mm — длина плавника (мм), - body_mass_g — масса тела (г), - sex — пол, - year — год наблюдения.
data(penguins)penguins |>head()
2. Теория (шпаргалка по пропускам)
2.1. Почему возникают пропуски и почему их важно обрабатывать?
Удаление строк/столбцов: drop_na() / select(-cols) — просто, но теряем данные и можем получить смещение.
Заполнение константой: replace_na(list(col = value)) — быстро, но может искажать распределения.
Заполнение статистиками: медиана/среднее для числовых, мода для категориальных.
Групповое заполнение: учитывает зависимость от групп (например, по species или island).
2.4. Практические рецепты в R
library(dplyr)library(tidyr)library(forcats)# Удаление строк с NA хотя бы в одном из выбранных столбцовpenguins_drop <- penguins |>drop_na(bill_length_mm, bill_depth_mm)# Заполнение константамиpenguins_const <- penguins |>mutate(sex =fct_explicit_na(sex, na_level ="unknown"))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `sex = fct_explicit_na(sex, na_level = "unknown")`.
Caused by warning:
! `fct_explicit_na()` was deprecated in forcats 1.0.0.
ℹ Please use `fct_na_value_to_level()` instead.
# Заполнение «модой» (часто встречающееся значение) для фактора/характераmode_val <-function(x) { ux <-na.omit(x); if (length(ux) ==0) return(NA)names(sort(table(ux), decreasing =TRUE))[1]}penguins_mode <- penguins |>mutate(sex =if_else(is.na(sex), mode_val(sex), sex) )# Заполнение медианой по всему столбцуmedians <- penguins |>summarise(across(where(is.numeric), ~median(.x, na.rm =TRUE)))penguins_med <- penguins |>mutate(across(where(is.numeric), ~replace_na(.x, medians[[cur_column()]])))# Групповая медиана по виду (species)penguins_group_med <- penguins |>group_by(species) |>mutate(across(where(is.numeric), ~if_else(is.na(.x), median(.x, na.rm =TRUE), .x))) |>ungroup()
Выведите таблицу количества пропусков по всем столбцам (в убывающем порядке).
Постройте gg_miss_var и vis_miss для наглядности. Кратко опишите, где пропусков больше всего.
Часть B. Базовые подходы
Сформируйте датасет без пропусков в числовых столбцах bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g (используйте drop_na). Сравните размерность с исходной.
Заполните sex модой по всему набору. Сравните распределение sex до/после (bar chart).
Часть C. Заполнение статистиками
Заполните все числовые столбцы медианами (по всему столбцу). Постройте гистограмму bill_length_mm до/после заполнения в одном окне (фасеты или цвет).
Выполните групповое заполнение медианой по species для числовых столбцов. Сравните медианы body_mass_g по species до/после (таблица из 2–3 строк на вид).
Часть D. Сравнение стратегий
Сравните три версии датасета:
исходный с пропусками,
глобальная медиана,
групповая медиана по species.
Для каждого варианта посчитайте среднее и медиану bill_depth_mm по species, выведите аккуратную таблицу (pivot_wider).
Часть E. Визуализация (мини-отчёт)
Постройте boxplot body_mass_g по species и sex для набора после группового заполнения. Добавьте подписи, легенду, тему.
Сохраните 2–3 ключевых графика (ggsave()) и укажите их в выводах.
Контрольные вопросы
Чем отличаются стратегии drop_na() и заполнение медианой? Когда что предпочтительнее?
Почему групповое заполнение может быть лучше глобального? Приведите пример из набора пингвинов.
Какие риски несёт замена пропусков модой для категориальных признаков?
Что такое MCAR/MAR/MNAR? Как это влияет на выбор стратегии?
Какие графики вы используете для оценки эффектов заполнения и почему?