Короткий ответ
Простое среднее арифметическое долей по группам (AVG долей) игнорирует разный размер этих групп, поэтому правильный способ — считать взвешенную конверсию как SUM(converted) / SUM(total) по всем строкам сразу, а не усреднять уже готовые проценты.
Как это работает подробнее
если в регионе A было 10 визитов и 5 конверсий (50%), а в регионе B — 1000 визитов и 300 конверсий (30%), простое среднее долей даст (50%+30%)/2 = 40%, что никак не отражает реальную общую конверсию (5+300)/(10+1000) ≈ 29.4% — потому что простое среднее не учитывает, что регион B весит в данных гораздо больше.
Пример кода
question-65.sql
SELECT SUM(converted) * 1.0 / SUM(total_visits) AS overall_conversion
FROM region_stats;
-- НЕВЕРНО для сравнения с общим показателем: AVG(converted::float / total_visits) AS naive_avgЧто использовать на практике
- Практика. эта разница становится особенно важной (и может приводить к парадоксу Симпсона), когда сравнивают агрегированные группы с сильно разным объёмом — например, конверсия по дням недели, по странам с разным трафиком или по когортам разного размера. Перед усреднением процентных метрик всегда стоит спросить: «веса групп одинаковы или сильно различаются?»
- Проверка. Проверка: сравнить
overall_conversionс результатом прямого расчёта по необобобщённым даннымSELECT COUNT(CASE WHEN converted THEN 1 END)::float / COUNT(*) FROM raw_visits— они должны совпасть, а наивное среднее долей — как правило, нет.
Подводные камни
- Частая ошибка. усредняют уже посчитанные в отдельных строках проценты (
AVG(conversion_rate)по регионам) вместо пересчёта от первичных числителя и знаменателя — это распространённая ошибка в сводных дашбордах, собранных из уже агрегированных таблиц без доступа к исходным числителю/знаменателю.