В этом модуле вы узнаете, что такое статистический критерий, как его выбрать, и как он поможет выявить сходство и различие между выборками; как с помощью библиотеки Pandas конфигурировать выборки и накладывать условия. Внутри модуля — пошаговый алгоритм работы с инструментом.

Самое сложное уже позади. Осталось использовать нужные статистические критерии на практике.

К счастью, многое уже сделано за нас. Работая с данными в Python, вы в 99,9% случаях будете использовать библиотеку pandas и ее инструмент представления таблиц dataframe. Для начала импортируйте библиотеку и считайте данные из файла.

import pandas as pd
data  = pd.read_csv('my_test_data.csv') #в скобках нужно указать путь к файлу

Вы можете просмотреть данные и убедиться, что все правильно считалось, с помощью функции head(n) — она покажет первые n строк таблицы.

data.head(10)

Вы можете обратиться к отдельной колонке таблицы с помощью квадратных скобок.

data['Название_колонки']

Вы также можете просмотреть данные, которые соответствуют определенному условию.

data[data['Группа_теста']=='B'] 

Необходимые критерии вы найдете в библиотеках scipy и statsmodels. Если вам понадобится критерий, которого там нет, скорее всего его уже кто-то реализовал и нужно всего лишь найти другую библиотеку. Например, есть хорошая реализация метода bootstrap.

Реализации разных критериев:

t-критерий Стьюдента, код на Python

import scipy.stats as stats
alpha = 0.05
t_statistic, p = stats.ttest_ind(data[data['Группа_теста']=='A'].metric, 
															 data[data['Группа_теста']=='B'].metric, 
															 equal_var = False)

print('Нулевая гипотеза о равенстве средних {}отклоняется на уровне значимости {}, поскольку p-value = {:f}'.format('не ' if p > alpha else '', 1-alpha, p))

Критерий хи-квадрат, код на Python

from scipy.stats import chi2_contingency
chi, p, dof, exp = chi2_contingency([data.groupby('Группа_теста').paid.sum(),
                  data.groupby('Группа_теста').user_id.count() - data.groupby('Группа_теста').paid.sum()])

#paid - колонка, в которой 1 стоит для заплативших пользователей и 0 для не заплативших

print('Разница между группами {}значимая на уровне значимости {}, поскольку p-value = {:f}'.format('не ' if p > alpha else '', 1-alpha, p))

Bootstrap, код на Python

!pip install bootstrapped
import bootstrapped.bootstrap as bs
import bootstrapped.stats_functions as bs_stats
import bootstrapped.compare_functions as bs_compare
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')

boot = bs.bootstrap_ab(data[data['Группа_теста']=='A'].metrics.values,
											 data[data['Группа_теста']=='B'].metrics.values, 
                       bs_stats.mean, bs_compare.difference, 
											 num_threads = -1, 
											 return_distribution = True)

plt.hist(boot, bins = 30)
plt.axvline(x = np.percentile(boot, 2.5), color='grey', linestyle='--', linewidth = 3)
plt.axvline(x = np.percentile(boot, 97.5), color='grey', linestyle='--', linewidth = 3)
plt.axvline(x = 0, color='blue', linestyle='--', linewidth = 3)
plt.show(

Еще раз зафиксируем порядок действий:

  1. Считываем данные из дата-сета, в котором хранятся наблюдения из нашего A/B-теста.
  2. Подключаем библиотеку с реализацией выбранного нами статистического критерия.
  3. Запускаем расчет и выводим результат проверки на экран.
  4. Результаты A/B-теста готовы, вы великолепны!