Статистика на собеседовании аналитика: 20 вопросов и задач
Двадцать авторских вопросов по статистике, вероятности и A/B-тестам для собеседования аналитика: ответ вслух, слабая формулировка, расчёт на Python и SQL.
Содержание статьи
На статистическом блоке собеседования аналитика редко спрашивают формулы ради формул. Проверяют другое: понимаете ли вы, что означает число, когда ему нельзя верить и какое решение из него следует. Ниже 20 авторских вопросов и задач — от медианы и дисперсии до SRM, подглядывания и парадокса Симпсона. У каждого есть короткий ответ, который можно произнести за минуту, типичная слабая формулировка и ссылка на подробный разбор. Все числа пересчитаны на Python, три задачи решаются запросом к учебной базе «Маяк».
Как тренироваться по этому списку
Прочитайте условие, закройте ответ и скажите свой вслух, лучше под запись. Минуты хватает почти на любой вопрос: сначала вывод, потом одно обоснование, затем оговорка, при которой вывод перестаёт работать. Сверьтесь с ответом ниже и отдельно — со слабой формулировкой. Она обычно не ошибочна целиком, но обрывается до решения или путает два похожих понятия.
Задачи с числами решайте на бумаге до того, как смотреть код. На интервью калькулятор чаще всего есть, но интервьюер смотрит, умеете ли вы прикинуть порядок: «примерно шесть с половиной тысяч на группу» звучит сильнее, чем точное 6 507 без понимания, откуда оно взялось.
- Вопросы 1–4 — описательная статистика и вероятность.
- Вопросы 5–11 — интервалы, p-value, ошибки, мощность и размер выборки.
- Вопросы 12–16 — A/B-тест: SRM, подглядывание, множественные проверки, ratio-метрики, сегменты.
- Вопросы 17–20 — причинность, парадокс Симпсона, ЦПТ и бутстреп.
1. Средний чек 6 050 ₽, медиана 1 450 ₽: что ставить в отчёт
Десять покупок: 900, 1 100, 1 200, 1 300, 1 400, 1 500, 1 600, 1 700, 1 800 и 48 000 ₽. Среднее — 6 050 ₽, медиана — 1 450 ₽. Что вы покажете руководителю?
Ответ вслух. Зависит от вопроса. Если считаем выручку или план, нужно среднее: сумма равна среднему, умноженному на число покупок, и заказ на 48 000 ₽ — это 79% выручки выборки. Если описываем типичного покупателя, нужна медиана. Сам заказ я бы проверил: опт, тестовая транзакция или ошибка в сумме. Без него среднее — 1 389 ₽. В отчёт ставлю оба числа и отдельной строкой долю крупного заказа.
Слабый ответ: «Медиана, потому что она устойчива к выбросам». Свойство названо верно, вывод — нет: финансовый план по медиане занизит выручку в четыре раза, а удаление заказа без проверки прячет, возможно, самого ценного клиента.
2. Заказов стало вчетверо больше — что уменьшится
Стандартное отклонение чека — 600 ₽ на 400 заказах. Через месяц заказов 1 600. Что станет с разбросом?
Ответ вслух. Стандартное отклонение — свойство самих чеков, оно останется около 600 ₽. Уменьшится стандартная ошибка среднего — точность оценки: 600 / √400 = 30 ₽, а 600 / √1 600 = 15 ₽. Чтобы вдвое сузить интервал, данных нужно вчетверо больше.
Слабый ответ: «Разброс уменьшится вдвое». Это смешение двух чисел: разброса данных и неопределённости среднего. Покупатели не стали похожи друг на друга от того, что их стало больше.
3. Антифрод сработал: какова вероятность мошенничества
Мошенников среди платежей 1%. Правило ловит 95% мошеннических платежей и ошибочно помечает 5% честных. Платёж помечен. Какова вероятность, что это мошенник?
Ответ вслух. Около 16%. Возьму 10 000 платежей: мошеннических 100, правило поймает 95. Честных 9 900, из них 5% — 495 ложных срабатываний. Среди 590 помеченных мошеннических 95, это 16,1%. При редком событии даже точное правило даёт в основном ложные тревоги, поэтому помеченный платёж — повод для проверки, а не для блокировки.
Слабый ответ: «95%». Это вероятность пометки при условии мошенничества, а спрашивали обратное. Ответ в натуральных числах на 10 000 платежей понятнее формулы и его труднее перепутать.
4. Конверсия визита 4%: через сколько визитов покупка
Каждый визит независимо заканчивается покупкой с вероятностью 4%. Сколько визитов в среднем до первой покупки? Купит ли пользователь за это число визитов?
Ответ вслух. В среднем 1 / 0,04 = 25 визитов. Но за 25 визитов купят только 64% пользователей: 1 − 0,96²⁵ ≈ 0,64. Распределение скошено, медиана — 17 визитов, а у части людей до покупки уходит гораздо больше. Оговорка: независимость визитов в жизни нарушается — кто не купил за десять визитов, скорее всего, и дальше покупает реже.
Слабый ответ: «За 25 визитов купит наверняка». Математическое ожидание — не гарантия и не медиана, а при скошенном распределении все три числа расходятся.
5. Задача на «Маяке»: доля платящих по каналу и её интервал
Посчитайте долю пользователей с первой оплатой в каждом канале привлечения и 95% доверительный интервал доли. Правда ли, что paid_search платит реже остальных, или это шум?
Запрос считает интервал Вальда: p ± 1,96 · √(p(1 − p) / n). Для paid_search выходит 86 платящих из 1 015 — 8,5% с интервалом от 6,8% до 10,2%. У partner интервал 14,4–19,5%, у organic 21,5–25,5%, у referral 24,1–29,5%.
Ответ вслух. Интервал paid_search не пересекается ни с одним другим, так что разница не объясняется случайностью выборки. Две оговорки. Непересекающиеся интервалы означают значимую разницу, а пересекающиеся ещё не означают её отсутствия: разность проверяют своим интервалом. И база закрыта 30 августа — у свежих регистраций не было времени заплатить, поэтому каналы стоит сравнить и на дозревших когортах. При малом числе успехов интервал Вальда врёт у границы нуля; формула Уилсона здесь даёт почти то же — 6,9–10,3%.
Слабый ответ: «8,5% меньше 17%, значит канал хуже». Число верное, но без размера выборки и интервала нельзя отличить разницу от случайного колебания на сотне пользователей.
WITH first_pay AS (
SELECT DISTINCT user_id
FROM payments
WHERE payment_type = 'first'
),
by_channel AS (
SELECT u.channel,
COUNT(*) AS users,
COUNT(f.user_id) AS payers,
COUNT(f.user_id) * 1.0 / COUNT(*) AS p
FROM users u
LEFT JOIN first_pay f ON f.user_id = u.user_id
GROUP BY u.channel
)
SELECT channel,
users,
payers,
ROUND(CAST(100 * p AS numeric(18, 6)), 1) AS share_pct,
ROUND(CAST(100 * (p - 1.96 * SQRT(p * (1 - p) / users)) AS numeric(18, 6)), 1) AS ci_low_pct,
ROUND(CAST(100 * (p + 1.96 * SQRT(p * (1 - p) / users)) AS numeric(18, 6)), 1) AS ci_high_pct
FROM by_channel
ORDER BY share_pct DESC6. Что значит «95% доверительный интервал»
Ответ вслух. Это свойство процедуры: если много раз повторить сбор данных и каждый раз строить интервал тем же способом, около 95% интервалов накроют истинное значение. Практически я читаю его как диапазон значений, с которыми данные согласуются, и смотрю на края: если и нижний край устраивает бизнес, решение устойчиво.
Слабый ответ: «С вероятностью 95% истинная доля лежит внутри». В частотной статистике истинное значение фиксировано, а случаен интервал; такую фразу можно сказать про байесовский интервал с явным априорным распределением. Ещё хуже — «95% пользователей попадают в интервал»: это путает точность среднего с разбросом данных из вопроса 2.
7. Что такое p-value и как его толкуют неверно
Ответ вслух. Это вероятность получить разницу не меньше наблюдаемой, если нулевая гипотеза верна и допущения теста выполнены. Маленький p-value говорит, что данные плохо согласуются с «эффекта нет». Он ничего не говорит о размере эффекта и о том, стоит ли изменение внедрять: это показывает интервал.
Слабые ответы — сразу три. «p = 0,03 — вероятность, что нулевая гипотеза верна, 3%»: p-value вычислен при условии, что она верна, и не может быть её вероятностью. «1 − p = 97% — вероятность, что эффект есть»: та же ошибка с другой стороны. «p = 0,001, значит эффект большой»: на миллионе пользователей крошечная разница даёт крошечный p-value.
8. Ошибки первого и второго рода: какая хуже
Ответ вслух. Ошибка первого рода — увидеть эффект, которого нет, и запустить бесполезное изменение; её вероятность при верной нулевой гипотезе ограничивает уровень α. Ошибка второго рода — пропустить эффект, который есть; её вероятность β, а 1 − β — мощность, вероятность заметить эффект заданного размера. Какая хуже, решает цена: дорогой необратимый запуск — бережём α, дешёвое изменение, которое легко откатить, — можно поднять α ради мощности.
Слабый ответ: «Первого рода — когда ошиблись в расчётах». Ошибки рода — не опечатки, а неизбежный риск решения по выборке. И мощность без названного размера эффекта не имеет смысла: «мощность 80%» всегда означает «80% для эффекта в столько-то».
9. p = 0,3: значит, фича не влияет?
Тест шёл две недели, разница незначима, p = 0,3. Менеджер пишет: «фича ни на что не влияет, закрываем».
Ответ вслух. Незначимый результат значит «не нашли», а не «нет». Я посмотрю на интервал разности. Если он условно от −1 до +3 п.п., данные совместимы и с нулём, и с эффектом, который бизнесу важен: тесту не хватило мощности. Если интервал узкий вокруг нуля, например ±0,3 п.п., можно сказать, что эффекта больше 0,3 п.п. скорее всего нет. Формулировка для менеджера: «эффекта больше X не видим», с конкретным X.
Слабый ответ: «Мы приняли нулевую гипотезу». Нулевую гипотезу не принимают — её не отвергают. Это не придирка к словам: от неё зависит, закроют ли рабочую фичу.
10. Сколько пользователей нужно на тест
Конверсия 20%. Хотим заметить рост до 22%, α = 5% двусторонний, мощность 80%. Сколько пользователей в группе?
Ответ вслух. Около 6 500 на группу. Формула: n = (z₀,₉₇₅ + z₀,₈)² · (p₁(1 − p₁) + p₂(1 − p₂)) / (p₂ − p₁)², где сумма z примерно 2,8. Дальше делю на трафик в день и получаю длительность; меньше полной недели не беру даже при большом трафике — у поведения есть недельный цикл.
Слабый ответ: «Запустим и посмотрим, когда станет значимо». Это подглядывание из вопроса 13, а ещё отказ от решения, которое нужно принять до запуска: какой эффект нам вообще интересен.
from scipy.stats import norm
p1, p2 = 0.20, 0.22 # базовая конверсия и та, которую хотим поймать
alpha, power = 0.05, 0.80
z = norm.ppf(1 - alpha / 2) + norm.ppf(power)
n = z**2 * (p1 * (1 - p1) + p2 * (1 - p2)) / (p2 - p1) ** 2
print(f"на группу: {n:.0f}")11. Почему эффект вдвое меньше стоит вчетверо дороже
Тот же тест, но продакт хочет ловить рост не на 2, а на 1 п.п. — «трафик тот же, просто посчитаем точнее».
Ответ вслух. Размер выборки обратно пропорционален квадрату минимального эффекта. Вдвое меньший MDE — примерно вчетверо больше пользователей: для 20% → 21% нужно около 25 600 на группу вместо 6 500. При том же трафике тест идёт вчетверо дольше. Если столько ждать нельзя, честнее снизить шум метрики (CUPED, другая метрика) или признать, что эффект в 1 п.п. этим тестом не измерить.
Слабый ответ: «Нужно в два раза больше данных». Линейная интуиция здесь подводит, и на планировании это стоит недель.
12. Задача на «Маяке»: проверьте сплит перед выводами
В эксперименте onboarding_checklist сплит задумывался 50 на 50. Проверьте, нет ли перекоса, прежде чем смотреть на конверсию.
На «Маяке» в checklist 1 541 пользователь, в control 1 527 — 50,23% и 49,77%. Хи-квадрат против ожидания «поровну» даёт p = 0,80: перекоса не видно. Теперь учебный пример: 50 600 и 49 400 пользователей. Отклонение всего 1,2%, но p = 0,0001.
Ответ вслух. Это SRM — sample ratio mismatch. При такой разбивке результат конверсии читать нельзя, пока не найдена причина: фильтр ботов, редирект, потеря событий в одном варианте. Пользователи пропадают не случайно, и сравнение перестаёт быть сравнением похожих групп.
Слабый ответ: «Перекос 1% — ерунда». Ерунда при сотне пользователей; при ста тысячах это сигнал поломки. Значение имеет не процент, а p-value проверки при данном размере.
SELECT variant,
COUNT(*) AS users,
ROUND(CAST(100.0 * COUNT(*) / SUM(COUNT(*)) OVER () AS numeric(18, 6)), 2) AS share_of_split_pct,
SUM(CASE WHEN converted THEN 1 ELSE 0 END) AS converted,
ROUND(CAST(100.0 * SUM(CASE WHEN converted THEN 1 ELSE 0 END) / COUNT(*) AS numeric(18, 6)), 1) AS conversion_pct
FROM experiment_exposures
WHERE experiment_name = 'onboarding_checklist'
GROUP BY variant
ORDER BY variantfrom scipy.stats import chisquare
for name, counts in {"Маяк": [1541, 1527], "учебный пример": [50_600, 49_400]}.items():
stat, p = chisquare(counts) # ожидание по умолчанию — поровну
print(f"{name}: хи-квадрат {stat:.2f}, p = {p:.4f}")13. Можно ли смотреть результат каждый день
Команда проверяет тест каждый день и останавливает его, как только p < 0,05. Чем это плохо?
Ответ вслух. Каждая проверка — ещё один шанс поймать случайное колебание. В симуляции A/A-теста на 14 дней по 500 пользователей в группе в день одна проверка в конце даёт ложное срабатывание в 4,9% случаев, ежедневная — в 21,6%. Вместо 5% ошибки — около пятой части. Смотреть на данные можно, чтобы ловить поломки; решать — только в заранее назначенный день или последовательным методом с поправкой на число проверок.
Слабый ответ: «Если значимо — значит значимо, неважно когда». Уровень α рассчитан на одну проверку в фиксированный момент. Правило «остановиться при первом успехе» меняет процедуру, и α перестаёт ей соответствовать.
import numpy as np
from scipy import stats
rng = np.random.default_rng(7)
days, per_day, p, runs = 14, 500, 0.20, 20_000
a = rng.binomial(per_day, p, size=(runs, days)).cumsum(axis=1)
b = rng.binomial(per_day, p, size=(runs, days)).cumsum(axis=1)
n = per_day * np.arange(1, days + 1)
pool = (a + b) / (2 * n)
z = (b - a) / n / np.sqrt(pool * (1 - pool) * 2 / n)
pv = 2 * stats.norm.sf(np.abs(z))
print(f"одна проверка в конце: {(pv[:, -1] < 0.05).mean():.3f}")
print(f"проверка каждый день: {(pv < 0.05).any(axis=1).mean():.3f}")14. Двадцать метрик, одна значима
В отчёте теста 20 метрик, значимо выросла одна — время в разделе «Избранное». Запускаем?
Ответ вслух. Если эффекта нет нигде и метрики независимы, вероятность хотя бы одного значимого результата при α = 5% равна 1 − 0,95²⁰ ≈ 64%. Одна «победа» из двадцати — ожидаемый шум. Решение принимается по основной метрике, выбранной до запуска; остальные — защитные или для объяснения. Если проверять много гипотез всё-таки нужно, порог поправляют: по Бонферрони 0,05 / 20 = 0,0025, мягче — Холм или Бенджамини — Хохберг.
Слабый ответ: «Что-то выросло — значит, тест удачный». Так в отчёт попадает метрика, которую выбрали после того, как увидели результат.
15. CTR в тесте с рандомизацией по пользователям
Метрика — CTR: клики, делённые на показы. Варианты назначаются пользователям. Коллега сравнивает CTR t-тестом, где каждая строка — один показ. Что не так?
Ответ вслух. Показы одного пользователя зависимы: активный человек даёт сотни показов с похожим поведением. Тест по показам считает их независимыми, занижает дисперсию и даёт слишком узкий интервал — ложных побед больше, чем 5%. Единица анализа должна совпадать с единицей рандомизации: считаю по пользователю числитель и знаменатель, а дисперсию отношения сумм — дельта-методом, линеаризацией или бутстрепом по пользователям. И уточняю, какая метрика нужна: отношение сумм и средний CTR пользователя — разные числа, они могут разойтись даже по направлению.
Слабый ответ: «Показов миллион, значит, точность огромная». Миллион зависимых наблюдений несут гораздо меньше информации, чем миллион независимых.
16. Задача на «Маяке»: эффект есть, но не везде
В onboarding_checklist конверсия 30,3% против 20,0%: разница +10,3 п.п., 95% интервал от 7,2 до 13,3 п.п. Разбейте результат по устройствам и скажите, что сообщить менеджеру.
На desktop 39,8% против 20,0%, разница +19,8 п.п. (интервал 15,4–24,1). На mobile 19,9% против 20,1%, разница −0,2 п.п. (интервал от −4,2 до +3,9).
Ответ вслух. Общий эффект реален, но его даёт desktop. На mobile эффекта не видно, а интервал допускает и плюс, и минус до 4 п.п., так что «на мобильных не работает» — слишком сильно; «эффекта больше 4 п.п. там нет» — честно. Разбивка сделана после теста, а таких разбивок можно придумать десятки; desktop-эффект настолько силён, что переживёт любую разумную поправку, но причину я бы искал до решения: возможно, чеклист плохо отображается на маленьком экране. Предложение — включить на desktop, на mobile проверить вёрстку и повторить тест.
Слабый ответ: «+10 п.п. для всех, раскатываем». Средний эффект описывает смесь двух групп и не описывает ни одну из них.
SELECT u.device,
e.variant,
COUNT(*) AS users,
SUM(CASE WHEN e.converted THEN 1 ELSE 0 END) AS converted,
ROUND(CAST(100.0 * SUM(CASE WHEN e.converted THEN 1 ELSE 0 END) / COUNT(*) AS numeric(18, 6)), 1) AS conversion_pct
FROM experiment_exposures e
JOIN users u ON u.user_id = e.user_id
WHERE e.experiment_name = 'onboarding_checklist'
GROUP BY u.device, e.variant
ORDER BY u.device, e.variant17. Кто пишет в поддержку, тот чаще уходит
Пользователи, которые обращались в поддержку, отменяют подписку вдвое чаще остальных. Может, чат поддержки вредит?
Ответ вслух. Скорее всего, причинность обратная: в поддержку пишут те, у кого уже что-то сломалось. Обращение отмечает проблему, а не создаёт её. Я бы сравнил людей с одинаковой проблемой — с обращением и без, посмотрел, что было раньше — сбой или обращение, — и как отток зависит от скорости ответа. Причинный вывод даст эксперимент: например, разные сроки ответа или проактивное сообщение при сбое.
Слабый ответ: «Корреляция не означает причинность» — и всё. Фраза верна, но интервьюер ждёт следующего шага: какая альтернативная причина и как её проверить.
18. Новая версия лучше в каждом сегменте и хуже в целом
Пользователи сами обновляют приложение. Сравниваем конверсию в покупку у старой и новой версии. Как такое возможно и какая версия лучше?
Ответ вслух. Это парадокс Симпсона. Новую версию в основном ставят новые пользователи, а они покупают реже всех; в старой версии осталось много постоянных. Общая цифра сравнивает состав аудитории, а не версии. Внутри каждого сегмента новая версия лучше на 2 п.п. Для честного сравнения нужно смотреть по сегментам или взвешивать по одинаковой структуре, а лучше — рандомизировать. В A/B-тесте такой разный состав групп — признак сломанного сплита.
Слабый ответ: «Новая версия хуже: 16% против 26%». Общий итог верен арифметически, но отвечает на другой вопрос.
| Сегмент | Старая версия | Новая версия |
|---|---|---|
| Новые пользователи | 20 из 200 — 10% | 96 из 800 — 12% |
| Постоянные пользователи | 240 из 800 — 30% | 64 из 200 — 32% |
| Всего | 260 из 1 000 — 26% | 160 из 1 000 — 16% |
19. Выручка на пользователя не нормальна — t-тест нельзя?
У 95% пользователей выручка ноль, у немногих — десятки тысяч. Можно ли сравнивать средние t-тестом?
Ответ вслух. Центральная предельная теорема говорит о распределении выборочного среднего, а не самих данных. При большой выборке среднее распределено почти нормально, и t-тест работает. Но с тяжёлыми хвостами сходимость медленная: несколько «китов» двигают среднее сильнее эффекта. Я бы проверил, как меняется результат без топ-пользователей, построил бутстреп-интервал и, если нужно, заранее договорился о метрике с ограничением выбросов как о дополнительной.
Слабый ответ: «Данные не нормальные — только Манна — Уитни». Этот критерий проверяет другую гипотезу — что значения одной группы систематически больше, — и не отвечает на вопрос о средней выручке, на которой держится экономика.
20. Как получить интервал для медианы
Нужен 95% интервал для медианного чека или для отношения двух сумм, а готовой формулы под рукой нет.
Ответ вслух. Бутстреп. Тысячи раз тяну выборку того же размера с возвращением, на каждой считаю медиану, беру 2,5-й и 97,5-й перцентили полученных значений. Тянуть нужно единицу рандомизации: в тесте по пользователям — пользователей со всеми их заказами, а не отдельные заказы. Ограничения: на маленьких выборках и крайних квантилях интервал неточен, а смещение данных и SRM бутстреп не лечит.
Слабый ответ: «Бутстреп создаёт новые данные, и выборка становится больше». Он не добавляет информации — он показывает, насколько оценка колеблется на тех данных, что уже есть.
Что объединяет слабые ответы
Почти каждая слабая формулировка выше путает две соседние вещи: разброс данных и точность среднего, вероятность данных при гипотезе и вероятность гипотезы, «не нашли» и «нет», единицу показа и единицу рандомизации. Если перед ответом спросить себя «о чём именно это число», половина ловушек исчезнет.
Вторая общая черта — ответ обрывается на определении. Интервьюер спрашивает про p-value, но слушает, что вы сделаете с результатом. Заканчивайте ответ решением или следующей проверкой: «запускаем на desktop», «ищем причину перекоса», «эффекта больше 4 п.п. нет».
Частые вопросы
Нужно ли учить формулы наизусть?
Нескольких хватает: стандартная ошибка доли √(p(1 − p) / n), интервал ±1,96 стандартной ошибки, зависимость размера выборки от квадрата эффекта. Остальное важнее уметь объяснить и прикинуть порядок, чем воспроизвести символ в символ.
Сколько вопросов по статистике задают на одном интервью?
Зависит от роли и компании: у продуктового аналитика статистика часто встроена в разбор A/B-теста, у аналитика данных бывает отдельный блок. Список выше покрывает типичные темы, но не обещает, что спросят именно их.
Что делать, если не помню ответ?
Скажите, что знаете, и рассуждайте вслух: «формулу не помню, но интервал должен сужаться как корень из n, поэтому…». Рассуждение с оговоркой ценится выше уверенного неверного ответа.
Как проверять задачи с числами самому?
Повторите расчёт в Python или SQL: три задачи из списка решаются запросом к учебной базе в песочнице, симуляции — в любом ноутбуке. Если число не сходится, разберитесь почему — на интервью этот навык и проверяют.
Дальше — разобрать A/B-тест целиком в симуляторе, где решение принимается по данным, а SQL-запросы для собеседования потренировать в задачах с проверкой.
Материалы по теме

Закон больших чисел простыми словами: формулировка и примеры
Закон больших чисел: почему среднее и доля стабилизируются с ростом выборки. Пример с монетой, накопленная конверсия A/B-теста в SQL, слабая и сильная форма, ошибка игрока и когда закон работает медленно.

Нулевая гипотеза простыми словами: что это и как её формулировать
Нулевая гипотеза (H0) — утверждение, что эффекта или разницы нет. Чем она отличается от альтернативной H1, как её формулировать и что значит «отвергнуть H0».
Калькулятор значимости A/B-теста: как посчитать и прочитать результат
Как посчитать статистическую значимость A/B-теста по двум конверсиям: какие числа нужны, что означает p-value и доверительный интервал разницы, и когда расчёт вообще не применим.