Визуализация данных: создание scatter plot в Seaborn – подробное руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для кого эта статья:

  • начинающие и опытные аналитики данных
  • студенты и профессионалы, интересующиеся визуализацией данных
  • специалисты в области бизнес-аналитики и управления данными

    Точечные диаграммы (scatter plot) — это мощный визуальный инструмент, который помогает выявить взаимосвязи между переменными, которые могли бы остаться незамеченными в массивах чисел. Используя Seaborn — библиотеку визуализации в Python, построенную на matplotlib, вы получаете доступ к элегантным и информативным графикам, которые говорят больше, чем тысячи строк данных. В этом руководстве я проведу вас через все этапы создания точечных диаграмм, от базовых приемов до продвинутых методик для опытных аналитиков и исследователей данных. Готовы превратить свои данные в инсайты, которые невозможно игнорировать? 📊

Хотите перейти от теории к профессиональной практике в сфере анализа данных? Курс «Аналитик данных» с нуля от Skypro даст вам не только теоретическую базу по визуализации с Seaborn, но и реальные проекты для портфолио. Наши выпускники создают визуализации, которые используются для принятия бизнес-решений в крупнейших компаниях. От основ Python до мастерства в построении сложных диаграмм — всё в одной программе!

Основы scatter plot в Seaborn для качественного анализа данных

Scatter plot (точечная диаграмма) — это тип графика, который использует координаты Декартовой системы для отображения значений двух переменных. Seaborn делает создание таких диаграмм интуитивно понятным даже для начинающих аналитиков, предлагая множество возможностей для настройки.

Для начала работы с scatter plot в Seaborn необходимо импортировать необходимые библиотеки:

Python
Скопировать код
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Настройка стиля
sns.set(style="whitegrid")

Базовая функция для создания scatter plot в Seaborn — это sns.scatterplot(). Давайте рассмотрим её основные параметры:

  • x, y — имена переменных или массивы данных для осей X и Y
  • data — DataFrame, содержащий данные
  • hue — переменная для категоризации точек по цвету
  • size — переменная для изменения размера точек
  • style — переменная для изменения маркера точек
  • palette — цветовая палитра

Рассмотрим базовый пример создания scatter plot с использованием встроенного в Seaborn датасета:

Python
Скопировать код
# Загрузка датасета
tips = sns.load_dataset("tips")

# Создание базовой точечной диаграммы
plt.figure(figsize=(10, 6))
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.title("Зависимость чаевых от суммы счёта")
plt.xlabel("Сумма счёта")
plt.ylabel("Размер чаевых")
plt.show()

Для более глубокого анализа часто требуется добавить дополнительную информацию через цвет или размер маркеров. В Seaborn это делается с помощью параметров hue и size:

Python
Скопировать код
# Добавление категоризации по полу и размеру компании
plt.figure(figsize=(10, 6))
sns.scatterplot(
x="total_bill", 
y="tip", 
hue="sex", 
size="size", 
data=tips,
sizes=(20, 200)
)
plt.title("Зависимость чаевых от суммы счёта с учётом пола и размера компании")
plt.show()
ФункцияОписаниеОсновные параметры
sns.scatterplot()Создаёт стандартную точечную диаграммуx, y, data, hue, size, style
sns.relplot()Создаёт фасетированные графики отношенийx, y, data, hue, size, style, kind='scatter', col, row
sns.lmplot()Создаёт scatter plot с линией регрессииx, y, data, hue, col, row, lowess, ci
sns.jointplot()Создаёт scatter plot с гистограммами по осямx, y, data, kind='scatter', hue, marginal_kws

Для аналитической работы часто требуется выявить корреляции и тренды. Seaborn предлагает функцию sns.lmplot(), которая не только создает scatter plot, но и добавляет линию регрессии:

Python
Скопировать код
# Создание scatter plot с линией регрессии
sns.lmplot(x="total_bill", y="tip", data=tips, height=6, aspect=1.5)
plt.title("Зависимость чаевых от суммы счёта с линией регрессии")
plt.show()
Кинга Идем в IT: пошаговый план для смены профессии

