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

Дашборд для одного читателя

middle~10 мин

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

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

Каждый понедельник я пишу тебе одно и то же: сколько заработали, сколько людей играет, где теряем новичков, что покупают. Сделай так, чтобы я открывал одну страницу и видел всё сам.

Бран просит не отчёт, а дашборд. Отчёт отвечает на вопрос один раз, дашборд отвечает на одни и те же вопросы каждую неделю. В прошлых уроках мы строили по одному графику. Сегодня собираем из них страницу для одного читателя.

Приборная панель машины

На приборной панели нет всего, что знает машина. Там скорость, обороты, топливо и пара лампочек. Давление в каждом цилиндре водителю не нужно, его смотрит механик. Хорошая панель отвечает на вопросы того, кто сидит за рулём, и молчит про остальное.

Дашборд устроен так же. Сначала выпиши вопросы читателя, потом подбери под каждый вопрос одну карточку. У Брана вопросов четыре:

  1. Сколько заработали? Выручка по неделям, линия.
  2. Сколько людей играет? Средний DAU по неделям, линия.
  3. Где теряем новичков? Воронка от установки до первой покупки, столбцы.
  4. Что покупают? Топ офферов по выручке, столбцы.

Четыре вопроса, четыре карточки. Пятая карточка «на всякий случай» отнимает у читателя внимание, а ответа не добавляет.

Каждая карточка это запрос

В нашем мини-DataLens каждая карточка дашборда это обычный SQL-запрос и настройка графика к нему: тип, ось X и меры, как во вкладке «График» песочницы. Отдельного языка для дашбордов нет. Всё, чему мы научились в курсе, работает здесь без изменений.

Выручку берём чистую, как в боссе «Экономика Пограничья»: только оплаченные покупки, по одной на чек и без тестовых аккаунтов студии:

WITH clean AS (
  SELECT * FROM purchases
  WHERE status = 'paid'
    AND id IN (SELECT min(id) FROM purchases GROUP BY receipt_id)
    AND player_id NOT IN (SELECT id FROM players WHERE email LIKE '%@studio.dev')
)
SELECT date_trunc('week', created_at)::date AS week, sum(amount_rub) AS revenue
FROM clean
WHERE created_at < '2026-06-29'
GROUP BY week
ORDER BY week;

Сырые данные дают 1250 покупок на 726 433 ₽, чистые 1139 покупок на 657 756 ₽. Разница почти в 70 тысяч. Если на дашборд попадут сырые данные, Бран каждую неделю будет видеть выручку на 10% выше чистой.

DAU считаем без ботов и тестировщиков, как в уроке про DAU. Для недельной линии берём среднее DAU за неделю: число пар «игрок, день» делим на 7. Это не WAU: WAU считает каждого игрока недели один раз, а средний DAU показывает, сколько людей в игре в обычный день.

Воронка повторяет урок про воронки: шаги задаём через VALUES, чтобы порядок был наш, а не алфавитный. Топ офферов это GROUP BY по офферу и LIMIT 5.

Неполный период

Данные кончаются 30 июня, это вторник. Неделя с 29 июня в таблице есть, но в ней всего два дня. Чистая выручка за неё 2491 ₽ против 10-13 тысяч в соседних неделях, а средний DAU выходит 41 вместо 140. На линии это выглядит как обвал в последней точке, хотя игра в порядке.

Поэтому в карточках выручки и DAU стоит WHERE … < '2026-06-29': на дашборд попадают только полные недели. В живом дашборде то же правило звучит так: текущая неделя либо не рисуется, либо рисуется пунктиром с подписью «неделя не закончилась».

Ошибка аналитика

урок из курса

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

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