Как построить scatter plot в pandas

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Зачем нужен scatter plot

Scatter plot — первый график при изучении связи двух числовых переменных. «Коррелируют ли revenue и session length?», «связан ли age с churn?» — scatter даст ответ быстрее, чем любые метрики. Плюс сразу видно нелинейные связи и outliers, которые correlation пропустит.

На собеседовании в кейсах часто: «у вас две метрики, как быстро проверить связь?». Scatter + correlation — правильный ответ. Полезно знать, как добавить hue (цвет по группе), size (размер точки), regression line.

В статье:

  • Простейший scatter
  • С цветом по сегменту (hue)
  • С размером по третьей переменной
  • Regression line через seaborn
  • Нелинейные связи и как их видеть

1. Простой scatter

import pandas as pd
import matplotlib.pyplot as plt

df.plot.scatter(x='age', y='revenue')
plt.show()

Или через matplotlib:

plt.scatter(df['age'], df['revenue'])
plt.xlabel('Age')
plt.ylabel('Revenue')
plt.show()

2. С цветом по группе (hue)

Через seaborn — проще:

import seaborn as sns

sns.scatterplot(data=df, x='age', y='revenue', hue='country')

Каждая страна — свой цвет. Сразу видны различия.

3. С размером точки

sns.scatterplot(
    data=df,
    x='age',
    y='revenue',
    hue='country',
    size='orders_count'
)

Размер кружка = количество заказов. Третье измерение в одном графике.

4. Regression line

sns.regplot(data=df, x='age', y='revenue')  # scatter + линия регрессии

Или отдельно по группам:

sns.lmplot(data=df, x='age', y='revenue', hue='country')

5. Log-scale для long-tail

Если данные имеют тяжёлый хвост:

plt.scatter(df['age'], df['revenue'])
plt.yscale('log')
plt.xscale('log')

Или log-трансформация данных:

import numpy as np
plt.scatter(df['age'], np.log1p(df['revenue']))

6. Много точек — hexbin / density

На 100 000 точек scatter превращается в чёрное пятно. Альтернативы:

hexbin

plt.hexbin(df['age'], df['revenue'], gridsize=50, cmap='Blues')
plt.colorbar()

density

sns.kdeplot(data=df, x='age', y='revenue', fill=True)

sample

df.sample(10000).plot.scatter(x='age', y='revenue', alpha=0.3)

7. Alpha для overlapping

plt.scatter(df['x'], df['y'], alpha=0.3)  # полупрозрачность

Видно плотные области чётче.

8. Subplots для сравнения

fig, axes = plt.subplots(1, 3, figsize=(15, 5))

for i, country in enumerate(['RU', 'KZ', 'BY']):
    subset = df[df['country'] == country]
    axes[i].scatter(subset['age'], subset['revenue'])
    axes[i].set_title(country)

9. Pairplot — все пары

Для быстрого exploratory:

sns.pairplot(df[['age', 'revenue', 'sessions']], diag_kind='hist')

Грид scatter для всех пар + distribution на диагонали. Быстро увидеть все correlations.

10. Annotate outliers

fig, ax = plt.subplots()
ax.scatter(df['x'], df['y'])

# подписать top-3 по y
top3 = df.nlargest(3, 'y')
for _, row in top3.iterrows():
    ax.annotate(row['name'], (row['x'], row['y']))

Scatter vs другие графики

  • Scatter: связь двух числовых
  • Line: тренд во времени
  • Bar: категориальные
  • Box: распределение группы
  • Heatmap: matrix correlations

Частые ошибки

1. Scatter на миллионе точек

Overplotting — ничего не видно. Используйте hexbin или sample.

2. Без подписей осей

Кто-то смотрит график без context — бесполезно.

3. Не учесть outliers

Один outlier растягивает оси — остальное в маленьком кластере. Filter или log-scale.

4. Scatter для категорий

Scatter — только для числовых. Для категорий — bar или strip plot.

Связанные темы

FAQ

plot.scatter или plt.scatter?

Одинаково. pandas метод удобнее для one-off.

seaborn vs matplotlib?

seaborn красивее, для hue/size и regression удобнее.

Outliers скрывают паттерн?

Обрежьте до P99 или используйте log-scale.

Как save в файл?

plt.savefig('scatter.png', dpi=300, bbox_inches='tight').


Тренируйте pandas — откройте тренажёр с 1500+ вопросами для собесов.