Статистические критерии и доверительные интервалы

от автора

Сегодня поговорим о том, как понять, работает ли ваша новая фича или это просто случайный всплеск. Разберемся, что такое статистические критерии, доверительные интервалы, и как их использовать, чтобы принимать обоснованные решения.


Немного теории

Статистические критерии

Каждый раз, когда вы выкатываете новую фичу, перед вами встаёт вопрос: действительно ли она улучшила метрики или всё это просто случайность? Статистический критерий — это инструмент, который помогает ответить на этот вопрос.

Критерий основывается на двух гипотезах:

  1. Нулевая гипотеза (H₀): никакой разницы между контрольной и тестовой группой нет. Фича не работает.

  2. Альтернативная гипотеза (H₁): разница есть, и тестовая группа лучше.

Цель статистического критерия — помочь вам принять решение: отвергнуть H₀ (в пользу H₁) или оставить её в покое. Это делается на основании уровня значимости α, который чаще всего равен 0.05. Если вероятность того, что данные соответствуют H₀, меньше 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:


ссылка на оригинал статьи https://habr.com/ru/articles/859234/