Раздел 42 · Аналитика данных с нуля

Метрики-отношения: дельта-метод, линеаризация и бакеты

middle~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Фрея · риск-менеджер необанка «Монетка»

Продуктовая команда прислала новый слайд: «Средний чек в кофейнях и фастфуде у теста 535 ₽ против 512 ₽, плюс 4,7%, t-тест, p = 0,014». По всем кафе чек, говорят, не сдвинулся. Чем они считали и можно ли этому верить?

До сих пор мы сравнивали метрики на клиента: долю клиентов с кафе в уроке 54, походы и траты на клиента в уроке 68. Средний чек устроен иначе: это рубли, делённые на оплаты. Жребий бросали клиентам, а считаем мы на оплатах. Сегодня разберём, почему от этого ломается обычный t-тест и как его чинить.

Сколько стоит одна оплата

Данные те же, что в уроке 68: cafe_clients.csv, по строке на клиента, с числом оплат в кафе cafe_visits и суммой cafe_rub с 1 апреля. Средний чек группы это все её рубли в кафе, делённые на все её оплаты:

import numpy as np
import pandas as pd
from scipy import stats

clients = pd.read_csv("cafe_clients.csv")
totals = clients.groupby("test_group")[["cafe_rub", "cafe_visits"]].sum()
totals["cafe_rub"] / totals["cafe_visits"]
test_group
control    1090.685999
test       1093.549420

3 966 оплат теста на 4 337 017 ₽ и 3 414 оплат контроля на 3 723 602 ₽. Разница 2,86 ₽ на оплату. Кешбэк, похоже, чек не сдвинул: он заставил ходить в кафе чаще, а платят там столько же.

Такую метрику называют метрикой-отношением. Их в продуктах полно: средний чек, ARPPU (выручка, делённая на платящих пользователей), CTR (клики, делённые на показы), если тест делит пользователей. Признак один: в знаменателе не то, чему бросали жребий.

Почему t-тест по операциям врёт

Самое простое: взять все оплаты теста, все оплаты контроля и сравнить средние t-тестом Уэлча из урока 68. Продуктовая команда так и сделала. Для всех кафе это даёт p = 0,911 и стандартную ошибку 25,74 ₽.

Ошибка в том, что t-тест считает каждую оплату отдельным независимым наблюдением. А оплаты одного клиента похожи друг на друга. Клиент 14 ходит по ресторанам: 8 оплат со средним чеком 2091 ₽. Клиент 1 берёт кофе и шаурму: 8 оплат по 897 ₽ в среднем. У десятой части клиентов средний чек ниже 441 ₽, у другой десятой выше 1954 ₽.

Представь опрос: ты спросил 8 человек из одной семьи, за кого они голосуют. Это не 8 мнений, а примерно одно, повторённое 8 раз. Тест по операциям думает, что у него 7 380 независимых чеков, а у него 1 751 клиент со своими привычками. Наблюдений меньше, чем кажется, значит разброс средней больше, чем считает тест.

Единица рандомизации здесь клиент. Честная стандартная ошибка, как мы сейчас увидим, 29,03 ₽. Тест по операциям занижает дисперсию на 21%.

Много ли это? Проверим на A/A-тесте. Возьмём оплаты в кафе за январь-март, когда кешбэка ещё не было, и 2000 раз поделим клиентов на две случайные половины. Разницы между половинами нет по построению, поэтому честный тест должен ошибиться примерно в 5% разбиений. Результат с сидом 2026:

тест по операциям      p < 0,05 в 8,0% разбиений
линеаризация           p < 0,05 в 4,65% разбиений

Тест по операциям находит несуществующий эффект в 8% случаев вместо обещанных 5%. Эту симуляцию ты соберёшь в квесте ★★★, и там же увидишь, как её легко сделать неправильно.

урок из курса

Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.