KPI: определить измерение и решение до панели

Кратко

KPI — показатель, выбранный для отслеживания цели. Число не устанавливает причину и не доказывает коммерческую ценность или безопасность.

Вымышленная пустая аналитическая комната: два стола с чистыми карточками, латунные лампы и бордовая папка
В этой статье

KPI — показатель, выбранный для отслеживания цели. Число не устанавливает причину и не доказывает коммерческую ценность или безопасность.

Составить договор измерения

Запишите цель, формулу, единицу, числитель, знаменатель, аудиторию и период. Назовите ответственного и решение. Стоимость лида не равна стоимости нового клиента: укажите состав затрат и определение результата.

Проверить изменение до действия

Проверьте охват, повторы, задержки и изменения определений. Среднее долей не обязательно равно общей доле: используйте соответствующие количества. Порог требует расследования, а не даёт готовую причину. Инструмент не гарантирует качество сбора.

Контрольные вопросы
ПунктЧто документировать
ОпределениеЗаписанные формула, единица и охват
КачествоПроверены охват, повторы и доступность
РешениеЯсные ответственный, действие и ограничения

Источники и проверка

Свяжите каждый KPI с контрактом и решением.

Полезная метрика определяет действие, которое должно быть оправдано изменением. Перед установкой целевого значения задокументируйте формулу, совокупность, источник и условия, чтобы число было неполным. Панель мониторинга может правильно соответствовать своему определению, но не отвечать на бизнес-вопрос, если единица измерения или область применения отличаются.

  • Запишите числитель, знаменатель и исключения.
  • Проверьте известный случай от события до графика.
  • Покажите последнее обновление и периоды, которые все еще не завершены.

Первичный источник: Google SRE — Data Processing Pipelines. Связанный метод: прочитать практическое руководство.

Придайте KPI контекст.

KPI в процентах должен иметь единицы измерения, количество и период. В противном случае идентичные значения могут представлять очень разные объемы и неопределенности.

  • Публикуйте числитель и знаменатель вместе с ставкой.
  • Документируйте частичный сбор данных и отсутствие данных о целевой аудитории перед интерпретацией.

Первичный источник: NIST/SEMATECH — Confidence intervals for proportions. Связанный метод: прочитать практическое руководство.

Целостность соединений данных

Соединение таблиц может размножить строки и исказить суммы.

  • Строка заказов означает заказ, а строка позиций — товар в нём. До объединения проверьте повторяющиеся и пустые ключи.
  • Сгруппируйте позиции по ключу заказа. Соединение с этим результатом не повторяет сумму заказа для каждой позиции. Сверьте сумму с исходной таблицей заказов.
  • LEFT JOIN сохраняет заказы без позиций, но WHERE по правой таблице может их удалить. Отсутствие соответствия не означает нулевую сумму.

Воспроизводимый приёмочный случай

Вымышленный пример: данные не описывают клиента или наблюдаемый результат.

Посмотреть данные случая
{
    "orders": [
        {
            "id": 1,
            "total": 100
        },
        {
            "id": 2,
            "total": 200
        }
    ],
    "line_order_ids": [
        1,
        1,
        2
    ],
    "sum_before": 300,
    "sum_after_raw_join": 400
}

Ожидаемое решение

400 дважды учитывает заказ. Сначала сгруппируйте строки по заказу, чтобы получить 300. Проверить также два вымышленных заказа по 100: сумма 200. SUM(DISTINCT total) вернёт 100, удалив допустимое значение. Проверять идентификаторы и кардинальность соединения, а не устранять повторы сумм.

Воспроизводимые SQL-запросы

Вымышленный пример: заказы на 100 и 200 и три позиции для 1, 1 и 2. Запросы используют только VALUES; выполняйте их в тестовой среде.

WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2))
SELECT COUNT(*) AS rows, SUM(o.total) AS total
FROM orders o JOIN lines l ON l.order_id = o.id;
WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2)),
per_order AS (
  SELECT order_id, COUNT(*) AS line_count
  FROM lines GROUP BY order_id
)
SELECT COUNT(*) AS orders, SUM(o.total) AS total
FROM orders o LEFT JOIN per_order l ON l.order_id = o.id;

Прямое соединение даёт три строки и 400. Предварительная агрегация возвращает два заказа и 300.

WITH orders(id, total) AS (VALUES (1, 100), (2, 100))
SELECT SUM(total) AS correct_total,
       SUM(DISTINCT total) AS distinct_total
FROM orders;

При суммах 100 и 100 правильный итог — 200; SUM(DISTINCT total) даёт 100.

Процедура проверки

  1. Определите детализацию заказов и строк.
  2. Соедините заказ с двумя строками.
  3. Сохраните ключи, количества и сверенные суммы.

PostgreSQL — Table expressions and joins

Достаточно SUM(DISTINCT total)?

Нет. Два заказа по 100 дают 200, а SUM(DISTINCT total) возвращает 100. Исправляйте связь ключей, а не удаляйте равные суммы.

Первичный источник: PostgreSQL — Table expressions and joins. Связанный метод: прочитать практическое руководство.