Описание на данните
Накратко: Описателната статистика казва къде е центърът на данните (средна, медиана, най-честа стойност) и колко се разпръскват (стандартно отклонение, процентили, IQR).
Проблем
„Средният клиент“
Управителят иска карта за лоялност. „Средният клиент прави по 8 поръчки годишно. Да дадем подарък на осмата поръчка: така всеки обикновен клиент ще го получи.“
Звучи разумно. Но колко клиенти стигат до осма поръчка? И колко поръчки прави един обикновен клиент? Средната отговаря само на един от тези въпроси, и не винаги на този, който си мислиш.
Идеята
Средна, медиана, най-често
Едно число, което казва „около колко са поръчките“, има три вида:
- средната (mean): сборът, разделен на броя;
- медианата (median): числото по средата, когато ги наредиш; половината са под нея, половината над нея;
- най-честата стойност (mode): тази, която се среща най-много пъти.
Стойността на поръчка за годината, без отказаните поръчки:
Средната е 10,63 €, а медианата 7,70 €. Най-честата поръчка е за 2,40 €. Три числа за едни и същи данни, и 64,4% от поръчките са под средната.
Причината е опашката: малко големи поръчки (до 78,70 €) дърпат средната нагоре. Медианата не ги усеща, защото гледа само кое е по средата. Видя опашката в хистограмата на поръчките.
mode() връща списък, защото най-честите стойности може да са няколко с еднакъв брой. Затова values е закръглено до цент: иначе 2.4 и 2.4000000000000004 се броят за различни.
Идеята
Разсейване: обхват и стандартно отклонение
Средната не казва колко се различават поръчките една от друга. Два магазина със средна 10 € може да са много различни: в единия всяка поръчка е около 10 €, в другия има и по 1 €, и по 50 €. Това се казва разсейване (spread).
Обхватът (range) е най-голямата минус най-малката: 77,90 €. Той зависи само от двете крайни поръчки и една странна поръчка го променя.
Стандартното отклонение (standard deviation, std) е колко далеч от средната е обикновено една поръчка. Тук е 9,43 €: поръчка на 10,63 € ± около 9 € е нещо обичайно.
По-точно, за любопитните
std е корен от средния квадрат на разстоянията до средната. Квадратът прави големите разстояния много по-тежки, затова при дълга опашка std също расте.
pandas дели на n − 1, а NumPy (np.std) на n. При 10 459 поръчки разликата е в четвъртия знак след запетаята. При 5 числа е забележима: np.std(x, ddof=1) дава същото като pandas.
Идеята
Процентили и IQR
Процентилът казва под колко е даден дял от данните. 90-ият процентил е стойността, под която са 90% от поръчките. quantile ги дава с дял от 0 до 1:
10% от поръчките са до 2,40 €, а 90% до 22,92 €. Трите прекъснати линии са квартилите: 25-ият процентил (q1, 4,20 €), медианата (7,70 €) и 75-ият (q3, 14,00 €). Те делят поръчките на четири равни части.
Между q1 и q3 са средните 50% поръчки. Ширината им е IQR (interquartile range): 14,00 − 4,20 = 9,80 €. За разлика от обхвата, IQR не се мести от една огромна поръчка.
Виж и картината: от медианата до q3 са 6,30 €, а от q1 до медианата само 3,50 €. Дясната половина е разтеглена: това е опашката, казана с числа.
Пробвай
Прагът за безплатна доставка
Магазинът ще дава безплатна доставка на най-големите 10% поръчки. Над каква сума? Запиши прага в threshold.
Решение
import pandas as pd
orders = pd.read_csv('year_orders.csv')
items = pd.read_csv('year_items.csv')
items['revenue'] = items['quantity'] * items['unit_price']
per_order = items.groupby('order_id')['revenue'].sum()
orders['value'] = orders['id'].map(per_order)
# Отказаните поръчки не са оборот: без тях.
values = orders[orders['status'] != 'cancelled']['value'].round(2)
threshold = values.quantile(0.9)
print(threshold)
print((values >= threshold).mean())values.quantile(0.9) е 22,92 €: точно 10% от поръчките са на тази сума или над нея. Средната плюс едно std дава 20,06 € и над нея са 13,3% от поръчките. При дълга опашка std не казва какъв дял е над някоя граница. Това го казват процентилите.
Идеята
describe(), прочетено докрай
describe() от първия поглед към таблица дава наведнъж всичко дотук:
Сега всеки ред има смисъл:
count: 10 459 поръчки;meanиstd: 10,63 € средно, обикновено на около 9,43 € от нея;minиmax: от 0,80 € до 78,70 €;25%,50%,75%: квартилите.50%е медианата.
Бърз поглед за опашка: mean е доста над 50% (10,63 € срещу 7,70 €), а от 75% до max има 64,70 €, срещу 3,40 € от min до 25%. Опашката е вдясно.
Идеята
„Средният клиент“ не съществува
Обратно към картата за лоялност. Колко поръчки прави всеки клиент за годината? Броят се всички поръчки, и отказаните: клиентът все пак е поръчал.
Клиентите са 1 390. Средно имат по 8 поръчки, но медианата е 4, а най-честото е 2. 224 клиенти са поръчали само веднъж, а най-редовният има 121 поръчки.
Хистограмата показва защо: повечето клиенти са вляво, при 1–5 поръчки, а дълга опашка от редовни клиенти стига до 121. Средната (плътната линия) е между двата свята и не описва никого добре. Клиентът „със средно 8 поръчки“ е число от сметката, не човек, когото ще срещнеш често.
Когато данните имат дълга опашка, медианата казва „обикновения“ случай, а средната е за друго: например колко поръчки ще дойдат общо от 100 нови клиенти.
Идеята
Необичайни стойности: правилото с IQR
Кои поръчки са необичайно големи? Често използваното правило е: необичайно е всичко на повече от 1,5 × IQR под q1 или над q3.
Горната граница е 14,00 + 1,5 × 9,80 = 28,70 €, а над нея са 609 поръчки. Долната е отрицателна, затова под нея няма нищо.
Правилото само посочва. Решението е твое: тези 609 поръчки са истински и носят около 21% от оборота. Махаш стойност само когато е доказана грешка, като цена без десетичната точка или дубликат, както видя в почистването.
Пробвай
Редовните клиенти
Кои клиенти поръчват необичайно често? Сметни горната граница по правилото с IQR за поръчките на клиент (в limit) и запиши в regulars клиентите над нея.
Решение
import pandas as pd
orders = pd.read_csv('year_orders.csv')
per_customer = orders.groupby('customer_id').size()
q1 = per_customer.quantile(0.25)
q3 = per_customer.quantile(0.75)
limit = q3 + 1.5 * (q3 - q1)
regulars = per_customer[per_customer > limit]
print(limit, len(regulars))q1 е 2 поръчки, q3 е 7, IQR е 5, а границата е 7 + 1,5 × 5 = 14,5. Над нея са 171 клиенти, и те правят 54,6% от всички поръчки. Ако границата е самият q3 (7), излизат 340 клиенти: това е всяка четвърт, не необичайните. Ако тръгнеш от средната, правилото вече не е с квартили.
Упражнение
Подарък на осмата поръчка?
Колко поръчки прави обикновеният клиент? Запиши го в typical. И какъв дял от клиентите стигат до осма поръчка? Запиши дела (от 0 до 1) в reach.
Решение
import pandas as pd
orders = pd.read_csv('year_orders.csv')
per_customer = orders.groupby('customer_id').size()
typical = per_customer.median()
reach = (per_customer >= 8).mean()
print(typical, round(reach * 100, 1))Медианата е 4 поръчки: половината клиенти правят 4 или по-малко. Средната (8) не е „обикновеният клиент“. До осма поръчка стигат 340 от 1 390 клиенти, тоест 24,5%. Подаръкът на осмата поръчка би стигнал до една четвърт от клиентите, най-редовните, а не до „всеки обикновен“. С > 8 излизат 21,6%: изпускаш тези с точно 8 поръчки.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: Нови колони · Групи: groupby · Първата графика · Разпределения
- Продължава в: Извадка и популация · Доверителен интервал · Проверка на хипотеза · Изтичане на данни (data leakage)
- Задачи по темата: Статистика за решения