Статистика для аналитика с нуля: разброс, перцентили, форма данных и выборка
Что из статистики нужно в рабочий день: как читать разброс и стандартное отклонение, зачем p90 и p99, почему продуктовые данные почти никогда не нормальные и чем выборочная ошибка отличается от смещения.
Содержание статьи
Учебная статистика начинается с формул, рабочая — с вопроса «можно ли на этом числе принимать решение». Разница заметна сразу: в продукте нет аккуратной выборки, есть неполный последний день, три канала трафика с разной аудиторией, пропуски в логах и срок до пятницы. Дальше — четыре вещи, которые закрывают большую часть таких разговоров: разброс, перцентили, форма распределения и то, кем на самом деле заполнена выборка. Каждая разобрана на числах, которые можно пересчитать на калькуляторе.
Коротко
Порядок работы важнее списка формул. Сначала вы определяете, что именно измеряете и на кого смотрите, и только потом выбираете статистику. Большинство ошибок в отчётах появляется до первого вычисления.
- Среднее описывает центр, но ничего не говорит о том, насколько предсказуем процесс: для этого нужен разброс.
- Стандартное отклонение — про разброс самих наблюдений, стандартная ошибка — про точность оценки. Это два разных числа.
- Перцентили отвечают на вопрос «сколько наблюдений укладывается в порог», и их нельзя усреднять по группам.
- У денег и времени правый хвост — норма, а не дефект данных: снизу ноль, сверху ничего.
- Два пика в распределении почти всегда означают, что метрика склеила две разные аудитории.
- Выборочная ошибка уменьшается с ростом n, смещение не уменьшается никогда.
Из всей статистики в рабочую неделю попадают четыре вопроса
Возьмём сервис доставки еды и обычный разбор месяца. На столе четыре задачи: ARPU по каналам привлечения вырос, но продуктовая команда спорит, какой канал оставить; пользователи жалуются на медленный поиск, а график среднего времени ответа спокоен; поддержка отвечает в среднем за четыре часа, и никто не понимает, откуда эта цифра; после релиза прошёл опрос, в нём 72% довольных. Четыре разговора — и ни один не решается одним средним.
Если вытащить из них статистическую часть, останутся четыре вопроса. Насколько процесс предсказуем — это разброс. Какая доля наблюдений укладывается в порог — это перцентили. На что похожа форма данных и не смешаны ли в одной метрике разные сценарии — это распределение. И последний, самый неудобный: кто вообще попал в расчёт и можно ли переносить вывод на всю базу.
Порядок здесь не случайный, он же и порядок этого материала. Разброс показывает, что центра недостаточно. Перцентили дают язык, чтобы говорить про края. Форма распределения объясняет, почему перцентили расходятся с центром так сильно. А выборка решает, про кого вообще было всё предыдущее.
Про сам центр — среднее, медиану и моду — отдельный разбор: в нём двадцать заказов, средний чек 2 310 ₽ при медиане 1 000 ₽ и ответ на вопрос, какую середину ставить в отчёт. Здесь это считается известным, поэтому начинаем с того, что стоит рядом с центром.
И одна привычка, которая экономит больше времени, чем любая формула: записать единицу наблюдения до расчёта. Пользователь, заказ, сессия и событие дают четыре разных знаменателя и четыре разных ответа на один и тот же вопрос. Десять событий одного человека — это одно наблюдение, а не десять, и половина споров о «неправильных цифрах» заканчивается на этом уточнении.
вопрос → кто в выборке → единица наблюдения → форма → разброс и неопределённость → решениеПерепрыгнуть можно через любой шаг, но тогда точность расчёта уже ничего не гарантирует.
У двух каналов ARPU одинаковый, а риск разный — это видно только в разбросе
Первая задача: органика и партнёрский канал дали один и тот же ARPU — 900 ₽. По этому числу каналы неразличимы, и решение «масштабируем партнёрку, там дешевле трафик» выглядит обоснованным. Посмотрим на пять пользователей из каждого канала, чтобы механику можно было пересчитать руками.
Органика: 700, 800, 900, 1 000 и 1 100 ₽. Партнёрка: 0, 0, 200, 800 и 3 500 ₽. Суммы одинаковые — 4 500 ₽, средние тоже: 900 ₽. Медианы разные: 900 ₽ против 200 ₽. Три пользователя из пяти в партнёрском канале не заплатили почти ничего, а один дал 3 500 ₽ — 78% всей выручки канала.
Теперь посчитаем разброс. Дисперсия — это средний квадрат отклонения от среднего, стандартное отклонение — корень из неё, то есть то же самое в рублях. Для органики отклонения равны −200, −100, 0, +100 и +200; сумма их квадратов 100 000; делим на n − 1 = 4, получаем 25 000; корень — 158 ₽. Для партнёрки отклонения −900, −900, −700, −100 и +2 600; сумма квадратов 8 880 000; делим на 4 — 2 220 000; корень — 1 490 ₽. Один и тот же ARPU, разброс различается почти в десять раз.
Две детали про саму формулу. Квадрат нужен, чтобы отклонения в минус и в плюс не уничтожали друг друга: их обычная сумма всегда равна нулю, проверьте на органике. Делитель n − 1, а не n, берут, когда считают оценку по выборке: среднее уже вытащено из этих же данных, поэтому отклонения от него систематически занижены, и поправка это компенсирует. На пяти наблюдениях разница между n и n − 1 заметна, на пятидесяти тысячах — нет, и спорить о ней не стоит.
На полном месяце картина та же, просто числа устойчивее: у органики стандартное отклонение 220 ₽, у партнёрского канала 1 140 ₽. Для решения это означает конкретное: выручка партнёрки собрана на нескольких крупных пользователях, и её повторяемость зависит от того, придут ли такие же в следующем месяце. Сравнение каналов по одному ARPU эту зависимость скрывает целиком.
Разброс при этом не оценка качества. Для платежей широкий разброс нормален — люди платят по-разному. Для времени ответа API он сам по себе проблема: пользователь не видит среднего, он видит свой запрос. Одно и то же число читается противоположно в зависимости от того, что за процесс за ним стоит.
| Показатель | Органика | Партнёрка | Как получен |
|---|---|---|---|
| Пользователей в примере | 5 | 5 | количество строк |
| Сумма | 4 500 ₽ | 4 500 ₽ | сложить значения |
| ARPU | 900 ₽ | 900 ₽ | сумма / 5 |
| Медиана | 900 ₽ | 200 ₽ | третье значение в упорядоченном ряду |
| Стандартное отклонение | 158 ₽ | 1 490 ₽ | √(Σ(x − x̄)² / 4) |
| Доля выручки у верхнего пользователя | 24% | 78% | 1 100 / 4 500 и 3 500 / 4 500 |
select
channel,
count(*) as users,
round(avg(revenue)) as arpu,
round(stddev_samp(revenue)) as sd,
round(percentile_cont(0.5) within group (order by revenue)) as median,
round(percentile_cont(0.9) within group (order by revenue)) as p90
from user_revenue
where cohort_month = date '2026-06-01'
group by channel
having count(*) >= 200
order by sd desc;Если стандартное отклонение сопоставимо со средним или больше его, метрика собрана на хвосте. Тогда к ARPU нужны медиана, p90 и доля выручки у верхних 5% — иначе решение про бюджет опирается на нескольких пользователей, которых в следующем месяце может не быть.
Среднее время ответа 280 мс ничего не говорит о запросе, который шёл 7 секунд
Вторая задача: поиск медленный, но график среднего времени ответа ровный — 280 мс весь месяц. Разброс уже подсказал, что центра мало, а перцентили дают язык, чтобы говорить именно про края.
Перцентиль — это значение, ниже которого лежит заданная доля наблюдений. p50 — медиана, половина запросов быстрее. p90 означает, что девять запросов из десяти укладываются в этот порог, а каждый десятый — нет. Квантиль — тот же объект в долях от нуля до единицы: p90 и квантиль 0,9 — одно и то же. Месячный срез поиска выглядит так: p50 — 180 мс, p75 — 260 мс, p90 — 410 мс, p95 — 820 мс, p99 — 2 400 мс.
Разница между p50 и p99 — больше чем в тринадцать раз, и среднее 280 мс стоит между p75 и p90. То есть «среднее время ответа» описывает не типичный запрос, а примерно восьмидесятый перцентиль. Каждый сотый запрос при этом идёт дольше двух секунд: на тысяче поисков в минуту это десять недовольных пользователей каждую минуту, и они не узнают, что в среднем всё хорошо.
Главное свойство перцентилей — они формулируются как договорённость. «90% поисков быстрее 400 мс» можно проверить, поставить в SLO и повесить на дашборд. Для этого нужно зафиксировать три вещи: окно расчёта, объект (запрос, а не пользователь) и способ вычисления. Без этого две команды посчитают «p90» по-разному и будут спорить о цифре, хотя расходятся у них знаменатели.
Теперь про ловушку, из-за которой перцентили ломаются чаще всего: их нельзя усреднять. У мобильного клиента p90 равен 520 мс, у веба — 300 мс. Общий p90 не равен 410 мс, потому что среднее двух перцентилей — это не перцентиль объединённого набора. Его считают либо по исходным наблюдениям, либо через структуру, которая умеет складываться, — гистограмму с фиксированными корзинами или t-digest. В BI-системах это типичная причина расхождения: сводная плитка усредняет то, что усреднять нельзя.
Вторая ловушка — шум на маленькой выборке. На 500 запросах p99 определяется пятью самыми медленными, и один случайный сетевой таймаут двигает его вдвое. Поэтому p99 имеет смысл на больших окнах и для сценариев, где редкий отказ действительно дорог: оплата, авторизация, отправка заказа. Для операционного контроля хватает p90, а p99 по часу — это обычно не метрика, а случайность.
Как перцентили ловят то, что среднее пропускает, видно на релизе поиска. Среднее улучшилось: 420 мс было, 350 мс стало. В это же время p95 вырос с 1,2 до 2,4 секунды. Оптимизация ускорила массовые простые запросы и замедлила тяжёлые фильтры — и если в отчёт попало только среднее, команда закрыла релиз как удачный, а часть пользователей получила вдвое худший опыт.
| Показатель | На что отвечает | Где применяют |
|---|---|---|
| p50 | каким видит продукт типичный пользователь | обзорные графики, сравнение версий |
| p90 | сколько укладывается в обещание | SLO, операционный контроль |
| p95 | где начинается ощутимый хвост | медленные экраны, тяжёлые отчёты |
| p99 | насколько дороги редкие отказы | оплата, авторизация, критические запросы |
| n и окно | можно ли вообще доверять краю | обязательная подпись к p95 и p99 |
Значения в миллисекундах. p99 больше p50 в тринадцать раз — ровно этот разрыв среднее и скрывает.
Поддержка отвечает «в среднем за 4 часа», и таких обращений нет вообще
Третья задача. Среднее время ответа поддержки — четыре часа, и это число не описывает ни одного реального обращения. Днём отвечают примерно за 5 минут, ночью письмо лежит до утра — около 18 часов. Четыре часа лежат в провале между двумя пиками: столько не ждёт почти никто.
Это и есть двугорбое распределение, и читается оно однозначно: в одной метрике склеены два разных процесса. Любой центр — среднее, медиана, мода — встанет между пиками и опишет выдуманный сценарий. Лечится не трансформацией и не вычищением хвоста, а разделением: дневная смена и ночная, первая линия и эскалация, платный тариф и бесплатный. После разреза у каждой группы появляется свой честный центр и свой p90.
У форм распределения есть всего несколько типов, которые встречаются в продукте, и каждый диктует первый шаг. Симметричная — редкая гостья: рост, вес, погрешность измерения, иногда время выполнения стабильной операции. На ней работает привычная связка «среднее ± стандартное отклонение», и именно из неё растёт интуиция из учебника.
Скошенная вправо — основной случай для денег и времени. Выручка на пользователя, LTV, время до первой покупки, длительность сессии: снизу метрика ограничена нулём, сверху ничем, а крупный клиент покупает не на 200 ₽ больше обычного, а в десятки раз больше. Среднее уезжает в хвост, медиана остаётся на месте, и их расхождение — это не погрешность, а описание формы.
Дискретная форма — там, где значений мало и они целые: число заказов на покупателя, количество попыток оплаты, число мест в подписке. Такую метрику честнее описывать долями, а не центром. И ограниченная сверху шкалой — доля просмотренного видео, процент выполнения плана: здесь хвост уходит влево, потому что упереться в 100% легко, а группа, бросившая действие на первом шаге, тянет среднее вниз.
Посмотрите на время до первой покупки в нашем сервисе: 420 пользователей купили в первый день, 610 — на второй, 380 — в интервале от двух до четырёх дней, 150 — от четырёх до восьми, 72 — позже. Всего 1 632 человека. Горб слева, тонкий хвост справа — и медиана около двух дней, тогда как среднее заметно выше из-за последних 72 наблюдений.
Диагностика формы занимает одну команду и не требует теории. Нужны семь чисел: n, минимум, p25, медиана, p75, p95, максимум, плюс доля пропусков и число уникальных значений. Последние два часто важнее остальных: если уникальных значений пять, перед вами дискретная шкала, а не непрерывная величина, и гистограмма по ней ничего не покажет. А если доля пропусков выросла после релиза, то разговор вообще не про статистику, а про трекинг.
И про нормальность. Продуктовые данные почти никогда не нормальные, и это не повод останавливаться: для сравнения средних на больших выборках работает центральная предельная теорема — распределение самой оценки становится близким к нормальному даже при скошенных исходных данных. Проверять нормальность каждой метрики как ритуал смысла мало. Смысл есть в другом вопросе: не склеены ли в этой метрике две аудитории, которые стоило бы считать отдельно.
| Форма | Где встречается | Что делать первым |
|---|---|---|
| Симметричная | время стабильной операции, погрешность | среднее и стандартное отклонение работают |
| Скошенная вправо | выручка, LTV, время до события | медиана и p90, доля суммы у верхних 5% |
| Двугорбая | день и ночь, B2C и B2B, trial и платные | разрезать метрику, не усреднять |
| Дискретная | число заказов, попыток, мест | доли по значениям вместо центра |
| С потолком | доля просмотра, выполнение плана | p10 и доля ниже порога |
Число пользователей по корзинам, всего 1 632. Медиана попадает во вторую корзину, среднее — правее неё.
col = 'minutes_to_first_reply'
print(df[col].describe(percentiles=[.1, .25, .5, .75, .95]))
print('пропусков:', df[col].isna().mean().round(3))
print('уникальных:', df[col].nunique())
# два пика обычно видно сразу в разрезе по сценарию
print(df.groupby('shift')[col].agg(['count', 'median', 'mean']))Разброс данных и точность оценки — разные числа, и путают их постоянно
Перед последней задачей нужно развести два числа, которые выглядят похоже и означают разное. Стандартное отклонение описывает, насколько различаются сами наблюдения. Стандартная ошибка описывает, насколько неточно посчитано среднее по ним. Первое — свойство процесса, второе — свойство вашей выборки.
Связь между ними простая: стандартная ошибка равна стандартному отклонению, делённому на корень из n. Возьмём партнёрский канал со стандартным отклонением 1 490 ₽. На 2 000 пользователях стандартная ошибка ARPU равна 1 490 / √2 000 ≈ 33 ₽. На 8 000 — около 17 ₽. Разброс между пользователями при этом не изменился ни на рубль: люди платят так же по-разному, просто среднее мы знаем точнее.
Отсюда практическое следствие. Собрав больше данных, вы уточняете оценку, но не делаете процесс однороднее. Если продуктовый вопрос звучит как «насколько предсказуема выручка с пользователя», отвечает стандартное отклонение, и наращивание выборки его не улучшит. Если вопрос «насколько точно мы знаем ARPU», отвечает стандартная ошибка, и она падает вместе с корнем из n — вчетверо больше данных дают вдвое более точную оценку.
Из стандартной ошибки строится доверительный интервал: примерно две ошибки в каждую сторону для 95%. Для партнёрского ARPU на 2 000 пользователях это ±66 ₽ — то есть 900 ₽ честно читается как «где-то от 834 до 966». Записанная так, метрика больше не выглядит точнее, чем она есть, и спор о разнице в 20 ₽ между каналами заканчивается сам.
s = √(Σ(x − x̄)² / (n − 1)); SE = s / √ns не зависит от размера выборки, SE падает пропорционально корню из n.
72% довольных — это 72% среди 18%, которые увидели форму
Последняя задача месяца и самая неприятная. После релиза опрос дал 72% положительных ответов. Форму видели пользователи, которые открыли экран обратной связи, — 18% базы. Те, кто удалил приложение на второй день, её не увидели никогда. Число 72% верно, но относится не к той аудитории, о которой говорят на встрече.
Здесь встречаются два разных риска, и их лечат по-разному. Выборочная ошибка — случайное отклонение оценки, потому что наблюдений ограниченное число; она уменьшается при росте n предсказуемо, через корень. Смещение — систематический сдвиг из-за того, что в выборку попадают не те наблюдения; оно не уменьшается вообще, сколько данных ни собирайте.
Арифметика этой разницы отрезвляет. Возьмём 44 000 наблюдений: стандартная ошибка для доли около 50% равна √(0,25 / 44 000) ≈ 0,24%, то есть интервал примерно ±0,5 процентного пункта. Выглядит как измерение с точностью до половины пункта. Теперь предположим, что среди 82% невидевших форму довольных не 72%, а 45% — оценка всей базы становится 0,18 × 72 + 0,82 × 45 ≈ 50%. Сдвиг в 22 пункта при погрешности в половину пункта: формула про ошибку посчитана правильно и ровно ничего не защищает.
Механизмы смещения стоит знать по именам, потому что по имени сразу видно проверку. Coverage bias — в источник попадает не вся популяция: только активные пользователи, только один регион, только устройства с работающим SDK. Non-response — отвечают не все, и отказ связан с мнением: недовольные чаще молчат или, наоборот, приходят только они. Survivorship — в знаменателе остались выжившие, а ушедшие выпали из расчёта. Post-treatment selection — сегментация по условию, которое возникло уже после воздействия: «сравним тех, кто дошёл до оплаты» ломает даже корректно рандомизированный тест.
Рабочий инструмент против всего этого один — воронка попадания в данные. Рисуете четыре шага: кто в принципе подходил под вопрос, кто увидел событие, кого мы наблюдали, кто попал в итоговый расчёт. В нашем сервисе она выглядит так: 100 тысяч подходящих пользователей, 82 тысячи увидели экран, 61 тысяча отдала событие, 44 тысячи попали в расчёт. До метрики доехало 44% исходной аудитории, и каждый переход — отдельный вопрос «почему потеряли и кого именно».
Дальше сравниваете дошедших с исходными по двум-трём известным признакам: платформа, возраст аккаунта, тариф, канал. Если в базе Android 54%, а в расчёте 31%, вы знаете и сам факт смещения, и его вероятную причину. Обычно этого достаточно, чтобы выбрать одно из четырёх: починить сбор, стратифицировать выборку, взвесить группы или сузить утверждение до той аудитории, которая реально измерена.
Последнее — нормальный рабочий выход, а не поражение. «Среди активных платящих пользователей на iOS удовлетворённость 72%» — это решение можно принимать. Проблема начинается там, где ограниченную выборку молча называют «нашими пользователями», и дальше на ней строят продуктовую стратегию для всей базы.
| Что видно в данных | Тип риска | Проверка |
|---|---|---|
| Маленькая случайная выборка | выборочная ошибка | посчитать интервал, добрать данные |
| В расчёте только активные | coverage bias | сравнить состав расчёта с полной базой |
| Опрос заполнили немногие | non-response bias | изучить отказавшихся, добавить пассивные события |
| Считаем только оставшихся | survivorship bias | вернуть ушедших в знаменатель |
| Сегмент по событию после релиза | post-treatment selection | резать только по признакам до воздействия |
До метрики доехало 44% исходной аудитории. Каждый шаг — отдельная причина потери и отдельный риск смещения.
Как написать вывод, который не развалится на ревью
Все четыре задачи сходятся в одном месте — в формулировке. Сильный вывод отделяет наблюдение от объяснения и называет границы применимости. Сравните две версии про поддержку. «Поддержка работает плохо, среднее время ответа 4 часа». И: «Днём медиана ответа 5 минут, ночью около 18 часов; среднее в 4 часа не описывает ни одну смену. Ночная очередь — отдельный процесс, и решать нужно её».
Вторая формулировка длиннее на строку, но на ней можно действовать, и её нельзя прочитать неправильно. Тот же приём работает всюду: сначала факт с числами и объектом, затем гипотеза отдельным предложением, затем что именно нужно для её проверки. Слово «значит» в середине вывода — хороший повод проверить, не превратилась ли корреляция в причину по дороге.
Что практически полезно проверять перед отправкой отчёта: рядом с каждым средним стоит n; для денежных и временных метрик рядом с центром есть медиана и p90; перцентили не усреднены по группам; метрика не склеила два сценария; у выборки названа аудитория, а не просто количество строк. Пять проверок занимают минут десять и снимают большинство вопросов на ревью.
Отдельно про неопределённость. Честная запись «прирост от +0,7 до +11,3 п.п.» полезнее уверенного «прирост 6%», потому что показывает, хватает ли данных для решения. Если интервал шире, чем цена решения, правильный вывод — «данных пока не хватает, нужно столько-то», и это тоже результат работы, а не её отсутствие.
Практика: четыре числа для одной своей метрики
Возьмите любую метрику своего продукта и пройдите тот же маршрут за один вечер. Шаг первый: посчитайте n, среднее, медиану, стандартное отклонение и p90 одним запросом. Если стандартное отклонение сопоставимо со средним, а p90 выше медианы больше чем в два раза, у метрики хвост, и одно среднее в отчёт не идёт.
Шаг второй: постройте распределение по корзинам и подпишите форму словами — симметричная, скошенная, двугорбая, дискретная. Если горбов два, найдите признак, который их разделяет, и пересчитайте всё отдельно по группам.
Шаг третий: нарисуйте воронку попадания в данные от исходной аудитории до строки в расчёте и посчитайте долю на каждом переходе. Затем сравните состав итогового набора с полной базой по двум признакам. Почти всегда выясняется, что «все пользователи» — это конкретная и довольно узкая когорта.
Шаг четвёртый: перепишите вывод по схеме «факт — гипотеза — что нужно для проверки» и назовите в нём аудиторию. Если после этого вывод звучит скучнее, чем раньше, обычно это признак, что из него убрали то, чего в данных не было.
Итог и что читать дальше
Статистика в работе аналитика нужна не для точности ради точности, а для трёх ответов: насколько велик сигнал, насколько он устойчив и на кого его можно распространить. Разброс отвечает за предсказуемость, перцентили — за края, форма распределения — за то, не склеены ли разные процессы, выборка — за границу вывода. Ни один из этих вопросов не закрывается средним, и ни один не требует сложной математики.
Дальше логично идти в две стороны. В сторону неопределённости — доверительный интервал, мощность и p-value: они превращают «разница есть» в «разница такого размера, и данных на это хватает». И в сторону данных — проверки качества, выбросы и причины, по которым метрика начинает обманывать раньше любой статистики.
Материалы по теме

Дисперсия и стандартное отклонение: что это и как посчитать
Дисперсия — средний квадрат отклонения от среднего, стандартное отклонение — корень из неё. Формулы, пример на пяти числах, почему делят на n − 1, расчёт в SQL, Excel и Python, типичные ошибки.

Коэффициент вариации: формула, расчёт и как читать
Коэффициент вариации — стандартное отклонение в процентах от среднего. Формула, пример на пяти числах, расчёт в SQL, Python и Excel, порог 33% для НМЦК и ловушки.

Генеральная совокупность и выборка: что это и как не перепутать
Генеральная и выборочная совокупность простыми словами: параметр и статистика, способы отбора, объём выборки и погрешность. Пример на SQL: честная выборка против удобной.