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

Воронки

middle~15 мин

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

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

Ты говоришь, что Android-новички после 2.0 не возвращаются. Ладно. А где именно они отваливаются? Мне нужно одно место, куда отправить программистов, а не «всё плохо».

В прошлом уроке retention показал, что новички на Android после релиза 2.0 возвращаются на следующий день в полтора раза реже. Retention говорит «что-то сломалось». Воронка говорит «где».

Песочные часы с дырками

Представь песочные часы, где песок сыплется через несколько сит подряд. На каждом сите часть песка застревает. Если внизу мало песка, надо найти сито, на котором застревает больше всего.

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

install → tutorial_start → tutorial_complete → first_quest_complete → store_open → first_purchase

Шаг 1: сколько игроков на каждом шаге

Считаем не события, а разных игроков: count(DISTINCT player_id). Порядок шагов задаём сами через VALUES: в данных его нет, а алфавитный порядок тут бессмысленен. Тестовые аккаунты студии, как всегда, выбрасываем.

WITH steps(step_no, step) AS (
  VALUES (1, 'install'), (2, 'tutorial_start'), (3, 'tutorial_complete'),
         (4, 'first_quest_complete'), (5, 'store_open'), (6, 'first_purchase')
)
SELECT s.step_no, s.step, count(DISTINCT e.player_id) AS players
FROM steps s
LEFT JOIN events e
  ON e.name = s.step
 AND e.player_id NOT IN (SELECT id FROM players WHERE email LIKE '%@studio.dev')
GROUP BY s.step_no, s.step
ORDER BY s.step_no;

LEFT JOIN от списка шагов нужен, чтобы шаг, до которого никто не дошёл, остался в отчёте с нулём, а не исчез.

Шаг 2: две конверсии

У воронки две полезные доли. Конверсия шага делит игроков шага на предыдущий шаг: какое сито пропускает хуже. Сквозная конверсия делит на первый шаг: сколько из всех установивших дошли сюда. Обе посчитаем окнами из урока про LAG и FIRST_VALUE:

round(100.0 * players / lag(players) OVER (ORDER BY step_no), 1) AS from_prev,
round(100.0 * players / first_value(players) OVER (ORDER BY step_no), 1) AS from_install
 step_no |         step         | players | from_prev | from_install
---------+----------------------+---------+-----------+--------------
       1 | install              |    4077 |           |        100.0
       2 | tutorial_start       |    3889 |      95.4 |         95.4
       3 | tutorial_complete    |    2935 |      75.5 |         72.0
       4 | first_quest_complete |    2563 |      87.3 |         62.9
       5 | store_open           |    1844 |      71.9 |         45.2
       6 | first_purchase       |     499 |      27.1 |         12.2

Самое узкое сито у магазина: покупают 27,1% открывших. Но это нормально для бесплатной игры. Нас интересует другое: какой шаг ухудшился.

урок из курса

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

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