← Все курсы · Курс SQL · Все руководства

Преобразование воронки в SQL и шаг, который показывает 100%

Один запрос на количество, три проверки на смысл · Часть Analyst Prep Kit

К , аналитик данных · Опубликовано

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

Вот что делать сегодня, о воронке, о которой вы уже сообщаете. Ищите любой шаг преобразования на уровне 100 % или около него. Этот шаг почти никогда не работает идеально; это шаг, который можно пропустить или который регистрируется как побочный эффект следующего. Найдите сеансы, которые достигли более позднего шага без предыдущего, и вы найдете их в одном запросе.

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

Шаг, который можно обойти, — это идея, чтобы она получила картину.

The step people can go around Four horizontal bars are stacked and centred, forming a funnel that narrows downwards. The top bar is labelled view and holds the number 10, and it is the widest. Below it a narrower bar labelled cart holds 7. Below that a much narrower bar labelled checkout holds 3. At the bottom a bar labelled purchase holds 3, and it is drawn exactly as wide as the checkout bar above it, so the funnel stops narrowing at the last step. An amber pipe leaves the right-hand end of the cart bar, curves out to the right, runs down past the checkout bar without touching it, and turns back in to join the right-hand end of the purchase bar. The picture shows two things at once that are really one thing: the last two bars match in width, and there is a route from cart to purchase that never enters checkout. viewcart checkoutpurchase 107 33
Десять сеансов просмотра, семь — добавления в корзину, три — оформления заказа и три — покупки. Последние два столбца имеют одинаковую ширину, потому что во время одной сессии труба перешла от корзины прямо к покупке и ни разу не коснулась оформления заказа.
Что вы узнаете
  1. Что должен выдать запрос воронки
  2. Считайте сеансы, а не события
  3. Условная агрегация: вся воронка в одну строку
  4. Шаг за шагом и в целом
  5. 100 % означает, что шаг пропущен.
  6. Строгая воронка
  7. Где на самом деле прекращаются сеансы
  8. Порядок и временные окна
  9. Полное до и после
  10. Краевые случаи, разрушающие воронку
  11. Почему это работает
  12. Использование этого в вашем собственном проекте
  13. Все на одном экране
Каждый результат на этой странице реален. Двадцать четыре события в десяти сеансах, четырех шагах, загруженных в DuckDB и запрошенных. Десять сеансов намеренно достаточно малы, чтобы вы могли держать все это в голове и проверять каждую цифру. Именно так следует строить запросы воронки, прежде чем они достигнут реальных объемов.

Вот все, что было сделано за десять сессий, так что никаких сюрпризов в дальнейшем не будет.

СессияпутьСобытия
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).

Использование этого в вашем собственном проекте

Перестраивать каждую воронку сразу нет необходимости. Вместо этого сделайте это по порядку.

  1. Сравните верхнее число с количеством посетителей или сеансов. Если оно больше, вы подсчитываете события.
  2. Сначала сократите до одной строки для каждой вещи, с флагом на каждый шаг, прежде чем произойдет какой-либо подсчет. Все остальное становится арифметикой.
  3. Посмотрите на каждый шаг: конверсия выше примерно 95 %. и запустите на нем обходной запрос.
  4. Опубликовать оба тарифа, любое завершение и полный путь с метками на них.
  5. Постройте таблицу самого дальнего шага и проверьте, что это добавляет к вашему количеству входов. Это единственное согласование, которое есть в воронке.
  6. Укажите окно в заголовке, а не в запросе, чтобы читатель знал, что означает «преобразованный».

Если у вас под рукой есть бумага, один дополнительный эскиз стоит пяти минут. Нарисуйте воронку в виде прямоугольников, а затем нарисуйте каждую известную вам стрелку, которая пропускает поле: путь к сохраненной карте, заказ по телефону, продавец, вводящий ее вручную. У большинства воронок есть хотя бы одна, а у тех, у которых ее нет, обычно есть еще одна, которую еще никто не нарисовал.

Подробнее об этом и еще что-нибудь подобное. Все инструкции находятся в одном месте на индекс направляющих. Если вы предпочитаете вводить запросы, а не читать о них, SQL-практикум дает вам по одному выполняемому запросу к реальной базе данных.

Все на одном экране

Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.

вещьЧто он делает
Сначала три решенияЧто считается, какие шаги, над каким окном.
Считайте вещь, а не событие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%, и все воспринимали это как хорошо продуманное электронное письмо, пока не выяснилось, что проверка автоматически завершалась для всех, кто приходил по партнерской ссылке, а реальное число для всех остальных составляло около шестидесяти. Какой подозрительно удачный шаг оказался в вашей собственности?

Ссылки

Воронка состоит из пяти шагов, и на третьем этапе задействовано больше людей, чем на втором.

SQL для аналитиков состоит из 458 страниц, запросы воронки построены таким образом, что на каждом этапе учитывается одно и то же население в одном и том же порядке.

SQL для аналитиков, 19 $ →
Практикуйте воронки на сеансах, которые вы можете посчитать вручную.

тот Курс SQL дает вам повторения: условную агрегацию для записи, обход сеансов для поиска, строгие воронки для построения и флеш-карточки, на которых количество и какая скорость принадлежат. Теперь вы владеете методом; комплект - это практика. Ничего устанавливать, учетная запись не требуется.

Откройте набор SQL →