Теорія
Аналіз до і після: чесне порівняння версій
Аналіз до і після: правила, за яких порівняння версій застосунку варто читати.
~9 хв читання · 9 вправ · 250 балів
Перед початком
Що можна дізнатися без тесту?
Тут ти працюєш в продуктовій команді Halves — застосунку, який ділить спільні витрати між сусідами по квартирі, парами й компаніями в подорожах, із платним планом Halves Plus. Не кожна зміна отримує A/B-тест: релізи виходять, кампанії стартують, сезони змінюються, а хтось однаково питає, чи зміна спрацювала.
Цей модуль показує, як далеко можна зайти з даними без підкидання монетки: як побудувати чесне порівняння, які пояснення воно здатне відкинути і де мусить зупинитися. Перший урок порівнює дві версії застосунку до і після релізу так, щоб незавершені когорти не ввели в оману.
Чому «користувачі нової версії» — упереджена група
Поділ сьогоднішніх користувачів за версією застосунку здається чесним порівнянням (той самий тиждень, та сама погода), але воно перекошене ще до початку: оновлення ніхто не розігрував.
Ті, хто відкриває Halves раз на кілька днів, отримують 4.9.0 за день-два, часто автоматично. Ті, хто відійшов, тижнями сидять на 4.8.0. Тож на боці нової версії зібралися найвідданіші користувачі, і вона «виграла» б, навіть якби реліз нічого не змінив. Коли групи відбирають себе самі, це зміщення відбору (selection bias); докладно його розбирає урок Зміщення відбору: хто робить X, той краще утримується.

Без підкидання монетки ти робиш спостережне порівняння (observational comparison), і чесність доводиться вбудовувати через те, як обирають групи. Три правила роблять порівняння версій «до і після» вартим читання:
- Нові користувачі, згруповані за датою реєстрації. Новачок встановлює актуальну версію, тож версію визначає дата, а не ентузіазм.
- Те саме фіксоване вікно для кожної когорти, наприклад активність на 8–14-й день.
- Лише когорти, які прожили все вікно.
Навіть тоді воно показує різницю, а не її причину.
- ТакНові користувачі за датою реєстрації, до і після 11 травня, активні на 8–14-й день, лише завершені когорти
- Не такКористувачі цього тижня на 4.9.0 проти тих, хто досі на 4.8.0
Ті, хто швидко оновлюється, — найактивніші користувачі: групи відібрали себе самі.
Які когорти вже прожили своє вікно?
Когорта входить у порівняння версій, лише коли все її вікно минуло. До того її число цензуроване справа (right censoring): як пояснює урок Як читати воронку: цензурування справа і діапазони дат, незавершене вікно виглядає як люди, що не повернулися. Для днів 8–14 active_days_8_14 рахує лише ту частину вікна, яка вже відбулася, а когорта, чий 8-й день ще не настав, показує нуль за побудовою.
У датасеті є стовпчик, що це вирішує: days_observed — скільки днів після реєстрації видно на ранок вивантаження. Когорта завершена, коли days_observed ≥ 14.

