Итоговая практика
Менеджер магазина просит короткий отчёт. Вы ответите на пять вопросов. Каждый вопрос посчитайте на Python или на SQL. Лучше на обоих, чтобы проверить себя.
Подготовка: вы в папке stats-practice, таблицы созданы (Установка). Решайте сами, без AI. Открывайте решение, когда ответ готов.
Вопрос 1. Какой у нас типичный заказ?
Заголовок раздела «Вопрос 1. Какой у нас типичный заказ?»Посчитайте по amount: число заказов, среднее, медиану, стандартное отклонение, P90. Какую меру вы покажете менеджеру как «типичный чек» и почему?
Проверка:
| Метрика | Значение |
|---|---|
| Заказов | 1000 |
| Среднее | 77,33 |
| Медиана | 48,05 |
| Стандартное отклонение | 276,83 |
| P90 | 101,75 |
Показываем медиану: 48. Среднее завышено пятью очень большими заказами.
Решение
SELECT count(*) AS n, round(avg(amount), 2) AS mean_amount, round(median(amount), 2) AS median_amount, round(stddev_samp(amount), 2) AS std_amount, round(quantile_cont(amount, 0.9), 2) AS p90FROM orders;Вопрос 2. Есть ли выбросы?
Заголовок раздела «Вопрос 2. Есть ли выбросы?»Найдите выбросы по правилу IQR. Сколько их? Какие из них выглядят подозрительно и почему?
Проверка: верхняя граница 134,5; выбросов 55. Подозрительны пять заказов от 3 332,65 до 4 493,42: следующий по величине заказ — всего 387,64. Все пять сделаны с mobile.
Решение
SELECT order_id, device, channel, amountFROM ordersWHERE amount > 1000ORDER BY amount DESC;Все пять — mobile. Нужно проверить, нет ли ошибки в мобильном приложении. Например, цена в центах вместо долларов.
Вопрос 3. Где заказы дороже — на мобильном или на десктопе?
Заголовок раздела «Вопрос 3. Где заказы дороже — на мобильном или на десктопе?»Сравните устройства по среднему и медиане. Потом повторите для заказов дешевле 1000. Сделайте вывод.
Проверка:
| device | заказов | среднее | среднее без выбросов | медиана |
|---|---|---|---|---|
| desktop | 485 | 58,65 | 58,65 | 51,13 |
| mobile | 515 | 94,93 | 57,46 | 44,83 |
По среднему мобильные заказы на 62% дороже. Это иллюзия: после удаления пяти заказов средние почти равны (57,46 и 58,65).
Решение
SELECT device, count(*) AS n, round(avg(amount), 2) AS mean_amount, round(avg(amount) FILTER (WHERE amount < 1000), 2) AS mean_no_outliers, round(median(amount), 2) AS median_amountFROM ordersGROUP BY deviceORDER BY device;Python:
import csvimport statistics as st
with open("data/orders.csv") as f: orders = list(csv.DictReader(f))
for dev in ["desktop", "mobile"]: a = [float(r["amount"]) for r in orders if r["device"] == dev] rest = [x for x in a if x < 1000] print(dev, len(a), round(st.mean(a), 2), round(st.mean(rest), 2), round(st.median(a), 2))Вопрос 4. Разница между устройствами реальна?
Заголовок раздела «Вопрос 4. Разница между устройствами реальна?»Постройте 95% доверительные интервалы среднего чека для desktop и mobile по заказам дешевле 1000. Они пересекаются? Что это значит?
Проверка:
| device | среднее | интервал |
|---|---|---|
| desktop | 58,65 | 55,19–62,12 |
| mobile | 57,46 | 53,77–61,16 |
Интервалы сильно пересекаются. Разницы между устройствами по среднему чеку нет.
Решение
SELECT device, count(*) AS n, round(avg(amount), 2) AS mean_amount, round(avg(amount) - 1.96 * stddev_samp(amount) / sqrt(count(*)), 2) AS ci_low, round(avg(amount) + 1.96 * stddev_samp(amount) / sqrt(count(*)), 2) AS ci_highFROM ordersWHERE amount < 1000GROUP BY deviceORDER BY device;Вопрос 5. Что с новой кнопкой?
Заголовок раздела «Вопрос 5. Что с новой кнопкой?»Вывод для менеджера по A/B-тесту: конверсия, разница, p-value, доверительный интервал разницы. Рекомендуете ли запускать кнопку всем? Напишите вывод в трёх предложениях.
Проверка: конверсия A 10,0%, B 12,5%. Разница +2,5 п.п. (+25% относительно). z = 2,50, p-value = 0,0124. Интервал разницы: от +0,54 до +4,46 п.п.
Пример вывода: «Новая кнопка увеличила конверсию с 10% до 12,5%. Разница статистически значима (p = 0,012). Настоящий эффект — от 0,5 до 4,5 п.п., поэтому запускаем всем и следим за метрикой».
Решение
Все формулы — в уроке A/B-тест. Соберите их в один скрипт на Python.
- Найдите в
daily.csvдни, где число заказов самое необычное для затрат на рекламу. Подсказка: возьмите остатки от линии трендаorders ~ ad_spendи найдите самые большие по модулю. - Постройте таблицу по каналам (
channel): число заказов, медиана суммы, P90 времени доставки. - Напишите функцию
describe(values)на Python. Она печатает число значений, среднее, медиану, стандартное отклонение, минимум и максимум.