Задачи на медиану и перцентили на собеседовании

Зачем спрашивают

Медиану и перцентили путают с средним, и это частая ловушка на собесе. Задачи проверяют:

  • Знаете ли вы, когда медиана корректнее среднего.
  • Можете посчитать медиану в 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)).

Читайте также

FAQ

Медиана всегда лучше среднего?

Нет. Для нормально распределённых данных — равноценна. Для скошенных (LTV, доход, задержки) — лучше медиана. Для finance reporting — часто просят среднее.

Как быстро посчитать P99 на миллиардах строк?

Через approximate quantile: quantile(0.99) в ClickHouse, APPROX_QUANTILES в BigQuery. Точный расчёт требует сортировки всего — непрактично.

Медианный доход или средний — что показывать в презентации?

Часто оба. Средний — понятно стейкхолдеру, медиана — реально отражает. Если они сильно различаются, объясните почему.

Почему P99 нестабильный?

Потому что зависит от очень редких событий. Шум в 100 точках может сильно сдвинуть P99. P95 надёжнее для дашбордов, P99 — для алертов.