метрикизакон Гудхартаконтр-метрикипродукт

Закон Гудхарта и контр-метрики: как не убить продукт погоней за цифрой

2026-07-11 11 мин

Когда команда упирается в один показатель и гонит его вверх любой ценой, я почти всегда знаю, чем это кончится: цифра вырастет, а продукт станет хуже. Это и есть закон Гудхарта — «когда метрика становится целью, она перестаёт быть хорошей метрикой». Защита от него не про героизм и не про интуицию, а про конкретную инженерию метрик: контр-метрики (guardrail), пары «скорость плюс качество» и одна North Star вместо десятка прокси. Разберу, как это устроено и почему именно аналитик обязан ловить манипуляции первым.

Что такое закон Гудхарта простыми словами?

Формулировку приписывают британскому экономисту Чарльзу Гудхарту — он говорил про денежно-кредитную политику: как только центробанк начинает таргетировать конкретный монетарный агрегат, тот перестаёт вести себя предсказуемо. Позже антрополог Мэрилин Стратерн переформулировала мысль так, как её сегодня цитируют в продуктовых командах: любая мера, превращённая в цель, теряет свойства хорошей меры.

В продукте это выглядит буднично. Мы не умеем напрямую измерить «пользователь получил ценность». Поэтому берём наблюдаемую цифру — заходы, клики, длину сессии — и договариваемся считать её сигналом ценности. Пока цифра просто наблюдается, она честно коррелирует с тем, что нам важно. Как только за неё начинают премировать, увольнять и защищать квартальные планы, люди оптимизируют именно её. И оптимизируют изобретательно: находят самый дешёвый способ подвинуть число, не трогая ту самую ценность, ради которой метрику вводили.

Почему хорошая метрика ломается, когда становится целью?

Потому что почти любая метрика — это прокси. Она стоит вместо настоящей цели, которую тяжело или дорого измерить. Между прокси и целью всегда есть зазор, и в спокойном режиме он маленький. Давление на метрику растягивает этот зазор: люди двигают прокси, а цель остаётся на месте или проседает.

Классический пример — DAU. Дневная активность — приличный прокси вовлечённости, пока вы её просто смотрите. Поставьте DAU целью команды роста — и появятся пуши в 22:00, счётчики непрочитанного, «войдите, чтобы забрать награду». DAU поедет вверх, а удержание на длинном горизонте и NPS поедут вниз, потому что вы обучили продукт дёргать людей, а не давать им пользу.

Механика всегда одна: у сотрудника есть выбор между дорогим честным способом двинуть метрику (сделать продукт лучше) и дешёвым способом (накрутить прокси). Если система награждает за цифру, а не за результат, рациональный человек выбирает дешёвый путь. Это не про плохих людей — это про плохо спроектированные стимулы.

Как выглядит геймификация метрик на реальных примерах?

Самые узнаваемые случаи — там, где метрику привязали к KPI и бонусу.

Колл-центр, где оператору платят за количество обработанных звонков. Среднее время разговора падает, «обработано в час» растёт, отчёт зелёный. А на деле операторы сбрасывают сложные обращения, лишь бы взять следующий простой звонок. Проблема клиента не решена — он перезванивает, и один и тот же человек засчитывается как три успешных контакта.

Реклама и контент, где цель — CTR. Заголовки мутируют в кликбейт, ставятся кричащие превью. Клики растут, а конверсия в покупку и время на странице падают, потому что пришли люди, которых обманули ожиданием.

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

Такой разрыв легко увидеть в данных, если вообще додуматься посмотреть на пару метрик сразу:

-- Операторы: «производительность» против реальной решённости
SELECT
    o.operator_id,
    COUNT(*)                                   AS calls_handled,
    ROUND(AVG(o.duration_sec), 1)              AS avg_duration,
    -- контр-метрика: доля клиентов, перезвонивших в течение 24 часов
    ROUND(AVG(CASE WHEN c.recontacted_24h THEN 1 ELSE 0 END), 3) AS recontact_rate
FROM calls o
JOIN call_outcomes c ON c.call_id = o.call_id
WHERE o.created_at >= DATE('now', '-30 day')
GROUP BY o.operator_id
ORDER BY calls_handled DESC;

Оператор с рекордным calls_handled и подозрительно низким avg_duration часто идёт в паре с высоким recontact_rate. Это и есть подпись Гудхарта: локальный чемпион по прокси-метрике проваливает настоящую цель. Похожие расследования удобно тренировать на разборах в кейсах — там как раз даётся сырой набор данных и задача докопаться до того, что цифра скрывает.

Что такое контр-метрики и guardrail-метрики?

Контр-метрика (её же называют guardrail, «ограждение») — это показатель, который специально двигается в противоположную сторону, если основную метрику начинают накручивать нечестно. Вы не оптимизируете guardrail, вы за ним следите: он должен оставаться в допустимом коридоре, пока вы гоните основную метрику.

Пары «метрика — контр-метрика», которые я держу в голове:

В экспериментах guardrail-метрики — обязательная часть дизайна. Вы катите A/B-тест на новую механику, у которой цель — поднять активацию. Заранее фиксируете, что при этом не должны просесть удержание 30-го дня, доля жалоб и время загрузки. Если основная метрика выросла, а guardrail пробил порог — это не победа, это перекладывание проблемы в другой карман. Такие ловушки любят на собеседованиях: посмотрите разбор в вопросах по продуктовой аналитике, там регулярно спрашивают, какие guardrail вы бы поставили к предложенной метрике.