Настройка параметров и стилей scatter plot для разных задач

Тонкая настройка визуализаций — это то, что отличает любительский анализ от профессионального. Seaborn предоставляет богатые возможности для кастомизации scatter plot под разные аналитические задачи. 🔍

Анна Смирнова, Data Visualization Lead Помню свой первый серьезный проект по анализу поведения пользователей e-commerce платформы. Данные были колоссальные — более миллиона точек. Когда я построила стандартный scatter plot, он превратился в сплошное пятно, а не в источник инсайтов. Решение нашлось в настройке прозрачности точек и использовании гексагональных бинов. Я использовала код:

Python
Скопировать код
plt.figure(figsize=(12, 8))
sns.scatterplot(
x="время_на_сайте", 
y="сумма_заказа", 
data=user_data,
alpha=0.2, # Прозрачность точек
s=10, # Маленький размер точек
)
plt.title("Зависимость суммы заказа от времени, проведенного на сайте")
plt.show()

Дополнительно я создала альтернативную визуализацию с hexbin:

Python
Скопировать код
plt.figure(figsize=(12, 8))
plt.hexbin(user_data['время_на_сайте'], user_data['сумма_заказа'], gridsize=50, cmap='viridis')
plt.colorbar(label='Количество пользователей')
plt.title("Плотность распределения пользователей")
plt.show()

Эти две визуализации раскрыли ключевой паттерн — существовал порог в 4 минуты, после которого вероятность крупного заказа значительно возрастала. Мы перепроектировали UX с учетом этого инсайта и увеличили средний чек на 17%.

Рассмотрим основные параметры, которые помогут адаптировать ваши визуализации под различные аналитические потребности:

1. Управление цветовыми схемами

Seaborn предлагает широкий выбор готовых цветовых палитр, которые можно применять через параметр palette:

Python
Скопировать код
# Использование качественной палитры для категориальных данных
plt.figure(figsize=(10, 6))
sns.scatterplot(
x="total_bill", 
y="tip", 
hue="day", 
data=tips,
palette="Set2" # Категориальная палитра
)
plt.title("Размер чаевых по дням недели")
plt.show()

# Использование последовательной палитры для количественных данных
plt.figure(figsize=(10, 6))
sns.scatterplot(
x="total_bill", 
y="tip", 
hue="size", 
data=tips,
palette="viridis" # Последовательная палитра
)
plt.title("Размер чаевых с учётом размера компании")
plt.show()

2. Настройка маркеров и их прозрачности

Для данных с высокой плотностью критически важно настроить отображение точек:

Python
Скопировать код
# Настройка прозрачности и размера маркеров
plt.figure(figsize=(10, 6))
sns.scatterplot(
x="total_bill", 
y="tip", 
data=tips,
alpha=0.6, # Прозрачность
s=100, # Размер маркеров
edgecolor='k', # Цвет контура
linewidth=0.5 # Толщина контура
)
plt.title("Зависимость чаевых от суммы счёта")
plt.show()

3. Добавление контекстной информации

Для более полного анализа часто требуется включить дополнительный контекст:

Python
Скопировать код
# Добавление линии тренда и доверительного интервала
plt.figure(figsize=(10, 6))
sns.regplot(
x="total_bill", 
y="tip", 
data=tips,
scatter_kws={"alpha": 0.4, "s": 50},
line_kws={"color": "red"}
)
plt.title("Тренд зависимости чаевых от суммы счёта")
plt.show()
Тип задачиРекомендуемые настройкиПример применения
Выявление выбросовВысокая прозрачность (alpha=0.3-0.5), средний размер точекАнализ расходов клиентов, поиск нетипичных сделок
Анализ плотности данныхНизкая прозрачность (alpha=0.1-0.3), маленький размер точекАнализ поведения пользователей веб-сайтов, трафика
Сегментация клиентовЯркие контрастные цвета (palette="Set1"), средний размер точекRFM-анализ, сегментация по покупательской активности
Выявление корреляцийРегрессионные линии (регрессия=True), доверительные интервалыАнализ зависимости продаж от рекламных бюджетов

