Karometr
Аналитика

Метрики и формулы

Когортный очищенный спрос, сопоставимая панель дилеров, индексы к базе 100 и обеспеченность запасом — методология Karometr.

0. Как читать документ: отношения (ratio) и индексы (index)

В Karometr используются два разных типа метрик, и подменять одно другим методологически неверно:

Отношение (ratio)Индекс (index, база 100)
Что измеряетабсолютный физический уровень в моментеизменение периода tt относительно периода сравнения, в сопоставимых условиях
ПримерStockDayst\text{StockDays}_t, CancellationRatet,h\text{CancellationRate}_{t,h}Indexperiod(t)\text{Index}_{\text{period}}(t), Indexyear(t)\text{Index}_{\text{year}}(t)
Обязательное условие корректностиединый момент фиксации (ItI_t — конец периода)расчёт только на сопоставимой панели дилеров Dt,pD_{t,p} (раздел 4) и с календарной корректировкой (раздел 6)
Отвечает на вопрос«сколько сейчас»«насколько изменилось с точки сравнения, без искажения от смены состава источников»
Отношение не менее точно, чем индекс — оно точно ровно так же. Разница не в точности, а в вопросе: ratio — про уровень сейчас, индекс — про изменение относительно точки сравнения, очищенное от смены состава дилерской панели.

1. Переменные и данные

ОбозначениеНазваниеЕдиницаМомент/период фиксацииИсточникНазначениеОграничения
ttтекущий период (день)точка отсчёта времени в формулах
ppлаг сравнения периодаднизадаётся пользователем/дашбордомшаг сравнения для Indexperiod\text{Index}_{\text{period}}должен быть согласован (например, 30 дней)
yyлаг годового сравненияднификсированная константашаг сравнения для Indexyear\text{Index}_{\text{year}}обычно 365; вопрос календарного vs скользящего года открыт (см. раздел 14)
hhокно наблюдения когортыднисогласуется владельцем продуктаопределяет, через сколько дней после заключения контракт считается «устоявшимся»значение (30/60/90) не выбрано — см. раздел 14
CtC_tваловой поток новых контрактовшт.заключены в периоде ttfact_contractsбазовый поток продаж, точка входа всех метрикне учитывает последующие расторжения
XtX_tпоток расторжений периодашт.расторгнуты в периоде tt, независимо от даты заключенияfact_cancellationsнужен для NtN_tне привязан к когорте — нельзя использовать как показатель «спроса периода tt»
NtN_tчистый поток контрактовшт.период ttрасчётная (из CtC_t, XtX_t)операционный индикатор нетто-активности (сколько контрактов на руках прибавилось за период)не является показателем спроса — смешивает расторжения разных когорт
Rt,hR_{t,h}когортные расторженияшт.контракты когорты tt, расторгнутые в пределах окна hhfact_contractsfact_cancellationsчислитель для CancellationRatet,h\text{CancellationRate}_{t,h}, вычитаемое в Zt,hZ_{t,h}требует ожидания окончания окна hh для окончательного значения
Zt,hZ_{t,h}очищенный контрактный спрос когорты ttшт.контракты когорты tt, сохранившие силу после окончания окна hhрасчётнаяосновная метрика спроса — база для индексов и обеспеченности запасомдо истечения hh дней после конца периода tt значение предварительное
ItI_tдоступный складской остатокшт.конец периода ttfact_inventory_snapshotзнаменатель для обеспеченности запасоммомент фиксации (конец дня) должен быть единым во всех источниках — см. раздел 14
DtD_tмножество дилеров с валидными данными в периоде ttмножество IDпериод ttdim_dealer + DQ-статусбаза для сопоставимой панелидилеры с неполной/невалидной выгрузкой исключаются
Dt,pD_{t,p}сопоставимая панель дилеровмножество IDпересечение периодов tt и tpt-pрасчётная, Dt,p=DtDtpD_{t,p} = D_t \cap D_{t-p}ограничивает расчёт индекса только теми, кто присутствует в обоих периодахбез неё сравнение периодов с разным составом источников некорректно

Примечание: переменные LtL_t, StS_t, PtP_t, DtdealD_t^{\text{deal}}, RtresR_t^{\text{res}}, MtM_t (лиды, показы, цена, скидка, резервы, маржа) зафиксированы как возможное расширение модели, но в текущем этапе не являются обязательными к сбору.

2. Первичные показатели: валовой и чистый поток контрактов

