Как провести A/B-тест с минимальными затратами

Сколько на самом деле стоит проведение теста и почему не всегда стоит верить программистам.

Генеральный директор центра управления конверсией REES46 Михаил Кечинов написал колонку с примерами кода на PHP.

Как провести A/B-тест с минимальными затратами

Любой уважающий себя интернет-магазин должен использовать те сервисы автоматизации и персонализации маркетинга, которые приносят ему дополнительные деньги. И не использовать те сервисы, которые не приносят деньги или, что ещё хуже, генерируют убытки. Это логично, но к сожалению, в жизни не всегда так.

Маркетологи интернет-магазинов принимают решение по принципу «Этот сервис с крупными клиентами работает, а там не дураки, свое дело знают, так что и мне подойдет». А те, которые крупные, в свою очередь делали точно так же. Хотя, казалось бы, проведи A/B-тест, пойми, сколько тебе этот сервис приносит, и тогда решай, нужен он тебе или нет.

Недавно я узнал, что A/B-тесты не практикуются почти совсем. Потому что игроки рынка рассказывают, что проведение теста — это очень дорого. Конкретизируя в цифрах, провести A/B-тест двух сервисов товарных рекомендаций стоит от 300 тысяч рублей. Трижды пересчитав нули, я спросил: откуда дровишки?

Мне ответили:

  1. Нужно настраивать серверное разделение трафика и передать нужные dimensions в Google Analytics через Measurement Protocol.

  2. Учитывая то, что экспериментальные сессии должны делиться и считаться начиная с первой страницы даже для новых пользователей — придется отказаться от стандартного Google cid (который генерится на клиенте) и использовать свой собственный идентификатор клиента.

  3. Необходимо настроить трекинг статуса заказов в Google Analytics через Measurement Protocol (полную синхронизацию с CRM/ERP).

  4. По прошествии предполагаемого периода теста необходимо выгрузить информацию обо всех заказах и сессиях из Google Analytics при помощи API.

  5. Нужно соединить полученные данные с маржинальностью каждого заказа, чтобы посчитать EBITDA от каждого заказа.

  6. Загрузить полученные цифры по EBITDA в R/Python/Excel и оценить распределение выборки.

  7. Также надо отсечь аномалии (95/99-percentile) и рассчитать среднеквадратическое отклонение.

  8. И ещё рассчитать доверительные интервалы и статистическую значимость для полученной выборки.

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

  10. Уже на это уйдет более 300 тысяч рублей, при условии, что вы найдете специалиста, который это осилит, и магазин, который будет реализовывать.

Если бы я был маркетологом без опыта программирования, чтобы я увидел бы из этого текста? Я бы увидел слова «серверное разделение», «measurement protocol», «percentile», «доверительные интервалы» и подумал: «Жесть какая, слишком сложно и требует времени на то, чтобы разобраться, займет у нас полгода, нереально».

Я полжизни занимаюсь программированием, и половину от этой половины — управлением программистами. Я знаю, что говорят программисты менеджерам, когда не хотят делать какую-то задачу: они говорят, что это невообразимо сложно и используют для этого множество технических слов, типа «legacy», «рефакторить надо», «архитектура не позволяет».

Наш пример A/B-теста

Я постараюсь перевести его на человеческий язык, дать куски готового кода для программистов и показать, сколько это действительно стоит. Но сначала давайте определимся со стоимостью: в среднем час работы хорошего программиста на аутсорсе стоит 2,5 тысячи рублей.

Исходя из оценки в 300 тысяч рублей, подразумевается, что для проведения A/B-теста потребуется 120 часов работы специалистов. В переводе на человеческие дни — 4 недели непрерывного программирования (да, мы считаем, что программисты работают 6 часов в день, а в остальное время ходят в туалет, за кофе и покурить).

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

Теперь вернемся к нашим пунктам невероятного объема работ, перечисленного выше.

Первое, на что стоит обратить внимание в этих пунктах: в них говорится, что Google Analytics доверия нет, поэтому пользователей на сегменты нужно разделять на сервере своими силами, потом загружать всё в Google Analytics, а потом, в конце, выгружать из нее и сопоставлять со своей базой. Сложновато получилось. И непонятно. В основном непонятно — зачем. Если доверия Google нет, значит, не нужно его использовать.

Отмечаем всех посетителей по сегментам на своем сервере и записываем в заказ сегмент посетителя своими силами. Пример кода на PHP, который выполняет пункты 1, 2, 3 и 4:

​if( !$_SESSION['abc_test_segments'] ) { $segments = ['A', 'B', 'C']; $segment = $segments[random_int(0, count($segments))]; $_SESSION['abc_test_segments'] = $segment; mysql_query('INSERT INTO segments (segment) VALUES ("' . $segment . '")');}

На человеческом языке это означает: если пользователь ещё не помещен в сегмент, нужно поместить его туда и записать визит посетителя в базу данных. И если этот пользователь оформил заказ, отметить сегмент этого заказа:

​mysql_query('UPDATE orders SET segment = "' . $segment . '" WHERE id = ' . $order_id);

