Бран · продюсер «Хроник Пограничья»
Инвесторам нужен слайд с 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.