Урок по треку Python для анализа данных 6 мин

Графики и Jupyter для аналитика

matplotlib, seaborn, выбор графика под вопрос, типичные ошибки, работа в Jupyter.

График на собесе проверяют двумя способами: умеете ли вы быстро построить нужный в 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?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.