1 заметка с тегом

Python

Как рассчитывать доверительные интервалы через x² или бета-распределение

Очень часто, в интернет-маркетинге нам приходится принимать решение на основе малого количества цифр. Я (и это прививаю своей команде) стараюсь принимать решения на основе цифр. Сегодня хочу рассказать про два способа принятия таких решений. В дальнейшем буду ссылаться на эту статью, когда буду разбирать что-нибудь практическое.

Биномиальное распределение
Биномиальное распределение — это распределение исходов, где значение может принимать два значения: «правда» или «ложь» — «1» или «0».

Разберём на примере:
У нас есть посадочная страница, на которую мы заводим пользователей с рекламной кампании. Каждый заход — это испытание. Заход может закончиться оправленной заявкой (конверсия, «ПРАВДА», «1»), или пользователь просто может уйти (ничего, «Ложь», «0»).

Каждое испытание должно быть независимым от предыдущего.

Расчёт через ײ (хи-квадрат)

Формула расчёта доверительного интервала через хи-квадрат выглядит так:

σ×SQRT(КОНВЕРСИЯ×(1-КОНВЕРСИЯ/ВЫБОРКА)

SQRT — корень.
σ — это сигма, среднеквадратичное отклонение. К примеру, для 68% нам нужна 1σ. Вот примеры:

1 сигма — это 68% точности.
1.28 сигмы — это 80% точность.
1.96 сигмы — это 95% точности.
3 сигмы — это 99,72% точности. В интернет-маркетинге такая точность не нужна.

Точность в данном случае — это фактически площадь рассматриваемых результатов. Чем ниже площадь, тем меньше в расчёт попадают аномальные результаты (которые находятся на краях гауссовой кривой).

Рассмотрим пример:
Баннер А — CTR=5%
Баннер Б — CTR=5.5%

На обоих баннерах выборка (показы): 10 000. Какой из этих баннеров лучше с 80% точностью?

Считаем:

σ для 80% = 1.28

Доверительный интервал для Баннера А
1.28 x SQRT(5% × (1 — 5%) / 10 000) = 0.28%

Доверительный интервал для Баннера Б
1.28 × SQRT(5.5% × (1 — 5.5%) / 10 000) = 0.29%

Для «Баннера А» доверительный интервал при такой выборке будет:

CTR(min) = 5% — 0.28% = 4.72%
CTR(max) = 5% + 0.28% = 5.28%

Для «Баннера Б» доверительный интервал будет:

CTR(min) = 5.5% — 0.29% = 5.21%
CTR(max) = 5.5% + 0.29% = 5.79%

Таким образом баннеры с 80% вероятностью не различимы. Они пересекаются на диапазоне между 5.21% и 5.28%. Нужно больше выборки, чтоб доверительный интервал для каждого баннера сузить и выявить победителя.

Расчёт через бета-распределение

В Excel или Google Spreadsheet есть встроенная функция бета-распределения. Формула будет выглядеть так:

=Beta.inv(границы_точности; КОНВЕРСИЙ; ВЫБОРКА — (КОНВЕРСИЯ × ВЫБОРКУ))

Если мы вернёмся к задачке с баннерами, то у нас получатся вот такие формулы

Для Баннера А

CTR(min) = beta.inv(0.1; 5% × 10000; 10000 — 5% × 10000)
CTR(max) = beta.inv(0.9; 5% × 10000; 10000 — 5% × 10000)

Для Баннера Б

CTR(min) = beta.inv(0.1; 5.5% × 10000; 10000 — 5.5% × 10000)
CTR(max) = beta.inv(0.9; 5.5% × 10000; 10000 — 5.5% × 10000)

Получается:

Для баннера А

CTR(min) = 4.72%
CTR(max) = 5.28%

Для баннера Б

CTR(min) = 5.21%
CTR(max) = 5.79%

Результаты расчёта доверительного интервала через ײ и через формулу бета-распределения одинаковые. В случае биномиального расчёта можно использовать любую из этих формул.

Аналогично можно сделать и через Python. Разберём на примере баннера Б:

import scipy.stats as ss

dist = ss.beta(550, 9450)

ctrmin = dist.ppf(0.1)
ctrmax = dist.ppf(0.9)

print("CTRmin: {:2.2%} \nCTRmax: {:2.2%}".format(ctrmin, ctrmax))

Вывод кода выше:

CTRmin: 5.21% 
CTRmax: 5.79%