← Все курсы · Курс SQL · Все руководства
Преобразование воронки в SQL и шаг, который показывает 100%
К концу этой страницы вы сможете одним запросом превратить таблицу событий в воронку, определить, какая часть людей переходит от каждого шага к следующему, определить разницу между шагом, который люди проходят, и шагом, который люди пропускают, и составить единственное резюме, для которого на самом деле предназначена воронка: где все останавливаются. Это около двадцати пяти минут, и все приведенные ниже результаты были просчитаны.
Вот что делать сегодня, о воронке, о которой вы уже сообщаете. Ищите любой шаг преобразования на уровне 100 % или около него. Этот шаг почти никогда не работает идеально; это шаг, который можно пропустить или который регистрируется как побочный эффект следующего. Найдите сеансы, которые достигли более позднего шага без предыдущего, и вы найдете их в одном запросе.
Краткая версия: подсчитывайте отдельные сеансы на каждом шаге с условной агрегацией, а затем проверяйте, действительно ли для достижения шага требуется предыдущий.
Шаг, который можно обойти, — это идея, чтобы она получила картину.
- Что должен выдать запрос воронки
- Считайте сеансы, а не события
- Условная агрегация: вся воронка в одну строку
- Шаг за шагом и в целом
- 100 % означает, что шаг пропущен.
- Строгая воронка
- Где на самом деле прекращаются сеансы
- Порядок и временные окна
- Полное до и после
- Краевые случаи, разрушающие воронку
- Почему это работает
- Использование этого в вашем собственном проекте
- Все на одном экране
Вот все, что было сделано за десять сессий, так что никаких сюрпризов в дальнейшем не будет.
| Сессия | путь | События |
|---|---|---|
| S1 | просмотр > корзина > оформление заказа > покупка | 4 |
| S2 | просмотр > корзина > оформление заказа > покупка | 4 |
| S3 | просмотр > корзина > оформление заказа | 3 |
| S4 | просмотр > корзина | 2 |
| S5 | просмотр > корзина | 2 |
| S6 | Вид | 1 |
| S7 | Вид | 1 |
| S8 | Вид | 1 |
| S9 | просмотр > корзина > покупка | 3 |
| S10 | просмотр > просмотр > корзина | 3 |
1. Что должен выдавать запрос воронки
Воронка – это количество вещи который достиг каждого из упорядоченного списка шагов. Три решения предшествуют любому SQL, и все три меняют числа.
Что именно считается? Сессии, пользователи, заказы, заявки. Пользователь, который посещает сайт пять раз, — это один пользователь и пять сеансов, и эти воронки совершенно не похожи друг на друга.
Какие действия и в каком порядке? Порядок — это ваше утверждение о процессе, а пятый раздел — это то, что происходит, когда данные с ним не совпадают.
Над каким окном? Постоянно, в день, в течение тридцати минут после первого шага. Воронка без окна спокойно считает конверсией тех, кто посмотрел в январе и совершил покупку в мае.
Запишите эти три, прежде чем писать запрос. Это такая же дисциплина, как и любые другие показатели, и определение метрики это более длинная версия причины.
2. Считайте сеансы, а не события
До пояснения: десять сессий произвели двадцать четыре события. Скажите, сколько из этих событий являются просмотрами.
SELECT step, COUNT(*) AS events, COUNT(DISTINCT session_id) AS sessions
FROM events GROUP BY 1;
view | 11 | 10
cart | 7 | 7
checkout | 3 | 3
purchase | 3 | 3
Одиннадцать просмотров событий, десять сеансов. Сеанс S10 просмотрен дважды, что является совершенно нормальным поведением и совершенно неправильно считать дважды: вершиной воронки является количество сеансов, которые зашли так далеко, а не количество раз, когда они это сделали.
Разрыв здесь невелик, и он никогда не бывает мал в реальных данных, потому что первый шаг воронки — это именно тот шаг, который люди повторяют. Просмотр домашней страницы, регистрируемый при каждой навигации, может привести к тому, что число посетителей в верхней части воронки в несколько раз превысит число посетителей, из-за чего каждый коэффициент конверсии ниже него будет выглядеть ужасным без всякой причины.
Таким образом, каждый счетчик в воронке COUNT(DISTINCT thing_id). Если верхнее число вашей воронки больше, чем количество посетителей, вот почему.
3. Условная агрегация: вся воронка в одну строку
Приведенная выше сгруппированная версия дает одну строку на шаг, что хорошо для диаграммы и неудобно для расчета ставок, поскольку для каждой скорости требуется две строки. Вместо этого при условном агрегировании вся воронка помещается в одну строку.
SELECT COUNT(DISTINCT CASE WHEN step='view' THEN session_id END) AS viewed,
COUNT(DISTINCT CASE WHEN step='cart' THEN session_id END) AS carted,
COUNT(DISTINCT CASE WHEN step='checkout' THEN session_id END) AS checked_out,
COUNT(DISTINCT CASE WHEN step='purchase' THEN session_id END) AS purchased
FROM events;
10 | 7 | 3 | 3
Этот механизм стоит понять, а не копировать. CASE возвращает идентификатор сеанса, когда шаг соответствует и NULL когда это не так, и COUNT игнорирует нули, поэтому в каждом столбце учитываются только сеансы, достигшие этого шага. Это тот же трюк, что и поворот вручную, и руководство по ДЕЛУ охватывает само выражение.
Вам нужна одна строка из четырех чисел, потому что теперь каждая ставка представляет собой арифметику между столбцами, а не соединение между строками.
4. Шаг за шагом и в целом
Два разных вопроса, и в отчетах обычно один отображается, а другой помечается как другой.
viewed | carted | checked_out | purchased
10 | 7 | 3 | 3
view to cart 70.0%
cart to checkout 42.9%
checkout to purchase 100.0%
overall (view to purchase) 30.0%
Шаг за шагом делит каждый счет на тот, который находится над ним, и отвечает: «сколько людей сюда попали, сколько осталось». Общий делится по верху и отвечает "всех, кто начал, сколько закончило". Умножение скоростей шагов дает общую скорость, что является полезной проверкой: 0,700 × 0,429 × 1,000 равно 0,300.
Оба упомянуты в отчете. Шаг за шагом подскажет вам, куда направить свои усилия; в целом говорит вам, чего стоит этот процесс. Публикация только показателей шагов позволяет странице с показателем 90% выглядеть успешной, когда ее посещают только сорок человек в месяц.
5. 100% означает, что шаг пропущен.
Перед пояснением: оформление покупки вышло ровно на 100,0%. Скажите, что бы это значило, если бы это было правдой.
Чтобы ни один человек, дошедший до страницы оформления заказа, не совершил покупку: ни брошенных корзин, ни неудавшихся карточек, ни раздумий. В любой реальной проверке, которая не является результатом, это симптом, и вопрос, который следует задавать, заключается не в том, «почему проверка такая хорошая», а в том, «действительно ли проверка на пути».
На него отвечает один запрос. Сократите каждый сеанс до флагов, а затем найдите те, которые достигли более позднего шага без предыдущего.
WITH s AS (
SELECT session_id,
MAX(step='checkout')::INT AS did_checkout,
MAX(step='purchase')::INT AS did_purchase
FROM events GROUP BY 1)
SELECT session_id FROM s WHERE did_purchase = 1 AND did_checkout = 0;
S9
С9 пошёл просмотр, тележка, покупка. Три сессии проверены и три куплены, но это не одни и те же три, и соотношение между двумя разными наборами по три вовсе не является коэффициентом конверсии.
В реальных системах это имеет обычные причины. Путь в один клик или сохраненная карта пропускает страницу оформления заказа. Мобильное приложение запускает различные события с веб-сайта. Событие оформления заказа регистрируется только при отправке, поэтому тот, кто платит другим способом, никогда его не генерирует. Каждый из них стоит знать, и ни один из них не виден на воронкообразной диаграмме.
Произнесите вслух, как называется соотношение между двумя перекрывающимися, но разными множествами. Это не коэффициент конверсии, и, дав ему такое название, проблема с данными становится целью, которую кого-то просят улучшить.
6. Строгая воронка
Если вы утверждаете, что шаги выполняются по порядку, заставьте запрос обеспечить его соблюдение. Помечайте каждый сеанс на каждом этапе, а затем требуйте также все предыдущие флаги.
WITH s AS (
SELECT session_id,
MAX(step='view')::INT AS v,
MAX(step='cart')::INT AS c,
MAX(step='checkout')::INT AS k,
MAX(step='purchase')::INT AS p
FROM events GROUP BY 1)
SELECT SUM(v) AS viewed,
SUM(v*c) AS carted,
SUM(v*c*k) AS checked_out,
SUM(v*c*k*p) AS purchased
FROM s;
10 | 7 | 3 | 2
Умножение флагов - это AND: сеанс считается шагом, только если у него есть этот флаг и все флаги перед ним. Первые три числа не изменились, а последнее уменьшилось с 3 до 2, поскольку S9 больше не соответствует критериям.
Теперь две основные ставки рядом:
any purchase at all 30.0%
completed the full path 20.0%
Разница в десять процентных пунктов в десяти сеансах, когда один клиент использует другой маршрут. Ни одно из чисел не является неверным. Первый отвечает «сколько купило», второй отвечает «сколько прошли процесс, который мы разработали», и в отчете должно быть указано, какой из них он показывает, а не оставлять читателю право предполагать.
7. Где фактически прекращаются сеансы
Воронкообразная диаграмма показывает, сколько пользователей достигли каждого шага. Что люди на самом деле хотят знать, так это то, где все сдались, и это другой запрос с гораздо более полезным ответом, потому что каждый сеанс появляется ровно один раз.
SELECT CASE WHEN p=1 THEN 'purchased'
WHEN k=1 THEN 'stopped at checkout'
WHEN c=1 THEN 'stopped at cart'
ELSE 'stopped at view' END AS outcome,
COUNT(*) AS sessions
FROM s GROUP BY 1 ORDER BY sessions DESC;
purchased | 3
stopped at view | 3
stopped at cart | 3
stopped at checkout | 1
Три, три, три и один, в сумме получается десять, что соответствует количеству сеансов. Это согласование является причиной построить его таким образом: счетчики воронки перекрываются, поэтому их нельзя сверить с общей суммой, в то время как таблица самого дальнего шага разделяет сеансы и должна суммироваться.
тот CASE Порядок имеет значение и выполняет всю работу: сначала проверяется самый дальний шаг, поэтому каждый сеанс попадает ровно в одну корзину, что является тем же правилом упорядочивания «первый истинный выигрыш», что и любая другая цепочка условий.
Представьте на мгновение свою собственную воронку. Если вы перестроите ее как таблицу дальних шагов, добавятся ли ведра к числу вошедших людей? Если нет, то что-то в воронке учитывается в двух местах.
8. Порядок и временные окна
Два уточнения, которые будут иметь значение, как только данные станут реальными.
Заказ внутри сеанса. Приведенный выше подход с использованием флагов спрашивает, произошел ли шаг, а не произошел ли он после предыдущего. Сеанс покупки, а затем просмотра страницы продукта считается полным путем. Если последовательность имеет значение, сравнивайте временные метки, а не флаги: требуйте, чтобы время оформления заказа наступало после времени корзины, обычно с MIN(...) времени каждого шага за сеанс.
MIN(CASE WHEN step='cart' THEN event_time END) AS cart_at,
MIN(CASE WHEN step='checkout' THEN event_time END) AS checkout_at
-- then: WHERE checkout_at > cart_at
Окно. Решите, сколько времени потребуется сеансу для завершения воронки. Без ограничений, повторное посещение через несколько недель засчитывается в исходный просмотр, что увеличивает конверсию и делает невозможным измерить любые изменения в процессе. При слишком узком лимите вы недооцениваете медленные, но настоящие конверсии. Правильного ответа нет, есть только заявленный, и он находится в заголовке отчета, а не в запросе.
Полное до и после
Те же события, тот же вопрос: насколько хорошо происходит преобразование?
До
SELECT step, COUNT(*) AS n FROM events GROUP BY 1;
view | 11
cart | 7
checkout | 3
purchase | 3
view to cart 63.6%, cart to checkout 42.9%, checkout to purchase 100%
Три проблемы. Верхнее число учитывает события, поэтому оно равно одиннадцати, а не десяти, и первая оценка неверна. Последний шаг дает идеальные 100% результатов, в которых никто не сомневается, потому что это хорошие новости. И нигде нет какой-либо общей суммы, поэтому ничто из этого не может быть согласовано с десятью существующими сеансами.
после
-- one row per session, one flag per step
WITH s AS (
SELECT session_id,
MAX(step='view')::INT AS v, MAX(step='cart')::INT AS c,
MAX(step='checkout')::INT AS k, MAX(step='purchase')::INT AS p
FROM events GROUP BY 1) -- 10 rows
SELECT SUM(v) AS viewed, SUM(v*c) AS carted,
SUM(v*c*k) AS checked_out, SUM(v*c*k*p) AS purchased,
ROUND(100.0*SUM(p)/SUM(v),1) AS any_purchase,
ROUND(100.0*SUM(v*c*k*p)/SUM(v),1) AS full_path
FROM s;
10 | 7 | 3 | 2 | 30.0 | 20.0
-- and the table that has to add up
purchased 3, stopped at view 3, stopped at cart 3, stopped at checkout 1 = 10
Одна строка за сеанс перед подсчетом, поэтому события не могут быть подсчитаны дважды. Обе цифры конверсии с маркировкой. И таблица дальних шагов, которая согласовывается с количеством сеансов.
Заявление, и это повод смотреть на совершенный шаг, а не праздновать его: проверка на покупку читалась 100%, и причина заключалась в том, что одна сессия из десяти вообще не проходила проверку, что также увеличило честный коэффициент конверсии с 30% до 20%.
Краевые случаи, разрушающие воронку
Шесть, которые стоит знать.
Названия шагов изменены. Релиз переименовывается add_to_cart к cart_add и середина воронки рушится в одночасье. Проверьте отдельные значения шага, прежде чем поверить в внезапное падение.
Шаг, который не везде логируется. Веб запускает его, приложение - нет. Затем воронка измеряет сочетание платформ, а не поведение, и она перемещается всякий раз, когда маркетинг меняет канал.
Сеансы, которые начинаются в середине воронки. Кто-то попадает на страницу продукта по электронной почте и никогда не видит домашнюю страницу. Они представляют собой настоящую конверсию и не проходят строгую воронку. Решите, действительно ли ваш верхний шаг необходим.
Боты. Они просматривают и никогда не покупают, поэтому раздувают верхнюю часть воронки и снижают все показатели ниже нее. Фильтруйте их перед подсчетом, а не после того, как подвергните сомнению цифры.
Сеансы, охватывающие полночь или тайм-аут. У одного человека получается две сессии, одна из которых просмотрена, а другая куплена, поэтому реальная конверсия выглядит как две неудачи. Это та же проблема идентификации, что и Разрешение объекта, применяется к сеансам, а не к клиентам.
Сравнение воронок разных групп населения. Воронка, которая улучшилась после кампании, возможно, просто началась с разных людей. Решение такое же, как и везде в аналитике: сравнивайте когорты, а не периоды, что и есть когортный анализ это для.
Почему это работает
Воронка — это утверждение о последовательности, а последовательность — это не то, что содержит таблица событий сама по себе; это должно быть навязано. Работа над анализом закономерностей на основе данных о событиях рассматривает упорядочивание как объект исследования, а не как фон именно потому, что интересные вопросы заключаются в том, какие события происходят после чего, и ответ на них требует определения того, что считается последовательностью и в течение какого периода (Агравал & Шрикант, 1995, Материалы 11-й Международной конференции по инженерии данных, 3–14). Два усовершенствования восьмого раздела (сравнение временных меток и выбор окна) представляют собой уменьшенную версию этого. Воронка без них не измеряет процесс, она подсчитывает, произошли ли когда-либо четыре события в одном сеансе.
Более глубокая проблема на этой странице заключается в том, что происходит, когда число, которое не означает того, что оно говорит, все равно публикуется. Как только показатель становится показателем эффективности, люди действуют в соответствии с ним, и показатель, отражающий только часть того, что он утверждает, надежно производит усилия, направленные на показатель, а не на то, что он обозначает (Риджвей, 1956, Ежеквартальный журнал административной науки, 1(2), 240–247). Шаг оформления заказа, показывающий 100%, потому что его можно обойти, имеет именно такую форму: он не просто неверен, он неверен в том направлении, в котором команду можно поздравить, а затем вместо этого попросить улучшить другой шаг.
Одно замечание в шпаргалке ниже. Он создан для того, чтобы его просматривали и вспоминали, а не перечитывали, потому что преимущества самотестирования распространяются на проблемы, которые отличаются от тех, на которых вы тестировали, и это имеет значение, когда следующая воронка имеет другие шаги (Кастрюля & Рикард, 2018, Психологический вестник, 144(7), 710–756).
Использование этого в вашем собственном проекте
Перестраивать каждую воронку сразу нет необходимости. Вместо этого сделайте это по порядку.
- Сравните верхнее число с количеством посетителей или сеансов. Если оно больше, вы подсчитываете события.
- Сначала сократите до одной строки для каждой вещи, с флагом на каждый шаг, прежде чем произойдет какой-либо подсчет. Все остальное становится арифметикой.
- Посмотрите на каждый шаг: конверсия выше примерно 95 %. и запустите на нем обходной запрос.
- Опубликовать оба тарифа, любое завершение и полный путь с метками на них.
- Постройте таблицу самого дальнего шага и проверьте, что это добавляет к вашему количеству входов. Это единственное согласование, которое есть в воронке.
- Укажите окно в заголовке, а не в запросе, чтобы читатель знал, что означает «преобразованный».
Если у вас под рукой есть бумага, один дополнительный эскиз стоит пяти минут. Нарисуйте воронку в виде прямоугольников, а затем нарисуйте каждую известную вам стрелку, которая пропускает поле: путь к сохраненной карте, заказ по телефону, продавец, вводящий ее вручную. У большинства воронок есть хотя бы одна, а у тех, у которых ее нет, обычно есть еще одна, которую еще никто не нарисовал.
Все на одном экране
Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.
| вещь | Что он делает |
|---|---|
| Сначала три решения | Что считается, какие шаги, над каким окном. |
| Считайте вещь, а не событие | COUNT(DISTINCT session_id). Просмотры повторяются. |
| Условная агрегация | COUNT(DISTINCT CASE WHEN step='x' THEN id END), один столбец на шаг. |
| Почему это работает | CASE возвращает NULL, если шаг не соответствует, а COUNT пропускает нули. |
| Шаг за шагом | Каждый счет превышает тот, который над ним. |
| Общий | Каждый пересчитывается сверху. Скорость шага умножается на него. |
| Шаг на 100% | Не идеальный шаг. Шаг пропускается или регистрируется как побочный эффект. |
| В поисках обходного пути | Флаг для каждого сеанса, затем более поздний шаг равен 1, а более ранний шаг — 0. |
| Строгая воронка | Умножьте флаги: SUM(v*c*k*p). Требуется каждый предыдущий шаг. |
| Две основные ставки | Любое завершение и полный путь. Здесь 30,0% и 20,0%. |
| Стол для дальних шагов | Каждый сеанс один раз. Необходимо добавить к количеству входов. |
| КЕЙС заказывайте там | Сначала самый дальний шаг, поэтому каждый сеанс попадает в одну корзину. |
| Заказ внутри сеанса | Флаги не проверяют это. Сравнивать MIN(time) за шаг. |
| Окно | Без ограничений покупка, сделанная несколько месяцев спустя, будет сохранена в исходном виде. |
| Переименованные шаги | Обвал посередине. Сначала проверьте отдельные значения шагов. |
| Боты | Надуйте верх, опустите каждую ставку. Фильтруйте перед подсчетом. |
Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. Тот, который я помню, был воронкой регистрации, где этап проверки электронной почты конвертировался в 99,6%, и все воспринимали это как хорошо продуманное электронное письмо, пока не выяснилось, что проверка автоматически завершалась для всех, кто приходил по партнерской ссылке, а реальное число для всех остальных составляло около шестидесяти. Какой подозрительно удачный шаг оказался в вашей собственности?
Ссылки
- Агравал Р. и Шрикант Р. (1995). Последовательный анализ шаблонов. Материалы 11-й Международной конференции по инженерии данных, 3–14.
- Риджуэй, В.Ф. (1956). Дисфункциональные последствия измерений производительности. Ежеквартальный журнал административной науки, 1(2), 240–247.
- Пан, SC, и Рикард, TC (2018). Передача обучения с расширенным тестированием: метааналитический обзор и синтез. Психологический вестник, 144(7), 710–756.
SQL для аналитиков состоит из 458 страниц, запросы воронки построены таким образом, что на каждом этапе учитывается одно и то же население в одном и том же порядке.
SQL для аналитиков, 19 $ →тот Курс SQL дает вам повторения: условную агрегацию для записи, обход сеансов для поиска, строгие воронки для построения и флеш-карточки, на которых количество и какая скорость принадлежат. Теперь вы владеете методом; комплект - это практика. Ничего устанавливать, учетная запись не требуется.
Откройте набор SQL →