Сегодня поговорим о том, как понять, работает ли ваша новая фича или это просто случайный всплеск. Разберемся, что такое статистические критерии, доверительные интервалы, и как их использовать, чтобы принимать обоснованные решения.
Немного теории
Статистические критерии
Каждый раз, когда вы выкатываете новую фичу, перед вами встаёт вопрос: действительно ли она улучшила метрики или всё это просто случайность? Статистический критерий — это инструмент, который помогает ответить на этот вопрос.
Критерий основывается на двух гипотезах:
Нулевая гипотеза (): никакой разницы между контрольной и тестовой группой нет. Фича не работает.
Альтернативная гипотеза (): разница есть, и тестовая группа лучше.
Цель статистического критерия — помочь вам принять решение: отвергнуть (в пользу ) или оставить её в покое. Это делается на основании уровня значимости , который чаще всего равен 0.05. Если вероятность того, что данные соответствуют , меньше 5%, гипотеза считается отклонённой.
Доверительный интервал
Доверительный интервал (в дальн. DI) — это диапазон значений, в котором, с заданной вероятностью, находится истинное значение вашей метрики. Например, если DI для конверсии равен [0.48, 0.52], то вы с 95% уверенностью можете сказать, что истинная конверсия где-то в этом диапазоне.
DI позволяет не просто принять решение о том, работает ли фича, но и понять, насколько устойчивы результаты.
Допустим, вы добавили огромную зелёную кнопку «Купить», потому что дизайн-команда уверена: зелёный цвет вызывает у пользователей желание тратить деньги (ну, почти). Вопрос: стала ли конверсия лучше?
Контрольная группа: старый дизайн. Конверсия, предположим, 20%.
Тестовая группа: новый дизайн. Кажется, что стало 22%.
Но так ли всё радужно? Могли ли эти 2% быть просто результатом случайности? Тут и могут помочь статистические критерии.
Пример A/B-теста на котиках
Теперь поговорим о действительно важном: котиках. Представим, что вы управляете сайтом с фотографиями милых котов. Вы решили провести эксперимент, чтобы понять, какая версия карточки котика привлекает больше лайков:
Контрольная версия: стандартная карточка.
Тестовая версия: добавили анимацию «котик машет лапкой».
Мы хотим узнать: действительно ли анимация увеличивает вероятность, что посетители лайкают котика, или это просто случайный шум?
Генерируем данные
Предположим, что контрольная версия карточки получает лайки в 40% случаев, а тестовая версия — в 46%. Смоделируем это с помощью биномиального распределения.
import numpy as np
# Параметры
n_users = 1000 # количество посетителей
p_control = 0.4 # вероятность лайка в контрольной группе
p_test = 0.46 # вероятность лайка в тестовой группе
# Генерируем данные
np.random.seed(42) # чтобы результаты были воспроизводимыми
control_group = np.random.binomial(1, p_control, size=n_users)
test_group = np.random.binomial(1, p_test, size=n_users)
# Рассчитываем конверсии
cr_control = control_group.mean()
cr_test = test_group.mean()
print(f"Конверсия контрольной группы: {cr_control:.4f}")
print(f"Конверсия тестовой группы: {cr_test:.4f}")
Конверсия контрольной группы: 0.3870
Конверсия тестовой группы: 0.4810
Проверяем гипотезу
Теперь применим t-тест, чтобы понять, есть ли значимая разница между двумя группами.
from scipy.stats import ttest_ind
# T-тест
stat, p_value = ttest_ind(control_group, test_group, alternative='less')
print(f"T-статистика: {stat:.4f}")
print(f"P-value: {p_value:.4f}")
if p_value < 0.05:
print("Отклоняем H₀: анимация увеличивает вероятность лайков.")
else:
print("Не отклоняем H₀: значимых изменений нет.")
T-статистика: -4.2580
P-value: 0.0000
Отклоняем H₀: анимация увеличивает вероятность лайков.
Доверительные интервалы
Чтобы быть уверенными в результатах, строим доверительные интервалы для обеих групп.
from statsmodels.stats.proportion import proportion_confint
# Доверительные интервалы
ci_control = proportion_confint(control_group.sum(), nobs=n_users, alpha=0.05)
ci_test = proportion_confint(test_group.sum(), nobs=n_users, alpha=0.05)
print(f"Доверительный интервал для контрольной группы: {ci_control}")
print(f"Доверительный интервал для тестовой группы: {ci_test}")
Доверительный интервал для контрольной группы: (0.35681203687738955, 0.4171879631226105)
Доверительный интервал для тестовой группы: (0.45003263106850594, 0.511967368931494)
Визуализация
Чтобы данные были не только понятными, но и красивыми, создадим график. На нём отобразим распределения данных, средние значения и доверительные интервалы.
import seaborn as sns
import matplotlib.pyplot as plt
# Создаём массивы для распределений
control_dist = np.random.binomial(n=1, p=p_control, size=10000).mean(axis=0)
test_dist = np.random.binomial(n=1, p=p_test, size=10000).mean(axis=0)
# Визуализация
plt.figure(figsize=(12, 8))
sns.histplot(control_group, bins=20, kde=True, color="blue", label="Контрольная группа", stat="density", alpha=0.6)
sns.histplot(test_group, bins=20, kde=True, color="green", label="Тестовая группа", stat="density", alpha=0.6)
# Добавляем вертикальные линии для средних значений
plt.axvline(cr_control, color="blue", linestyle="--", label=f"Средняя конверсия (контроль): {cr_control:.2f}")
plt.axvline(cr_test, color="green", linestyle="--", label=f"Средняя конверсия (тест): {cr_test:.2f}")
# Доверительные интервалы
plt.axvline(ci_control[0], color="blue", linestyle=":", label=f"ДИ контроль: {ci_control[0]:.2f} - {ci_control[1]:.2f}")
plt.axvline(ci_control[1], color="blue", linestyle=":")
plt.axvline(ci_test[0], color="green", linestyle=":", label=f"ДИ тест: {ci_test[0]:.2f} - {ci_test[1]:.2f}")
plt.axvline(ci_test[1], color="green", linestyle=":")
# Оформление графика
plt.title("Лайки котиков: контрольная vs тестовая группа", fontsize=16)
plt.xlabel("Значение конверсии", fontsize=12)
plt.ylabel("Плотность", fontsize=12)
plt.legend(loc="upper left", fontsize=10)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()
График показывает, что тестовая группа с анимацией котиков имеет значимо более высокую конверсию (48% против 39% у контрольной), а непересекающиеся доверительные интервалы подтверждают статистическую значимость результата. Это значит, что анимация действительно увеличила вовлечённость пользователей!
В заключение спешу напомнить об открытых уроках по аналитике, которые совсем скоро пройдут в рамках онлайн-курсов от Otus:
21 ноября: «Кому в корпоративном мире нужна BI-аналитика?». Узнать подробнее
26 ноября: «Основы визуализации данных в работе аналитика». Узнать подробнее
Комментарии (10)
Aggle
20.11.2024 21:42Наверное, 5 % не стоит брать за догму. Это условно общепринятое значение, взятое без особого обоснования. Величина p, по идее, должна выбираться самим исследователем, исходя из целей и задач собственно исследования, возможных рисков и последствий и т. д.
gazzz
20.11.2024 21:42есть такой момент ) это как принять, что кинув два кубика мы не получим 6+6 т.к. это статистически крайне маловероятный случай
redfox0
20.11.2024 21:42Знаете, я вот разбираюсь в статистике достаточно, чтобы понимать что такое "нулевая гипотеза" и зачем нужна контрольная группа. Но из вашего графика совершенно ничего непонятно.
gazzz
20.11.2024 21:42а можно заменять т-статистику расчетом доверительного интервала? в каких случаях это альтернативы, а в каких лучше применять одно или другое?
0utlander
20.11.2024 21:42т-статистика используется для проверки гипотезы, а ДИ используется для оценки истинного среднего значения. но результаты t-test в случае его неоднозначности можно подкрепить расчетами CI (confidence interval), если например p-value близко к a.
чуть более наглядно
Например, если мы хотим сравнить средние значения двух групп (A и B), и ДИ разницы пересекает 0:ДИ для среднего группы A: (10, 15)
ДИ для среднего группы B: (12, 18)
ДИ для разницы средних: (-5, 5)
Если доверительный интервал (ДИ) разницы пересекает 0, это означает, что разница между средними значениями групп не является статистически значимой.
vadimr
Ваши гипотезы H0 и H1 не покрывают в сумме все возможности. Так нельзя.
WhoIsJohnGolt
Согласен. Односторонняя проверка подталкивает к тому, чтобы с большей вероятностью принять желаемое за действительное. Поэтому здесь более корректна будет двусторонняя проверка
gazzz
можно пример двусторонней проверки ?
vadimr
Ну тут вообще по-хорошему надо на два разных вопроса отвечать. Изменилось ли вообще что-то, и стало ли лучше или хуже.
WhoIsJohnGolt
Как написал @vadimr ниже, двусторонняя проверка ответит на вопрос "изменилось ли вообще что-то?" а это предполагает более строгое условие - для его выполнение будет проверяться на обоих хвостах распределения и правому хвосту "достанется" только 2.5%