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

Ответ

Чтобы проверить увеличение среднего чека, я бы использовал 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 недели).
  • Дополнительный анализ: Всегда смотрю не только на средний/медианный чек, но и на распределение. Увеличение могло произойти за счет роста числа крупных покупок или снижения числа мелких. Также анализирую влияние на конверсию — не снизилась ли она из-за роста цены.

Ответ 18+ 🔞

А, ну это же классика, ебать мои старые костыли! Сидишь такой, думаешь: "Вот внедрил я новую хрень, типа умные рекомендации или кнопку другого цвета. И вроде бы бабла стало приходить больше". А потом вопрос: а это точно из-за моей гениальности, или просто повезло, как мартышке с бананом?

Так вот, чтобы не быть распиздяем, который на глазок меряет, надо делать всё по-взрослому — A/B-тест, ёпта. Суть проще пареной репы: делишь пользователей на две кучки. Одним (контроль) оставляешь всё как было, старый, добрый, залупа конская. Другим (тест) подсовываешь свою новую, блядовитую фичу. И смотришь, у кого средний чек больше вырос.

Как это провернуть, чтобы не облажаться:

  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("Статистически значимой разницы не обнаружено.")

А теперь подводные ебушки-воробушки, на которых все погорают:

  • Гонять тест надо достаточно долго. Не день и не два. Минимум пару недель, а лучше месяц, чтобы все циклы покупок отловить и сезонные скачки не приписать своей гениальности. Терпения ноль ебать — но надо.
  • Не зацикливайся на одной цифре. Да, средний чек вырос. А конверсия в покупку не просела? Может, люди просто стали реже покупать, но дороже? А может, ты просто отсеял всех, кто брал мелкие товары, и остались только те, кто и так тратил дохуя? Смотри на всю картину, а не на один пиксель. Иначе будет тебе хиросима, а не рост.