Перейти к содержанию

252 уроков, 17 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 5 из 20 Средний 25 мин 120 XP

scatterplot в Seaborn: связь двух величин на точках

Диаграмма рассеяния показывает связь двух числовых столбцов: одна строка таблицы — одна точка. Управляем размером s и прозрачностью alpha и учимся видеть кластеры.

Редакция Питоники

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

Данные: реклама и выручка

12 магазинов: реклама и выручка
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 показывает плотность затемнением.

Крупнее и полупрозрачно: s=70, alpha=0.7
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))
Проверь себя
0 / 5

1. Сколько точек нарисует scatterplot по таблице из 200 строк?

2. Что означает облако точек, тянущееся вверх вправо?

3. Зачем параметр alpha в scatterplot?

4. За что отвечает параметр s=70?

5. На scatterplot точки легли в два отдельных облака. Что делать?

Карточки терминов
Запомнено: 0 / 6
Практика

По данным о квартирах (заготовка ниже) постройте диаграмму рассеяния: по оси X — площадь, по оси Y — цена. Сделайте точки крупнее (s=70) и полупрозрачными (alpha=0.7).

practice.py
Вопросы и ответы по уроку

Чем 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-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.