Задачи на медиану и перцентили на собеседовании
Зачем спрашивают
Медиану и перцентили путают с средним, и это частая ловушка на собесе. Задачи проверяют:
- Знаете ли вы, когда медиана корректнее среднего.
- Можете посчитать медиану в SQL и pandas.
- Понимаете ли P90/P95/P99 для SLA и хвостов.
Задача 1. Когда медиана лучше среднего
У нас распределение доходов: 90% пользователей 30–60k, 10% — 500k+. Какая метрика «типичного» пользователя?
Ответ. Медиана. Среднее сместится вверх из-за топ-10%, медиана отражает «середину» реально.
Задача 2. Посчитать медиану в SQL
PostgreSQL
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) AS median
FROM orders;ClickHouse
SELECT quantile(0.5)(amount) FROM orders;
-- Или точнее: quantileExact(0.5)(amount)MySQL (нет функции)
-- Для odd числа строк
SELECT amount FROM orders ORDER BY amount
LIMIT 1 OFFSET (SELECT COUNT(*)/2 FROM orders);Задача 3. P95 latency для API
У нас есть таблица с временем ответа API. Посчитайте P95 за последний день.
SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY latency_ms)
FROM api_logs
WHERE DATE = CURRENT_DATE;Интерпретация: 95% запросов отвечали быстрее этого значения. Типичная SLA-метрика.
Задача 4. Pandas: medain и quantile
df['amount'].median()
df['amount'].quantile(0.95)
# Несколько перцентилей одновременно
df['amount'].describe(percentiles=[0.25, 0.5, 0.75, 0.95, 0.99])Попробовать силы на подобных вопросах проще всего в тренажёре Карьерник — прямо в Telegram, без регистрации через сайт.
Задача 5. Медиана по группе
-- SQL
SELECT city, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) AS median
FROM orders GROUP BY city;# Pandas
df.groupby('city')['amount'].median()Задача 6. Разница mean vs median по сегментам
stats = df.groupby('segment')['amount'].agg(['mean', 'median'])
stats['skew_sign'] = stats['mean'] - stats['median']
# Если mean > median → правый хвост (киты)
# Если mean < median → левый хвост (редко)Задача 7. Перцентили для сегментации
Разделите пользователей на top 5%, middle 90%, bottom 5% по выручке.
WITH stats AS (
SELECT user_id, total,
PERCENT_RANK() OVER (ORDER BY total) AS prank
FROM user_totals
)
SELECT user_id, total,
CASE
WHEN prank >= 0.95 THEN 'top'
WHEN prank < 0.05 THEN 'bottom'
ELSE 'middle'
END AS segment
FROM stats;Задача 8. PERCENTILE_CONT vs PERCENTILE_DISC
- CONT — continuous, интерполирует между значениями. Для нечётного числа строк возвращает среднее двух соседних.
- DISC — discrete, возвращает реальное значение из данных.
-- Для [1, 2, 3, 4]
PERCENTILE_CONT(0.5) → 2.5 (interpolated)
PERCENTILE_DISC(0.5) → 2 (actual value)На собесе спросят разницу — знайте.
Задача 9. Квантиль в Python через numpy
import numpy as np
np.percentile(df['amount'], [25, 50, 75, 95, 99])
# [250, 500, 1000, 3000, 10000]Пройти 30–50 задач по теме за вечер можно в Telegram-тренажёре. Это то, что отличает «знаю» от «уверенно отвечу на собесе».
Задача 10. Визуализация распределения с перцентилями
import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(df['amount'])
plt.axvline(df['amount'].median(), color='red', label='Median')
plt.axvline(df['amount'].quantile(0.95), color='orange', label='P95')
plt.legend()Какие перцентили и когда использовать
- P50 (медиана) — типичное значение в распределении.
- P90 — «большинство» с запасом.
- P95 — стандарт SLA в IT.
- P99 — выявление редких медленных запросов.
- P99.9 — для очень критичных систем.
Ловушки на собесе
1. «Средний чек упал, но медиана стабильна»
Значит, ушли киты. Типичный пользователь не изменился.
2. «Добавление одного элемента сильно двигает среднее»
Если +10% элементов сдвинули mean на 50% — значит, был большой выброс. Медиана устойчивее.
3. P95 путают с P5 или P0.95
P95 = 95-й перцентиль = 95% значений ниже него. P5 = 5-й (bottom). P0.95 = формат в SQL.
4. AVG медленнее для больших данных?
Нет, AVG быстрее медианы. Медиана требует сортировки (O(n log n)), среднее — просто сумма (O(n)).
Читайте также
- Медиана vs среднее
- Квантили и перцентили
- Выбросы в данных
- Задачи на статистику
- Агрегатные функции SQL
FAQ
Медиана всегда лучше среднего?
Нет. Для нормально распределённых данных — равноценна. Для скошенных (LTV, доход, задержки) — лучше медиана. Для finance reporting — часто просят среднее.
Как быстро посчитать P99 на миллиардах строк?
Через approximate quantile: quantile(0.99) в ClickHouse, APPROX_QUANTILES в BigQuery. Точный расчёт требует сортировки всего — непрактично.
Медианный доход или средний — что показывать в презентации?
Часто оба. Средний — понятно стейкхолдеру, медиана — реально отражает. Если они сильно различаются, объясните почему.
Почему P99 нестабильный?
Потому что зависит от очень редких событий. Шум в 100 точках может сильно сдвинуть P99. P95 надёжнее для дашбордов, P99 — для алертов.