# Загальна кількість, унікальні користувачі й пастки підрахунку

> Чому той самий тиждень даних дає різну кількість «активних користувачів» і як рахувати правильно.

- Курс: [Продуктова аналітика: від даних до рішень](https://productovi.com/uk/courses/product-analytics.md)
- Модуль: Що саме ми вимірюємо?
- Урок 2/32, ~32 хв
- Джерело: https://productovi.com/uk/courses/product-analytics/counting-traps

## Звідки взялося 22?

**Alex Tutor:** Знову в продуктовій команді Halves: Maya має число для ради директорів і просить тебе його перевірити.

**Maya:** Презентація для ради директорів — у п'ятницю. Я порахувала всіх в експорті за минулий тиждень: 22 активні користувачі. Можна ставити на слайд?

**Sofia:** Але ж у файлі 147 рядків. Яке з чисел справжнє?

**Alex Tutor:** Поки що жодне. 147 — це **загальна кількість подій (event total)**: усі рядки разом із повторами. 22 — це **унікальні користувачі (unique users)**: усі, хто має хоча б один рядок, кожен по разу.

![Висока стопка паперових чеків стоїть поруч із коротким рядом фігурок людей, кожна по одному разу.](https://productovi.com/courses/product-analytics/inline/counting-traps-illustration-2.webp)

*Рядки й люди — різні підрахунки: одна активна людина може залишити десяток рядків.*

**Набір даних (CSV):** [Лог подій Halves, 1–7 червня (147 рядків)](https://productovi.com/datasets/product-analytics/counting-traps/halves-events-week-1.csv)

Усі події за минулий тиждень у порядку часу. Час в UTC.

- `event_time`: Коли це сталося, в UTC
- `user_id`: Хто: акаунт у Halves
- `event`: Що сталося: app_opened, expense_added або settle_up_recorded
- `platform`: Де записано подію: ios, android або server
- `entry_method`: Лише для expense_added: manual, receipt_scan або recurring (створює сервер)
- `amount_usd`: Сума в доларах США для витрат і розрахунків
- `settlement_id`: Лише для settle_up_recorded: до якого розрахунку належить рядок

**Набір даних (CSV):** [Користувачі Halves у лозі (22 рядки)](https://productovi.com/datasets/product-analytics/counting-traps/halves-users-week-1.csv)

Один рядок на кожен акаунт, що трапляється в лозі подій.

- `user_id`: Акаунт у Halves
- `signup_date`: Дата створення акаунта
- `platform`: Платформа телефона користувача: ios або android
- `acquisition_channel`: Звідки користувач прийшов у Halves: invite, app_store_search, paid_social, referral_link або staff
- `timezone`: Домашній часовий пояс користувача
- `is_internal`: true для акаунта команди, false для клієнта; заповнено не завжди

**Alex Tutor:** У u014 цього тижня 12 рядків, у u005 — один. У загальній кількості u014 важить удванадцятеро більше. В унікальних користувачах кожен рахується один раз.

**Sofia:** Тобто «скільки людей» — це унікальні користувачі. Отже, 22 правильно?

**Alex Tutor:** Це люди з *будь-яким* рядком. Перш ніж називати їх активними, подивімося, хто вони.

> **Вправа:** u014 уже відкривав Halves цього тижня. Наступного тижня та сама людина відкриває його на 10 разів більше, ніж зазвичай. **Правда чи ні:** зростуть і загальна кількість подій, і кількість унікальних користувачів.

## Рядки, яких ніхто не робив

**Alex Tutor:** Дехто з 22 має лише один вид рядків: витрата о 06:00 UTC в понеділок, `platform = server`, `entry_method = recurring`.

**Alex Tutor:** Це **серверні події (server-side event)**: Halves сам додав їм щомісячні рахунки, як-от оренду. Ці люди за весь тиждень жодного разу не відкрили застосунок.

**Maya:** Але ж вони платять за Plus. Хіба вони не рахуються?

**Alex Tutor:** Як передплатники — так. Як активні користувачі — ні. «Активний» має означати, що людина щось зробила. Для Halves домовимося так: хоча б раз за тиждень відкрила застосунок.

> **Вправа:** Скористайся логом подій. Скільки **унікальних користувачів хоча б раз відкрили застосунок** (`app_opened`) за тиждень?

## Найактивніші користувачі працюють у нас

**Sofia:** Два акаунти вирізняються: по 20 рядків, і кожна витрата — рівно 1 дол.

**Alex Tutor:** Типовий слід QA: тестувальники додають крихітні витрати, щоб перевірити, чи все працює. Це **внутрішній трафік (internal traffic)**, і йому не місце в продуктових метриках.

![Двоє працівників із бейджами раз у раз тиснуть на тестовий телефон за столом, а поруч росте купка крихітних однакових чеків.](https://productovi.com/courses/product-analytics/inline/counting-traps-illustration-3.webp)

*Дотики тестувальників схожі на активного користувача, але в продуктових числах їм не місце.*

**Maya:** Просто: є позначка `is_internal`. Відфільтруй за нею.

**Alex Tutor:** Спробуй: позначка ловить один акаунт. В іншого `is_internal` порожній, бо хтось забув його заповнити. Видає його інша колонка у файлі користувачів.

**Alex Tutor:** Будь-яку позначку, яку ставлять вручну, вважай неповною, доки не перевіриш.

> **Вправа:** Скористайся журналом подій і файлом користувачів та прибери **всі** акаунти команди, з позначкою чи без. Скільки реальних користувачів хоча б раз за тиждень відкрили застосунок?

**Alex Tutor:** Maya перераховуватиме це щотижня, тож фільтр для акаунтів команди треба записати. Є два варіанти.

> **Вправа:** Яке правило має використовувати щотижневий звіт, щоб прибрати акаунти команди?

## Рахуємо витрати

**Theo:** Для сторінки в сторі хочу «витрат додано за тиждень». У файлі 60 рядків `expense_added`. Можна писати 60?

**Alex Tutor:** Ті самі пастки, тільки в кількості подій. Частину цих рядків створив сервер, а частину ввели два QA-акаунти.

**Sofia:** Тобто прибираю рядки `recurring` та обидва акаунти команди й рахую рядки?

**Alex Tutor:** Так. Тут рахувати рядки правильно, бо кожна витрата — рівно одна подія. Неправильні лише рядки, яких не додавала жодна людина.

> **Вправа:** Theo потрібно «витрат, доданих людьми за минулий тиждень». Скільки з 60 рядків `expense_added` додали реальні користувачі в застосунку, без регулярних рахунків і акаунтів команди?

**Alex Tutor:** У Theo ще одне прохання для сторінки в магазині: типова витрата. Тут середнє може підвести.

> **Вправа:** Theo хоче «типову витрату» для сторінки в магазині застосунків. Без акаунтів команди 40 рядків `expense_added` за минулий тиждень мають середнє 81,28 дол., а медіану 40,50 дол. Яке число підходить і чому?

## Розрахунки: платежі, а не рядки

**Sofia:** А розрахунки? Рядків `settle_up_recorded` — 11.

**Alex Tutor:** Тут рядки завищують число. Платник записує розрахунок, а телефон отримувача записує його ще раз під час підтвердження. Щоб порахувати платежі, рахуй різні `settlement_id`.

![Двоє людей тримають по половинці одного розірваного чека; половинки складаються в один цілий.](https://productovi.com/courses/product-analytics/inline/counting-traps-illustration-4.webp)

*Платник і отримувач записують його обидва: два рядки, один розрахунок.*

**Maya:** А «розрахунків на користувача»? Кому зараховувати: платникові чи отримувачеві?

**Alex Tutor:** Залежить від питання. Скільки платежів закрито — рахуємо id. Скільки людей розраховувалися — рахуємо користувачів з обох боків. Головне — записати, що саме мається на увазі.

> **Вправа:** У лозі 11 рядків `settle_up_recorded`. Скільки **розрахунків** (платежів) вони описують?

**Alex Tutor:** Тепер інше прочитання Maya: не платежі, а люди, які брали участь у розрахунку, як платник чи як отримувач.

> **Вправа:** Скільки **різних користувачів** мають хоча б один рядок `settle_up_recorded` у лозі за тиждень?

## Відповідь для Maya

**Alex Tutor:** Складімо все докупи. Той самий тиждень дає чотири різні числа «користувачів» залежно від того, що відфільтрувати.

> **Один тиждень, чотири числа**
>
> | Кого рахуємо | Користувачів |
> |---|---|
> | Усіх, хто має рядок у лозі | 22 |
> | … з них тих, хто відкривав застосунок | 19 |
> | … мінус акаунти з `is_internal = true` | 18 |
> | … мінус усі акаунти команди | **17** |

**Maya:** Тобто на слайді буде 17? Це гірше, ніж 22.

**Alex Tutor:** Це число, яке витримає перевірку. І напиши під ним визначення, щоб кожен, хто перерахує, отримав 17.

**Sofia:** Тижневі активні користувачі: реальні люди, не акаунти команди, які хоча б раз за тиждень відкрили застосунок.

**Alex Tutor:** Перед визначенням — останнє сортування: яким числам цього тижня потрібні різні id, а які чесно рахувати рядками?

> **Вправа:** Які з цих чисел треба рахувати як **різні id**, а не рядки? Обери всі правильні варіанти.

> **Вправа:** Напиши Maya 2–3 речення: чому «22 активні користувачі» за минулий тиждень — неправильне число і яке число поставити на слайд натомість, разом із визначенням.

> **Головне**
>
> - **Загальна кількість подій** рахує рядки разом із повторами, **унікальні користувачі** — кожну людину один раз. Обирай те, що потрібно для питання.
> - **Серверні події** (регулярні рахунки) додають у лог людей, які не відкривали застосунок: 22 користувачі з будь-якою подією, 19 — з відкриттям.
> - **Внутрішній трафік** треба прибирати, і однієї позначки мало: `is_internal` прибирає один акаунт команди (18), `acquisition_channel = staff` знаходить другий (17).
> - Для витрат рядки правильні після очищення: 60 − 5 регулярних − 20 від команди = 35, доданих людьми.
> - Двосторонні події завищують число: 11 рядків розрахунків — це 8 платежів. Рахуй різні `settlement_id`.

**Alex Tutor:** Твоє речення — майже визначення метрики. У наступному уроці зробимо його настільки точним, щоб його не можна було прочитати двояко.

- Попередній урок: [Події, властивості й користувачі](https://productovi.com/uk/courses/product-analytics/events-properties-users.md)
- Наступний урок: [Визначення метрики: одне правило, одне число](https://productovi.com/uk/courses/product-analytics/metric-definitions.md)

---
Productovi Learning. Безкоштовно, читати можна без реєстрації.