Набір даних · 49 рядків
Щоденні когорти реєстрацій навколо версії 4.9.0
Нові користувачі Halves з 13 квітня до 31 травня 2026 року, один рядок на день реєстрації. Версія 4.9.0 вийшла 11 травня. Дані вивантажено вранці 1 червня.
Перші 5 з 49 рядків
З даними по 31 травня межа — 31 травня − 14 днів = 17 травня. Тож:
- усі 28 когорт 4.8.0 (13 квітня – 10 травня) завершені;
- з 21 когорти 4.9.0 завершені лише 11–17 травня: 7 когорт, 551 користувач;
- 18–24 травня пораховані частково (6 когорт, 473 користувачі);
- 25–31 травня ще взагалі не дійшли до 8-го дня (7 когорт, 642 користувачі, усі нулі).
Незавершені когорти в середньому не додають інформації; вони додають нулі, які означають «ще ні».
- ТакЗавершена, якщо days_observed ≥ 14 → 11–17 травня, 7 когорт
- Не такЗавершена, якщо days_observed ≥ 8 → 13 когорт
8-й день — початок вікна, а не його кінець.
Межа зсувається з кожним вивантаженням
Які когорти завершені, залежить від двох речей: вікна й останнього дня в даних. Правило щоразу те саме:
Остання завершена дата реєстрації = останній день даних − кінець вікна
Для днів 8–14 вікно закінчується на 14-й день. Дані по 31 травня дають 31 травня − 14 = 17 травня. Тиждень потому, з даними по 7 червня, це 7 червня − 14 = 24 травня, і когорти 4.9.0 з 11 до 24 травня завершені: 14 когорт замість 7.
Саме тому аналіз «до і після» варто перезапускати, а не захищати. Перше прочитання бере ті кілька когорт, що готові; кожне наступне вивантаження додає завершених когорт і звужує інтервал, не змінюючи методу.
Поширені три помилки: віднімати лише початок вікна (8-й день), через що всередину потрапляють напівпобачені когорти; забувати, що сам день реєстрації — це день 0; брати дату, коли відкрили дашборд, замість останнього дня, який справді є в даних. Пиши обидві дати на графіку: «дані по 7 червня; когорти до 24 травня».
- ТакДані по 7 червня: 7 червня − 14 днів = 24 травня
- Не такДані по 7 червня: 7 червня − 8 днів = 30 травня
Взято початок вікна, тож когорти 25–30 травня пораховано лише частково.
Об'єднай когорти, потім діли один раз
Об'єднання когорт в одну частку (додати кількості, потім поділити один раз, як показує урок Обсяг, якість і парадокс Сімпсона) має одну передумову: кожна когорта в ньому має бути виміряна однаково.
Кожна версія має багато щоденних когорт різного розміру: тихий будній день може привести менше ніж 70 нових користувачів, людна субота — понад 100. Одна частка на версію:
Частка = Σ active_days_8_14 ÷ Σ new_users
Для 4.8.0 усі 28 когорт завершені: 638 ÷ 2209 = 28,88%.
Якщо натомість усереднити 28 щоденних часток, кожен день отримає однакову вагу, хоч яким він був за розміром. Тут результат випадково близький (28,94%), але не мусить бути: кілька крихітних днів із крайніми частками можуть відтягнути просте середнє далеко від того, що справді робили користувачі. Об'єднана частка рахує кожного користувача один раз.
Якщо змішати завершені й незавершені когорти чи когорти з різними вікнами, об'єднане число втрачає сенс, хоч арифметика й правильна. Тому спершу перевіряють завершеність, а вже потім сумують.
- Так4.8.0: 638 ÷ 2209 = 28,88%
- Не такСереднє 28 щоденних часток = 28,94%
Тут близько випадково; день із 66 людей важить як день із 105.
Звідки взялися 15% у Maya
Дашборд Maya показав, що утримання на другому тижні впало з 29% до 15%. Обидва числа об'єднано правильно; проблема в тому, які когорти туди потрапили.
15% — це всі 21 когорта 4.9.0: 253 ÷ 1666 = 15,19%. Але лише 7 із них прожили дні 8–14. 7 найсвіжіших когорт (25–31 травня, 642 користувачі) дають нулі, бо їхній 8-й день ще не настав, а 6 перед ними (18–24 травня) пораховано лише частково. Дві третини знаменника — люди, які просто ще не мали нагоди бути утриманими.
Беремо лише завершені когорти, 11–17 травня: 172 ÷ 551 = 31,22%. Проти 28,88% у 4.8.0 це 31,22 − 28,88 = +2,33 п. п. (з неокруглених часток, 31,216 − 28,882).

