Перейти к содержанию
Содержание

Много сравнений возвратов: скорректируйте p-value до выбора проблемных SKU

Аналитик сравнил доли возвратов сразу у многих SKU и получил несколько малых p-value. Выбирать проблемные товары только по этим значениям рискованно: в отчёте выполнена целая серия проверок. Сохраните её полный состав до отбора результатов.

Подготовьте реестр проверок

Одна строка реестра должна описывать одну заранее сформулированную гипотезу. Запишите SKU, сравниваемые группы, период, количества заказов и возвратов, метод теста, исходное p-value и размер наблюдаемого различия. Доли должны относиться к сопоставимым когортам с одинаковым временем наблюдения за возвратами.

Много сравнений возвратов: скорректируйте p-value до выбора проблемных SKU

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

Поправка не исправляет ошибочную единицу наблюдения или несопоставимые группы. Если один заказ оказался в обеих группах либо возврат ещё не успел произойти, сначала пересмотрите исходный анализ. Для независимых бинарных исходов пример подготовки таблицы есть в разборе теста Фишера.

Выберите правило контроля до отбора SKU

В SciPy функция false_discovery_control корректирует p-value для контроля FDR: ожидаемой доли ложных отклонений среди отклонённых нулевых гипотез. Это характеристика процедуры при её предпосылках, а не вероятность ошибки конкретного товара.

Метод bh соответствует Бенджамини и Хохбергу и требует независимости либо определённых положительных зависимостей. Более консервативный by допускает зависимые тесты. При пересекающихся сравнениях условия зависимости нужно обсудить с аналитиком; выбор метода нельзя делать по числу получившихся сигналов.

Рассчитайте скорректированные значения

Ниже код для вашей таблицы tests в Python с pandas и SciPy. В ней столбец hypothesis_id содержит непустой уникальный ID проверки, а p_value исходный результат корректно проведённого теста. Порог q задаёт ваша команда до просмотра отбора.

from scipy.stats import false_discovery_control

q = float(input("Заранее выбранный уровень FDR: "))
if not 0 < q < 1:
    raise ValueError("Уровень должен быть между 0 и 1")
if tests.empty or tests["hypothesis_id"].isna().any():
    raise ValueError("Нужен непустой реестр с ID")
if tests["hypothesis_id"].duplicated().any():
    raise ValueError("Одна проверка записана несколько раз")
ps = tests["p_value"].to_numpy(dtype=float)
if not ((ps >= 0) & (ps <= 1)).all():
    raise ValueError("Проверьте пропуски и диапазон p-value")
report = tests.copy()
report["p_adjusted"] = false_discovery_control(ps, method="by")
report["signal"] = report["p_adjusted"] < q

В примере выбран by; это явная настройка процедуры, а не рекомендация менять метод после расчёта. Функция возвращает значения в порядке входа, поэтому присвоение сохраняет связь с ID гипотезы.

Передайте сигналы на предметный разбор

Оставьте в отчёте все строки, оба p-value, метод, порог, размеры групп и разность долей. Сохраните дату расчёта и версию исходного файла. Отдельно укажите строки, которые не удалось корректно проверить, и причины.

Для отмеченных SKU разберите состав возвратов, качество карточки и сопоставимость периодов. Статистический сигнал сам по себе не устанавливает причину и не даёт команды снимать товар с продажи. Отсутствие сигнала также не доказывает равенство качества. Рабочий результат анализа: воспроизводимый реестр и обоснованный список вопросов для проверки, а не рейтинг виновных товаров.

Теги

Комментарии 0

0 / 1500

Популярные статьи