Как сделать A/B тест с помощью языка R в Rstudio

Цель этой статьи – предоставить некоторые инструкции о том, как проводить анализ результатов A / B-теста для примера сценария с использованием R, оценивать результаты и делать выводы на основе анализа.

Прежде чем мы начнем, давайте рассмотрим, что означает A / B-тест, для чего он обычно используется и каковы некоторые из его ограничений.

Определение

A / B-тестирование, также известное как сплит-тестирование, – это общая методология, используемая в Интернете, когда вы хотите протестировать новый продукт или функцию. Цель состоит в том, чтобы разработать эксперимент, который будет надежным и даст воспроизводимые результаты, чтобы принять обоснованное решение запускать или нет.

Как правило, этот тест включает сравнение двух веб-страниц, показывающих два варианта A и B, с аналогичным количеством посетителей и вариант, который дает лучший коэффициент конверсии.

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

Обычно одна из многих причин, по которым проводится A / B-тест, заключается в том, чтобы убедиться, что новые функции, которые планируется внедрить, действительно оказывают измеримое (положительное) влияние на намеченную цель, связанную с желанием ввести такие функции.

Ограничения

A / B-тестирование – один из многих инструментов для оптимизации конверсии. Это не самостоятельное решение. Это не решит всех ваших проблем с конверсией. Он не может исправить типичные проблемы, возникающие с беспорядочными данными. Вам нужно сделать больше, чем просто A / B-тест, чтобы действительно улучшить конверсию.

Теперь давайте погрузимся в практический пример тематического исследования. Наборы данных и полную информацию анализа можно найти на GitHub Если вам нужна какая – то помощь понимание и использование Github, есть полезная ссылка для начинающих здесь.

Пример использования

Представьте, что у нас есть результаты A / B-тестов с двух сайтов бронирования отелей. (Примечание: данные созданы так, чтобы они выглядели как настоящие.) Нам необходимо провести A / B-тестовый анализ данных, сделать выводы на основе данных и дать рекомендации руководству или продуктовым командам.

Примечание. Приведенный ниже анализ предполагает небольшое знание статистических концепций, чтобы сделать его кратким и точным.

Сводка набора данных

  1. Вариант A – это контрольная группа, которая отображает существующие продукты или функции на веб-сайте.
  2. Вариант B – это экспериментальная группа, которая экспериментирует с новой версией продукта или функции, чтобы узнать, нравится ли она пользователям или увеличивает ли это количество бронирований (конверсий).
  3. Преобразовано – на основе данного набора данных есть две категории, определяемые логическими значениями (Истина или ложь):
  4. Конвертировано = Истина, когда клиент успешно совершает бронирование
  5. Converted = False, когда клиент посещает сайты, но не бронирует

Как проверить гипотезу

Нулевая гипотеза

Обе версии A и B имеют одинаковую вероятность привлечения клиентов к бронированию или конверсии. Другими словами, нет никакого эффекта или разницы между версией A и B.

Альтернативная гипотеза

Обе версии A и B имеют разную вероятность привлечения клиентов к бронированию или конверсии. Существует разница между версией A и B. Версия B лучше, чем A, с точки зрения увеличения числа заказов клиентов. PExp_B! = Pcont_A

Анализ

Давайте вместе проведем анализ. Загрузите набор данных здесь . Обратите внимание, что для этого у вас должен быть установлен RStudio.

1.Подготовьте набор данных и загрузите библиотеку tidyverse, которая содержит соответствующие пакеты, используемые для анализа.

library (tidyverse)
setwd («~ egot _ \\ Projects \\ ABTest») # создайте свой собственный каталог
ABTest <- read.csv («Website Results.csv», header = TRUE) # Использование read.csv base R file import функция, чтобы данные можно было импортировать в фрейм данных в RStudio.
save (ABTest, file = "~ rda \\ ABTest.rda") # сохранить в своем собственном каталоге

2. Отфильтруем конверсии для вариантов A и B и вычислим соответствующие коэффициенты конверсии.

#2a. let's filter out conversions for variant_A 
conversion_subset_A <- ABTest %>% filter(variant == "A" & converted == "TRUE")

#2b.Total Number of Conversions for variant_A
conversions_A <- nrow(conversion_subset_A)

#2c. Number of Visitors for variant_A
visitors_A <- nrow(ABTest %>% filter(variant == "A"))

#2d. Conversion_rate_A
conv_rate_A <-  (conversions_A/visitors_A)  
print(conv_rate_A) #0.02773925

#2e. let's take a subset of conversions for variant_B
conversion_subset_B <- ABTest %>% filter(variant == "B" & converted == "TRUE")

#2f. Number of Conversions for variant_B
conversions_B <- nrow(conversion_subset_B)

#2g. Number of Visitors for variant_B
visitors_B <- nrow(ABTest %>% filter(variant == "B"))

#2h. Conversion_rate_B
conv_rate_B <-  (conversions_B/visitors_B)  
print(conv_rate_B) #0.05068493

3. Давайте вычислим относительный рост, используя коэффициенты конверсии A и B. Повышение – это процент от увеличения.

uplift <- (conv_rate_B - conv_rate_A) / conv_rate_A * 100
uplift # 82,72%
#B лучше, чем A на 83%. Этого достаточно, чтобы определить победителя.

