Лабораторная работа №5: Многомерный анализ с Seaborn
Цель: Научиться проводить разведочный анализ данных (EDA) "глазами". Мы перейдем от простых графиков к сложным визуализациям, которые показывают взаимосвязи между 3 и более переменными одновременно.
Инструменты:
- Python 3
- Seaborn (основной инструмент)
- Matplotlib (для настройки размеров)
- Pandas
Данные: Мы будем работать с популярным датасетом Diamonds (Бриллианты). Он содержит 54 000 записей о характеристиках камней (каратность, огранка, цвет, чистота) и их стоимости. Это идеальный датасет для поиска ответа на вопрос: "Что реально влияет на цену?".
Часть 1: Подготовка и Категориальный анализ
Seaborn встроен в экосистему Python и содержит несколько учебных датасетов.
Задание 1.1: Загрузка и осмотр
- Импортируйте библиотеки.
- Загрузите датасет
diamondsчерезsns.load_dataset. - Выведите
head()иinfo().
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Настройка стиля
sns.set_theme(style="whitegrid")
# TODO: Загрузите датасет 'diamonds'
# df = ...
# TODO: Выведите первые строки и info
# ...Вопрос на засыпку
Почему Ideal огранка стоит в среднем дешевле, чем Premium? (Мы ответим на это в части 3).
Часть 2: Распределения (Violinplot)
Boxplot скрывает форму распределения, а Violinplot показывает её.
Задание 2.1: Цена vs Чистота
Постройте Violinplot, показывающий распределение цены (price) для каждой категории чистоты (clarity).
- Отрежьте "хвосты" распределения для наглядности (
cut=0внутри violinplot, не путать с колонкойcut). - Поверните подписи оси X, если они наезжают друг на друга (
plt.xticks).
plt.figure(figsize=(12, 6))
# TODO: Постройте violinplot (x='clarity', y='price')
# sns.violinplot(...)
plt.title("Распределение цен в зависимости от чистоты")
plt.show()Часть 3: Многомерный анализ (Scatter + Hue)
Самая мощная техника
2D график + Цвет (3-е измерение). Ответим на вопрос из части 1: почему идеальные бриллианты дешевле? Возможно, они просто мелкие?
Задание 3.1: Цена vs Каратность + Огранка
- Постройте Scatterplot:
- Ось X:
carat - Ось Y:
price - Цвет (
hue):cut
- Ось X:
- Сделайте точки полупрозрачными (
alpha=0.5), так как данных много.
plt.figure(figsize=(10, 8))
# TODO: Постройте scatterplot с hue='cut'
# sns.scatterplot(...)
plt.title("Цена vs Каратность (с разбивкой по огранке)")
plt.show()Вывод: Мы видим, что камни Ideal (обычно оранжевые/зеленые точки) часто имеют малый вес (внизу слева), а Premium — большой. Цена зависит от веса сильнее, чем от качества огранки.
Часть 4: Корреляции (Heatmap)
Построим карту "кто с кем дружит".
Задание 4.1: Матрица корреляций
- Вычислите матрицу корреляций
corr_matrix(только для числовых колонок!). - Постройте Heatmap.
- Включите отображение цифр (
annot=True) и выберите цветовую схемуcoolwarm.
# TODO: Вычислите корреляцию (не забудьте numeric_only=True)
# corr_matrix = ...
plt.figure(figsize=(10, 8))
# TODO: Постройте heatmap
# sns.heatmap(...)
plt.title("Матрица корреляций")
plt.show()Часть 5: Pairplot (Взгляд сверху)
Pairplot строит графики "каждый с каждым".
Внимание к производительности
Поскольку датасет огромный (54к строк), построение полного pairplot "повесит" Colab. Мы возьмем случайную выборку.
Задание 5.1: Pairplot на сэмпле
- Возьмите случайные 1000 строк из датасета (
df.sample(1000)). - Выберите только колонки
['carat', 'depth', 'price', 'cut']. - Постройте
pairplot, раскрасив данные по огранке (hue='cut').
# Берем сэмпл, чтобы не перегружать память
df_sample = df.sample(n=1000, random_state=42)
# Выбираем подмножество колонок
columns_to_plot = ['carat', 'depth', 'price', 'cut']
# TODO: Постройте pairplot
# sns.pairplot(...)
# plt.show()