scatterplot в Seaborn: связь двух величин на точках
Диаграмма рассеяния показывает связь двух числовых столбцов: одна строка таблицы — одна точка. Управляем размером s и прозрачностью alpha и учимся видеть кластеры.
Редакция Питоники
Маркетинг просит удвоить рекламный бюджет. Прежде чем соглашаться, стоит проверить главную гипотезу: а растёт ли выручка от рекламы в наших магазинах? У нас есть таблица — двенадцать магазинов, у каждого расходы на рекламу и выручка за квартал. Две колонки чисел, один вопрос — и один график, который отвечает на него быстрее любого коэффициента.
Данные: реклама и выручка
import pandas as pd
shops = pd.DataFrame({
"shop": ["Центральный", "Северный", "Приморский", "Восточный", "Западный",
"Речной", "Парковый", "Садовый", "Луговой", "Ярославский",
"Балтийский", "Южный"],
"ads": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70],
"sales": [112, 160, 178, 205, 255, 268, 315, 325, 376, 380, 435, 470],
})
print(shops)
shop ads sales 0 Центральный 10 112 1 Северный 15 160 2 Приморский 20 178 3 Восточный 25 205 4 Западный 30 255 5 Речной 35 268 6 Парковый 40 315 7 Садовый 45 325 8 Луговой 50 376 9 Ярославский 55 380 10 Балтийский 60 435 11 Южный 70 470
Столбец ads — расходы на рекламу, тыс. руб., столбец sales — выручка, тыс. руб. В таблице связь приходится высчитывать; на графике её достаточно увидеть.
scatterplot: одна строка — одна точка
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
shops = pd.DataFrame({
"shop": ["Центральный", "Северный", "Приморский", "Восточный", "Западный",
"Речной", "Парковый", "Садовый", "Луговой", "Ярославский",
"Балтийский", "Южный"],
"ads": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70],
"sales": [112, 160, 178, 205, 255, 268, 315, 325, 376, 380, 435, 470],
})
sns.set_theme()
ax = sns.scatterplot(data=shops, x="ads", y="sales")
ax.set_title("Реклама и выручка: 12 магазинов")
ax.set_xlabel("Реклама, тыс. руб.")
ax.set_ylabel("Выручка, тыс. руб.")
plt.show()
График отображается под редактором
Каждая точка — один магазин, её координаты — пара чисел из его строки: сколько вложили в рекламу и сколько заработали. Точек ровно двенадцать — по числу строк в таблице; это главное отличие от гистограммы, где строки размазывались по карманам. Точки выстроились в облако, тянущееся вверх вправо: больше рекламы — больше выручка. Связь положительная, и глаз оценил её за секунду, хотя скучная проверка коэффициентом корреляции даёт то же самое: примерно 0.99.
Полезная привычка. Диаграмма рассеяния честнее любого коэффициента в одном смысле: на ней сразу видно, что связи нет или что точки образуют две группы. Коэффициент 0.99, посчитанный по данным с кластерами, может принадлежать двум разным мирам; точки этого не скроют.
s и alpha: точки, которые читаются
Параметр s задаёт размер точки в пунктах квадратных — по умолчанию 40. Параметр alpha — прозрачность от 0 (невидимая) до 1 (плотная). На двенадцати точках это косметика, но на тысячах строк без alpha облако превращается в чернильное пятно: в «толстых» местах рисуются сотни точек друг на друге, и alpha показывает плотность затемнением.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
shops = pd.DataFrame({
"shop": ["Центральный", "Северный", "Приморский", "Восточный", "Западный",
"Речной", "Парковый", "Садовый", "Луговой", "Ярославский",
"Балтийский", "Южный"],
"ads": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70],
"sales": [112, 160, 178, 205, 255, 268, 315, 325, 376, 380, 435, 470],
})
sns.set_theme()
ax = sns.scatterplot(data=shops, x="ads", y="sales", s=70, alpha=0.7)
ax.set_title("Тот же график: точки крупнее и мягче")
ax.set_xlabel("Реклама, тыс. руб.")
ax.set_ylabel("Выручка, тыс. руб.")
plt.show()
График отображается под редактором
Кластеры: облако распадается на группы
Самое ценное, что умеет диаграмма рассеяния, — показывать, когда «среднего магазина» не существует. Соберём таблицу из двух форматов: маленькие киоски с малым бюджетом и крупные точки в торговых центрах. Взгляд на график найдёт их быстрее, чем groupby, — мы ведь не знаем заранее, что делить нужно именно по формату.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
stores = pd.DataFrame({
"ads": [5, 10, 15, 8, 12, 55, 60, 50, 65, 58],
"sales": [90, 130, 160, 110, 150, 400, 430, 380, 450, 415],
})
sns.set_theme()
ax = sns.scatterplot(data=stores, x="ads", y="sales", s=70, alpha=0.7)
ax.set_title("Кластеры: киоски и точки в ТЦ")
ax.set_xlabel("Реклама, тыс. руб.")
ax.set_ylabel("Выручка, тыс. руб.")
plt.show()
График отображается под редактором
Точки легли в два отдельных облака: слева внизу киоски, справа вверху точки в ТЦ, посередине пусто. Это те же кластеры, что встречались в уроке про гистограммы: смесь двух групп, среднее по которой не описывает никого. Когда разделяющий признак известен и лежит в столбце, группы раскрашивают параметром hue= — ему посвящён отдельный урок курса. А пока важен сам факт: увидели два облака — не считайте одно среднее на оба.
Что дальше
Вы умеете видеть связь двух величин: точки вместо строк, размер и прозрачность под контроль, кластеры не спрячутся. Следующий урок — lineplot: те же две оси, но точки соединены линией, потому что по оси X — время.
Каждая точка диаграммы рассеяния — строка таблицы: облако, тянущееся вверх вправо, — положительная связь, два облака — две группы.
Сначала предскажи ответ в голове — это главный навык программиста.
import pandas as pd
shops = pd.DataFrame({
"ads": [10, 20, 30, 40],
"sales": [120, 210, 290, 400],
})
print(shops["ads"].corr(shops["sales"]).round(2))
import pandas as pd
import seaborn as sns
stores = pd.DataFrame({
"ads": [5, 10, 15, 55, 60],
"sales": [90, 130, 160, 400, 430],
})
ax = sns.scatterplot(data=stores, x="ads", y="sales")
print(len(ax.collections))
1. Сколько точек нарисует scatterplot по таблице из 200 строк?
2. Что означает облако точек, тянущееся вверх вправо?
3. Зачем параметр alpha в scatterplot?
4. За что отвечает параметр s=70?
5. На scatterplot точки легли в два отдельных облака. Что делать?
По данным о квартирах (заготовка ниже) постройте диаграмму рассеяния: по оси X — площадь, по оси Y — цена. Сделайте точки крупнее (s=70) и полупрозрачными (alpha=0.7).
Чем scatterplot отличается от lineplot?
scatterplot ставит независимые точки — порядок строк не важен, связь между величинами видна по форме облака. lineplot соединяет точки линией и предназначен для рядов, где по оси X идёт время или порядок: там перестановка точек искажает смысл. Для пары «реклама — выручка» нужен scatter, для «дата — температура» — line.
Урок 6: lineplot — ряды и трендыЧто делают параметры s и alpha в seaborn scatterplot?
s задаёт размер точки (по умолчанию 40, в уроке мы ставили 70), alpha — прозрачность от 0 до 1. Вместе они делают график читаемым: крупные точки заметнее в презентации, а прозрачность спасает от чернильного пятна, когда точек тысячи и они ложатся друг на друга.
Как раскрасить точки по категории?
Параметром hue=: sns.scatterplot(data=df, x="ads", y="sales", hue="format") присвоит каждой группе свой цвет и построит легенду автоматически. В уроке мы сознательно смотрели на кластеры без раскраски — чтобы научиться их замечать; hue подробно разбирается в отдельном уроке курса.
Означает ли красивое облако точек, что реклама увеличивает выручку?
Нет: scatterplot показывает совместное движение двух величин, но не причину. Возможно, оба числа растут от третьего фактора — площади, трафика, сезона. Причинность подтверждается экспериментом; график лишь честно показывает, что связь есть и какова её форма.
Понравился урок? Сошлитесь на него
«Диаграмма рассеяния честнее любого коэффициента в одном смысле: на ней сразу видно, что связи нет или что точки образуют две группы.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что читать дальше
Seaborn · Урок 4
histplot в Seaborn: распределения, bins и kde
Гистограмма отвечает на вопрос «как распределились числа», а не «каково их среднее». bins задаёт ширину карманов, kde=True добавляет гладкую форму — и бимодальность больше не спрячется.
Seaborn · Урок 6
lineplot в Seaborn: ряды, тренды и полоса доверия
lineplot соединяет точки линией, когда по оси X идёт время: тренд, несколько городов на одном графике и полоса доверия вокруг среднего при повторных измерениях.
Matplotlib / Seaborn · Урок 4
Диаграммы рассеяния scatter: ищем связи между величинами
scatter для поиска связей между величинами: форма облака точек, цвет и размер как третье измерение, alpha против оверплоттинга и кейс с 300 измерениями.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Matplotlib / Seaborn · Урок 10
Проект по визуализации: дашборд данных о фильмах на Matplotlib и Seaborn
Финальный проект курса: датасет из 200 фильмов, EDA, дашборд 2x2 с трендом, жанрами, гистограммой и scatter — плюс чек-лист «график готов к показу» и итоги десяти уроков.
matplotlib seabornстолбчатая диаграмма python
Matplotlib / Seaborn · Урок 2
Линейные графики в Matplotlib: plot, цвета, стили и подписи
plt.plot() под микроскопом: цвета, маркеры, стили линий, легенды, диапазоны осей и кейс с двумя температурными кривыми за месяц.
линейный график pythonкак построить линейный график в python
Seaborn · Урок 16
regplot: тренд и регрессия на графике рассеяния
Точки, линия регрессии и доверительная полоса одним вызовом regplot: как увидеть тренд двух величин, когда прямая врёт и что говорит наклон.
seaborn regplotрегрессия python график