Заключение контракта рассматривается как наблюдаемое выражение реализованного покупательского намерения и используется в качестве оперативного индикатора спроса — но не приравнивается ко всему рыночному спросу (часть спроса не доходит до контракта: отказы на более ранних стадиях воронки платформой не фиксируются).

Nt=CtXtN_t = C_t - X_t

Смысл результата: нетто-изменение числа действующих контрактов за период — сколько контрактов «на руках» прибавилось или убавилось.

Единица измерения: штуки за период tt.

Пример интерпретации: за день заключили 10 контрактов, расторгли 3 (из них 2 — контракты, заключённые неделями ранее) → Nt=7N_t = 7.

NtN_tне называется «очищенным» или «реальным» спросом. XtX_t включает расторжения контрактов, заключённых в любых предыдущих периодах, — поэтому NtN_t не привязан к конкретной когорте покупателей периода tt и не измеряет, сколько из контрактов именно этого периода оказались устойчивыми. Для этого используется Zt,hZ_{t,h} (раздел 3).

Условия корректного применения: NtN_t пригоден как операционный индикатор нетто-активности (например, для дашборда «на сколько выросла база активных контрактов»), но не должен подставляться в формулы, где требуется именно спрос когорты периода tt.

3. Очищенный контрактный спрос (когортный)

Когортные расторжения — расторжения контрактов, заключённых в периоде tt, произошедшие в пределах окна наблюдения hh:

Rt,hR_{t,h}

Очищенный контрактный спрос:

Zt,h=CtRt,hZ_{t,h} = C_t - R_{t,h}

Смысл результата: количество контрактов периода tt, которые остались в силе после завершения окна наблюдения hh — то есть подтверждённый, устоявшийся спрос именно этой когорты покупателей.

Единица измерения: штуки, привязанные к когорте tt и окну hh.

Пример интерпретации: из 10 контрактов, заключённых 1 марта, за 30 дней после заключения 2 были расторгнуты → Z1 марта,30=8Z_{\text{1 марта},\,30} = 8.

Окончательное значение Zt,hZ_{t,h} можно получить только после завершения окна наблюдения hh (то есть не раньше t+ht+h). До этого момента показатель должен помечаться и отображаться как предварительный и подлежит пересчёту.

Условия корректного применения: окно hh должно быть единым во всех формулах, где используется Zt,hZ_{t,h} (индексы, обеспеченность запасом, доля расторжений) — сравнение метрик, посчитанных с разным hh, некорректно.

3.1 Доля расторжений

CancellationRatet,h=Rt,hCt×100%\text{CancellationRate}_{t,h} = \frac{R_{t,h}}{C_t} \times 100\%

Смысл результата: какая доля контрактов когорты tt не дожила до конца окна наблюдения hh.

Пример интерпретации: заключили 100 контрактов, 12 расторгнуто в пределах 30 дней → CancellationRatet,30=12%\text{CancellationRate}_{t,30} = 12\%.

Для чего нужен: одновременный рост числа контрактов и доли расторжений может указывать на снижение качества спроса, проблемы с кредитованием, поставками, ценами или на наличие повторных/дублирующих договоров — сам по себе рост CtC_t не является однозначно позитивным сигналом без контроля CancellationRatet,h\text{CancellationRate}_{t,h}.

4. Сопоставимая панель дилеров

Не вся дилерская сеть подключена к платформе, и состав подключённых источников может меняться между периодами. Сравнивать абсолютные суммы по периодам с разным составом источников без нормализации нельзя — рост показателя может означать не рост спроса, а просто подключение новых дилеров.

Dt,p=DtDtpD_{t,p} = D_t \cap D_{t-p}

где:

  • DtD_t — множество дилеров с валидными данными в периоде tt;
  • DtpD_{t-p} — множество дилеров с валидными данными в периоде сравнения tpt-p;
  • Dt,pD_{t,p} — сопоставимая панель: только дилеры, присутствующие в обоих периодах.

Условия корректного применения: все индексы (раздел 5) обязаны считаться только по Dt,pD_{t,p}. Если сравнение по несопоставимой панели всё же нужно (например, для абсолютного объёма рынка «как есть»), это должно сопровождаться явным предупреждением в интерфейсе, а не подаваться как сопоставимая динамика.

5. Индексы (база 100)

Индекс к предыдущему сопоставимому периоду:

Indexperiod(t)=Zt,hZtp,h×100\text{Index}_{\text{period}}(t) = \frac{Z_{t,h}}{Z_{t-p,h}} \times 100

Годовой индекс:

Indexyear(t)=Zt,hZty,h×100\text{Index}_{\text{year}}(t) = \frac{Z_{t,h}}{Z_{t-y,h}} \times 100

