Как проверить, получилось ли увеличить прибыль по среднему чеку

«Как проверить, получилось ли увеличить прибыль по среднему чеку» — вопрос из категории A/B тестирование, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы проверить увеличение среднего чека, я бы использовал A/B-тест, сравнив метрику между контрольной и тестовой группами после внедрения изменений (например, новой системы рекомендаций или изменения UX).

План проверки:

  1. Определение групп: Пользователи случайным образом распределяются в контрольную (старый опыт) и тестовую (новый опыт) группы. Проверяю баланс групп по историческим данным (средний чек, частота покупок).
  2. Целевая метрика: Средний чек за период теста. Рассчитываю его как общую выручку группы, деленную на количество чеков в этой группе.
  3. Статистический тест: Поскольку распределение среднего чека часто имеет «тяжелый хвост» (не нормальное), предпочитаю использовать непараметрический U-тест Манна-Уитни для сравнения медиан.
import pandas as pd
import scipy.stats as stats
import numpy as np

# Предположим, у нас есть данные по чекам для каждой группы
# df_control и df_test — DataFrame с колонкой 'check_amount'

# Примерные данные
check_amounts_control = np.random.lognormal(mean=7.5, sigma=0.5, size=5000)
check_amounts_test = np.random.lognormal(mean=7.7, sigma=0.5, size=5000) # Чуть выше

# Проводим U-тест Манна-Уитни (двусторонний)
u_statistic, p_value = stats.mannwhitneyu(check_amounts_control,
                                           check_amounts_test,
                                           alternative='two-sided')

print(f"Медиана чека в контроле: {np.median(check_amounts_control):.2f}")
print(f"Медиана чека в тесте: {np.median(check_amounts_test):.2f}")
print(f"p-value: {p_value:.4f}")

if p_value < 0.05:
    print("Разница в медиане среднего чека статистически значима.")
    # Расчет относительного изменения медианы
    relative_change = (np.median(check_amounts_test) - np.median(check_amounts_control)) / np.median(check_amounts_control)
    print(f"Относительный прирост медианы чека: {relative_change:.2%}")
else:
    print("Статистически значимой разницы не обнаружено.")

Важные нюансы:

  • Длительность теста: Должна охватывать полный цикл покупки и учитывать сезонность (минимум 2-4 недели).
  • Дополнительный анализ: Всегда смотрю не только на средний/медианный чек, но и на распределение. Увеличение могло произойти за счет роста числа крупных покупок или снижения числа мелких. Также анализирую влияние на конверсию — не снизилась ли она из-за роста цены.