График на собесе проверяют двумя способами: умеете ли вы быстро построить нужный в matplotlib или seaborn и умеете ли выбрать график под вопрос так, чтобы он не врал.
Выбор графика под вопрос
| Вопрос | График |
|---|---|
| Как меняется во времени? | линия (plot) |
| Сравнить категории | столбцы (bar, barh), отсортированные по значению |
| Как распределены значения? | гистограмма, boxplot, violin, ECDF |
| Есть ли связь двух чисел? | точечный (scatter), при больших объёмах hexbin |
| Доли от целого | столбцы с накоплением; pie только для 2-3 долей |
| Матрица значений, корреляции | тепловая карта (heatmap) |
matplotlib: объектный стиль
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(daily.index, daily['revenue'], label='Выручка')
ax.set_title('Выручка по дням')
ax.set_xlabel('Дата')
ax.set_ylabel('₽')
ax.legend()
fig.tight_layout()
fig.savefig('revenue.png', dpi=150)
Пишите через fig, ax, а не через глобальный plt.plot: так понятно, на какую ось вы рисуете, и легко собрать несколько графиков в сетку plt.subplots(2, 2).
pandas умеет рисовать сам: df.plot(x='date', y='revenue', ax=ax), s.plot.hist(bins=30). Под капотом тот же matplotlib.
seaborn: статистические графики из длинной таблицы
seaborn работает с длинным форматом: колонка на переменную, и цвет, панели и группы задаются именами колонок.
import seaborn as sns
sns.histplot(data=df, x='check', hue='group', stat='density', common_norm=False)
sns.boxplot(data=df, x='city', y='check')
sns.lineplot(data=daily, x='date', y='revenue', hue='platform')
sns.heatmap(corr, annot=True, fmt='.2f', cmap='vlag', center=0)
stat='density'иcommon_norm=Falseнужны, чтобы сравнивать распределения групп разного размера: иначе большая группа визуально задавит маленькую.lineplotпри нескольких значениях на одну точку x сам усредняет и рисует доверительный интервал. Это удобно, но об этом надо знать, чтобы не принять полосу за что-то другое.
Гистограмма: число корзин
Число корзин (bins) меняет картину. Слишком мало: не видно формы и двух горбов. Слишком много: шум. Попробуйте несколько значений или правило вроде bins='auto'. Для сравнения распределений с длинным хвостом (чеки, время сессии) часто полезна логарифмическая шкала: ax.set_xscale('log') или log_scale=True в seaborn.
Boxplot: что на нём
- коробка от первого квартиля (Q1) до третьего (Q3), линия внутри это медиана;
- «усы» по умолчанию тянутся до самой дальней точки в пределах 1.5 × IQR от коробки (IQR = Q3 - Q1);
- точки за усами рисуются отдельно как выбросы.
Boxplot не показывает форму: два горба или пустые места внутри коробки он скрывает. Рядом полезно положить гистограмму или violin.
Как графики врут
- Обрезанная ось Y у столбцов. Столбец кодирует значение длиной, поэтому ось должна начинаться с нуля. У линейного графика обрезка допустима, но её нужно явно показывать.
- Две оси Y с разными масштабами позволяют нарисовать любую «корреляцию».
- Средние без разброса. Два столбца со средними без интервалов не говорят, значима ли разница.
- Неравные периоды: неполная последняя неделя выглядит как падение.
- Pie с десятью долями: углы сравнивать трудно, лучше отсортированные столбцы.
Jupyter: что важно знать
- Ячейки выполняются в том порядке, в каком вы их запускаете, а не сверху вниз. Скрытое состояние: переменная, удалённая из кода, живёт в памяти ядра. Перед отправкой отчёта: Restart & Run All.
%timeit,%%timeзамеряют скорость,%load_ext autoreloadи%autoreload 2подхватывают правки модулей без перезапуска.- Ноутбуки плохо ревьюятся в git: выходы ячеек раздувают диффы. Помогают очистка выходов перед коммитом (
nbstripout) или форматjupytext. - Повторяемый расчёт выносите из ноутбука в модуль
.pyс функциями, а в ноутбуке оставляйте исследование и графики.
Частые ошибки
- Столбцы с осью не от нуля.
- Сравнение гистограмм групп разного размера в абсолютных числах.
- Подписи осей и единицы отсутствуют.
- Цвет как единственный способ различить линии (проблема для дальтоников и при печати).
- Ноутбук, который не воспроизводится после Restart & Run All.
Что спросят на собесе
- Какой график выберете, чтобы сравнить распределения чеков в двух группах?
- Что показывает boxplot и чего он не показывает?
- Как график может ввести в заблуждение?
- Как сделать ноутбук воспроизводимым?
- Чем seaborn отличается от matplotlib?