где Zt,hZ_{t,h} и Ztp,hZ_{t-p,h} (или Zty,hZ_{t-y,h}) считаются только по дилерам сопоставимой панели Dt,pD_{t,p}.

Интерпретация:

ЗначениеСмысл
100100показатель не изменился
108108рост на 8%
9292снижение на 8%

Единица измерения: безразмерный пункт индекса (база 100).

Условия корректного применения: индекс считается только на сопоставимой панели Dt,pD_{t,p}; для ежедневных данных обязательна календарная корректировка (раздел 6); Zt,hZ_{t,h} на последних hh днях перед датой расчёта — предварительное значение (раздел 3), это должно быть видно в интерфейсе.

Индексы к базе 100 (раздел 5) и взвешенные по модельному ряду индексы Ласпейреса/Пааше/Фишера (раздел 8) решают разные задачи сопоставимости: раздел 5 нормализует изменение состава дилерской панели, раздел 8 — изменение состава модельного ряда. Это не взаимоисключающие метрики.

6. Календарные эффекты (для ежедневных данных)

Понедельник нельзя напрямую сравнивать с воскресеньем — структура спроса по дням недели неоднородна. Для оперативного дневного сравнения применяется один или несколько подходов:

  1. сравнение с аналогичным днём предыдущей недели (t7t-7);
  2. семидневное скользящее среднее;
  3. календарная корректировка по дням недели, праздникам и рабочим дням.

Семидневное скользящее среднее:

MA7,t=17k=06Ztk,hMA_{7,t} = \frac{1}{7} \sum_{k=0}^{6} Z_{t-k,\,h}
Поскольку Ztk,hZ_{t-k,h} становится окончательным только через hh дней после дня tkt-k, для последних hh дней окна MA7,tMA_{7,t} неизбежно будет содержать предварительные значения. Это не ошибка расчёта, а прямое следствие когортной методологии (раздел 3) — интерфейс должен явно показывать, что свежий хвост скользящего среднего предварительный.

7. Складские остатки и обеспеченность запасом

ItI_t — количество доступных для продажи автомобилей на конец периода tt. Момент фиксации должен быть единым во всех источниках (раздел 14) — запас (остаток на момент времени) и поток (события за период) нельзя смешивать без приведения к общему временному масштабу.

StockDayst=ItAverageDailyDemandt\text{StockDays}_t = \frac{I_t}{\text{AverageDailyDemand}_t}

где AverageDailyDemandt\text{AverageDailyDemand}_t — средний дневной очищенный контрактный спрос за выбранное окно ww:

AverageDailyDemandt=1wk=0w1Ztk,h\text{AverageDailyDemand}_t = \frac{1}{w} \sum_{k=0}^{w-1} Z_{t-k,\,h}

Единица измерения: дни.

Пример интерпретации: на складе 300 автомобилей, средний дневной спрос — 10 контрактов в день → StockDayst=30\text{StockDays}_t = 30 дней.

При использовании месячных данных допускается показатель StockMonthst=StockDayst/30\text{StockMonths}_t = \text{StockDays}_t / 30.

Интерпретация в терминах Months of Supply (отраслевой стандарт для недвижимости и авторитейля):

StockMonthst\text{StockMonths}_tСостояние
0–1 (≈ StockDays<30\text{StockDays} < 30)дефицит
1–1.5 (≈ StockDays45\text{StockDays} \approx 45)норма для авторынка
3+ (≈ StockDays>90\text{StockDays} > 90)затоваривание
Показатель по смыслу совпадает с общепризнанным Months of Supply, который в недвижимости и авторитейле трактуется так: 0–4 месяца — рынок продавца (дефицит), 4–5 — сбалансированный рынок, 8+ — рынок покупателя (затоваривание). Более низкие пороги Karometr — не отклонение от стандарта, а его калибровка под более быстрый цикл оборота авто по сравнению с недвижимостью.

7.1 Агрегация обеспеченности запасом по сегменту

При своде по нескольким моделям/брендам в сегмент или по всему рынку — сначала суммировать числитель и знаменатель, затем делить, а не усреднять частные значения по моделям:

StockDayssegment,t=iIi,tiAverageDailyDemandi,t\text{StockDays}_{\text{segment},t} = \frac{\sum_i I_{i,t}}{\sum_i \text{AverageDailyDemand}_{i,t}}
Простое среднее арифметическое StockDaysi\text{StockDays}_i по моделям даёт смещённую оценку (эффект Симпсона: модели с малым остатком, но случайным всплеском спроса, задирают среднее). Корректная агрегация — только через суммы объёмов.

