Короткий ответ
Грубая оценка lifetime — среднее значение разницы между датой последнего и датой первого события пользователя, но для ещё активных пользователей это значение занижено (right-censoring), поэтому его нужно интерпретировать с оговоркой.
Как это работает подробнее
для каждого пользователя находим MIN(event_date) и MAX(event_date), разницу усредняем по всем пользователям.
Пример кода
product_metrics.sql
-- PostgreSQL
SELECT AVG(last_event - first_event) AS avg_lifetime_days
FROM (
SELECT user_id,
MIN(event_date) AS first_event,
MAX(event_date) AS last_event
FROM events
GROUP BY user_id
) t
WHERE last_event < CURRENT_DATE - INTERVAL '60 days'; -- считаем только точно "ушедших"Что использовать на практике
- Применение. такую оценку корректно применять только к пользователям, которые точно "ушли" (например, не было активности 60+ дней) — активные пользователи ещё не закончили свой lifetime, и включение их в расчёт как есть занижает среднее; для точной оценки нужны методы выживаемости (survival analysis).
- Проверка или пример. Проверка: сравнить результат с медианой (менее чувствительна к выбросам) — сильное расхождение среднего и медианы говорит о длинном хвосте распределения.
Подводные камни
- Частая ошибка. включают в расчёт всех пользователей без разделения на "ушедших" и "ещё активных", получая заниженное и смещённое среднее; не исключают пользователей с одним-единственным событием, которые могут быть тестовыми/ботами.