Визуализация данных: создание scatter plot в Seaborn – подробное руководство
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- начинающие и опытные аналитики данных
- студенты и профессионалы, интересующиеся визуализацией данных
специалисты в области бизнес-аналитики и управления данными
Точечные диаграммы (scatter plot) — это мощный визуальный инструмент, который помогает выявить взаимосвязи между переменными, которые могли бы остаться незамеченными в массивах чисел. Используя Seaborn — библиотеку визуализации в Python, построенную на matplotlib, вы получаете доступ к элегантным и информативным графикам, которые говорят больше, чем тысячи строк данных. В этом руководстве я проведу вас через все этапы создания точечных диаграмм, от базовых приемов до продвинутых методик для опытных аналитиков и исследователей данных. Готовы превратить свои данные в инсайты, которые невозможно игнорировать? 📊
Хотите перейти от теории к профессиональной практике в сфере анализа данных? Курс «Аналитик данных» с нуля от Skypro даст вам не только теоретическую базу по визуализации с Seaborn, но и реальные проекты для портфолио. Наши выпускники создают визуализации, которые используются для принятия бизнес-решений в крупнейших компаниях. От основ Python до мастерства в построении сложных диаграмм — всё в одной программе!
Основы scatter plot в Seaborn для качественного анализа данных
Scatter plot (точечная диаграмма) — это тип графика, который использует координаты Декартовой системы для отображения значений двух переменных. Seaborn делает создание таких диаграмм интуитивно понятным даже для начинающих аналитиков, предлагая множество возможностей для настройки.
Для начала работы с scatter plot в Seaborn необходимо импортировать необходимые библиотеки:
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 датасета:
# Загрузка датасета
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
:
# Добавление категоризации по полу и размеру компании
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, но и добавляет линию регрессии:
# Создание scatter plot с линией регрессии
sns.lmplot(x="total_bill", y="tip", data=tips, height=6, aspect=1.5)
plt.title("Зависимость чаевых от суммы счёта с линией регрессии")
plt.show()

Настройка параметров и стилей scatter plot для разных задач
Тонкая настройка визуализаций — это то, что отличает любительский анализ от профессионального. Seaborn предоставляет богатые возможности для кастомизации scatter plot под разные аналитические задачи. 🔍
Анна Смирнова, Data Visualization Lead Помню свой первый серьезный проект по анализу поведения пользователей e-commerce платформы. Данные были колоссальные — более миллиона точек. Когда я построила стандартный scatter plot, он превратился в сплошное пятно, а не в источник инсайтов. Решение нашлось в настройке прозрачности точек и использовании гексагональных бинов. Я использовала код:
plt.figure(figsize=(12, 8))
sns.scatterplot(
x="время_на_сайте",
y="сумма_заказа",
data=user_data,
alpha=0.2, # Прозрачность точек
s=10, # Маленький размер точек
)
plt.title("Зависимость суммы заказа от времени, проведенного на сайте")
plt.show()
Дополнительно я создала альтернативную визуализацию с hexbin:
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
:
# Использование качественной палитры для категориальных данных
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. Настройка маркеров и их прозрачности
Для данных с высокой плотностью критически важно настроить отображение точек:
# Настройка прозрачности и размера маркеров
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. Добавление контекстной информации
Для более полного анализа часто требуется включить дополнительный контекст:
# Добавление линии тренда и доверительного интервала
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()
:
# Доступные стили: '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:
# Загрузка датасета 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 для всех возможных пар переменных:
# Создание матрицы 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()
:
# Создание совмещенного графика с гистограммами
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"
:
# Категориальный 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 году наша команда работала над проектом по анализу эффективности маркетинговых каналов для крупного онлайн-ритейлера. При визуализации данных о конверсии и стоимости привлечения клиентов мы столкнулись с серьезной проблемой — у нас были выбросы, которые полностью искажали масштаб графика. Большинство точек скапливались в нижнем левом углу, делая график непригодным для анализа. Тогда я применил следующий подход:
# Создание основного графика
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)
Когда на графике слишком много точек, они могут перекрывать друг друга, что затрудняет анализ.
Решения:
- Использование прозрачности:
# Настройка прозрачности точек
plt.figure(figsize=(10, 6))
sns.scatterplot(
x="total_bill",
y="tip",
data=tips,
alpha=0.3 # Высокая прозрачность
)
plt.title("Scatter plot с прозрачными точками")
plt.show()
- Использование hexbin для агрегации точек:
# Гексагональные бины вместо точек
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. Проблема с масштабом осей
Когда диапазоны значений сильно различаются или присутствуют выбросы.
Решения:
- Логарифмический масштаб:
# Логарифмический масштаб для оси 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()
- Ограничение диапазона осей:
# Ограничение осей для фокуса на основной части данных
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:
# 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) легенда может стать громоздкой.
Решения:
# Настройка легенды
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 идеально подходит для визуализации этих трех метрик:
# Создание датафрейма для 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. Анализ эффективности маркетинговых каналов
Оценка различных каналов привлечения по конверсии, стоимости привлечения и удержанию клиентов:
# Пример данных по маркетинговым каналам
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. Анализ продуктового портфеля
Оценка продуктов по прибыльности, объему продаж и темпу роста:
# Пример данных по продуктовому портфелю
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 — от простых двумерных графиков до сложных многомерных визуализаций с дополнительными метриками. Освоив эти техники, вы сможете трансформировать сырые данные в наглядные, информативные визуализации, помогающие принимать обоснованные решения. Помните: лучшие диаграммы — не просто красивые картинки, а инструменты для увлекательного исследования данных, способные раскрыть скрытые закономерности, которые невозможно увидеть в таблицах.