5. Рассчитаем z-оценку.

№5а. Вычислите Z-оценку, чтобы мы могли определить значение p
z_score <- d_hat / SE_pool
print (z_score) # 2.249546

6. Используя этот z-показатель, мы можем быстро определить p-значение через справочную таблицу или с помощью приведенного ниже кода:

# 5b. Вычислим p_value, используя значение
z_score p_value <- pnorm (q = -z_score, mean = 0, sd = 1) * 2
print (p_value) # 0,02447777

7. Рассчитаем доверительный интервал для пула.

#7a. Let's compute Confidence interval for the pool using pre-calculated results
ci <- c(d_hat - MOE, d_hat + MOE) 
ci  #0.002953777 0.042937584

#7b. Using same steps as already shown, let's compute the confidence 
#interval for variants A separately
 X_hat_A <- conversions_A/visitors_A
   se_hat_A <- sqrt(X_hat_A*(1-X_hat_A)/visitors_A) 
     ci_A <- c(X_hat_A - qnorm(0.975)*se_hat_A, X_hat_A + qnorm(0.975)*se_hat_A) 
print(ci_A)    #0.01575201 0.03972649

# Using same steps as already shown, let's compute the confidence 
#interval for variants B separately                                 
X_hat_B <- conversions_B/visitors_B
 se_hat_B <- sqrt(X_hat_B*(1-X_hat_B)/visitors_B) 
   ci_B <- c(X_hat_B - qnorm(0.975)*se_hat_B, X_hat_B + qnorm(0.975)*se_hat_B) 
print(ci_B) #0.03477269 0.06659717

8. Давайте визуализируем полученные результаты во фрейме данных (таблица):

vis_result_pool <- data.frame(
  metric=c(
    'Estimated Difference',
    'Relative Uplift(%)',
    'pooled sample proportion',
    'Standard Error of Difference',
    'z_score',
    'p-value',
    'Margin of Error',
    'CI-lower',
    'CI-upper'),
  value=c(
    conv_rate_B - conv_rate_A,
    uplift,
    p_pool,
    SE_pool,
    z_score,
    p_value,
    MOE,
    ci_lower,
    ci_upper
  ))
vis_result_pool

Модель

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

 Compute_ABTest_Results <- function(loadfile) {
  ABTest <- read.csv(loadfile, header = TRUE)
  conversion_subset_A <-
    ABTest %>% filter(variant == "A" & converted == "TRUE")
  conversions_A <- nrow(conversion_subset_A)
  visitors_A <- nrow(ABTest %>% filter(variant == "A"))
  conv_rate_A <-  (conversions_A / visitors_A)
  conversion_subset_B <-
    ABTest %>% filter(variant == "B" & converted == "TRUE")
  conversions_B <- nrow(conversion_subset_B)
  visitors_B <- nrow(ABTest %>% filter(variant == "B"))
  conv_rate_B <-  (conversions_B / visitors_B)
  uplift <-
    (conv_rate_B - conv_rate_A) / conv_rate_A * 100
  p_pool <-
    (conversions_A + conversions_B) / (visitors_A + visitors_B)
  SE_pool <-
    sqrt(p_pool * (1 - p_pool) * ((1 / visitors_A) + (1 / visitors_B)))
  MOE <- SE_pool * qnorm(0.975)
  d_hat <- conv_rate_B - conv_rate_A
  z_score <- d_hat / SE_pool
  p_value <- pnorm(q = -z_score,
                   mean = 0,
                   sd = 1) * 2
  lower   = d_hat - qnorm(0.975) * SE_pool
  upper   = d_hat + qnorm(0.975) * SE_pool
  vis_result_pool <- data.frame(
    metric = c(
      'Estimated Difference',
      'Relative Uplift(%)',
      'pooled sample proportion',
      'Standard Error of Difference',
      'z_score',
      'p-value',
      'Margin of Error',
      'CI-lower',
      'CI-upper'
    ),
    value = c(
      conv_rate_B - conv_rate_A,
      uplift,
      p_pool,
      SE_pool,
      z_score,
      p_value,
      MOE,
      ci_lower,
      ci_upper
    )
  )
  return(vis_result_pool)
}

10. Наконец, давайте визуализируем результаты A и B, используя нормальное распределение.

Выводы и рекомендации

1. Имеется 721 обращение и 20 переходов для варианта A и 730 обращений и 37 переходов для варианта B.

2. Относительный рост на 82,72% на основе коэффициента конверсии для A = 2,77%, коэффициента конверсии для B = 5,07%. Следовательно, вариант Б лучше А на 82,72%.

3. P-значение, вычисленное для этого анализа, составило 0,02448 (p <0,05 или p ниже 5% уровня значимости). Следовательно, результаты тестов демонстрируют сильную статистическую значимость. Вы можете быть уверены на 95%, что этот результат – следствие внесенных изменений, а не случайный результат.

4. На основании вышеупомянутых результатов, которые показывают сильную статистическую значимость. вам следует отклонить нулевую гипотезу и приступить к запуску.

5. Следовательно, принять вариант «Б» и развернуть его для 100% пользователей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *