Spotřební potravinový koš

Ringle
14 min readNov 27, 2020

--

Kdo jsme?

Náš all star tým Ringle sestává z Verči Peškové, Kate Voborník, Nikči Kučerové a Anet Bernardové

Kde najdete náš projekt?

Github repozitář:

1. O čem je náš projekt

Projekt online spotřebního potravinového koše umožňuje zobrazit vývoj cen potravin na základě dat z eshopů s potravinami. Téma jsme zvolily na základě zadání od Apify. Tým Apify nám kromě tématu poskytl i scrapnutá data z potravinových eshopů a velkou podporu formou pravidelných schůzek a rad. Společnost Apify provozuje Hlídač shopů, který pravidelně scrapuje data z českých eshopů a zobrazuje vývoj cen v čase. Vytvořením online spotřebního potravinového koše na příkladu potravin ukazujeme, k čemu je sledování vývoje cen potravin užitečné a jak zajímavé trendy můžeme ve vývoji cen vysledovat. Naším projektem tak pomáháme nejen spotřebitelům, případně i novinářům a politikům při sledování vývoje cen, ale také Apify, protože přehledně ukazujeme užitečnost jejich nástroje.

Spotřební koš je nástroj užívaný Českým statistickým úřadem (ČSÚ) k sledování vývoje nákladů domácností. Každá položka ve spotřebním koši má přidělenou určitou váhu reprezentující význam položky pro domácnost. Váhou se cena položky násobí, následně se ceny položek v košíku sečtou a výsledná částka reprezentuje cenu spotřebního koše, tedy výdajů domácnosti. Spotřební koš sestává z různých druhů výdajů na chod domácnosti včetně např. služeb nebo nákladů na ošacení. My se soustředily pouze na ceny potravin. Důvodem bylo, že zobrazit všechny části spotřebního koše by znamenalo např. zahrnout i ceny malířských prací, vodné, cenu uhlí nebo třeba cenu nafty. Získat všechna tato data s možností pravidelného scrapování pro nás bylo v omezeném čase nerealistické.

Výhodou našeho online spotřebního koše oproti oficiálnímu koši publikovanému ČSÚ je možnost sledovat vývoj cen potravin v reálném čase u konkrétních produktů a s přehlednou vizualizací. Je možné zobrazit jak jednotlivé konkrétní produkty (např. vývoj cen okurky hadovky), tak kategorie (např. ovoce a zelenina) i spotřební koš jako celek. Měl by tak lépe sloužit např. novinářům či politikům, kteří chtějí vysledovat vliv určitě události (např. záplavy, změna zákonů, Covid, …) na cenu určitých potravin za účelem sepsání článku nebo získání informací pro určité politické rozhodnutí. Pomoci by náš spotřební koš měl i spotřebitelům, kteří mohou porovnat ceny potravin v jednotlivých eshopech, ceny jednotlivých potravin navzájem (např. vyplatí se mi víc jíst okurky, nebo rajčata? Hovězí, nebo kuřecí?) nebo sledovat vývoj cen v čase a zjistit tak kdy je nejvýhodnější kupovat některé potraviny.

2. Jak jsme projekt realizovaly

Obecné zadání online spotřebního koše jsme dostaly od Apify. Abychom věděly jak spotřební koš konkrétně sestavovat, prostudovaly jsme metodiku ČSÚ a zavolaly si s pracovníkem ČSÚ, který má spotřební koš na starosti. Od něj jsme zjistily, že pravděpodobně nebudeme moci přesně kopírovat složení spotřebního koše dle ČSÚ. Stály jsme totiž před otázkou jak rozhodnout, který konkrétní produkt z určité kategorie vybrat pro naše srovnání. Konkrétní příklad: na eshopu je 10 různých másel. Jak rozhodneme, které zařadit do spotřebního koše? Bude to Dr. Halíř, Madeta, či farmářské máslo? Nebo všechny? Zjistily jsme, že ČSÚ konkrétní produkty vybírá podle složité metodiky ve které zohledňuje i podíl jednotlivých výrobků na trhu dle dat prodejců. K těmto datům jsme samozřejmě přístup neměly, a tedy jsme nemohly vybírat zcela totožné produkty jako ČSÚ ani stanovit cenu stejným způsobem.

