Лабораторная работа №3: Продвинутый Pandas (EDA)
Цель: Освоить методы агрегации данных (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 pd
import seaborn as sns
import 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)Часть 2: Группировка (Groupby)
Теперь, когда данные чисты, мы можем искать инсайты. Основной вопрос: "Кто выжил?".
Задание 2.1: Вычислите среднюю выживаемость (survived) в зависимости от класса каюты (pclass).
Подсказка: survived равен 1 или 0. Среднее значение автоматически даст процент выживших.
# TODO: Сгруппируйте по 'pclass' и вычислите среднее для 'survived'
# survival_by_class = ...
# print(survival_by_class)Часть 3: Сводные таблицы (Pivot Tables)
Сводные таблицы позволяют смотреть на данные в двух разрезах одновременно (матричный вид).
Задание 3.1: Построение Pivot Table
Создайте таблицу, где:
- Индекс (строки):
sex(пол). - Колонки:
class(класс каюты: First, Second, Third). - Значения:
survived(средняя выживаемость).
Бизнес-вопрос
Это позволит ответить на вопрос: "Правда ли, что женщин из 1-го класса спасали чаще, чем мужчин из 3-го?"
# TODO: Создайте pivot_table
# pivot_res = df_clean.pivot_table(
# index=...,
# columns=...,
# values=...,
# aggfunc=...
# )
# print(pivot_res)Часть 4: Объединение таблиц (Merge)
Представьте, что у нас есть справочник с описанием портов посадки, который пришел из другого отдела. Нам нужно "подтянуть" эти описания в главную таблицу.
Задание 4.1: Left Join
- Создан справочник
port_names. - Объедините
df_cleanсport_namesпо ключуembarked/code. - Используйте
how='left', чтобы не потерять строки, если для какого-то порта нет описания.
# Создаем справочник портов
port_names = pd.DataFrame({
'code': ['S', 'C', 'Q'],
'city_name': ['Southampton', 'Cherbourg', 'Queenstown']
})
print("Справочник:")
print(port_names)
# TODO: Объедините таблицы. Обратите внимание: ключи называются по-разному ('embarked' и 'code')
# Используйте left_on и right_on
# df_merged = pd.merge(
# ...,
# ...,
# how='left',
# left_on=...,
# right_on=...
# )
# print("\nРезультат (первые 5 строк):")
# print(df_merged[['embarked', 'city_name', 'survived']].head())