machine-learningЛабораторная работаPython

Лабораторная работа №3: Продвинутый Pandas (EDA)

👀 Загрузка...

Цель: Освоить методы агрегации данных (groupby, pivot_table), научиться объединять разные таблицы (merge) и выработать стратегию работы с пропущенными значениями (NaN).

Инструменты:

  • Python 3
  • Pandas
  • Seaborn (для загрузки учебных данных)

Данные: Мы будем работать с классическим датасетом Titanic. Он идеально подходит для этой практики, так как содержит пропуски (возраст, каюты) и категориальные признаки для группировки.


Часть 1: Анализ и обработка пропусков (Missing Values)

В реальных данных часто встречаются пустые ячейки. В Pandas они отображаются как NaN (Not a Number) или None. Модели машинного обучения не умеют работать с пропусками, поэтому их нужно устранить.

Задание 1.1:

  1. Загрузите датасет Titanic.
  2. Посчитайте количество пропусков в каждом столбце.
  3. Посчитайте процент пропусков для каждого столбца.
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

  1. Создан справочник port_names.
  2. Объедините df_clean с port_names по ключу embarked / code.
  3. Используйте 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())

🧠 Проверка знаний

Почему при очистке данных о пассажирах Титаника столбец `deck` (Палуба) был удален целиком, а в столбце `age` (Возраст) пропуски были заполнены медианой?

Что произойдет при использовании `how='left'` во время объединения (`merge`) основной таблицы со справочником портов, если для одного из портов пассажира нет расшифровки в справочнике?