4. Настройка стилей Seaborn

Seaborn предлагает несколько встроенных стилей для графиков, которые можно настроить с помощью функции set_style():

Python
Скопировать код
# Доступные стили: 'darkgrid', 'whitegrid', 'dark', 'white', 'ticks'
sns.set_style("darkgrid")
plt.figure(figsize=(10, 6))
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.title("Scatter plot с темной сеткой")
plt.show()

# Настройка контекста для размера элементов
# Доступные контексты: 'paper', 'notebook', 'talk', 'poster'
sns.set_context("talk")
plt.figure(figsize=(10, 6))
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.title("Scatter plot для презентаций")
plt.show()

Создание многомерных scatter plot с дополнительными измерениями

Многомерный анализ данных позволяет выявить сложные взаимосвязи, которые могут остаться незамеченными при исследовании только двух переменных. Seaborn предоставляет несколько мощных инструментов для создания scatter plot с более чем двумя измерениями. 📈

Традиционный scatter plot включает две оси (x и y), но с помощью Seaborn мы можем добавить дополнительные измерения, используя:

  • Цвет (hue) — для отображения третьей переменной
  • Размер (size) — для отображения четвертой переменной
  • Форма маркеров (style) — для отображения пятой переменной
  • Разделение на подграфики (col, row) — для сравнения нескольких категорий

Рассмотрим пример использования всех этих параметров на датасете Iris:

Python
Скопировать код
# Загрузка датасета Iris
iris = sns.load_dataset("iris")

# Создание многомерной точечной диаграммы
sns.relplot(
x="sepal_length", 
y="sepal_width",
hue="species", # Цветовая кодировка по видам
size="petal_width", # Размер точек по ширине лепестка
style="species", # Форма маркеров по видам
data=iris,
height=6,
aspect=1.5
)
plt.title("Многомерный анализ цветков ириса")
plt.show()

Для еще более глубокого анализа можно использовать функцию sns.pairplot(), которая создает матрицу scatter plot для всех возможных пар переменных:

Python
Скопировать код
# Создание матрицы scatter plot
sns.pairplot(
iris, 
hue="species",
diag_kind="kde", # Тип графика на диагонали
markers=["o", "s", "D"], # Маркеры для разных категорий
palette="Set2" # Цветовая палитра
)
plt.suptitle("Матрица отношений всех параметров ириса", y=1.02)
plt.show()

Для отображения распределений по осям вместе с scatter plot можно использовать sns.jointplot():

Python
Скопировать код
# Создание совмещенного графика с гистограммами
sns.jointplot(
x="sepal_length",
y="sepal_width",
data=iris,
hue="species",
kind="scatter", # Тип основного графика
height=8,
ratio=3, # Соотношение размеров основного графика и гистограмм
marginal_kws=dict(bins=15, fill=True) # Параметры для гистограмм
)
plt.suptitle("Распределение длины и ширины чашелистиков по видам ириса", y=1.02)
plt.show()

Для анализа взаимосвязи между несколькими категориальными и непрерывными переменными используется функция sns.catplot() с параметром kind="scatter":

Python
Скопировать код
# Категориальный scatter plot
sns.catplot(
x="species",
y="sepal_length",
hue="species",
data=iris,
kind="swarm", # Тип "рой пчел" для точечной визуализации без перекрытий
height=6,
aspect=1.5
)
plt.title("Распределение длины чашелистиков по видам")
plt.show()

Решение типичных проблем при построении scatter plot в Seaborn

Даже опытные аналитики сталкиваются с проблемами при визуализации данных. Рассмотрим наиболее распространенные трудности при работе со scatter plot в Seaborn и способы их решения. 🛠️

