Мини-проект: анализ набора данных

Собираем все навыки курса в один сквозной анализ — от загрузки данных до выводов.

Анализ данных — это пайплайн: загрузить, осмотреть, очистить, преобразовать, посчитать статистики и построить модель.

В этом финальном уроке мы пройдём типичный путь аналитика на воображаемом наборе данных о сотрудниках (колонки: name, age, department, salary, experience). Каждый шаг использует то, что мы изучили.

Цель урока — показать, что отдельные приёмы курса складываются в единый рабочий процесс. По отдельности read_csv, filter, group_by, t.test и lm — просто функции; вместе они образуют пайплайн анализа, по которому идёт почти любая реальная задача. Запомните этот порядок шагов как шаблон: к нему вы будете возвращаться снова и снова, меняя лишь данные и вопросы. Именно умение собирать такой конвейер, а не знание отдельных функций, делает из ученика аналитика.

Шаг 1. Загрузка и осмотр

library(tidyverse)

employees <- read_csv("employees.csv")
glimpse(employees)
summary(employees)

Сначала смотрим структуру через glimpse (аналог str из tidyverse) и сводку summary: сколько строк, какие типы, есть ли пропуски и подозрительные значения.

Шаг 2. Очистка пропусков

sum(is.na(employees$salary))

employees <- employees %>%
  filter(!is.na(salary))

Считаем пропуски в salary и убираем строки без зарплаты. Восклицательный знак ! означает «не», поэтому !is.na(salary) — «зарплата указана».

Шаг 3. Преобразование и группировка

Добавим стаж в категориях и посчитаем среднюю зарплату по отделам:

by_dept <- employees %>%
  mutate(level = if_else(experience >= 5, "senior", "junior")) %>%
  group_by(department) %>%
  summarise(
    avg_salary = mean(salary),
    headcount  = n()
  ) %>%
  arrange(desc(avg_salary))

by_dept

Вывод:

# A tibble: 3 x 3
  department avg_salary headcount
  <chr>           <dbl>     <int>
1 IT             120000        12
2 Sales           90000        20
3 Support         70000        15

Одна цепочка пайпа выполнила четыре шага: создала колонку, сгруппировала, посчитала сводки, отсортировала.

Шаг 4. Статистика и гипотеза

it <- employees %>% filter(department == "IT") %>% pull(salary)
sales <- employees %>% filter(department == "Sales") %>% pull(salary)

t.test(it, sales)

Проверяем гипотезу: значимо ли зарплаты в IT выше, чем в Sales. Функция pull достаёт колонку как вектор для t.test.

Шаг 5. Модель и график

model <- lm(salary ~ experience, data = employees)
summary(model)

ggplot(employees, aes(x = experience, y = salary)) +
  geom_point() +
  geom_smooth(method = "lm")

Строим регрессию «зарплата от стажа» и рисуем точки с линией тренда: geom_smooth(method = "lm") добавляет на график ту самую прямую регрессии.

Как работает под капотом

Сила такого пайплайна — в воспроизводимости и читаемости. Весь анализ — это один скрипт: запустив его заново на обновлённых данных, вы получите свежие результаты без ручной работы. Tidyverse-стиль (пайпы, говорящие глаголы) делает код почти самодокументируемым: даже спустя месяцы видно, что и зачем считалось. Именно за это R ценят в исследованиях и аналитике.

Частые ошибки

  • Пропустить осмотр данных. Без glimpse/summary легко строить анализ на «грязных» данных и не заметить пропуски.
  • Делать выводы только по средним. Подкрепляйте их разбросом, графиком и проверкой гипотез.
  • Не сохранять скрипт. Весь смысл — в воспроизводимости: храните анализ как .R-файл.

Итог

  • Анализ — это пайплайн: загрузка → осмотр → очистка → преобразование → статистика → модель.
  • Пайп %>% и глаголы dplyr делают код читаемым.
  • pull достаёт колонку как вектор; geom_smooth(method="lm") рисует линию регрессии.
  • Главная ценность R — воспроизводимый, самодокументируемый анализ.
Проверьте себя
1. С чего разумно начинать анализ нового набора данных?
AСразу строить регрессию
BС осмотра через glimpse/summary: типы, размер, пропуски
CС удаления всех колонок
DС построения графика без проверки данных
2. Что означает условие !is.na(salary) в filter?
AЗарплата равна NA
BЗарплата указана (не является пропуском)
CЗарплата больше нуля
DУдалить колонку salary
3. Что добавляет geom_smooth(method = "lm") на график?
AСтолбцы
BЛинию линейной регрессии (тренда)
CПодписи осей
DЛегенду