Как проверить эффективность алгоритма ценообразования для физического ритейла с помощью A/B-теста

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

Ответ

Для проверки эффективности нового алгоритма ценообразования в ритейле я бы спланировал и провел A/B-тест, разделив магазины или товарные категории на две сопоставимые группы.

1. Дизайн эксперимента:

  • Группы: Контрольная (старые цены) и тестовая (цены по новому алгоритму). Разделение — случайное, но с проверкой баланса по ключевым параметрам: локация, площадь, трафик, средний исторический чек.
  • Основная метрика: Выручка на магазин/товарную категорию.
  • Дополнительные метрики: Средний чек, маржинальность, объем продаж в единицах, конверсия.
  • Длительность: Не менее 4 недель для учета недельной сезонности и полного цикла покупок.

2. Статистический анализ: Перед сравнением средних проверяю распределение данных. Для нормально распределенных метрик использую t-тест, для остальных — непараметрический U-тест Манна-Уитни.

import scipy.stats as stats
import numpy as np

# Пример: сравнение выручки в двух группах магазинов
revenue_control = np.array([120000, 115000, 130000, 125000, 118000]) # Контроль
revenue_test = np.array([135000, 140000, 128000, 142000, 138000])    # Тест

# Проверка нормальности (Shapiro-Wilk)
_, p_norm_control = stats.shapiro(revenue_control)
_, p_norm_test = stats.shapiro(revenue_test)

if p_norm_control > 0.05 and p_norm_test > 0.05:
    # Данные нормальные, используем t-тест
    t_stat, p_value = stats.ttest_ind(revenue_control, revenue_test, equal_var=False) # Welch's t-test
    test_name = "t-тест"
else:
    # Данные не нормальные, используем U-тест
    u_stat, p_value = stats.mannwhitneyu(revenue_control, revenue_test, alternative='two-sided')
    test_name = "U-тест Манна-Уитни"

print(f"Использован {test_name}. p-value = {p_value:.4f}")
if p_value < 0.05:
    print("Статистически значимая разница обнаружена.")
    # Расчет размера эффекта (например, относительный прирост)
    effect = (np.mean(revenue_test) - np.mean(revenue_control)) / np.mean(revenue_control)
    print(f"Относительный прирост выручки: {effect:.2%}")
else:
    print("Статистически значимой разницы не обнаружено.")

3. Интерпретация и выводы: Ключевой результат — не только статистическая значимость (p-value < 0.05), но и практическая значимость (размер эффекта). Также я бы провел сегментный анализ, чтобы понять, на каких категориях товаров или в каких типах магазинов алгоритм сработал лучше или хуже.