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

Лабораторная работа №5: Многомерный анализ с Seaborn

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

Цель: Научиться проводить разведочный анализ данных (EDA) "глазами". Мы перейдем от простых графиков к сложным визуализациям, которые показывают взаимосвязи между 3 и более переменными одновременно.

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

  • Python 3
  • Seaborn (основной инструмент)
  • Matplotlib (для настройки размеров)
  • Pandas

Данные: Мы будем работать с популярным датасетом Diamonds (Бриллианты). Он содержит 54 000 записей о характеристиках камней (каратность, огранка, цвет, чистота) и их стоимости. Это идеальный датасет для поиска ответа на вопрос: "Что реально влияет на цену?".


Часть 1: Подготовка и Категориальный анализ

Seaborn встроен в экосистему Python и содержит несколько учебных датасетов.

Задание 1.1: Загрузка и осмотр

  1. Импортируйте библиотеки.
  2. Загрузите датасет diamonds через sns.load_dataset.
  3. Выведите 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 Каратность + Огранка

  1. Постройте Scatterplot:
    • Ось X: carat
    • Ось Y: price
    • Цвет (hue): cut
  2. Сделайте точки полупрозрачными (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: Матрица корреляций

  1. Вычислите матрицу корреляций corr_matrix (только для числовых колонок!).
  2. Постройте Heatmap.
  3. Включите отображение цифр (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 на сэмпле

  1. Возьмите случайные 1000 строк из датасета (df.sample(1000)).
  2. Выберите только колонки ['carat', 'depth', 'price', 'cut'].
  3. Постройте 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()

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

Почему при построении Pairplot для датасета Diamonds в лабораторной работе используется выборка (sample), а не весь датасет?

Для чего используется параметр `cut=0` при построении Violinplot в Seaborn?