Data scrapnutá na denní bázi z eshopů Rohlik.cz, Kosik.cz a iTesco.cz jsme získaly od Apify, přičemž pro práci s daty jsme si nastavily prostředí pro práci v Keboole a Snowlake. Následně jsme provedly explorativní analýzu dat. Narazily jsme ale na celou řadu problémů (a to byl teprve začátek, ale o tom později). Hlavní problém je zmíněn v předchozím odstavci — jaký produkt zvolit? Další problém představovalo napárování produktů napříč eshopy. Výrazně by nám totiž usnadnilo práci, pokud bychom byly schopné identifikovat v datech stejný produkt ve všech eshopech a srovnávat tak cenu stejných položek.

S těmito problémy jsme se pokusily popasovat skrze automatizovaný vyhledávač, dále uváděný jako SearchBot. Ani zámořsky znějící název nás ovšem nezachránil před strmým pádem. Hlavní spásnou myšlenkou bylo nechat odpovědnost na eshopu, tedy vyhledat názvy produktů spotřebního koše, jak je nazývá ČSÚ a nechat si vrátit všechny výsledky. Pro všechny eshopy jsme tedy napsaly web scraping v pythonu, který pomocí vyhledávání skrz url (například https://www.rohlik.cz/hledat/máslo) projel seznam stringů ČSÚ a do tabulky zapsal id produktů.

Myslely jsme si, jak na to jdeme od lesa, ovšem tvrdá rána přišla v moment, kdy jsme se podívaly dál než na první produkt (rýže dlouhozrnná) a našly jsme názvy jako “ovocný kyselý drops” nebo “drobný slaný kraker” — což, uhodli jste, nejsou v běžné řeči zrovna zažité termíny. Eshopy by s vámi souhlasily, a místo seznamu id produktů jsme tak měly jen oči pro pláč. Jelikož jsme ale byly ještě plné nadějí, rozhodly jsme se stringy upravit pro 21. století a prošly každý jeden string na každém jednom eshopu a SearchBot pustily znovu.

Den byl zase krásný. Asi na 10 minut, dokud se data nenahrála do Snowflaku a nepřišlo peklo č. 2. Vrácených produktů bylo o poznání víc, než v první fázi, ale asi se mnou budete souhlasit, že králičí hlavu asi nemůžeme považovat za správný výsledek pro “med”. Takhle jsme zjistily, že nám ani ty technológie nepomohou a budeme muset zase do roboty, produkt po produktu, nechat nebo ne. Jelikož už začala frustrace nabývat větších rozměrů, omezily jsme si počet produktů a vyčistily pouze prvních 8 vrácených produktů (podle pořadí výsledků na stránkách eshopů). Na balkon se jich dostalo málo, ale zaslouženě. Některé produkty se nám bohužel nepodařilo dohledat ani manuálně, ale drtivá většina z celkových cca 170 produktů byla zastoupena ve všech třech eshopech.

Teď to vezmu trochu hopem, protože i naše tempo se podstatně zrychlilo — manuální čištění zabere překvapivě (haha) mnoho času. Seznamy produktů pro každý eshop byly ready, následovalo napojení na slavný Hlídač shopů, který v sobě obsahoval vývoj ceny za každý den za cca rok a půl. Báječný. Ale ne. Nemáme v něm dost informací — potřebujeme toho o produktech vědět víc, hlavně cenu za jednotku, kterou ve svých kalkulacích ČSÚ využívá. Zde nám přispěchal na pomoc náš chrabrý rytíř na bílém koni, v Apify známý jako Zuzka, která nám přes Apify crawler zařídila scrape všech produktů — teda, ehm, většiny. Díky milované Zuzce jsme byly schopné k datům přilepit jednotku (tedy hmotnost, počet kusů atp.) a na základě ní i cenu za jednotku. Samozřejmě se to neobešlo bez problémů a náš druhý rytíř v blyštivé zbroji byla Geneea, která nám zcela altruisticky poskytla své API pro zpracování přirozeného jazyka a díky které jsme byly schopné z pohádky na iTescu vydolovat potřebné informace. S některými typy informací by nám pomohl už leda ďábel, a to výměnou za věčné zatracení, tudíž jsme parsovaly stringy jak zběsilé a nakonec se nám podařilo dataset očistit do použitelné podoby. Nyní už stačilo produkty napárovat na informace poskytované ČSÚ a vesele začít studovat jak teda ty záplavy ve Španělsku zahýbaly cenami okurek.

Ano, v ten moment jsme si doopravdy myslely, že už je konec a že už máme krásná data k vizualizacím. Jak už asi předpokládáte, byl to omyl a my jsme se dostaly do nekonečného kolečka zpráv typu “hele ta vepřová játra asi nemaj stát 40 tisíc korun za kilogram co, to je asi blbě co” a “kolik tak cca váží takový kiwi? nemáte někdo doma kiwi a váhu?”. Zároveň jsme zjistily, že jsou v datech mezery, kdy produkt buď není dostupný, nebo jej scraper opomenul. Proto jsou ceny dopočítány zpětně podle poslední známé ceny (případně první) — ve výsledných výpočtech by to jinak vytvářelo velký nepořádek a způsobovalo zavádějící interpretace.

S dopočítanými daty už se přidaly do hry grafy a všelijaké vizualizace, které odhalovaly další problémy (např. že Tesco den po slevě uvádí původní cenu jako zlevněnou, nebo že v průběhu slevy přepočítává cenu za jinou jednotku, což vedlo k ceně česneku 2500 Kč za kilogram, přičemž běžně je to jen několik desítek korun). Zjistily jsme ale spoustu zajímavostí, které se vám budeme snažit přiblížit v následující části.

A teď ta poslední věc, na které jsme chtěly strávit většinu času, dashboard v Plotly Dash. Ale jak praví železné pravidlo datové analýzy — na čištění dat strávíš 80 % času. A tak se i stalo. Webový dashboard prošel rychlovývojem a za pomoci přívětivého názvu knihovny plotly express prošly rychlovývojem i grafy. Díky tomu všemu můžeme naše závěry předávat i v interaktivní formě, přístupné volně na Heroku.

3. Jak jsme si rozdělily práci

Naší technickou ředitelkou byla Verča. Pracovala s Keboolou, čistila data ve Snowflake pomocí SQL a s pomocí Pythonu prováděla web scraping, vizualizace a vývoj webové aplikace v Plotly dash. Radila nám z technického hlediska, jaké jsou potřeba jednotlivé kroky, abychom se dostaly k cíli.

Anet pro tým zpracovala metodiku výpočtu spotřebního koše a pomáhala se strategií volby produktů. Podílela se na čištění dat a v půlce projektu se zapojila jako projektový manažer a kontrolovala, aby se něco dělo v nějakém čase. Vymýšlí také jak náš nástroj zpropagovat a dostat k těm, kterým by mohl posloužit.

Kate se zaměřila na čištění dat v SQL a na práci s Geneea.

Nikča pomáhala s čištěním dat, založila nám týmový Drive a podílela se na organizaci práce.

4. K čemu jsme dospěly

Cena spotřebního koše se v průběhu času pozvolna zvyšuje. To jsme očekávaly, protože inflace jak známo také roste. Ceny potravin se však zvyšovaly rychleji než inflace — ta dosahuje méně než 3%, zatímco ceny potravin rostly až o 9%. Tuhle nesrovnalost si vykládáme dvěma důvody. Jednak jsme zjistily, že eshopy v návaznosti na různé světové události (prasečí mor, povodně,…) sice potraviny zdražují, ale když cena surovin klesá (např. ve sledovaném období měla klesat cena mléka), prodejci ceny zpět nezlevňují. Navíc ve sledovaném období zasáhla koronakrize, která měla samozřejmě na ceny velký vliv. Podle médií bylo zvýšení cen zejména u potravin ze zahraničí způsobeno jednak omezenou možností cestovat. Zahraniční pracovníci se proto nemohli dostat do zemí odkud pochází k nám dovážená zelenina a ovoce — např. Francie nebo Itálie — a kvůli nedostatku pracovních sil vzrostly ceny těchto potravin. Dále byla problematická během první vlny koronakrize i přeprava potravin ze zámoří kvůli omezení lodní dopravy — to mělo za následek zvýšení cen některých dalších kategorií potravin.

Růst ceny spotřebního koše podle eshopů byl rychlejší než odpovídá inflaci. Předpokládáme, že za to může ochota eshopů zdražovat, když je situace složitá, a neochota zlevňovat, když jsou okolnosti příznivější.

Sledovaly jsme také vývoj cen u konkrétních produktů v návaznosti na světové události, které by na jejich ceny mohly mít vliv. Například jsme tak zjistily, že cena okurek, které se k nám dováží ze Španělska, stoupla v únoru, což odpovídá době kdy se Španělskem prohnala bouřka Glorie, která poničila velkou část úrody.

V únoru vzrostla cena za okurku, pravděpodobně kvůli záplavám ve Španělsku, odkud se k nám okurky dováží.

Dále jsme zjistily, že během první vlny koronakrize vzrostla cena květáku. To může být způsobeno tím, že květák se dováží z Francie, do které se kvůli protipandemickým opatřením nemohli dostat zahraniční pracovníci provádějící sklizeň. Stoupla tak cena za práci při sklizni a v důsledku stouply i ceny květáku.

Během koronakrize vzrostla cena květáku. Ten často sklízejí zahraniční pracovníci, kteří se ale za sklizní kvůli restrikcím nemohli dostat. Vzrostla proto cena práce i květáku.

Dopad zvýšené spotřební daně na lihoviny jsme mohly sledovat např. Na zvýšení ceny rumu Božkov:

Naše vizualizace ukazuje i změny cen v závislosti na měnící se sazbu daní. Zde vidíme zvýšení ceny tuzemáku kvůli zvýšené sazbě spotřební daně na lihoviny.

Vývoj vepřového masa byl hned několikrát ovlivněn prasečím morem — poprvé v listopadu 2019, kdy se začal šířit africký mor v Číně, odkud pochází polovina světové produkce. Následně v září 2020, kdy se africký mor rozjel v Německu a odbyt z Německa mimo EU se snížil, což na Evropském trhu způsobilo přebytek.

5. Přínos našeho projektu

Doufáme, že naše grafy přinesou lepší informovanost politiků, novinářů i veřejnosti o dopadu světových událostí, politických opatření nebo právních změn na ceny potravin. Umíme například zobrazit o kolik procent se zvedla cena okurek dovážených ze Španělska po bouři, která poničila okurkovou úrodu. Novinář, který o této události a jejím vlivu na ceny českých potravin bude psát, může náš graf využít, ověřit si na něm tvrzené informace a doprovodit jím svůj článek.

Dále můžeme například sledovat vliv nedostatku zahraničních pracovníků na ceny potravin, které kvůli zákazu cestování nemá kdo sklízet. Můžeme se tak zamyslet nad dopady, které by omezení vstupu zahraničních pracovníků během sklizně mělo na ceny našich potravin.

V neposlední řadě z našich vizualizací například vidíme, o kolik se zvedla cena lihovin po zavedení vyšší sazby spotřební daně. To může být zajímavé, protože se opakovaně objevuje argument proti zvyšování sazeb spotřební daně spočívající v tvrzení, že prodejci pokryjí zvýšenou daň ze své marže. Prodejci proto budou mít menší zisky, ale spotřebitelé své chování nezmění, protože pro ně cena zůstane stejná. Tento argument naše analýza vyvrací.

6. Informační zdroje

Data jsme získaly od Apify, které je pravidelně scrapuje pro svůj Hlídač shopů. Metodiku jsme čerpaly z oficiálních dokumentů ČSÚ.

7. Jaké to pro nás bylo

Verča Pešková

Projekt od Apify se mi od začátku líbil, protože to perfektně zapadalo do motivací, které mě vedly k tomu se k DA Projektu přihlásit. Konkrétně to, že se projekt týkal dat, se kterými už to trochu umím, ale zároveň tam byl velký prostor rozvíjet i nástroje, které už tolik neovládám (především python). Neočekávala jsem ale, že bude tolik problémů s daty a že tolik času strávíme nad čištěním a transformacemi a že narazíme na tolik slepých uliček.

Rozhodně jsem ale spokojená s tím, že jsem měla možnost si vyzkoušet web scraping a vývoj webového dashboardu v pythonu a jeho nasazení. Velkým plusem bylo i intro do GITu od mentora Zdeňka, díky kterému jsem konečně získala trochu sebevědomí v běžných procesech verzování. Jakub z Apify mi také pomohl v zásadách project managementu a vůbec nám dával velký support v průběhu, což byla velká výhoda.

Je mi líto, že jsme nezvládly větší onboarding všech členek týmu do vývoje dashboardu — rozhodně to nebylo vlivem nedostatku vůle. Přesto doufám, že nějaké předávání knowhow proběhlo a že i zbytek týmu si z projektu odnese něco zajímavého. Pro mě to kromě posunu v technických dovednostech byla ta samotná práce v týmu. Zprvu spolupráce trochu drhla, ale nakonec jsme to zvládly rozjet a všechny se zapojily podle svých možností, za což jsem vděčná. V práci jsem na všechno sama a je fajn si ty tasky rozdělit a rozhodovat společně.

Anet Bernardová

Do projektu mě motivovaly zapojit se tři věci. Jednak jeho potenciální přesah, tedy využitelnost pro rozhodování a informovanost politiků, novinářů i všech ostatních. Dále jeho rozsah — přišlo mi, že je téma nastavené dostatečně úzce, aby se dalo za tři měsíce pohodlně stihnout (ehm, keep dreaming…). No a posledním a hlavním důvodem proč se do projektu zapojit byla Verča. Znala jsem ji coby lektorku z Digitální akademie, kterou jsem letos dokončila. Moc mě bavily její lekce i zápal pro věc a říkala jsem si, že s takovým člověkem bych chtěla být v týmu.

Vzhledem k tomu, že v programování jsem byla oproti ostatním holkám newbie — vždyť jsem teprv letos před pár měsíci dokončila Akademii — chtěla jsem se zapojit tak, abych se hlavně něco přiučila, a to se mi povedlo. Obnovila jsem si znalosti SQL při čištění dat. Mohla jsem také sledovat komplikovanější příkazy, které vymýšlely ostatní holky, a učit se na nich. Skvělá byla lekce Git, kterou nám poskytl Zdeněk. Sice se mi z ní trochu zapařil mozek, ale konečně jsem pořádně pochopila k čemu všem to je. Moc mi taky pomohlo sledovat vývoj projektu od začátku do konce, uvědomila jsem si, jaké jsou jednotlivé kroky datové analýzy a že se člověk nejvíc zasekne na čištění dat. No a v neposlední řadě pro mě bylo velmi zajímavé naučit se základy projektového managementu od Kuby Balady, který všem holkám na tohle téma poskytl seminář a mně i osobní rady.

Kate Voborník

Na projekt ma začiatkom leta nahecovala Verča a spoločne sme presvedčili Nicol, lebo veď staré dobré DA časy, všakže… Opäť raz sa mi potvrdilo, že človek nie úplne pozitívne spomienky (nedostatok spánku, športu, života, doplň) potlačí ako nič, takže yolo, 3 years later, poďme si to zopakovať! A ako bonus, už v plnom pracovnom nasadení (keď som sa naposledy účastnila Digitálnej akadémie roku pána 2017, ešte mi ani poriadne nezaschol inkounst na diplome a “užívala” som si gap months pred nástupom do jobu) a s tým, že tentokrát to už nebudú ňuňu lekcie a ňuňu vodenie za ručičky…

Už viac ako dva roky aj v civilnom živote robím dátového analytika a SQL a dátové modely si užívam dostatočne v mojom nine-to-five fungovaní, takže som do projektu šla s tým, že si trochu (konečne) zapythoním. Téma online spotrebného koša do toho krásne sadla, pretože a) dostaneme super dáta, b) v plotly dash vyrobíme pop*či online report a c) padlo tam dokonca aj nejaké spojenie, že “návrh algoritmu”!

