Цель: Освоить методы агрегации данных (groupby, pivot_table), научиться объединять разные таблицы (merge) и выработать стратегию работы с пропущенными значениями (NaN).
Инструменты:
Python 3
Pandas
Seaborn (для загрузки учебных данных)
Данные:
Мы будем работать с классическим датасетом Titanic. Он идеально подходит для этой практики, так как содержит пропуски (возраст, каюты) и категориальные признаки для группировки.
Часть 1: Анализ и обработка пропусков (Missing Values)
В реальных данных часто встречаются пустые ячейки. В Pandas они отображаются как NaN (Not a Number) или None. Модели машинного обучения не умеют работать с пропусками, поэтому их нужно устранить.
Задание 1.1:
Загрузите датасет Titanic.
Посчитайте количество пропусков в каждом столбце.
Посчитайте процент пропусков для каждого столбца.
import pandas as pdimport seaborn as snsimport numpy as np# Загружаем датасетdf = sns.load_dataset('titanic')# TODO: Выведите количество пропусков (NaN) в каждом столбце# missing_counts = ...# print("Количество пропусков:\n", missing_counts)# TODO: Вычислите процент пропусков (количество пропусков / общее число строк * 100)# missing_pct = ...# print("\nПроцент пропусков:\n", missing_pct)
Задание 1.2: Стратегии очистки (Imputation)
Применим разные стратегии для разных колонок:
Индивидуальный подход к признакам
deck (Палуба): Слишком много пропусков (> 70%). Устранить столбец целиком.
embarked (Порт посадки): Пропусков мало (< 1%). Удалить строки с пропусками.
age (Возраст): Важный признак, удалять нельзя. Заполнить пропуски медианным значением возраста по всему датасету.
# 1. Удаление столбца 'deck'# TODO: Удалите столбец 'deck' (используйте axis=1)# df_clean = df.drop(...)# 2. Удаление строк с пустым 'embarked'# TODO: Удалите строки, где есть NaN в колонке 'embarked'# df_clean = df_clean.dropna(...)# 3. Заполнение пропусков в 'age'# TODO: Вычислите медиану по столбцу 'age'# age_median = ...# TODO: Заполните пропуски в 'age' вычисленной медианой# df_clean['age'] = df_clean['age'].fillna(...)# Проверка: пропусков быть не должно# print(df_clean.isna().sum())
Часть 2: Группировка (Groupby)
Теперь, когда данные чисты, мы можем искать инсайты. Основной вопрос: “Кто выжил?”.
Задание 2.1: Вычислите среднюю выживаемость (survived) в зависимости от класса каюты (pclass).
Подсказка:survived равен 1 или 0. Среднее значение автоматически даст процент выживших.
# TODO: Сгруппируйте по 'pclass' и вычислите среднее для 'survived'# survival_by_class = ...# print(survival_by_class)
Задание 2.2: Посчитайте статистику по возрасту (age) и стоимости билета (fare) в разрезе пола (sex).
Нам нужны:
Для возраста: среднее значение.
Для стоимости: среднее и максимальное значение.
Используйте метод .agg().
# TODO: Используйте agg для расчета нескольких метрик# stats = df_clean.groupby('sex').agg({# 'age': ...,# 'fare': ...# })# print(stats)
Часть 3: Сводные таблицы (Pivot Tables)
Сводные таблицы позволяют смотреть на данные в двух разрезах одновременно (матричный вид).
Задание 3.1: Построение Pivot Table
Создайте таблицу, где:
Индекс (строки): sex (пол).
Колонки: class (класс каюты: First, Second, Third).
Значения: survived (средняя выживаемость).
Бизнес-вопрос
Это позволит ответить на вопрос: “Правда ли, что женщин из 1-го класса спасали чаще, чем мужчин из 3-го?”
Представьте, что у нас есть справочник с описанием портов посадки, который пришел из другого отдела. Нам нужно “подтянуть” эти описания в главную таблицу.
Задание 4.1: Left Join
Создан справочник port_names.
Объедините df_clean с port_names по ключу embarked / code.
Используйте how='left', чтобы не потерять строки, если для какого-то порта нет описания.
Почему при очистке данных о пассажирах Титаника столбец `deck` (Палуба) был удален целиком, а в столбце `age` (Возраст) пропуски были заполнены медианой?
Что произойдет при использовании `how='left'` во время объединения (`merge`) основной таблицы со справочником портов, если для одного из портов пассажира нет расшифровки в справочнике?