|
Визуализация данных: продвинутые графики (Seaborn)
ОП.09 Обработка и анализ данных
Практическая работа №5
Тема: Визуализация данных: продвинутые графики (Seaborn)
Цель работы: Научиться строить продвинутые визуализации с помощью библиотеки Seaborn: pairplot, violinplot, heatmap, jointplot.
Время выполнения: 2 академических часа
Инструменты: Python + Jupyter Notebook, библиотеки pandas, matplotlib, seaborn
ЗАДАНИЕ ДЛЯ СТУДЕНТА
Этап 1. Подготовка данных (10 минут)
Загрузите и подготовьте датасет titanic.csv:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Загрузка данных
df = pd.read_csv('titanic.csv')
# Очистка
df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
df['Age'].fillna(df['Age'].mean(), inplace=True)
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)
# Преобразуем Survived в категорию для лучшей визуализации
df['Survived'] = df['Survived'].astype('category')
Этап 2. Pairplot — матрица диаграмм рассеяния (15 минут)
Постройте pairplot для всех числовых признаков:
# Выбираем числовые столбцы
numeric_cols = ['Age', 'Fare', 'SibSp', 'Parch']
# Pairplot с разделением по выживаемости
sns.pairplot(df[numeric_cols + ['Survived']], hue='Survived', diag_kind='hist')
plt.suptitle('Парные зависимости признаков', y=1.02)
plt.show()
Вопросы:
• Какие пары признаков показывают явную зависимость?
• Как распределены выжившие и погибшие по возрасту и цене билета?
Этап 3. Violinplot — скрипичная диаграмма (15 минут)
Постройте скрипичные диаграммы для сравнения распределений:
# Сравнение возраста выживших и погибших
plt.figure(figsize=(10, 6))
sns.violinplot(x='Survived', y='Age', data=df)
plt.title('Распределение возраста выживших и погибших')
plt.xlabel('Выжил (1 — да, 0 — нет)')
plt.ylabel('Возраст')
plt.show()
# Сравнение цены билета по классам
plt.figure(figsize=(10, 6))
sns.violinplot(x='Pclass', y='Fare', data=df)
plt.title('Распределение цены билета по классам')
plt.xlabel('Класс')
plt.ylabel('Цена билета')
plt.show()
Вопрос: Чем violinplot отличается от boxplot? Какие выводы можно сделать по графикам?
Этап 4. Jointplot — совместное распределение (15 минут)
Постройте jointplot для двух признаков:
# Зависимость возраста от цены билета
sns.jointplot(x='Age', y='Fare', data=df, kind='scatter', alpha=0.5)
plt.suptitle('Зависимость возраста от цены билета', y=1.02)
plt.show()
# С гистограммами и регрессией
sns.jointplot(x='Age', y='Fare', data=df, kind='reg')
plt.suptitle('Зависимость возраста от цены билета (с регрессией)', y=1.02)
plt.show()
Вопрос: Есть ли корреляция между возрастом и ценой билета? Что показывает линия регрессии?
Этап 5. Heatmap с группировкой (15 минут)
Постройте тепловую карту для выживаемости по двум категориям:
# Сводная таблица: выживаемость по классу и полу
pivot_survival = df.pivot_table(index='Pclass', columns='Sex', values='Survived', aggfunc='mean')
# Тепловая карта
plt.figure(figsize=(8, 5))
sns.heatmap(pivot_survival, annot=True, cmap='RdYlGn', vmin=0, vmax=1, fmt='.2f', linewidths=1)
plt.title('Выживаемость по классу и полу')
plt.show()
# Сводная таблица: средняя цена билета по классу и полу
pivot_fare = df.pivot_table(index='Pclass', columns='Sex', values='Fare', aggfunc='mean')
plt.figure(figsize=(8, 5))
sns.heatmap(pivot_fare, annot=True, cmap='Blues', fmt='.0f', linewidths=1)
plt.title('Средняя цена билета по классу и полу')
plt.show()
Вопрос: Какая группа пассажиров имела самую высокую выживаемость? А самую низкую?
Этап 6. Countplot и Barplot (15 минут)
Постройте столбчатые диаграммы для категориальных признаков:
# Количество выживших и погибших
plt.figure(figsize=(8, 5))
sns.countplot(x='Survived', data=df)
plt.title('Количество выживших и погибших')
plt.xlabel('Выжил (1 — да, 0 — нет)')
plt.ylabel('Количество')
plt.show()
# Количество пассажиров по портам посадки
plt.figure(figsize=(8, 5))
sns.countplot(x='Embarked', data=df)
plt.title('Количество пассажиров по портам посадки')
plt.xlabel('Порт посадки')
plt.ylabel('Количество')
plt.show()
# Средняя выживаемость по портам
plt.figure(figsize=(8, 5))
sns.barplot(x='Embarked', y='Survived', data=df)
plt.title('Выживаемость по портам посадки')
plt.xlabel('Порт посадки')
plt.ylabel('Доля выживших')
plt.show()
Вопрос: Какой порт посадки даёт самую высокую выживаемость? Почему?
Этап 7. Выводы (10 минут)
Напишите развёрнутый вывод по работе:
1. Какой тип графика (pairplot, violinplot, jointplot, heatmap) оказался самым информативным и почему?
2. Какие закономерности вы обнаружили с помощью продвинутых визуализаций?
3. В чём преимущество Seaborn перед стандартным matplotlib?
КРИТЕРИИ ОЦЕНКИ
| Критерий | Макс. балл |
|---|
| Все графики построены и подписаны | 3 | | Код чистый, с комментариями | 2 | | Выводы развёрнутые и по делу | 3 | | Использованы разные типы графиков Seaborn | 2 | | Итого | 10 |
ОТВЕТ ДЛЯ ПРЕПОДАВАТЕЛЯ (эталонный результат)
Нажмите, чтобы увидеть ответы
Этап 2. Pairplot:
• Явная зависимость: Fare и Pclass (дорогие билеты — 1 класс).
• Выжившие чаще имеют более дорогие билеты и младший возраст.
Этап 3. Violinplot:
• Violinplot показывает не только медиану и квартили, но и форму распределения (плотность вероятности).
• У выживших возраст распределён более равномерно, у погибших — пик в районе 20-30 лет.
Этап 4. Jointplot:
• Корреляция между возрастом и ценой билета практически отсутствует (≈0.1).
• Линия регрессии почти горизонтальна.
Этап 5. Heatmap:
• Самая высокая выживаемость: женщины 1 класса (≈96%).
• Самая низкая выживаемость: мужчины 3 класса (≈13%).
• Самая высокая цена билета: женщины 1 класса.
Этап 6. Countplot/Barplot:
• Самый популярный порт — S (Саутгемптон).
• Самая высокая выживаемость — у пассажиров порта C (Шербур) ≈55%.
Этап 7. Выводы (пример):
1. Heatmap оказалась самой информативной для категориальных данных, pairplot — для числовых.
2. Класс и пол — ключевые факторы выживаемости. Цена билета сильно коррелирует с классом.
3. Seaborn проще в использовании, имеет красивые стили по умолчанию и специализированные графики.
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|
|
|