Как протестировать ваше приложение на Python с помощью A / B тестов
Будет ли отображение количества проданных экземпляров книги на моём веб-сайте побуждать больше людей покупать её? Чтобы уверенно ответить на этот вопрос, я могу положиться на Python A / B-тестирование. Этот метод тестирования позволяет нам оценить две версии веб-сайта или приложения, выпустив их для разных сегментов пользователей, чтобы увидеть, какая из них работает лучше.
@python_job_interview – вопросы с собеседований Python.
Проведение тестового эксперимента
Мне нравится связывать каждый вариант с его “ведром”. Используя эту аналогию, мы можем более эффективно сгруппировать каждый вариант для сравнения в будущем. Во время теста, по мере сбора данных по каждому варианту, их можно легко разделить и поместить в соответствующее ведро.
Первый блок называется контрольным блоком — он представляет состояние приложения без новых улучшений или обновлений и может рассматриваться как эталон при проведении последующих сравнений. Второй блок называется блоком изменений и включает в себя новые функции или улучшения, подлежащие тестированию. Имея это в виду, моя цель в этом эксперименте – ответить на следующий вопрос:
Приведёт ли показ количества проданных экземпляров книги к тому, что больше людей купят книгу?
Прежде чем проводить тест, мы должны сначала идентифицировать каждое “ведро”. Для этого я создал пример приложения, которое поможет нам на этом пути. Вот его скриншот:
Блок изменений помечен как B (тот, который я хочу протестировать), а контрольный блок помечен как A. Предположим, что контрольный блок в настоящее время влияет, в среднем, на 200 покупок книг 15% моих пользователей в неделю. Моя следующая задача – предоставить блок изменений ещё 15% пользователей для сбора метрик. Чтобы сделать это, мне нужно будет установить флаг функции и настроить пользовательский сегмент.
Использование флагов функций в A/B-тестировании
Флаги функций – это фрагмент кода, который условно скрывает и отображает функциональность. Чтобы переключаться между двумя сегментами во время работы приложения, мы можем связать новый компонент / функцию с флагом функции. Когда флаг функции включён, сообщение будет отображаться, а когда он выключен, оно будет скрыто. Использование флага функции имеет дополнительное преимущество, позволяющее указать подмножество пользователей для отображения новой функции. Это то, что нам нужно настроить для сбора показателей для варианта B.
Вот краткий обзор того, как это сделать:
Создание флага функции
1. Создайте бесплатную учетную запись ConfigCat
2. На панели мониторинга создайте флаг функции со следующими подробностями:
Name: canShowCopiesSold
Key: canshowcopiessold
Description: Showing the number of book copies sold
Убедитесь, что в вашей среде включён флаг функции.
3. Нажмите кнопку ADD FEATURE FLAG функции, чтобы создать и сохранить флаг функции
4. Чтобы создать сегмент пользователей для тестирования, нажмите кнопку TARGET % OF USERS и настройте фиксированный процент (15%), как показано ниже:
С этим набором, когда на следующем шаге будет включён флаг функции, набор вариантов будет доступен только для 15% базы пользователей.
5. Интегрируйте флаг функции в ваше приложение на Python
Чтобы отслеживать и собирать события кликов для корзины вариантов, я буду использовать инструмент анализа продукта под названием Amplitude. В конце я покажу вам, как сравнить клики с кликами панели управления.
Настройка Amplitude
1. Созадйте бесплатную учетную запись Amplitude
2. Перейдите в раздел Data, щёлкнув выпадающий список в левом верхнем углу
3. Щелкните ссылку Sources в разделе Connections на левой боковой панели, затем нажмите кнопку + Add Source в правом верхнем углу
4. Выберите Python SDK из списка источников SDK и введите следующие сведения, чтобы создать исходный код:
5. Вы должны быть автоматически перенаправлены на страницу реализации. Мы скоро вернёмся к этому, но сначала давайте добавим событие:
Добавление события
Создавая событие, мы даём указание Amplitude специально прослушивать это событие и собирать его. Позже наш код будет запускать это событие всякий раз, когда будет нажата кнопка покупки.
1. Нажмите на ссылку Events на левой боковой панели в разделе Tracking Plan, чтобы перейти на страницу события
2. Нажмите кнопку + Add Event в правом верхнем углу, чтобы создать событие и заполните следующие данные:
В приведённом выше примере, я создал событие с именем book_purchase
, чтобы представить тип события, которое я планирую запустить и отправить позже. Затем была добавлена категория. Затем событие было активировано путём выбора параметра “Активно”. Наконец, я добавил правильный источник к этому событию.
3. Нажмите кнопку Save changes на левой боковой панели
Интегрирование с Amplitude
Нажмите на ссылку внедрения на левой боковой панели, чтобы просмотреть страницу с инструкциями по интеграции.
Установите Amplitude CLI с помощью следующей команды:
npm install -g @amplitude/ampli
2. Установите зависимости Amplitude Python SDK:
pip install amplitude-analytics
3. Запустите следующую команду, чтобы загрузить SDK в Python:
ampli pull
В приведённой выше команде Amplitude создаст файл ampli/ampli.py
. Загрузите в него все необходимые настройки из предыдущих шагов. Я импортирую и буду использовать этот файл в следующем разделе.
Отправка события из Python
- Импорт и инициализация Amplitude:
from .ampli import *
ampli.load(LoadOptions(
environment=Environment.PRODUCTION
))
2. Я изменю тип кнопки покупки на “отправить”, а затем перенесу её в форму. Таким образом, при нажатии на него в my view будет отправлен запрос post, который будет использоваться на следующем шаге для отправки события в Amplitude:
<form method="post">
<button type="submit" class="purchase-button">Purchase Your Copy Now</button>
</form>
3. Ниже я добавил оператор if для проверки метода POST, который затем запустит и отправит событие book_purchase в Amplitude:
# ...
configcat_client = configcatclient.create_client('YOUR_CONFIGCAT_SDK_KEY')
@app.route("/", methods=('GET', 'POST'))
def index():
# ...
if request.method == 'POST':
# Replace user_id with an actual unique identifier for your user
ampli.book_purchase(user_id='user@example.com')
# ...
Полный код вы можете посмотреть здесь.
Давайте проверим наличие зарегистрированных запросов, чтобы убедиться, что Python подключён к моей учетной записи Amplitude.
Проверка зарегистрированных запросов
- В разделе Connections на левой боковой панели нажмите на Sources
- 2. Нажатие на кнопку покупки зарегистрирует событие в Amplitude, как показано на графике успешных запросов слева:
Настройка диаграммы анализа
1. Перейдите на панель Analytics, щёлкнув стрелку выпадающего списка в левом верхнем углу рядом с Data
2. На панели инструментов аналитики нажмите кнопку New на левой боковой панели
3. Нажмите на Analysis, а затем на Segmentation. Сегментация – это механизм, используемый Amplitude для сбора и создания диаграмм на основе событий, инициированных пользователем. Таким образом, Amplitude создаст и настроит диаграмму для сбора данных из события, которое мы ранее создали.
4. Выберите событие, как показано ниже:
5. Нажмите Save в правом верхнем углу, чтобы сохранить диаграмму
Проанализируйте результаты теста
Чтобы сравнить и проанализировать результаты между двумя сегментами, вы можете щёлкнуть раскрывающийся список Compare to past в верхней части диаграммы, как показано ниже. Начните с выбора соответствующего временного интервала. Например, поскольку вариант A (контрольный сегмент) повлиял на 846 кликов по покупке за прошлую неделю, я могу сравнить это с текущей неделей, чтобы определить, работает ли вариант B (сегмент вариаций) лучше. Если это так, я могу развернуть его для всех.
Чтобы вести журнал того, когда вы включали и отключали флаги своих функций во время тестирования, вы можете добавить его в свои графики на Amplitude.
Суммируем
Давайте подведём итоги того, что мы сделали:
- Мы обсудили концепции состояний управления и изменения (сегментов) и определили их в примере приложения
- Создали флаг функции
- Создали учётную запись Amplitude
- Создали источник
- Добавили событие
- Извлекли конфигурации Amplitude и интегрировали их в Python
- Отправили и отследили несколько успешных запросов
- Создали аналитическую диаграмму для записи событий щелчка
- Наконец, мы рассмотрели, как мы можем сравнить состояние изменения с состоянием контроля на аналитической диаграмме Amplitude, используя опцию Compare to past
Заключение
A/B-тестирование – это полезный метод определения того, соответствует ли новая функция вашим ожиданиям, путём тестирования ее на небольшом проценте пользователей перед развёртыванием для всех. С помощью ConfigCat вы можете упростить свой тест, используя флаги функций и сегментацию пользователей. Их 10-минутный обучаемый интерфейс управления флагами функций позволяет вам и вашей команде быстро приступить к работе. Я настоятельно рекомендую вам попробовать их, зарегистрировав бесплатную учетную запись.