8. Взвешенные индексы по составу модельного ряда (опциональный слой)

Разделы 5–7 нормализуют сравнение по составу дилерской панели, но не по составу модельного ряда: рост продаж дорогой модели и рост продаж бюджетной модели в сумме iZi,t,h\sum_i Z_{i,t,h} учитываются одинаково. Если нужен единый рыночный индекс, устойчивый к изменению модельного ряда (например, при сравнении регионов с разной структурой продаж), применяется классическая схема индексов количества Ласпейреса/Пааше/Фишера, где роль веса значимости играет средняя цена контракта модели.

Ласпейрес (веса базового периода):

DQItL=ipi,0Zi,t,hipi,0Zi,0,h×100DQI^{L}_t = \frac{\sum_i p_{i,0} \, Z_{i,t,h}}{\sum_i p_{i,0} \, Z_{i,0,h}} \times 100

Пааше (веса текущего периода):

DQItP=ipi,tZi,t,hipi,tZi,0,h×100DQI^{P}_t = \frac{\sum_i p_{i,t} \, Z_{i,t,h}}{\sum_i p_{i,t} \, Z_{i,0,h}} \times 100

Фишер (устраняет системные смещения обоих методов):

DQItF=DQItL×DQItPDQI^{F}_t = \sqrt{DQI^{L}_t \times DQI^{P}_t}

где pi,0p_{i,0}/pi,tp_{i,t} — средняя цена контракта модели ii в базовом/текущем периоде (источник — mart_pricing), Zi,t,hZ_{i,t,h} — очищенный когортный спрос по модели ii.

По той же схеме строится индекс запасов SQItFSQI^F_t (подстановка Ii,tI_{i,t} вместо Zi,t,hZ_{i,t,h}) и индекс баланса рынка:

BIt=DQItFSQItF×100BI_t = \frac{DQI^{F}_t}{SQI^{F}_t} \times 100
Этот слой не входит в базовую методику текущего этапа и требует отдельного решения владельца продукта (раздел 14) — нужен ли он на MVP или это метрика следующего этапа.

9. Отложенные/неактуальные для текущего этапа показатели

  1. DIDI (полный сезонно-нормализованный индекс спроса, в отличие от календарной корректировки раздела 6) — не используется в текущей методике. Ориентир при реализации — методология Manheim Used Vehicle Value Index: отсечение выбросов (>2.6σ по цене и пробегу), регрессионная mix-adjustment поправка на пробег, сезонная корректировка (Census X), база 100 на фиксированную дату.
  2. SISI (индекс предложения через baseline) — требует отдельного согласования знаменателя.

10. Сигналы и алерты

Все пороги алертов интерпретируются как коэффициент изменения: значение 1.01.0 означает отсутствие изменений, 2.02.0 — рост в 2 раза, 0.50.5 — снижение вдвое.

  1. Аномалия валового потока контрактов (статистическое правило):
alert, если CtCˉ28>3σ28\text{alert, если } |C_t - \bar{C}_{28}| > 3\,\sigma_{28}

где Cˉ28\bar{C}_{28} — скользящее среднее числа контрактов за 28 дней, σ28\sigma_{28} — скользящее стандартное отклонение за тот же период.

  1. Резкое изменение краткосрочного индекса:
alert, если Indexperiod(t)>300 или <50(p=3)\text{alert, если } \text{Index}_{\text{period}}(t) > 300 \text{ или } < 50 \quad (p = 3)
Порог означает трёхкратный рост за 3 дня — экстремальный сигнал (200%+ скачок). Для 3-дневного окна это намеренно широкий порог, чтобы фильтровать только аномально резкие изменения.
  1. Значительное изменение среднесрочного индекса (p=30p = 30):
alert, если Indexperiod(t)>150 или <70\text{alert, если } \text{Index}_{\text{period}}(t) > 150 \text{ или } < 70
  1. Существенное изменение годового индекса:
alert, если Indexyear(t)>120 или <80\text{alert, если } \text{Index}_{\text{year}}(t) > 120 \text{ или } < 80
  1. Дополнительные сигналы (опционально на этапе v1):
alert, если CVRtleadcontract<0.85×CVRbaselineleadcontract\text{alert, если } CVR_t^{\text{lead}\to\text{contract}} < 0.85 \times CVR_{\text{baseline}}^{\text{lead}\to\text{contract}}alert, если CancellationRatet,h>p90(CancellationRate180d,h)\text{alert, если } \text{CancellationRate}_{t,h} > p_{90}(\text{CancellationRate}_{180d,h})

Второй сигнал: срабатывает, если сегодняшняя доля когортных расторжений выше, чем 90% всех дневных значений за последние 180 дней — попадает в «худшие 10%» за полгода.

11. Контроль качества, версии и предварительные значения

Общий контур контроля качества данных (полнота, дубли, timeliness, справочники) описан в Модели данных и Сверке и аудите. Специфично для когортной методологии данного документа:

  1. Каждая метрика на основе Zt,hZ_{t,h} хранит флаг is_preliminary до истечения окна hh.
  2. Исторические показатели пересчитываются при поступлении запоздавших расторжений (Rt,hR_{t,h}), исправлений задним числом или уточнённых данных — пересчёт затрагивает все зависимые метрики (CancellationRate, индексы, StockDays).
  3. Договор должен иметь единый идентификатор на всём жизненном цикле, включая случаи перезаключения — иначе когортный расчёт Rt,hR_{t,h} будет неверно относить расторжение к чужой когорте.
  4. Тестовые/технические контракты исключаются до расчёта CtC_t.
  5. Полнота ежедневной выгрузки проверяется до включения дилера в DtD_t за период — дилер с неполной выгрузкой не входит в панель этого периода.

12. Конфиденциальность публикации метрик

Ролевой/атрибутный доступ (RBAC/ABAC) и аудит-логирование описаны в ABAC-модели доступа. Дополнительно к общей политике доступа — методологические ограничения именно на публикацию метрик:

  1. Минимальное число дилеров в выборке для публикации показателя.
  2. Минимальное число событий (контрактов) в выборке.
  3. Запрет отображения срезов, по которым можно однозначно определить показатели одного дилера (см. правило анти-деанонимизации в Дашбордах, уровень 2).
  4. Объединение или скрытие слишком узких региональных/модельных срезов, не проходящих пороги (1)–(2).
  5. Публикация индекса вместо абсолютного значения там, где абсолютное значение раскрывает объём конкретного дилера.
Если в городе представлена только одна модель определённого бренда у одного дилера, система не должна раскрывать индивидуальные показатели этого дилера без явно разрешённого режима обмена данными между дилерами.

13. Вопросы владельцу продукта

Следующие параметры методологии не могут быть определены без решения владельца продукта — в документе они оставлены как открытые переменные (hh, pp, yy, ww), а не зафиксированы произвольно:

  1. Какое окно наблюдения hh используется для очищенного спроса Zt,hZ_{t,h}: 30, 60 или 90 дней?
  2. Какая дата считается датой контракта (дата подписания, дата в DMS, дата первого события)?
  3. Как учитываются перезаключённые договоры — сохраняется единый идентификатор или это новая когорта?
  4. Как обрабатываются контракты на один автомобиль, заключённые одним покупателем у нескольких дилеров?
  5. Считается ли расторжение по инициативе дилера и клиента одинаково, или это разные причины с разным весом?
  6. Какой остаток ItI_t используется — на начало или конец дня?
  7. Какие автомобили считаются доступными для продажи (учитываются ли зарезервированные, находящиеся в пути, демо-автомобили)?
  8. Какой минимальный размер выборки (дилеров/событий) допустим для отображения индекса (раздел 12, пункты 1–2)?
  9. Как часто допускается пересчёт исторических показателей и на какую глубину истории?
  10. Какие абсолютные данные можно показывать пользователям, а какие должны быть доступны только в виде индексов?
  11. Нужен ли на текущем этапе взвешенный по модельному ряду слой индексов (раздел 8, DQIDQI/SQISQI/BIBI), или он переносится на следующий этап?
  12. Лаг годового сравнения yy — фиксированные 365 дней или календарный год (с учётом високосных лет)?

14. Источники методологии

  1. Laspeyres, Paasche, Fisher index number methods — geeksforgeeks.org, efinancemanagement.com.
  2. Months of Supply (отраслевой стандарт баланса спроса/предложения) — ShowingTime, Redfin.
  3. Manheim Used Vehicle Value Index (методология ценового индекса: mix-adjustment, сезонность, база 100) — Summary Methodology PDF.
  4. Сопоставимая панель (Dt,pD_{t,p}) методологически аналогична принципу repeat-sales/matched-sample, используемому в индексах недвижимости (например, S&P CoreLogic Case-Shiller): в сравнение включаются только объекты (там — сделки повторной продажи, здесь — дилеры), присутствующие в обоих сравниваемых периодах, что убирает искажение от смены состава выборки.