← Главная

Методология и прозрачность расчётов

OLAP
ClickHouse
Графики
Корзина
Скидки
Шринкфляция

Как именно считаются метрики в аналитике

Эта страница описывает методику расчётов “как в коде”: что именно мы берём из данных, как нормализуем единицы измерения, какие агрегации применяем и как интерпретировать метрики. Цель — воспроизводимость и аудит.

Что является “точкой” на графике

Базовая гранулярность исходных данных — “товар в день”. Для выбранной цели (товар / категория / поиск) и метрики мы строим серию по времени.

Два уровня агрегации (один запрос)
1) Агрегация по сущностям внутри дня
Если цель — категория или поиск, в один день попадает много товаров. Мы сначала сводим их в одно значение за день методом entityAggregation (среднее/медиана/перцентили и т.д.).
2) Агрегация по времени внутри бакета
Если шаг времени больше дня (неделя/месяц…), мы дополнительно агрегируем дневные значения внутри бакета методом timeAggregation.

Дополнительно в каждую точку возвращается sampleSize (сколько наблюдений участвовало), а также minInSample/maxInSample — “коридор” значений в выборке, полезный для тултипов.

Что именно мы измеряем

Доступные метрики
  • Цена за упаковку (со скидкой / без скидки)
  • Цена за единицу (со скидкой / без скидки)
  • Размер упаковки (для шринкфляции)
  • Глубина скидки (%)
  • Доля товаров со скидкой (%)

Цены: со скидкой и без

Мы храним и используем две версии цены для одного и того же наблюдения: “регулярную” (без скидки) и “фактическую” (с учётом скидки).

Соответствие метрик полям
PRICE_PACK_REGULAR
default_priceWithoutDiscount
PRICE_PACK_DISCOUNTED
default_price
PRICE_UNIT_REGULAR
converted_priceWithoutDiscount
PRICE_UNIT_DISCOUNTED
converted_price

Важно: если вы выбираете метрику “со скидкой”, вы смотрите на реальную цену покупки в момент времени (если скидка активна). “Без скидки” — это базовая цена, на которую можно нормально сравнивать динамику.

Пересчёт веса/объёма к общей единице

Для сравнения разных упаковок мы используем “цену за единицу” (литр/килограмм/штука), которая хранится в полях converted_*. Единица измерения — converted_unit.

Принцип
Цена за единицу считается как:
converted_price = default_price / converted_size
Где converted_size — размер упаковки, приведённый к выбранной единице (kg/l/piece).
Важно для категорий/поиска
В одной категории могут смешиваться литры и килограммы (или разные “типы” unit). Чтобы не строить некорректную агрегацию, для метрик PRICE_UNIT_* мы определяем доминирующую converted_unit в выборке и фильтруем данные по ней, если её доля > 50%.

Скидки: глубина и проникновение

Глубина скидки (DISCOUNT_DEPTH_PERCENT)
Показывает, насколько фактическая цена ниже регулярной (в процентах). Если доступна цена за единицу — считаем по ней, иначе по цене за упаковку.
discount% = (regular - discounted) / regular * 100
Доля товаров со скидкой (DISCOUNT_PENETRATION)
Доля наблюдений в выборке, где hasDiscount = 1. Это “текущая насыщенность скидками” в выбранном разрезе.
penetration% = avg(hasDiscount) * 100

Интерпретация: “глубина” отвечает на вопрос “насколько сильно скидки режут цену”, “проникновение” — “на какой доле товаров они есть”.

Шринкфляция

Метрика SHRINKFLATION_SIZE — это default_size (размер/вес упаковки). На графике удобно смотреть тренд “упаковка уменьшается или нет” по товару или по категории.

Важно
Это не “инфляция цены”, а изменение количества продукта в упаковке. Для полной картины сравнивайте вместе с PRICE_UNIT_*.

Корзина и “персональная инфляция”

Корзина — это сумма по позициям unitPrice × quantity, где позиция может быть: категория (цена агрегируется по выборке) или конкретный товар (берётся фактическая цена товара).

Формулы
itemTotal = unitPrice * quantity basketTotal = sum(itemTotal) inflation% (корзина) = (basketTotal_to - basketTotal_from) / basketTotal_from * 100
Как выбирается цена “на дату”
Для товара и категории мы берём ближайшие доступные данные за последние 7 дней до указанной даты — это снижает “дыры” в данных, если в конкретный день не было обновления.

Товар / категория / поиск — отличия

Товар
В точке графика нет “выборки”: это один товар. sampleSize = 1, а min/max совпадают со значением метрики.
Категория
Внутри дня агрегируем много товаров. Для PRICE_UNIT_* может примениться фильтр по доминирующей единице, чтобы не смешивать “кг” и “л”.
Поиск
Выборка определяется подстрокой в названии товара (регистронезависимо). Дальше логика такая же, как у категории.

Примечания по качеству интерпретации

Выбор агрегатора
Для категорий чаще всего лучше медиана/перцентили: они устойчивее к выбросам (очень дорогим/дешёвым товарам).
Скидки и динамика
Сравнивайте “со скидкой” и “без скидки”: первая показывает реальную цену покупки, вторая — базовую динамику цен.
Единицы измерения
Если серия “цена за единицу”, смотрите на подпись единицы (1кг/1л/1шт). Для категорий мы стараемся не смешивать разные unit.