Михаил Петров, руководитель отдела аналитики В 2023 году наша команда работала над проектом по анализу эффективности маркетинговых каналов для крупного онлайн-ритейлера. При визуализации данных о конверсии и стоимости привлечения клиентов мы столкнулись с серьезной проблемой — у нас были выбросы, которые полностью искажали масштаб графика. Большинство точек скапливались в нижнем левом углу, делая график непригодным для анализа. Тогда я применил следующий подход:

Python
Скопировать код
# Создание основного графика
plt.figure(figsize=(14, 8))
g = sns.scatterplot(
x="cac", 
y="conversion", 
hue="channel",
size="total_users",
sizes=(50, 500),
alpha=0.7,
data=marketing_data
)

# Логарифмирование осей для лучшего отображения
plt.xscale('log')
plt.yscale('log')

# Добавление аннотаций для ключевых точек
for idx, row in marketing_data.iterrows():
if row['total_users'] > 10000: # Аннотируем только крупные каналы
plt.text(
row['cac'] * 1.05, 
row['conversion'] * 1.05, 
row['channel'], 
fontsize=9
)

plt.title("Эффективность маркетинговых каналов", fontsize=14)
plt.xlabel("Стоимость привлечения (CAC), $", fontsize=12)
plt.ylabel("Конверсия, %", fontsize=12)
plt.show()

Логарифмический масштаб на обеих осях полностью преобразил наш график. Внезапно мы увидели четкие кластеры каналов с похожей эффективностью. Это позволило нам перераспределить бюджет, увеличив инвестиции в каналы с низким CAC и приемлемой конверсией, что привело к 24% росту эффективности рекламных расходов в Q4 2023.

1. Проблема перекрытия точек (overplotting)

Когда на графике слишком много точек, они могут перекрывать друг друга, что затрудняет анализ.

Решения:

  • Использование прозрачности:
Python
Скопировать код
# Настройка прозрачности точек
plt.figure(figsize=(10, 6))
sns.scatterplot(
x="total_bill", 
y="tip", 
data=tips,
alpha=0.3 # Высокая прозрачность
)
plt.title("Scatter plot с прозрачными точками")
plt.show()
  • Использование hexbin для агрегации точек:
Python
Скопировать код
# Гексагональные бины вместо точек
plt.figure(figsize=(10, 6))
plt.hexbin(
tips["total_bill"], 
tips["tip"], 
gridsize=20, 
cmap="Blues"
)
plt.colorbar(label="Количество точек")
plt.title("Hexbin plot для данных о чаевых")
plt.xlabel("Сумма счёта")
plt.ylabel("Размер чаевых")
plt.show()

2. Проблема с масштабом осей

Когда диапазоны значений сильно различаются или присутствуют выбросы.

Решения:

  • Логарифмический масштаб:
Python
Скопировать код
# Логарифмический масштаб для оси X
plt.figure(figsize=(10, 6))
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.xscale("log")
plt.title("Scatter plot с логарифмической шкалой по X")
plt.show()
  • Ограничение диапазона осей:
Python
Скопировать код
# Ограничение осей для фокуса на основной части данных
plt.figure(figsize=(10, 6))
sns.scatterplot(x="total_bill", y="tip", data=tips)
plt.xlim(10, 40) # Ограничение оси X
plt.ylim(1, 8) # Ограничение оси Y
plt.title("Scatter plot с ограниченным диапазоном осей")
plt.show()

3. Проблема с визуализацией категориальных данных

Если одна из переменных категориальная, обычный scatter plot может быть неинформативным.

Решения:

  • Использование stripplot или swarmplot:
Python
Скопировать код
# Stripplot для категориальных данных
plt.figure(figsize=(10, 6))
sns.stripplot(
x="day", 
y="total_bill", 
data=tips,
jitter=True,
palette="Set2"
)
plt.title("Распределение суммы счёта по дням недели")
plt.show()