“Oh, my sweet summer child,” konštatuje future me.

Skrátim to, zasekli sme sa hneď v prvom bode. Vlastne nie, zasekli sme sa ešte predtým, keď nám borec z ČSÚ povedal, že nápad akože good, ale im by v ničom nepomohol :D Spoločne s vidinou presahu projektu (“Tvl, zachránime staťák!!”) odišiel aj náš entuziazmus a dosť dlhý čas sme strávili premýšľaním, ako to uchopiť nejak inak. Rada by som napísala, že som si svoj cieľ s programovaním splnila, ale dáta boli všetko, len nie super a my sme na nich strávili jedenásť týždňov z dvanástich. Verča je jediná, ktorá je aspoň trochu naskillená v kódení, takže scrapovania a výroby dashboardu sa samozrejme chopila ona, aby sme mali aspoň nejaký output. Chcela som Nicol a Anet ušetriť od prípadných depresií z SQLka, tak som sa do čistenia dát a dosť zdĺhavého získavania price per unit pre jednotlivé produkty (a tiež prepočet na ČSÚ gramáže, to je ďalšia funny story) pustila hlavne ja. Proste som nastúpila ako lacná pracovná sila z východu a venovala sa nudnej mechanickej práci v Snowflakeu (ejkejej som robila presne to, čo robím aj bežne, ibaže to teraz bolo zadarmo :D).

