БЛОК ТЕОРИИ: Бизнес-мышление и метрики
Это самый важный блок для прохождения собеседований. Именно здесь проверяют, умеет ли кандидат мыслить как бизнес, а не просто писать код. Давайте разберем всю теорию максимально подробно, с формулами, примерами и скриптами для Northwind.
ТЕМА 1. Продуктовые метрики
Эти метрики помогают понять, как пользователи взаимодействуют с продуктом, насколько они лояльны и сколько денег приносят.
1.1 DAU / WAU / MAU (Активная аудитория)
Метрика |
Расшифровка |
Что показывает |
|---|---|---|
DAU |
Daily Active Users |
Сколько уникальных пользователей зашли в день |
WAU |
Weekly Active Users |
Сколько уникальных пользователей зашли за неделю |
MAU |
Monthly Active Users |
Сколько уникальных пользователей зашли за месяц |
Зачем нужны:
Показывают масштаб аудитории
Помогают отслеживать тренды (рост/падение)
Используются для расчета других метрик
Пример из ритейла (М.Видео):
DAU = 50 000 человек заходят на сайт ежедневно
MAU = 500 000 уникальных посетителей в месяц
Как посчитать в SQL (Northwind):
-- Ежедневное количество уникальных клиентов, сделавших заказ
SELECT
order_date,
COUNT(DISTINCT customer_id) AS dau
FROM orders
GROUP BY order_date
ORDER BY order_date;
1.2 Stickiness (Липкость)
Определение: Показывает, насколько часто пользователи возвращаются в продукт.
Формула:
Stickiness = DAU / MAU × 100%
Значение |
Интерпретация |
|---|---|
> 50% |
🔥 Супер-липкий продукт (пользователи заходят почти каждый день) |
20-50% |
👍 Хорошая липкость |
< 20% |
⚠️ Низкая липкость (пользователи приходят редко) |
Пример:
DAU = 10 000
MAU = 50 000
Stickiness = 10 000 / 50 000 = 20%
Вывод: В среднем пользователь заходит 6 раз в месяц (20% от 30 дней).
Как посчитать в SQL:
WITH daily_users AS (
SELECT
order_date,
COUNT(DISTINCT customer_id) AS dau
FROM orders
GROUP BY order_date
),
monthly_users AS (
SELECT
DATE_TRUNC('month', order_date) AS month,
COUNT(DISTINCT customer_id) AS mau
FROM orders
GROUP BY DATE_TRUNC('month', order_date)
)
SELECT
AVG(d.dau) / m.mau * 100 AS stickiness
FROM daily_users d
CROSS JOIN monthly_users m
GROUP BY m.mau;
1.3 Retention (Удержание)
Определение: Доля пользователей, которые вернулись в продукт через определенное время.
Cohort Analysis (Когортный анализ):
Когорта — группа пользователей, объединенная по времени (например, все, кто зарегистрировался в январе)
Retention — сколько из них вернулись через 1, 2, 3… месяца
Пример:
Месяц регистрации |
Зарегистрировалось |
Вернулись через 1 мес |
Retention 1 мес |
|---|---|---|---|
Январь 2025 |
1000 |
400 |
40% |
Февраль 2025 |
1200 |
480 |
40% |
Март 2025 |
900 |
270 |
30% |
Вывод: Retention падает → нужно улучшать продукт.
Как посчитать в SQL (Northwind):
-- Когортный анализ: первый заказ клиента и его возвращаемость
WITH first_orders AS (
SELECT
customer_id,
MIN(order_date) AS first_order_date
FROM orders
GROUP BY customer_id
),
cohorts AS (
SELECT
customer_id,
DATE_TRUNC('month', first_order_date) AS cohort_month
FROM first_orders
),
order_months AS (
SELECT
o.customer_id,
c.cohort_month,
DATE_TRUNC('month', o.order_date) AS order_month,
EXTRACT(MONTH FROM AGE(o.order_date, c.cohort_month)) AS month_number
FROM orders o
JOIN cohorts c ON o.customer_id = c.customer_id
)
SELECT
cohort_month,
month_number,
COUNT(DISTINCT customer_id) AS retained_users
FROM order_months
GROUP BY cohort_month, month_number
ORDER BY cohort_month, month_number;
1.4 Churn Rate (Отток)
Определение: Доля пользователей, которые перестали пользоваться продуктом.
Формула:
Churn Rate = (Клиентов в начале - Клиентов в конце) / Клиентов в начале × 100%
Пример:
В начале месяца: 10 000 клиентов
В конце месяца: 9 000 клиентов
Churn Rate = (10 000 - 9 000) / 10 000 = 10%
Как снизить Churn:
Улучшить продукт
Внедрить программу лояльности
Сделать персонализированные предложения
1.5 ARPU и ARPPU (Доход на пользователя)
Метрика |
Расшифровка |
Формула |
|---|---|---|
ARPU |
Average Revenue Per User |
Выручка / Все пользователи |
ARPPU |
Average Revenue Per Paying User |
Выручка / Платящие пользователи |
Пример:
Выручка за месяц = 1 000 000 ₽
Всего пользователей = 100 000
Платящих пользователей = 10 000
ARPU = 1 000 000 / 100 000 = 10 ₽
ARPPU = 1 000 000 / 10 000 = 100 ₽
Вывод: ARPPU в 10 раз больше ARPU → монетизация держится на небольшой группе.
1.6 LTV (Lifetime Value) — Пожизненная ценность клиента
Определение: Сколько денег принесет клиент за всё время взаимодействия с компанией.
Упрощенная формула:
LTV = Средний чек × Частота покупок × Время жизни клиента
Точная формула:
LTV = ARPU × (1 / Churn Rate)
Пример:
ARPU = 1000 ₽ в месяц
Churn Rate = 5% (0.05)
LTV = 1000 / 0.05 = 20 000 ₽
Как увеличить LTV:
Увеличить средний чек (апселл/кросс-селл)
Увеличить частоту покупок
Снизить отток (увеличить время жизни)
Как посчитать LTV в Northwind:
-- LTV каждого клиента
WITH customer_metrics AS (
SELECT
c.customer_id,
COUNT(DISTINCT o.order_id) AS order_count,
AVG(od.quantity * od.unit_price * (1 - od.discount)) AS avg_check,
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS total_spent,
MAX(o.order_date) - MIN(o.order_date) AS customer_lifetime_days
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_details od ON o.order_id = od.order_id
GROUP BY c.customer_id
)
SELECT
customer_id,
total_spent AS ltv,
order_count,
avg_check,
customer_lifetime_days
FROM customer_metrics
ORDER BY ltv DESC;
ТЕМА 2. МАРКЕТИНГОВЫЕ МЕТРИКИ
Эти метрики помогают оценить эффективность рекламных кампаний и окупаемость маркетинговых бюджетов.
2.1 CAC (Customer Acquisition Cost) — Стоимость привлечения клиента
Определение: Сколько денег нужно потратить, чтобы привлечь одного нового клиента.
Формула:
CAC = Затраты на маркетинг / Количество новых клиентов
Пример:
Потратили на рекламу = 500 000 ₽
Привлекли 1000 новых клиентов
CAC = 500 000 / 1000 = 500 ₽
Что такое «хороший» CAC?
CAC должен быть меньше LTV (иначе вы работаете в убыток)
Идеально: LTV > 3 × CAC
2.2 ROMI (Return on Marketing Investment)
Определение: Возврат на инвестиции в маркетинг. Показывает, сколько рублей прибыли приносит 1 рубль, потраченный на маркетинг.
Формула:
ROMI = (Выручка от маркетинга - Затраты на маркетинг) / Затраты на маркетинг × 100%
Пример:
Потратили на рекламу = 100 000 ₽
Получили выручку = 300 000 ₽
ROMI = (300 000 - 100 000) / 100 000 = 200%
ROMI |
Интерпретация |
|---|---|
> 100% |
🟢 Отлично (каждый рубль приносит 2+ рубля) |
0-100% |
🟡 Окупается, но не очень эффективно |
< 0% |
🔴 Убыточно (тратим больше, чем зарабатываем) |
2.3 ROI (Return on Investment)
Определение: Общая окупаемость инвестиций (не только маркетинговых).
Формула:
ROI = (Доход - Затраты) / Затраты × 100%
2.4 CPC, CPM, CTR (Контекстная реклама)
Метрика |
Расшифровка |
Формула |
Пример |
|---|---|---|---|
CPC |
Cost Per Click |
Бюджет / Количество кликов |
10 ₽ за клик |
CPM |
Cost Per Mille (1000 показов) |
Бюджет / Показы × 1000 |
200 ₽ за 1000 показов |
CTR |
Click-Through Rate |
Клики / Показы × 100% |
2% (20 кликов на 1000 показов) |
Взаимосвязь:
CPC = CPM / (CTR × 10)
Пример:
CPM = 200 ₽
CTR = 2% (0.02)
CPC = 200 / (0.02 × 1000) = 10 ₽
ТЕМА 3. РИТЕЙЛ-МЕТРИКИ
Это метрики, специфичные для розничной торговли (как в Ленте, М.Видео, Ригле).
3.1 ABC-XYZ Анализ
Определение: Метод классификации товаров по двум критериям:
ABC — по вкладу в выручку
XYZ — по стабильности продаж
Категория ABC |
Описание |
Доля в выручке |
|---|---|---|
A |
Самые важные товары |
~80% |
B |
Средние товары |
~15% |
C |
Наименее важные товары |
~5% |
Категория XYZ |
Описание |
Коэффициент вариации |
|---|---|---|
X |
Стабильные продажи |
< 10% |
Y |
Сезонные/волатильные |
10-25% |
Z |
Нерегулярные продажи |
> 25% |
Матрица ABC-XYZ:
X (стабильные) |
Y (сезонные) |
Z (случайные) |
|
|---|---|---|---|
A (80% выручки) |
🔥 AX — Главные товары, держать всегда |
AY — Планировать по сезону |
AZ — Анализировать причины |
B (15% выручки) |
BX — Стабильные, держать |
BY — Планировать |
BZ — Требуют внимания |
C (5% выручки) |
CX — Можно держать |
CY — Можно сократить |
CZ — 🗑️ Выводить из ассортимента |
Как посчитать ABC-XYZ в SQL (Northwind):
-- ABC-XYZ анализ товаров
WITH product_sales AS (
SELECT
p.product_id,
p.product_name,
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS total_revenue,
COUNT(DISTINCT o.order_id) AS order_count,
STDDEV(od.quantity) AS sales_variation
FROM products p
JOIN order_details od ON p.product_id = od.product_id
JOIN orders o ON od.order_id = o.order_id
GROUP BY p.product_id, p.product_name
),
abc_classification AS (
SELECT
*,
PERCENT_RANK() OVER (ORDER BY total_revenue DESC) AS revenue_percentile
FROM product_sales
)
SELECT
product_name,
total_revenue,
CASE
WHEN revenue_percentile <= 0.8 THEN 'A'
WHEN revenue_percentile <= 0.95 THEN 'B'
ELSE 'C'
END AS abc_category,
CASE
WHEN sales_variation < 0.1 THEN 'X'
WHEN sales_variation < 0.25 THEN 'Y'
ELSE 'Z'
END AS xyz_category
FROM abc_classification
ORDER BY total_revenue DESC;
3.2 Средний чек (Average Check / AOV)
Определение: Средняя сумма одной покупки.
Формула:
Средний чек = Выручка / Количество заказов
Как увеличить средний чек:
Апселл (предложить более дорогой товар)
Кросс-селл (предложить дополнительные товары)
Скидки за минимальную сумму заказа
SQL в Northwind:
SELECT
AVG(order_total) AS avg_check
FROM (
SELECT
o.order_id,
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS order_total
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
GROUP BY o.order_id
) AS order_totals;
3.3 Конверсия (Conversion Rate)
Определение: Доля пользователей, которые совершили целевое действие.
Примеры конверсии в ритейле:
Посетитель сайта → Добавил товар в корзину
Добавил в корзину → Оформил заказ
Посетитель магазина → Совершил покупку
Формула:
Конверсия = Целевые действия / Всего пользователей × 100%
Пример:
1000 посетителей сайта
50 оформили заказ
Конверсия = 50 / 1000 = 5%
3.4 Воронка продаж (Sales Funnel)
Определение: Путь клиента от первого касания до покупки.
Пример воронки для интернет-магазина:
Этап |
Количество |
Конверсия (от этапа к этапу) |
|---|---|---|
Посетили сайт |
10 000 |
- |
Посмотрели товар |
4 000 |
40% |
Добавили в корзину |
1 000 |
25% |
Оформили заказ |
200 |
20% |
Оплатили |
150 |
75% |
Общая конверсия |
1.5% |
- |
Где падает воронка? На этапе «корзина → заказ» (20%) — возможно, сложная форма оформления.
SQL в Northwind (упрощенная воронка):
SELECT
COUNT(DISTINCT customer_id) AS customers,
COUNT(DISTINCT order_id) AS orders,
COUNT(DISTINCT order_id)::FLOAT / COUNT(DISTINCT customer_id) AS conversion_rate
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;
3.5 Товарооборот (Turnover / T/O)
Определение: Общая стоимость проданных товаров за период.
Формула:
Товарооборот = Сумма всех продаж
Не путать с выручкой! Выручка = Товарооборот - возвраты - скидки.
SQL в Northwind:
SELECT
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS turnover
FROM order_details od;
3.6 Маржинальность (Margin)
Определение: Доля прибыли в цене товара.
Формула:
Маржинальность = (Цена продажи - Себестоимость) / Цена продажи × 100%
Пример:
Продаем товар за 1000 ₽
Себестоимость = 700 ₽
Маржинальность = (1000 - 700) / 1000 = 30%
Что важно: Маржинальность показывает, сколько денег остается компании после покрытия прямых затрат.
3.7 Оборачиваемость склада (Inventory Turnover)
Определение: Сколько раз за период товар продается и заменяется на складе.
Формула:
Оборачиваемость = Себестоимость проданных товаров / Средний остаток на складе
Пример:
Себестоимость проданных товаров за год = 10 000 000 ₽
Средний остаток на складе = 1 000 000 ₽
Оборачиваемость = 10 раз в год
Интерпретация:
Высокая оборачиваемость → товар быстро продается (хорошо)
Низкая оборачиваемость → товар залеживается (плохо, увеличивает затраты на хранение)
3.8 Out-of-Stock (OOS)
Определение: Доля времени, когда товара нет в наличии.
Формула:
OOS = Дни без товара / Всего дней × 100%
Почему это плохо:
Потеря продаж (клиент уходит к конкуренту)
Снижение лояльности
Ухудшение метрик (заниженный средний чек)
SQL в Northwind (имитация):
-- Товары, которые закончились (units_in_stock = 0)
SELECT
product_name,
units_in_stock
FROM products
WHERE units_in_stock = 0;
ТЕМА 4. ПРОЦЕССНЫЙ ПОДХОД (ДЕКОМПОЗИЦИЯ)
Декомпозиция — это разбиение сложной задачи на простые составляющие.
4.1 Как искать причину падения метрики?
Метод «Дерево факторов»:
Падение выручки (-5%)
│
├─ Продажи упали
│ ├─ Меньше клиентов
│ │ ├─ Меньше трафика
│ │ └─ Меньше конверсия
│ └─ Меньше средний чек
│ ├─ Дешевые товары
│ └─ Меньше товаров в корзине
│
└─ Цены упали
├─ Скидки
└─ Снижение цен
4.2 Формула декомпозиции
Выручка = Трафик × Конверсия × Средний чек
Пример расчета:
Показатель |
Прошлый месяц |
Текущий месяц |
Изменение |
|---|---|---|---|
Трафик |
10 000 |
9 500 |
-5% |
Конверсия |
5% (0.05) |
5.2% (0.052) |
+4% |
Средний чек |
1000 ₽ |
950 ₽ |
-5% |
Выручка |
500 000 |
469 300 |
-6.14% |
Что делать:
Трафик упал на 5% → возможно, проблема с рекламой
Средний чек упал на 5% → возможно, переключение на дешевые товары
4.3 Пример ответа на собеседовании
Вопрос: «Наша выручка упала на 5% за месяц. Как будешь искать причину?»
Правильный ответ (структурированный):
Сначала проверю данные:
Нет ли технических ошибок (сбой в базе, неправильная выгрузка)
Сравню с аналогичным периодом прошлого года (сезонность)
Разложу выручку на факторы:
Выручка = Количество заказов × Средний чек
Количество заказов = Активные клиенты × Частота покупок
Активные клиенты = Новые + Вернувшиеся - Отток
Проверю каждый фактор:
Не упал ли трафик? (маржа, конверсия)
Не упал ли средний чек? (скидки, смена ассортимента)
Не вырос ли отток? (конкуренты, сервис)
Построю воронку:
Посетители → Корзина → Заказ → Оплата
На каком этапе падение?
Сделаю выводы и предложу гипотезы:
Если упал трафик → бюджет на рекламу
Если упала конверсия → UX/цена
Если упал средний чек → кросс-селлы/апселлы
ИТОГОВАЯ ШПАРГАЛКА ДЛЯ СОБЕСЕДОВАНИЯ
Метрика |
Формула |
Зачем |
|---|---|---|
DAU/MAU |
Количество пользователей в день/месяц |
Оценить размер аудитории |
Stickiness |
DAU / MAU × 100% |
Понять частоту возврата |
Retention |
Вернулись / Зарегистрировались |
Оценить удержание |
Churn |
(Начало - Конец) / Начало × 100% |
Оценить отток |
ARPU |
Выручка / Все пользователи |
Доход на всех |
ARPPU |
Выручка / Платящие |
Доход на платящих |
LTV |
ARPU / Churn |
Пожизненная ценность |
CAC |
Затраты / Новые клиенты |
Стоимость привлечения |
ROMI |
(Выручка - Затраты) / Затраты × 100% |
Окупаемость маркетинга |
Средний чек |
Выручка / Количество заказов |
Типичный размер покупки |
Конверсия |
Целевые действия / Всего × 100% |
Эффективность воронки |
ABC-XYZ |
Матрица классификации |
Управление ассортиментом |
Маржинальность |
(Цена - Себест.) / Цена × 100% |
Прибыльность товара |
Оборачиваемость |
Себест. / Средний остаток |
Эффективность склада |
ПРАКТИЧЕСКОЕ ЗАДАНИЕ ДЛЯ СТУДЕНТА
На основе Northwind напишите отчет для CEO компании:
Выручка за 1997 год
Средний чек по месяцам
Количество уникальных клиентов (MAU по месяцам)
Топ-5 товаров по выручке (категория A)
Товары, которые не продавались (Out-of-Stock потенциальные проблемы)
LTV клиентов (Топ-10 самых ценных)
Решение:
-- 1. Выручка за 1997 год
SELECT
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS total_revenue_1997
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
WHERE EXTRACT(YEAR FROM o.order_date) = 1997;
-- 2. Средний чек по месяцам
SELECT
DATE_TRUNC('month', o.order_date) AS month,
AVG(od.quantity * od.unit_price * (1 - od.discount)) AS avg_check
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
WHERE EXTRACT(YEAR FROM o.order_date) = 1997
GROUP BY DATE_TRUNC('month', o.order_date)
ORDER BY month;
-- 3. Количество уникальных клиентов по месяцам
SELECT
DATE_TRUNC('month', order_date) AS month,
COUNT(DISTINCT customer_id) AS unique_customers
FROM orders
WHERE EXTRACT(YEAR FROM order_date) = 1997
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY month;
-- 4. Топ-5 товаров по выручке
SELECT
p.product_name,
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS revenue
FROM products p
JOIN order_details od ON p.product_id = od.product_id
GROUP BY p.product_id, p.product_name
ORDER BY revenue DESC
LIMIT 5;
-- 5. Товары, которые не продавались
SELECT product_name
FROM products
WHERE product_id NOT IN (
SELECT DISTINCT product_id
FROM order_details
);
-- 6. Топ-10 LTV клиентов
SELECT
c.customer_id,
c.company_name,
SUM(od.quantity * od.unit_price * (1 - od.discount)) AS ltv
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_details od ON o.order_id = od.order_id
GROUP BY c.customer_id, c.company_name
ORDER BY ltv DESC
LIMIT 10;