Зачем держать метрики парами: скорость и качество?

Одиночная метрика всегда однобока, потому что у любого действия есть две стороны — сколько и насколько хорошо. Скорость без качества деградирует в халтуру, качество без скорости — в паралич. Поэтому здоровая система метрик почти всегда парная.

«Быстрее отвечаем в поддержке» превращается в «быстрее отписываемся», если рядом нет метрики решённости с первого контакта. «Больше заказов» превращается в «раздали промокоды в минус», если рядом нет маржи. Пара работает как система сдержек: команда физически не может выиграть по одной цифре, обвалив вторую, потому что смотрят на обе.

Посчитать пару на Python — минута работы. Считаю доставку заказов: скорость (медиана времени) и качество (доля без возврата) в одной таблице:

import pandas as pd

# orders: order_id, courier_id, delivery_minutes, is_returned, delivered_at
df = pd.read_parquet("orders.parquet")
recent = df[df["delivered_at"] >= "2026-06-01"]

report = (
    recent.groupby("courier_id")
    .agg(
        orders=("order_id", "count"),
        speed_median_min=("delivery_minutes", "median"),   # скорость
        return_rate=("is_returned", "mean"),               # качество (контр-метрика)
    )
    .reset_index()
)

# «Подозреваемые»: быстрые, но с высокой долей возвратов
suspects = report[
    (report["speed_median_min"] < report["speed_median_min"].median())
    & (report["return_rate"] > report["return_rate"].quantile(0.75))
]
print(suspects.sort_values("return_rate", ascending=False))

Тот, кто «возит быстрее всех», но собрал верхний квартиль по возвратам, скорее всего гонит скорость за счёт брошенных у двери или перепутанных заказов. Потренировать такие срезы можно в Python-тренажёре, а логику агрегатов на SQL — в SQL-тренажёре с настоящим PostgreSQL в браузере.

Чем North Star лучше набора прокси-метрик?

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

Разница принципиальная. Прокси-метрику легко накрутить, потому что она узкая: клики, заходы, отправленные сообщения. North Star подобрана так, что накрутить её дёшево уже нельзя — придётся и правда дать ценность. Для маркетплейса это не «визиты», а что-то вроде «выкупленных заказов на активного покупателя»; для медиасервиса — не «клики по плейлисту», а «часы реально прослушанного контента»; для B2B-инструмента — не «заведённые аккаунты», а «команды, которые дошли до регулярного использования».

Когда North Star определена, прокси перестают быть самоцелью и становятся рычагами. Мы по-прежнему смотрим на клики и заходы, но задаём другой вопрос: двигают ли они верхнюю метрику или отрываются от неё. Если DAU растёт, а North Star стоит — значит, активность накручена и ценности в ней нет. Дерево метрик под North Star помогает не потерять эту связь; собрать его аккуратно на SQL можно, пройдя базовые агрегаты в курсе по SQL, а синтаксис под рукой держать в SQL-справочнике.

Как аналитику ловить манипуляции с метриками?

Это прямая часть моей работы, и держится она на нескольких привычках.

Смотреть на распределение, а не на среднее. Среднее время ответа улучшилось — а что с 90-м перцентилем? Часто среднее двигают, отрезав хвост дешёвых случаев, а тяжёлые обращения при этом стали хуже. Медиана и перцентили врут заметно реже.

Резать по сегментам. Метрика в целом выросла — а по когортам, каналам, командам? Гудхартовская накрутка обычно локальна: один менеджер, один канал, один город тянут агрегат, оставаясь аномалией на фоне остальных.

Держать при каждой целевой метрике её контр-метрику и требовать смотреть на обе. Если в дашборде «конверсия» есть, а «возвратов» нет — дашборд врёт по построению.

Проверять определение метрики глазами того, кого по ней оценивают. Полезное упражнение: «представь, что твоя премия зависит от этой цифры — как ты накрутишь её, ничего не улучшив?». Найденные дешёвые лазейки сразу превращаются в guardrail. Такой стресс-тест метрик стоит прогонять и на тренировочных задачах, где нужно самому предложить и защитить набор показателей.

И самое неудобное политически — говорить вслух, когда цифра зелёная, а продукт нет. Аналитик, который молчит про разъезжающийся зазор между прокси и целью ради красивого отчёта, сам становится частью механизма Гудхарта.

Как собрать систему метрик, устойчивую к закону Гудхарта?

Свести всё вместе можно коротким чек-листом, который я держу под рукой перед запуском любой метрики или эксперимента.

Ни один из этих пунктов не спасает сам по себе — работает только система целиком. Метрика без guardrail будет накручена, guardrail без North Star позволит выигрывать по мелочам ценой главного, а North Star без сегментного контроля вы просто не заметите, как перестала расти.

Если хотите довести это до автоматизма — считать пары «метрика — контр-метрика», строить дерево под North Star и отлавливать накрутку в распределениях, — на тренажёре подготовки аналитиков это отрабатывается на живых данных: SQL и Python в браузере, продуктовые кейсы и разбор метрик с формулами. Pro открывает все 425 SQL- и 402 Python-задачи, кейсы и метрики без ограничений — удобно, когда хочется натренировать этот навык до состояния, в котором вы ловите Гудхарта на цифрах ещё до того, как он попадёт в квартальный отчёт.

Считай метрики в тренажёре
Воронки, retention и юнит-экономика на SQL-задачах — бесплатно.
SQL-тренажёр →