Aby som len nehejtila :D Čo mi prišlo naopak fajn a ako príjemná zmena, nemusela som riešiť celú dátovú pipeline , ako sa mi to deje v bežnom živote. Aktualizovala som dáta, Nicol na ne v PowerBI hodila odborné očko a dávala mi hinty, čo opravovať ďalej. Cez hackaton som si vyskúšala prácu s Geneea toolom a shout-out to Zdeněk za super intro do gitu, ktoré nám spravil druhý hackatonový deň :) Prvá polovica projektu trochu škrípala, ale potom sme sa všetky spoločne hecli a musím povedať, že projekt management bol od tohto momentu už na fakt dobrej úrovni. Dievčatá sú super a odhliadnuc od tej bolesti, čo sme spoločne zdieľali, tie pandemické víkendové niekoľkohodinové skupinové cally mi budú chýbať :)

Nikča Nicola Kučerová

Projekt online potravinového spotřebního koše se mi líbil od počátku nejvíce, jelikož při běžném fungování (vařim minimálně a děti nemám) vývoj cen u potravin nevnímám. Přesto mě zajímalo, jak se ceny za poslední dobu měnily a čím jsou změny způsobeny. Proto jsem se pro téma společně s holkama rozhodla a vzhledem k mým znalostem jsem se nabídla na pomoc s čištěním dat.