Пример кода, который реализует пункты 5, 6 и 7:

​SELECT (order_items.amount * items.price * items.price_margin) AS net_profit_segment_A FROM order_items LEFT JOIN items ON items.id = order_items.item_id WHERE order_items.order_id IN (SELECT id FROM orders WHERE date BETWEEN (...) AND segment = 'A' AND status = 'complete' AND order_sum <= (SELECT MAX(order_sum) * 0.95 FROM orders WHERE date BETWEEN(...) AND status = 'complete' ) AND order_sum >= (SELECT MAX(order_sum) * 0.05 FROM orders WHERE date BETWEEN(...) AND status = 'complete' ) );

Выглядит сложновато, но любой программист разберет его за пару минут. Смысл кода — получить чистую прибыль от всех исполненных заказов сегмента A, исключив 5% самых дорогих и самых дешевых аномальных заказов. Чтобы получить чистую прибыль сегментов B и C, достаточно просто заменить в этом запросе букву A.

Дальше пункт 8 — рассчитать доверительные интервалы. Что такое «доверительный интервал»? Это разница между выручкой разных сегментов, при превышении которой можно сказать, что разница имеет значение, а не случайность. Например, сегмент A с суммой 100 тысяч рублей и сегмент B с суммой 100 500 рублей имеют слишком малую разницу в 500 рублей, чтобы считать, что сегмент B всегда будет стабильно на 0,5% лучше, чем сегмент A.

А вот разница в 20 тысяч уже имеет значение. Имеет ли значение разница в 4,5 тысячи рублей? Это покажет доверительный интервал, который может рассчитать любой студент экономического или математического факультета типового вуза. Считается он так:

​SELECT ( 1.96 * SQRT( ( (SELECT COUNT() FROM orders WHERE segment = 'A')/(SELECT COUNT() FROM segments WHERE segment = 'A') * (1 - (SELECT COUNT() FROM orders WHERE segment = 'A') / (SELECT COUNT() FROM segments WHERE segment = 'A') ) ) / SELECT COUNT(*) FROM segments WHERE segment = 'A') ) AS confidence_interval_for_A

Подобный запрос выполняете для каждого сегмента и получаете доверительный интервал для каждого из них. Обратите внимание: решение уместилось 1147 букв. А описание проблемы и её стоимости потребовало 1429 букв.

Если разделить сумму в 300 тысяч рублей на 1147 букв, то получим стоимость одной буквы — 261 рубль 50 копеек. Даже юристы меньше зарабатывают.

При всем уважении к коллегам по рынку: я потратил на написание этого кода 15 минут, ещё около 30 минут я потратил на запрос в гугле «confidence interval mysql». В итоге не больше часа. Даже если поставить такую задачу начинающему программисту и платить ему как высококвалифицированному 2,5 тысячи рублей в час, сделать эту задачу можно часов за 20. И её стоимость составит не более 50 тысяч рублей. В шесть раз меньше заявленной цены.

55
11 комментариев

Все звучит круто, я прям вижу, как маркетологи побежали к своим разработчикам и начали им доказывать, что вот ребята за 50 тыс. все сделаю и это еще с запасом, а вы меня обманываете, негодяи!

И ребята будут долго и упорно объяснять, что этого мало и возникнут миллион мелочей, которые автор не учел, что нужно еще качественно протестировать, ведь мало получать данные, нужно быть на 100% уверенным, что они правдивые)

6
Ответить

| Исходя из оценки в 300 тысяч рублей, подразумевается, что для проведения A/B-теста потребуется 120 часов работы специалистов.

Считать, что в выставленном счёте всю сумму составляет ФОТ их программистов - полный бред.

Генеральный директор должен по себе знать, что там от силы ФОТ программистов тысяч 30. Остальное идёт на аренду офиса, ФОТ остальных сотрудников, в том числе на зарплату директору, налоги, рекламу, которая может быть и половиной затрат, да и прибыль хоть какая-то обязана быть.

Допускаю, про всё это можно не знать, если вся твоя фирма располагается на компьютере в твоей квартире, а сотрудники - фрилансеры из бедных регионов. Тогда, легко разделишь 300 на 2.5 и возмутишься на vc - "Да они там что, охренели?!" Смешно.

PS. "программиста на аутсорсе" надо не любого из пучка, а того, который в теорвер может, а то натестируете. И он не будет стоить 2.5, и программист-математик вряд ли шабашит на фрилансе.

3
Ответить

Блин, читаю колонку и пла́чу. Я же 6 лет назад точно также думал :joy:

3
Ответить

A/B тесты с разделением трафика, подсчётом доверительных интервалов и всем остальным есть в GA из коробки. Также есть куча недорогих сервисов для того же самого. Зачем вообще писать код на php, если есть готовое решение?

2
Ответить

Вот этот каммент полезнее статьи. Хотя статься полезна тем, что задаёт вопрос.

Ответить

Мне лень искать сайты, которые используют этот код, но тут sql injection в каждом запросе.

2
Ответить