Тож більша частина «падіння» — це календар, а не код. Така картина трапляється майже на кожному дашборді з утриманням за датою реєстрації: найсвіжіші когорти завжди виглядають жахливо, бо вікно ще відкрите. Дашборд, що приглушує чи ховає незавершені когорти, запобігає хибній тривозі ще до того, як її хтось побачить.
- ТакЗавершені когорти 4.9.0: 172 ÷ 551 = 31,22%
- Не такУсі когорти 4.9.0: 253 ÷ 1666 = 15,19% → «утримання впало вдвічі»
642 користувачі в знаменнику ще не могли бути активними на 8–14-й день.
Метриці потрібен фіксований горизонт
У звіті Theo — «повернулися будь-коли після реєстрації»: 66,8% для 4.8.0 проти 47,1% для 4.9.0. Схоже на ще більше падіння.
У цієї колонки немає фіксованого горизонту. Когорта із середини квітня мала до 48 днів, щоб хоч раз повернутися; когорта від 31 травня — жодного. Кожен додатковий день — ще одна нагода повернутися, тож метрика росте з віком когорти. Порівнювати за нею версії — значить порівнювати старі когорти з молодими, і старша версія виграє за побудовою.
Датасет: Щоденні когорти реєстрацій навколо версії 4.9.0 · є вище
Виправлення — фіксоване вікно: ті самі дні після реєстрації для кожної когорти, наприклад 8–14-й. Тоді кожна когорта має рівно стільки ж нагод, а рахують лише когорти, що прожили все вікно.
«Вона використовує всі наявні дані» звучить як перевага, але тут саме в цьому проблема: «усі дані» — це різна кількість даних для кожної когорти. Добра когортна метрика свідомо відкидає частину даних, щоб решта була порівнюваною.
Те саме стосується й іншого: «загальна кількість покупок на користувача», «хоч раз запросив друга», «дохід за весь час» — усім потрібен горизонт, перш ніж порівнювати когорти.
- ТакАктивні на 8–14-й день, когорти з days_observed ≥ 14
- Не так«Повернулися будь-коли»: 66,8% (4.8.0) проти 47,1% (4.9.0)
До 48 днів на повернення проти інколи жодного.
Завершеності замало без горизонту
Спокусливо думати, що проблема «повернулися будь-коли» зникає, щойно лишити тільки завершені когорти. Ні.
Візьмімо сім завершених когорт 4.9.0 (11–17 травня): будь-коли повернулися 335 з 551, тобто 335 ÷ 551 = 60,80%. Когорти 4.8.0 показують 1476 ÷ 2209 = 66,82%. За цією метрикою 4.9.0 виглядає приблизно на 6 пунктів гіршою.
А тепер фіксоване вікно на тих самих когортах: 31,22% для 4.9.0 проти 28,88% для 4.8.0, приблизно на 2,3 пункту краще. Ті самі користувачі — протилежний напрям.
Причина — вік. Завершені когорти 4.9.0 мали на 1 червня від 14 до 20 днів історії; когорти 4.8.0 — від 21 до 48. «Завершена» означає лише, що кожна прожила дні 8–14; на метриці без горизонту старші когорти однаково отримують тижні додаткових нагод.
Тож два правила працюють разом: фіксоване вікно змушує кожну когорту міряти одне й те саме, а завершеність гарантує, що кожна когорта це вікно прожила. Будь-яке з правил окремо однаково пускає вік когорти в порівняння.
- ТакДні 8–14, завершені когорти: 31,22% проти 28,88%
- Не такБудь-коли, завершені когорти: 60,80% проти 66,82% → «4.9.0 гірша»
Когорти 4.8.0 однаково мали 21–48 днів нагод проти 14–20.
Що може і чого не може підтвердити «до і після»
Чесний перерахунок усе одно лишає два окремі питання, перш ніж хтось назве +2,33 п. п. (31,22% проти 28,88%) покращенням.
Випадковість. Сім днів і 551 користувач — небагато. 95% інтервал різниці на основі Вілсона — приблизно від −1,9 до +6,7 п. п.: що завгодно від невеликої втрати до помітного виграшу. Він виключає велике падіння, і це відповідь на питання Maya, але виграшу не показує.
Усе інше. Інтервал враховує лише випадковий шум. Порівняння «до і після» містить і все інше, що змінилося між квітнем і травнем: канікули, кампанію, канали, з яких прийшли нові користувачі. Жоден інтервал, хоч який вузький, не відокремить реліз від цього.

Тож чесна відповідь: ознак, що 4.9.0 зламала утримання на другому тижні, немає; даних замало, щоб заявляти виграш; а схема не доводить причини. Перераховуй, коли завершаться нові когорти, а для наступної великої зміни лиши рандомізовану holdout-групу на старому сценарії (як — показує Кейс: версія чи трафік?).
Як це складається докупи: версії, задані датою реєстрації, одне фіксоване вікно, завершені когорти й об'єднані частки роблять «до і після» чесним; інтервал і межі методу тримають його правдивим. Далі — Структура трафіку і сезонність: коли змінюються й самі люди, що приходять.
- Так«Ознак, що 4.9.0 погіршила утримання на другому тижні, немає: +2,33 п. п. (від −1,9 до +6,7). Заявляти виграш зарано.»
- Не так«Новий сценарій першої витрати підняв утримання на другому тижні на 2,33 пункту.»
Заявляє причину й виграш, яких не підтримують ні інтервал, ні схема порівняння.
Готові потренуватися?
Виконайте вправи уроку й отримайте 250 балів, коли пройдете його вперше.
Розпочати вправи