Раздел 42 · Аналитика данных с нуля

Графики в Python: matplotlib, seaborn и какой график под какой вопрос

middle~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Бран · продюсер «Хроник Пограничья»

Инвесторам нужен слайд с DAU за всё время. А маркетинг прислал график «Выручка растёт каждый месяц», и я уже почти поверил. Сделай картинку, которой можно верить, и скажи, что не так с их графиком.

Мы повторили на pandas запросы курса, почистили выгрузки, соединили таблицы и разобрались с датами. Цифры в DataFrame есть, теперь их надо показать. В Python для этого две библиотеки: matplotlib рисует всё, а seaborn поверх неё делает статистические графики одной строкой. Сегодня строим три графика и учимся замечать график, который врёт.

Один вопрос, одна форма

Форму графика выбирают по вопросу, а не по вкусу. Вопросов у аналитика немного:

ВопросФормаПример
Как менялось во времени?линияDAU по дням
Как распределены значения?гистограммачеки в кафе
Кто больше?столбцы от нулявыручка по месяцам, по платформам
Какая доля от целого?столбцы с долями, реже круговаядоля Android среди новых игроков
Связаны ли две величины?точечная диаграммауровень персонажа и траты

Подробно о формах поговорим в уроке про чарты блока K. Пока хватит этой таблицы.

Фигура и оси

В matplotlib картинка состоит из двух вещей. Фигура это холст целиком. Оси (Axes) это сам график на холсте: линии, столбцы, подписи. Рисуют почти всегда через оси:

import matplotlib.pyplot as plt
import pandas as pd

daily = pd.read_csv("dau.csv", parse_dates=["day"]).sort_values("day")

fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(daily["day"], daily["dau"])
ax.set_ylim(bottom=0)
ax.set_title("Чистый DAU по дням")
ax.set_ylabel("DAU, игроков")
fig.savefig("dau.png")

plt.subplots() возвращает фигуру и оси, ax.plot(x, y) рисует линию, fig.savefig сохраняет картинку для слайда. В Jupyter картинка показывается сама, в скрипте её сохраняют в файл.

В этом коде две строки важнее остальных. sort_values("day"): линия соединяет точки в порядке строк. Выгрузка Брана пришла вперемешку, и без сортировки линия будет метаться между июнем и мартом. set_ylim(bottom=0): иначе matplotlib начнёт ось с минимума данных, и падение со 160 до 140 займёт пол-экрана.

Сгладить неделю

DAU «Хроник» скачет внутри недели: по будням в среднем 131-133 игрока, в субботу и воскресенье 158-160. За этими зубцами тренд виден хуже. Его достают скользящим средним за 7 дней, ровно за неделю, чтобы в каждое окно попадали и будни, и выходные:

daily["dau_7d"] = daily["dau"].rolling(7).mean()

ax.plot(daily["day"], daily["dau_7d"], linewidth=2, label="среднее за 7 дней")
ax.legend()

rolling(7).mean() из урока про даты в pandas это то же, что avg(dau) OVER (ORDER BY day ROWS 6 PRECEDING) из урока про рамки окна. Сглаженная линия растёт с 35 игроков в первую неделю до пика 180,6 к 8 мая и к концу июня опускается до 143. Ту же картину можно собрать и без Python, во вкладке «График» песочницы:

SQL-песочница

База · guild

Загружаю редактор…

База загрузится, когда ты выполнишь запрос или откроешь таблицы.

Выполни запрос, чтобы увидеть результат.

Выполни весь запрос кнопкой или Ctrl/Cmd+Enter. Ctrl+Space открывает подсказки. Можно писать несколько команд через точку с запятой, менять данные и открывать транзакции. У каждой песочницы своя база, изменения живут до ухода со страницы. «Сбросить базу» возвращает учебные данные, но не меняет SQL.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.