Ještě než k čištění dat došlo, snažila jsem se pochopit jak se vlastně spotřební koš počítá, jaké tam jsou váhy a co znamenají. V počátku projektu jsem s holkama spíš “brainstormovala”, jak to vlastně udělat, co budeme chtít analyzovat a jaké produkty budeme vybírat. Postupně se začaly nabalovat i různé dokumenty a podklady k projektu, a tak jsem rovnou našemu týmu vytvořila společný drive, kam jsme během celého projektu ukládaly dokumenty, které jsme k práci potřebovaly. Velmi pozitivně hodnotím tým Apify v čele s Jakubem, který nás při pomalejším rozjezdu nakopl a my začaly používat projektovou aplikaci “Trello”, kterou jsem do té doby neznala. Zároveň byla i velmi přínosná přednáška o agilním řízení projektů, jelikož my jsme agilní být potřebovaly.

Ikdyž jsem se nabídla s čištěním dat, tak SQL, Snowflake i Keboola u mě už byly pěkně zaprášeny. Díky projektu a dotazováním se Verči nebo Kate jsem se však dokázala znovu nastartovat a s čištěním pomáhat a objevovat, kde nám jaký produkt chybí nebo naopak jaký nesmyslný produkt se nám napároval. V závěru jsem transformované tabulky nahrála do Power BI (než jsme měly naprogramovaný dashboard v pythonu) a analyzovala jsem vývoj cen u jednotlivých potravin. Vizualizace nám pomohly nejenom sledovat vývoj cen, ale i objevovat nedostatky v datech, které nám při čištění v Snowflake utekly. Zajímavé bylo dohledávat na internetu zprávy, které psaly o změnách cen potravin a vidět, že naše data to potvrzují. :)

--

--