Към съдържанието
wannacode

Коя графика за какъв въпрос

Накратко: Видът графика се избира по въпроса: подредени стълбове за сравнение, линия за промяна във времето и пак стълбове, а не кръг, за дял от цялото.

Проблем

Четири въпроса, едни данни

Управителят има четири въпроса за годината:

  1. Кои продукти носят най-много пари?
  2. Как върви оборотът ден след ден?
  3. Каква част от оборота е всяка категория?
  4. Колко е обичайната поръчка?

Данните са едни и същи: поръчките и редовете им. Графиката обаче е различна за всеки въпрос. Една графика, която отговаря на всичките, няма. Има графика, която отговаря добре на един въпрос, и много, които отговарят на него зле.

Идеята

Първо въпросът, после графиката

Не започвай от „искам кръг“ или „искам линия“. Започни от въпроса и виж какъв вид е:

  • сравнение („кое е повече“): стълбове, подредени по стойност; при дълги имена хоризонтални (ax.barh);
  • промяна във времето („как върви“): линия;
  • дял от цялото („каква част“): пак подредени стълбове, в проценти; кръгът се чете по-трудно;
  • разпределение („колко е обичайното, колко се пръска“): хистограма, в следващия урок;
  • връзка („растат ли заедно“): разсейване (scatter), също в следващия урок.

Да видим първите три със същите данни.

Идеята

Сравнение: подредени хоризонтални стълбове

„Кои продукти носят най-много?“ е сравнение между 25 продукта. Имената им са дълги, затова стълбовете са хоризонтални: ax.barh(имена, стойности). Имената стоят отляво и се четат, без да се въртят.

Подреждането с sort_values() прави графиката класация. barh рисува първия ред най-долу, затова възходящият ред слага най-големия най-горе. figsize=(7, 7) дава на фигурата размер в инчове: 25 стълба искат височина.

Pythonданни: таблиците на магазина

Сиренето носи най-много: 10 325,30 €. След него са кафето на зърна (9 585,10 €) и кашкавалът (8 616,50 €). Подредени, стълбовете отговарят на въпроса още преди да прочетеш числата.

По-точно, за любопитните

Без sort_values() продуктите идват по азбучен ред от groupby. Азбуката е удобна, когато търсиш един продукт по име. За въпроса „кое е най-много“ трябва ред по стойност.

Пробвай

Най-продаваните на бройки

Кои 10 продукта са продадени в най-много бройки за годината? Запиши ги в top (продуктът е индексът, бройките са стойността) и ги начертай като хоризонтални стълбове с най-големия най-горе.

Pythonданни: таблиците на магазина

Идеята

Промяна във времето: линия

„Как върви оборотът ден след ден?“ е промяна във времето. Линията свързва всеки ден със следващия и окото следи посоката. 365 стълба биха били ограда, в която не се вижда нищо.

Оборотът по дни скача заради седмичния ритъм. Втора линия със средното за 7 дни (rolling(7) от урока за датите) показва посоката под шума:

Pythonданни: таблиците на магазина

Дните са 365. Най-силният е 26 декември 2025 с 852,90 €. Тънката линия е зъбеста всяка седмица, а дебелата показва големия върх през декември и спадовете през януари и септември. По хоризонталата са дати: ordered_at е превърнат в дата с pd.to_datetime и matplotlib сам слага месеците.

Идеята

Малки графики една до друга

В предния урок седемте категории в една ос се преплитаха. Друг начин е всяка категория да е в своя малка графика, а графиките да стоят една до друга. Това се казва малки графики (small multiples).

plt.subplots(2, 3) дава фигура с 2 реда и 3 колони оси. axes е масив от NumPy с форма (2, 3), а axes.flat ги дава една по една. sharey=True дава на всички една и съща вертикална скала. fig.suptitle е заглавие на цялата фигура. По хоризонталата е само номерът на месеца (pv.index.str[5:]), за да се събере:

Pythonданни: таблиците на магазина

С обща скала височините се сравняват: млечните са най-високо през цялата година, а кухнята е ниско с един връх през декември. Всяка линия се чете сама, без легенда и без цветове за разпознаване.

Идеята

Дял от цялото: стълбове срещу кръг

„Каква част от оборота е всяка категория?“ е въпрос за дял. Често за него се рисува кръгова диаграма (pie chart). Ето кръга и подредените стълбове с едни и същи числа, една до друга. plt.subplots(1, 2) дава две оси: тук ги кръщаваме left и right:

Pythonданни: таблиците на магазина

От кръга се вижда, че млечните са най-голямото парче, малко над една четвърт. Почистването (9,8%) и кухнята (10,2%) обаче изглеждат еднакви. Хлябът (11,9%) също е близо до тях. Стълбовете вдясно ги нареждат и разликите се виждат.

1. Погледни само кръга вляво. Кое е по-голямо: кухнята или почистването?

Идеята

Защо кръгът подвежда

Стълбовете се сравняват по дължина от една и съща линия. Окото прави това точно. Кръгът кара окото да сравнява ъгли и площи на парчета, които са завъртени различно. Това окото прави зле, особено при близки дялове.

Кръгът има и други проблеми:

  • над 4–5 парчета надписите се трупат;
  • два кръга един до друг (декември срещу година) почти не се сравняват;
  • цветът е единственото, което свързва парчето с името.

Кръгът върши работа в един случай: две-три парчета и въпрос „повече или по-малко от половината?“. За всичко друго подредените стълбове казват същото по-ясно.

Идеята

Разпределение и връзка

Остават два вида въпроси. За тях трябват графики, които идват в следващия урок:

  • разпределение: „колко е обичайната поръчка?“ Отговорът не е едно число, а как се пръскат 10 459 поръчки: колко са малки, колко са големи. Това показва хистограмата;
  • връзка: „поръчките с повече редове по-скъпи ли са?“ Всяка поръчка става точка с две числа. Облакът от точки е разсейване (scatter).
1. Управителят пита: „Колко е обичайната поръчка: повечето около 5 € ли са, или около 20 €?“ Каква графика отговаря?
2. „Поръчките с повече редове по-скъпи ли са?“ Каква графика отговаря?

Упражнение

Какво носи декември

Декември е най-силният месец. Повече поръчки ли има, или по-големи? Запиши в orders_n броя поръчки за всеки месец (без отказаните), в avg средната поръчка в евро, и ги начертай като две линии в две оси една до друга, всяка със заглавие.

Pythonданни: таблиците на магазина

Каква част от оборота през декември 2025 е всяка категория, с подаръчната карта? Запиши в share дела в проценти, подреден, и го начертай като хоризонтални стълбове с най-големия най-горе.

Pythonданни: таблиците на магазина

Тест

Провери се

1. Искаш да сравниш оборота на 25 продукта с дълги имена. Кое е най-четимо?
2. Начертал си top = units.nlargest(10) с ax.barh. Защо най-продаваният продукт е най-долу?
3. Брой поръчки и средна поръчка в евро по месеци. Защо в две оси една до друга, а не в една?
4. Какво прави sharey=True в plt.subplots(2, 3, sharey=True)?
5. Кое е първото нещо, което решаваш, преди да начертаеш графика?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·