# Swarmplot для категориальных данных без перекрытий
plt.figure(figsize=(10, 6))
sns.swarmplot(
x="day", 
y="total_bill", 
data=tips,
palette="Set2"
)
plt.title("Распределение суммы счёта по дням недели без перекрытий")
plt.show()
ПроблемаРешениеФункция/Параметр
Перекрытие точекИспользование прозрачностиalpha=0.1-0.5
Перекрытие точекАгрегация в гексагональные биныplt.hexbin()
Выбросы искажают масштабЛогарифмический масштабplt.xscale('log'), plt.yscale('log')
Слишком много категорий для hueФасетирование (разделение на подграфики)sns.relplot(col='переменная')
Сложно различить кластерыДобавление эллипсов доверияfrom matplotlib.patches import Ellipse

4. Проблемы с легендой

При использовании нескольких категориальных переменных (hue, size, style) легенда может стать громоздкой.

Решения:

Python
Скопировать код
# Настройка легенды
plt.figure(figsize=(10, 6))
g = sns.scatterplot(
x="total_bill", 
y="tip", 
hue="sex",
size="size",
data=tips
)

# Перемещение легенды за пределы графика
plt.legend(
bbox_to_anchor=(1.05, 1),
loc='upper left',
borderaxespad=0.
)

# Настройка заголовков в легенде
handles, labels = g.get_legend_handles_labels()
g.legend(handles=handles[1:], labels=labels[1:])

plt.title("Scatter plot с настроенной легендой")
plt.tight_layout()
plt.show()

Практические кейсы применения scatter plot для бизнес-аналитики

Теория хороша, но применение на практике — истинный показатель ценности инструмента. Рассмотрим, как scatter plot в Seaborn может решать реальные бизнес-задачи и приносить измеримую пользу компаниям. 💼

1. Анализ клиентской базы и сегментация

RFM-анализ (Recency, Frequency, Monetary Value) — это мощный метод сегментации клиентской базы. Scatter plot идеально подходит для визуализации этих трех метрик:

Python
Скопировать код
# Создание датафрейма для RFM-анализа (пример данных)
import pandas as pd
import numpy as np

# Сгенерируем пример данных
np.random.seed(42)
n = 1000
rfm_data = pd.DataFrame({
'customer_id': range(1, n+1),
'recency': np.random.randint(1, 365, n), # Дней с последней покупки
'frequency': np.random.randint(1, 50, n), # Количество покупок
'monetary': np.random.randint(10, 5000, n), # Потраченная сумма
})

# Определим сегменты
def assign_segment(row):
if row['recency'] < 30 and row['frequency'] > 20 and row['monetary'] > 2000:
return 'VIP'
elif row['recency'] < 90 and row['frequency'] > 10 and row['monetary'] > 1000:
return 'Loyal'
elif row['recency'] > 180 and row['frequency'] < 5 and row['monetary'] < 500:
return 'At Risk'
else:
return 'Regular'

rfm_data['segment'] = rfm_data.apply(assign_segment, axis=1)

# Визуализация RFM-сегментов
plt.figure(figsize=(12, 8))
sns.scatterplot(
x='recency', 
y='monetary',
size='frequency',
hue='segment',
sizes=(20, 200),
alpha=0.7,
palette="viridis",
data=rfm_data
)

plt.title("RFM-сегментация клиентской базы", fontsize=14)
plt.xlabel("Давность последней покупки (дни)", fontsize=12)
plt.ylabel("Сумма покупок ($)", fontsize=12)
plt.show()

2. Анализ эффективности маркетинговых каналов

Оценка различных каналов привлечения по конверсии, стоимости привлечения и удержанию клиентов:

Python
Скопировать код
# Пример данных по маркетинговым каналам
channels_data = pd.DataFrame({
'channel': ['Search', 'Social', 'Email', 'Referral', 'Direct', 'Display', 'Affiliate', 'Video'],
'cpa': [25, 18, 5, 15, 0, 30, 22, 28], # Стоимость привлечения
'conversion_rate': [3\.2, 2.1, 4.5, 2.8, 3.0, 1.2, 2.4, 1.8], # Конверсия в процентах
'retention_rate': [45, 35, 65, 50, 55, 30, 40, 38], # Удержание клиентов
'volume': [5000, 8000, 3000, 2000, 4000, 6000, 2500, 1800] # Объем трафика
})

