Фрея · риск-менеджер необанка «Монетка»
В отчёт правлению идёт строка «средний чек 1583 ₽». Аудитор спросил, насколько мы в нём уверены. Возьми мы другие полгода, вышло бы 1583 или 1400? Мне нужен ответ, а не «примерно».
В уроке про описательную статистику мы посчитали средний чек «Монетки»: 1583,60 ₽ по 68 241 проведённой операции при медиане 783 ₽. В прошлом уроке выяснили, что чеки похожи на логнормальное распределение: горка слева и длинный хвост справа. Сегодня отвечаем аудитору: как сильно гуляло бы это среднее, будь данные другими.
Ложка супа
Повар не съедает кастрюлю, чтобы понять, хватает ли соли. Он пробует ложку. Если суп перемешан, ложка говорит про всю кастрюлю, хотя вторая ложка будет чуть другой.
Наши 68 241 операция это ложка. Кастрюля это все операции, которые клиенты «Монетки» делали и ещё сделают, генеральная совокупность. Мы видим только выборку, и 1583,60 ₽ это её среднее. Настоящее среднее совокупности неизвестно. Вопрос аудитора в том, как далеко от него может лежать наше.
Другой половины года у нас нет, поэтому сделаем трюк на весь урок: притворимся, что 68 241 операция и есть вся совокупность. Тогда правда известна, 1583,60 ₽, и можно сколько угодно раз зачерпнуть из кастрюли ложку и посмотреть, что она покажет.
import numpy as np
import pandas as pd
from scipy import stats
# все проведённые операции: SELECT amount_rub FROM transactions WHERE status = 'approved'
checks = pd.read_csv("checks.csv")["amount_rub"].to_numpy()
truth = checks.mean() # 1583.60, «правда»
sd = checks.std() # 3470.40, разброс одного чека
Средние ведут себя лучше чеков
Зачерпнём 10 000 раз по 5 чеков и посчитаем среднее каждой ложки. Потом то же для 30, 100 и 1000 чеков:
rng = np.random.default_rng(68)
for n in [1, 5, 30, 100, 1000]:
means = rng.choice(checks, size=(10_000, n)).mean(axis=1)
print(n, means.std(), sd / np.sqrt(n))
rng.choice строит матрицу 10 000 на n, как бутстрэп в уроке про статистику A/B на Python, только тянем мы теперь из кастрюли, а не из своей выборки.
| чеков в ложке | разброс средних, ₽ | sd / sqrt(n), ₽ | ниже коридора | выше коридора |
|---|---|---|---|---|
| 1 | 3398 | 3470 | 0% | 2,1% |
| 5 | 1653 | 1552 | 0% | 3,3% |
| 30 | 632 | 634 | 0% | 4,3% |
| 100 | 345 | 347 | 0,05% | 4,5% |
| 1000 | 108 | 110 | 1,3% | 3,4% |
Тут видно две вещи.
Первая: средние гуляют тем меньше, чем больше ложка, и почти ровно на sd / sqrt(n). Типичное отклонение среднего ста чеков от правды 345 ₽, а отдельного чека 3470 ₽.
Вторая про форму. Коридор это правда ± 1,96 разброса средних. У нормального распределения за ним лежит по 2,5% с каждой стороны. Средние пяти чеков ещё повторяют форму самих чеков: вниз за коридор не выпадает ни одно, вверх 3,3%. Вот 10 000 средних, разложенных по расстоянию от правды в шагах sd / sqrt(n); в последнюю строку попало всё, что дальше трёх шагов:
n = 5 n = 1000
-3,0 0 13
-2,5 0 97 █
-2,0 0 401 ████
-1,5 0 1028 ██████████
-1,0 2483 █████████████████████████ 1707 █████████████████
-0,5 4208 ██████████████████████████████████████████ 2052 █████████████████████
+0,0 1805 ██████████████████ 1914 ███████████████████
+0,5 704 ███████ 1309 █████████████
+1,0 296 ███ 763 ████████
+1,5 191 ██ 407 ████
+2,0 91 █ 187 ██
+2,5 57 █ 64 █
+3,0 165 ██ 58 █
Слева перекошенная горка, как у самих чеков. Справа почти колокол. Это центральная предельная теорема: среднее многих независимых значений распределено почти нормально, какой бы кривой ни была форма самих значений. Логнормальные чеки, биномиальные конверсии, пуассоновские заказы: их средние с ростом выборки превращаются в колокол. Оговорка в слове «многих». Чеки «Монетки» с хвостом до 172 628 ₽ сдаются медленно: даже у тысячи чеков правый хвост толще левого.
урок из курса
Урок из курса «Аналитика данных с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.