Как построить 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.
Связанные темы
- Как построить гистограмму в pandas
- seaborn vs matplotlib
- Корреляция простыми словами
- Как посчитать корреляцию в SQL
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+ вопросами для собесов.