Бесплатная доставка: средний чек
// Условие
Тест порога бесплатной доставки: контроль A — от 3000 ₽, тест B — от 2500 ₽. Гипотеза: юзеры станут добирать корзину до порога, и средний чек вырастет. Метрика непрерывная — тут нужен t-test, а не тест долей.
result — dict с ключами mean_a, mean_b, p_value.// Данные
user_id, group (A/B), aov (средний чек юзера за период, ₽) — одна строка на юзера// Решение
Подсказка
Средние: df.groupby('group')['aov'].mean().
t-test двух независимых выборок: stats.ttest_ind(b, a, equal_var=False) — вариант Уэлча не требует равных дисперсий.
b и a — это Series значений aov каждой группы: df.loc[df['group']=='B', 'aov'].
Сначала попробуй сам → Показать решение
df = load_data()
from scipy import stats
a = df.loc[df['group'] == 'A', 'aov']
b = df.loc[df['group'] == 'B', 'aov']
t = stats.ttest_ind(b, a, equal_var=False) # t-test Уэлча
result = {'mean_a': a.mean(), 'mean_b': b.mean(), 'p_value': t.pvalue}
print(result)
equal_var=False) — безопасный дефолт: не требует равенства дисперсий и почти ничего не теряет, когда они равны.Что скажешь команде?
p ≈ 0.003 — эффект статзначим. «Ненормальность» распределения при n = 4000 на группу не мешает: t-test сравнивает средние, а средние по ЦПТ уже почти нормальны. Медиана — полезная доп. метрика, но бизнес живёт на сумме выручки, то есть на среднем × юзеров. Малый процент ≠ шум: значимость определяет p-value, а важность — деньги: +60 ₽ × все заказы года.