Перейти до змісту
Увійти

Теорія

Аналіз до і після: чесне порівняння версій

Аналіз до і після: правила, за яких порівняння версій застосунку варто читати.

~9 хв читання · 9 вправ · 250 балів

Перед початком

Що можна дізнатися без тесту?

Тут ти працюєш в продуктовій команді Halves — застосунку, який ділить спільні витрати між сусідами по квартирі, парами й компаніями в подорожах, із платним планом Halves Plus. Не кожна зміна отримує A/B-тест: релізи виходять, кампанії стартують, сезони змінюються, а хтось однаково питає, чи зміна спрацювала.

Цей модуль показує, як далеко можна зайти з даними без підкидання монетки: як побудувати чесне порівняння, які пояснення воно здатне відкинути і де мусить зупинитися. Перший урок порівнює дві версії застосунку до і після релізу так, щоб незавершені когорти не ввели в оману.

Чому «користувачі нової версії» — упереджена група

Поділ сьогоднішніх користувачів за версією застосунку здається чесним порівнянням (той самий тиждень, та сама погода), але воно перекошене ще до початку: оновлення ніхто не розігрував.

Ті, хто відкриває Halves раз на кілька днів, отримують 4.9.0 за день-два, часто автоматично. Ті, хто відійшов, тижнями сидять на 4.8.0. Тож на боці нової версії зібралися найвідданіші користувачі, і вона «виграла» б, навіть якби реліз нічого не змінив. Коли групи відбирають себе самі, це зміщення відбору (selection bias); докладно його розбирає урок Зміщення відбору: хто робить X, той краще утримується.

Завзяті постійні користувачі першими кидаються встановлювати оновлення, а випадкові підходять значно пізніше.
Оновлення не розігрували жеребом: першими його ставлять найактивніші.

Без підкидання монетки ти робиш спостережне порівняння (observational comparison), і чесність доводиться вбудовувати через те, як обирають групи. Три правила роблять порівняння версій «до і після» вартим читання:

  1. Нові користувачі, згруповані за датою реєстрації. Новачок встановлює актуальну версію, тож версію визначає дата, а не ентузіазм.
  2. Те саме фіксоване вікно для кожної когорти, наприклад активність на 8–14-й день.
  3. Лише когорти, які прожили все вікно.

Навіть тоді воно показує різницю, а не її причину.

  • Так
    Нові користувачі за датою реєстрації, до і після 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 червня.

signup_dateapp_versiondays_observednew_usersreturned_any_timeactive_days_8_14
2026-04-134.8.048724215
2026-04-144.8.047755223
2026-04-154.8.046705125
2026-04-164.8.045775631
2026-04-174.8.044705016

Перші 5 з 49 рядків

Завантажити CSV

З даними по 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).

Станом на 1 червня всі 28 когорт 4.8.0 завершені, а з 4.9.0 повні дні 8–14 мали лише 7 когорт з 11 до 17 травня; порівнюй тільки їх.

Тож більша частина «падіння» — це календар, а не код. Така картина трапляється майже на кожному дашборді з утриманням за датою реєстрації: найсвіжіші когорти завжди виглядають жахливо, бо вікно ще відкрите. Дашборд, що приглушує чи ховає незавершені когорти, запобігає хибній тривозі ще до того, як її хтось побачить.

  • Так
    Завершені когорти 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 балів, коли пройдете його вперше.

Розпочати вправи