Мини-проект: анализ набора данных
Собираем все навыки курса в один сквозной анализ — от загрузки данных до выводов.
Анализ данных — это пайплайн: загрузить, осмотреть, очистить, преобразовать, посчитать статистики и построить модель.
В этом финальном уроке мы пройдём типичный путь аналитика на воображаемом наборе данных о сотрудниках (колонки: 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 — воспроизводимый, самодокументируемый анализ.