# Визуализация эффективности каналов
plt.figure(figsize=(12, 8))
sns.scatterplot(
x='cpa', 
y='conversion_rate',
size='volume',
hue='retention_rate',
sizes=(100, 1000),
palette="viridis",
data=channels_data
)

# Добавление подписей для каналов
for i, row in channels_data.iterrows():
plt.text(
row['cpa'] + 0.5, 
row['conversion_rate'] + 0.1, 
row['channel'], 
fontsize=10
)

plt.title("Анализ эффективности маркетинговых каналов", fontsize=14)
plt.xlabel("Стоимость привлечения клиента (CPA), $", fontsize=12)
plt.ylabel("Конверсия, %", fontsize=12)
plt.colorbar(label="Удержание клиентов, %")
plt.show()

3. Анализ продуктового портфеля

Оценка продуктов по прибыльности, объему продаж и темпу роста:

Python
Скопировать код
# Пример данных по продуктовому портфелю
products_data = pd.DataFrame({
'product': ['Product A', 'Product B', 'Product C', 'Product D', 'Product E', 
'Product F', 'Product G', 'Product H', 'Product I', 'Product J'],
'profit_margin': [35, 42, 28, 15, 50, 22, 18, 38, 31, 25], # Маржинальность в %
'sales_volume': [1500, 3000, 800, 5000, 1000, 2500, 4000, 1200, 2200, 3500], # Объем продаж
'growth_rate': [5, 12, -2, 3, 8, -5, 15, 7, 0, 10], # Темп роста в %
'category': ['A', 'B', 'A', 'C', 'B', 'C', 'A', 'B', 'C', 'A'] # Категория продукта
})

# Визуализация продуктового портфеля
plt.figure(figsize=(12, 8))
sns.scatterplot(
x='profit_margin', 
y='growth_rate',
size='sales_volume',
hue='category',
sizes=(100, 1000),
palette="deep",
data=products_data
)

# Добавление подписей для продуктов
for i, row in products_data.iterrows():
plt.text(
row['profit_margin'] + 0.5, 
row['growth_rate'] + 0.5, 
row['product'], 
fontsize=9
)

# Добавление линий для создания квадрантов
plt.axhline(y=5, color='gray', linestyle='--', alpha=0.7)
plt.axvline(x=30, color='gray', linestyle='--', alpha=0.7)

# Добавление названий для квадрантов
plt.text(45, 12, "Звёзды", fontsize=12, ha='center')
plt.text(15, 12, "Вопросительные знаки", fontsize=12, ha='center')
plt.text(45, 0, "Дойные коровы", fontsize=12, ha='center')
plt.text(15, 0, "Собаки", fontsize=12, ha='center')

plt.title("BCG-матрица продуктового портфеля", fontsize=14)
plt.xlabel("Маржинальность, %", fontsize=12)
plt.ylabel("Темп роста, %", fontsize=12)
plt.show()

Хотели бы вы узнать, какая профессия в сфере данных подойдет именно вам? Профессиональные аналитики часто используют Seaborn для визуализации самых разных данных — от финансовых до медицинских. Тест на профориентацию от Skypro поможет выяснить, подходит ли вам карьера аналитика или, возможно, другая IT-специальность. Тест разработан с применением продвинутых алгоритмов и проанализирует ваши сильные стороны, предпочтения и потенциал для успеха в разных направлениях.

Мы рассмотрели полный цикл создания и настройки scatter plot в Seaborn — от простых двумерных графиков до сложных многомерных визуализаций с дополнительными метриками. Освоив эти техники, вы сможете трансформировать сырые данные в наглядные, информативные визуализации, помогающие принимать обоснованные решения. Помните: лучшие диаграммы — не просто красивые картинки, а инструменты для увлекательного исследования данных, способные раскрыть скрытые закономерности, которые невозможно увидеть в таблицах.