Если в отчёте уже есть конверсия по дням, каналам или кампаниям, функция «среднее» почти наверняка даст неверный итог. Для общей конверсии сложите целевые действия во всех строках, отдельно сложите подходящий знаменатель и разделите одну сумму на другую.
Такой расчёт работает, когда строки описывают непересекающиеся срезы, а целевое действие, единица знаменателя и правило подсчёта во всех строках одинаковы.
Почему среднее из процентов завышает результат
У процента нет собственного веса. Строка со 100 сеансами и строка с 900 сеансами при обычном среднем влияют на итог одинаково, хотя вторая описывает в девять раз больше трафика.
Рассмотрим учебный отчёт:
| Дата | Канал | Сеансы | Лиды | Конверсия строки |
|---|---|---|---|---|
| 1 октября | бренд | 100 | 10 | 10% |
| 1 октября | общий | 900 | 27 | 3% |
| 2 октября | бренд | 200 | 18 | 9% |
| 2 октября | общий | 800 | 20 | 2,5% |
Если сложить четыре процента и разделить на четыре, получится 6,125%. Этот результат предполагает, что каждая строка имеет одинаковый вес.
Правильный расчёт использует исходные величины:
(10 + 27 + 18 + 20) / (100 + 900 + 200 + 800) × 100%
= 75 / 2 000 × 100%
= 3,75%У среднего из процентов все строки весят одинаково; в общем расчёте вес строки задаёт её знаменатель.
Формула общей конверсии
Для строк от 1 до n:
CRобщая = Σ целевых действий / Σ знаменателя × 100%Знаменателем могут быть сеансы, пользователи, клики, заявки или другие сущности. Выберите одну и не смешивайте её с остальными. Если в одной строке конверсия рассчитана на пользователей, а в другой — на сеансы, общий процент не имеет однозначного смысла.
Тот же результат даёт взвешенное среднее, где вес каждой строки равен её знаменателю:
CRвзвешенная = Σ(CRi × знаменательi) / Σ знаменателяiНа практике безопаснее хранить в выгрузке числитель и знаменатель и пересчитывать итог из них. Округлённые проценты могут добавить небольшую погрешность. Если таблицу строил ИИ, дополнительно сверьте состав строк и контрольные суммы по чек-листу приёмки AI-сводки.
Это согласуется с тем, как описаны доли в схеме метрик Google Analytics Data API: например, engagement rate определяется как отношение engaged sessions к sessions. В документации GA4 ключевые события также считаются и выводятся рядом с измерениями отчёта; перед агрегацией важно сохранить сами количества и подходящий знаменатель.
Что проверить до сложения строк
Одинаковая формула ещё не гарантирует сопоставимость данных. Проверьте пять условий.
- Одно целевое действие. Во всех строках считается один и тот же лид, заказ или другое событие.
- Одно правило подсчёта. Если заказ учитывается один раз, не смешивайте его со строками, где повторное событие увеличивает счётчик. Отдельная проверка описана в материале «Одна заявка — две конверсии в отчёте».
- Один знаменатель. Сеансы складываются с сеансами, пользователи — с пользователями. Пользователь может попасть в несколько строк, поэтому сумма пользователей по каналам не всегда равна числу уникальных пользователей за период.
- Непересекающиеся строки. Не складывайте строку «Итого» с её детализацией. После объединения таблиц также проверьте, не размножились ли расходы или события; для этого есть разбор повторов после join.
- Одинаковый период и атрибуция. Дата клика и дата конверсии могут относить одно действие к разным строкам. Зафиксируйте модель отчёта до сравнения.
Если нужно вспомнить базовую формулу и выбрать целевое действие, начните с ответа «Как рассчитать конверсию сайта».
Воспроизводимая проверка на CSV
Сохраните учебные строки в example.csv:
date,channel,sessions,leads
2026-10-01,brand,100,10
2026-10-01,generic,900,27
2026-10-02,brand,200,18
2026-10-02,generic,800,20Скрипт ниже считает обычное среднее, взвешенную конверсию и контрольный итог:
import csv
from decimal import Decimal
with open("example.csv", encoding="utf-8") as source:
rows = list(csv.DictReader(source))
rates = [Decimal(row["leads"]) / Decimal(row["sessions"]) for row in rows]
sessions = sum(Decimal(row["sessions"]) for row in rows)
leads = sum(Decimal(row["leads"]) for row in rows)
plain_mean = sum(rates) / Decimal(len(rates))
weighted = sum(
rate * Decimal(row["sessions"])
for rate, row in zip(rates, rows)
) / sessions
total = leads / sessions
print(f"Среднее: {plain_mean * 100:.4f}%")
print(f"Взвешенная: {weighted * 100:.4f}%")
print(f"По суммам: {total * 100:.4f}%")
assert weighted == totalРезультат:
Среднее: 6.1250%
Взвешенная: 3.7500%
По суммам: 3.7500%Когда арифметика верна, а вывод всё равно ошибочен
Общая конверсия может измениться из-за состава трафика. Например, доля брендового канала с высокой конверсией выросла, хотя показатели каждого канала почти не изменились. Поэтому после общего итога посмотрите динамику по устойчивым сегментам и их долям.
В воронке важно также соблюдать порядок сущностей и период созревания лида. Сеанс, лид, квалифицированный лид и продажа возникают в разные моменты. Подход к такой диагностике разобран в материале «Как диагностировать провал воронки продаж».
Рабочий порядок короткий: сохраните числитель и знаменатель, проверьте сопоставимость строк, сложите исходные количества и только затем рассчитайте процент. Среднее из готовых процентов используйте лишь тогда, когда все знаменатели одинаковы — и это проверено по данным.
Источники
Материал подготовлен редакцией WiseLab с помощью AI. Источники и фактические утверждения проверены при подготовке.
Что думаете?
Загружаем комментарии…