Spory zbieg okoliczności i nagła zmiana planów sprawiły, że powstał ten nietypowy wpis o świętach, jedzeniu i ekonomii.
Zimny grudniowy wieczór, sobota. W ostatnim weekend przed Bożym Narodzeniem odbywa się w moim rodzinnym domu coroczne pieczenie pierników. Dzieci przy pomocy starszych ręcznie robią i wypiekają pierniki ozdabiane świątecznymi wzorkami z lukru. Jestem pewien, że w 2020 ten dzień wyglądałby dla mnie tak samo, jak w poprzednich latach, gdyby nie grupa nastolatek.
Moje siostrzenice wpadły na pomysł, by ten przedświąteczny i rodzinny czas umilić jedzeniem zamawianym z McDonald's. Gdy składałem swoje zamówienie, przypomniał mi się temat związany ze szlagierową potrawą dostępną w tej restauracji i analizą danych, o których to kiedyś czytałem.
Analiza była wykonana przez pracowników magazynu The Economist. Użyli słynnej kanapki sprzedawanej w McDonald's - Big Mac-a - do porównywania walut z różnych części świata. Historia jest dość ciekawa i jeśli chciałbyś dowiedzieć się o niej nieco więcej, to znajduje się ona tutaj. Inny przykłady użycia Big Mac-a w ekonomii znajduje się pod tym linkiem.
Pomyślałem, że sam mógłbym zrobić coś podobnego, nieco inspirując się tym, co zrobili eksperci z The Economist. Koniec końców po odebraniu swojej części zamówienia, zaszyłem się w wolnym pokoju z laptopem i nie brałem czynnego udziału w dalszym pieczeniu pierników. 😉
Czemu właśnie Big Mac?¶
- Jest znany na całym świecie.
- Jest dostępny od kilkudziesięciu lat.
- Dane na temat jego cen są powszechnie dostępne (np. tutaj).
Co można zrobić z tymi danymi?¶
Pomyślałem, że sprawdzę, jak zmieniał się poziom życia polaków w ciągu ostatnich lat i ile Big Mac-ów można było kupić za... no właśnie... za co? Nie jest tajemnicą, że przeciętne wynagrodzenie nie jest dobrym miernikiem zamożności społeczeństwa. Olbrzymia skośność rozkładu i zakrzywianie rzeczywistości przez rządzących - wystarczy poczytać, jak jest wyznaczana, by samemu wyrobić zdanie na ten temat. Pomyślałem, że odniosę ceny hamburgerów do płacy minimalnej i cen złota, a następnie sprawdzę:
- Jak zmieniała się wartość płacy minimalnej w ciągu ostatnich kilkudziesięciu lat?
- Ile hamburgerów można było kupić za płacę minimalną w ciągu ostatnich kilkudziesięciu lat?
- Ile gram złota można było kupić za płacę minimalną w ciągu ostatnich kilkudziesięciu lat?
- Na koniec zweryfikuję korelację pomiędzy poszczególnymi wartościami.
Przy okazji pokażę możliwości Pandas w zakresie czytania danych ze stron WWW.
Ostrzeżenie¶
Wpis nie jest dogłębną analizą zmian wartości pieniądza, ubożenia/bogacenia społeczeństwa, czy też innych zagadnień z pogranicza ekonomi i polityki. Napisałem go w jeden sobotni wieczór (+ edycja i publikacja w niedzielę), kosztując tortillę popijaną zimną Ice Tea (oczywiście z restauracji "Pod złotymi łukami" ;)), słuchając albumu "By the way" Red Hot Chilli Peppers. Proszę Cię zatem drogi czytelniku, podejdź do tego wpisu podobnie jak ja: z dużym dystansem. 😉
1. Import bibliotek.¶
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
2. Wczytanie i edycja zbiorów.¶
2.1. Dane dotyczące cen Big Maca.¶
Dane pobieram z GitHub-a The Economist.
big_mac_1 = pd.read_csv('big-mac-historical-source-data.csv')
big_mac_2 = pd.read_csv('big-mac-source-data.csv').drop(columns = 'GDP_dollar')
big_mac_1['date'] = pd.to_datetime(big_mac_1.date, format = '%Y-%m-%d').dt.date
big_mac_2['date'] = pd.to_datetime(big_mac_2.date, format = '%Y-%m-%d').dt.date
big_mac = pd.concat([big_mac_1, big_mac_2])
big_mac_pl = big_mac[big_mac.name == 'Poland']
big_mac_pl = big_mac_pl.rename(columns = {'local_price' : 'cena_big_mac', 'dollar_ex' : 'kurs_dolara'})
big_mac_pl.head()
Usuwam pierwszy wiersz (dane sprzed denominacji PLN) i zbędne kolumny, których nie będę używał.
big_mac_pl = big_mac_pl.drop(columns = ['name', 'iso_a3', 'currency_code'])
big_mac_pl = big_mac_pl.iloc[1:]
Dodaję nową kolumnę: rok. Będę używać jej jako identyfikatora podczas łączenia zbiorów.
big_mac_pl = big_mac_pl.assign(rok = big_mac_pl.date.astype(str).str[0:4])
big_mac_pl = big_mac_pl.assign(rok = big_mac_pl.rok.astype(int))
big_mac_pl.set_index('date', inplace = True)
Sprawdzam, czy w zbiorze nie ma duplikatów. Jeśli są, to usuwam je.
big_mac_pl.rok.value_counts().head()
big_mac_pl.drop_duplicates(subset = 'rok', keep = 'first', inplace = True)
I jeszcze szybki wykres ceny Big Maca na przestrzeni ostatniego ćwierćwiecza.
sns.lineplot(x = big_mac_pl.index, y = big_mac_pl.cena_big_mac)
plt.title('Ceny Big Mac-a')
plt.show()
Nie ma zaskoczenia - ceny ciągle rosną.
2.2. Płaca minimalna¶
placa_minimalna = pd.read_html('https://pl.wikipedia.org/wiki/P%C5%82aca_minimalna', decimal = ',', thousands = ' ')
Parametry metody pd.read_html
: decimal
i thousands
ustaliłem metodą prób i błędów.
placa_minimalna_1 = placa_minimalna[0].iloc[1:, 0:2] # za pomocą iloc usuwam zbędne kolumny i jeden zbędny wiersz
placa_minimalna_2 = placa_minimalna[1].iloc[0:,0:2] # za pomoca iloc usuwam zbędne kolumny
placa_minimalna_1.rename(columns = {'Data wprowadzenia' : 'data', 'Wartość w cenachbieżących' : 'placa_minimalna'}, inplace = True)
placa_minimalna_2.rename(columns = {'Data wprowadzenia' : 'data', 'Wartość w cenachbieżących' : 'placa_minimalna'}, inplace = True)
placa_minimalna_1.head()
Niestety w tabeli placa_minimalna_1
znajdują się niepotrzebne znaki, przez co dane zostały wczytane jako typ "object". Będę to musiał poprawić.
placa_minimalna_2.head()
Jak widać tabela placa_minimalna_2
ma podwójny indeks kolumnowy. Pozbywam się go.
placa_minimalna_2 = pd.DataFrame(placa_minimalna_2.values, columns = placa_minimalna_1.columns)
Z daty "wycinam" rok, który posłuży jako identyfikator.
placa_minimalna_1['rok'] = placa_minimalna_1['data'].str[-4:]
Łączę oba zbiory.
placa_minimalna = pd.concat([placa_minimalna_1, placa_minimalna_2])
Z powstałego zbioru wycinam rok, który posłuży za identyfikator.
placa_minimalna = placa_minimalna.assign(rok = placa_minimalna['data'].str.extract(r'(\d{4})'))
placa_minimalna = placa_minimalna.assign(rok = placa_minimalna.rok.astype(int))
placa_minimalna.drop(columns = ['data'], inplace = True)
placa_minimalna.head()
Niektóre wiersze zawierają adnotacje w nawiasach kwadratowych. Pozbywam się ich, używając wyrażenia regularnego.
placa_minimalna = placa_minimalna.assign(placa_minimalna = placa_minimalna.placa_minimalna.str.extract(r'([^\[]*)'))
Podobnie jak w przypadku cen Big Maca usuwam duplikaty. Pozostawiając ostatnią kopie zduplikowanej obserwacji, zapewniam, że będzie to najstarsza obserwacja z danego roku (co będzie miało znaczenie później, przy łączeniu cen złota).
placa_minimalna = placa_minimalna.drop_duplicates(subset = 'rok', keep = 'last')
2.3. Ceny złota.¶
Ze strony WWW pobieram również historyczne ceny złota.
ceny_zlota = pd.read_html('https://andrzejbaranowski.pl/cena-zlota-w-latach-1800-2017', decimal = ',', header = 0)[0]
Usuwam zbędne kolumny/zmienne.
ceny_zlota = ceny_zlota.loc[:,['ROK', 'CENA31 grudnia(w USD)']]
ceny_zlota.head()
ceny_zlota.columns = ['rok', 'cena_zlota'] # upraszczam nazwy
Wycena każdego roku przypada na 31 grudnia. Przyjmę, że wycena przypada na kolejny dzień, a więc 1 stycznia. Dzięki temu dane będą lepiej pasować danych dotyczących Big Maca i płacy minimalnej.
ceny_zlota = ceny_zlota.assign(rok = ceny_zlota.rok + 1)
3. Połączenie zbiorów.¶
Łączę dane w jedną tabelę analityczną (ABT - ang. analytical base table), której użyję do analizy.
abt = placa_minimalna.merge(big_mac_pl, on = 'rok')
abt = abt.merge(ceny_zlota, on = 'rok')
abt.set_index('rok', inplace = True)
abt.head()
4. Korekta typów zmiennych i zamiana jednostek.¶
abt = abt.assign(placa_minimalna = [float(value.replace(' ', '')) for value in abt.placa_minimalna.values])
abt = abt.assign(cena_zlota = [value.replace(',', '.') for value in abt.cena_zlota.values])
abt = abt.assign(cena_zlota = [float(value.replace(' ', '')) for value in abt.cena_zlota.values])
abt.head()
Wyznaczam płacę minimalną netto (Wikipedia podaje wartości brutto). Przyjmuję, że średnio stanowi/-ła ona 75% wartości płacy brutto.
abt = abt.assign(placa_minimalna_netto = abt['placa_minimalna']*0.75)
Cena złota została podana w dolarach za uncję. Mnie interesuje cena w PLN za gram. 1 uncja, to 28,3495231 gram. Kurs dolara mam z tabeli historycznych cena Big Maca.
uncja_na_gramy = 28.3495231
abt = abt.assign(cena_zlota_pln = abt.cena_zlota * abt.kurs_dolara / uncja_na_gramy)
5. Obliczenia.¶
Jeśli spojrzymy na wykres płacy minimalnej, to będzie on podobny do wykresu ceny Big Mac-a - cały czas tendencja wzrostowa. Oczywiście nie oznacza to, że nieustannie się bogacimy. Nie chcę zbyt głęboko wchodzić w tematy związane z ekonomią, bo jest to "luźny" i nieco żartobliwa analiza, przygotowana dla zabicia czasu. 🙂
To, że za wzrostem płacy nie zawsze idzie wzrost zamożności społeczeństwa, można odczytać z danych zawartych tutaj. W skrócie: prócz zmian poziomu płacy minimalnej, zmienia się również siła nabywcza pieniądza.
Wiele osób uważa, że jedynym prawdziwym pieniądzem "trzymającym wartość" na przestrzeni dziesięcioleci jest złoto (fizyczne oczywiście). Dosyć trudno je "dodrukować", zapotrzebowanie znacząco przewyższa dostępność, jest go na ziemi skończona ilość i nie jest tylko papierkiem o umownej wartości - ma realne zastosowanie w wielu gałęziach przemysłu.
Złoto posiada również wady - jest narzędziem w spekulacji, a popyt na nie jest dosyć mocno zmienny. W czasie kryzysów ludzie lgną do niego, a w czasie propersity złoto nie jest pierwszym wyborem inwestorów, którzy wpływają na kursy. Ceny złota w dużym stopniu zależą również od kursów walut, co z pewnością wpłynie na analizę.
Skracając mój nieco przydługi wywód - odniosę ceny złota do płacy minimalnej i cen Big Mac-a. 🙂 Sprawdzę też, czy (uwzględniając ceny złota) dziś zarabiamy realnie więcej niż 100 lat temu. 😉
5.1. Ile gram złota można było kupić za "najniższą krajową" na przestrzeni ostatnich 25 lat?¶
abt = abt.assign(zloto_za_najnizsza_krajowa = abt.placa_minimalna_netto / abt.cena_zlota_pln)
sns.lineplot(x = abt.index, y = abt.zloto_za_najnizsza_krajowa)
plt.title('Wartość najniższej krajowej w gramach złota')
plt.show()
Kryzys z 2008 znacznie mniej wioczny niż ten z 2012. Jeszcze rzut oka na tabelę...
abt.head(20)
Pytanie: czy w ostatnich 10 latach złoto jest niedowartościowane, inflacja zjadła nasze rosnące wynagrodzenia, czy też PLN stracił względem USD? 🙂
Korelacja pomiędzy ceną złota (przed przeliczeniem na PLN za gram) i kursem dolara wcale nie wydaje się oczywista.
abt.cena_zlota.corr(abt.kurs_dolara, method = 'spearman')
abt.placa_minimalna.corr(abt.cena_zlota, method = 'spearman')
A więc zgodnie z powyższym wraz ze wzrostem wartości złota rośnie najniższa krajowa. Co rośnie szybciej? A jeśli weźmiemy pod uwagę siłę nabywczą pieniądza?
Uwaga - ciekawostka.
W II Rzeczpospolitej od kwietnia 1924 obowiązywał sztywny parytet – 1 złoty równoważny 0,29 grama złota. W 1927 ustalono parytet 5924,44 złotych za kilogram czystego złota.
Pensja robotnika w roku 1929 wynosiła 1,02 zł za godzinę. Przy założeniu 40-godzinnego tygodnia pracy, to robotnik zarabiał 163,2 ówczesne złote miesięcznie, czyli ok. 27,547 gram złota.
Źródło ciekawostki: Wikipedia. Polecam również ten tekst o reformie monetarnej sprzed 100 lat, który do dziś budzi podziw. Tu znajduje się opis wspomnianej reformy na Wikipedii.
Ile dziś złota może kupić średniej klasy specjalista z dużego polskiego miasta?
Zakładam (być może nieco zbyt optymistycznie) zarobki średniej klasy specjalisty na poziom 5000 zł netto. Dzielę to przez cenę złota z początku 2020 roku.
print('Za 5000 zł mozna kupić ok. {} gram złota.'.format(np.round(5000 / 203.894911, 3)))
Ok. 100 lat temu robotnik zarabiał więcej (licząc w wycenie złota) niż osoba zarabiająca w 2020 roku 5000 zł netto. Nie oceniam, bo naród polski dużo przeszedł przez ten czas.
5.2. Ile Big Mac-ów można było kupić za "najniższą krajową" na przestrzeni ostatnich 25 lat?¶
abt = abt.assign(big_mac_za_najnizsza_krajowa = abt.placa_minimalna_netto / abt.cena_big_mac)
sns.lineplot(x = abt.index, y = abt.big_mac_za_najnizsza_krajowa)
plt.title('Wartość najniższej krajowej w Big Mac-ach')
plt.show()
Big Mac, który w przeciwieństwie do złota nie jest obciążony wahaniami związanymi ze spekulacją inwestorów i wieloma innymi czynnikami wskazuje, że praktycznie nieprzerwanie nasza zdolność zakupowa (mierzona najniższą krajową) rośnie.
5.3. Weryfikacja korelacji.¶
abt.corr(method = 'spearman')
Co można stwierdzić, patrząc na ostatni wykres i tabelę z wartościami korelacji? McDonald's robi dobre badania rynku. 🙂
Podsumowanie¶
Mam nadzieję, że przypadł Ci do gustu ten nieco "luźniejszy" w swym charakterze wpis. Proszę, nie bierz niektórych z powyższych wniosków do serca. Głównym celem była tu zabawa ogólnodostępnymi danymi i spojrzeniem na ekonomię z pewnym dystansem. 😉
Jeśli interesują Cię podobne analizy, to prócz tej wykonanej przeze mnie, oraz The Economist polecam przeczytanie artykułu o "Iluzji pieniądza na przykładzie batonika Mars". 🙂
PODOBAŁ CI SIĘ TEN ARTYKUŁ?
Jeśli tak, to zarejestruj się, by otrzymywać informacje o nowych wpisach.
Dodatkowo w prezencie wyślę Ci bezpłatny poradnik :-)
Dodaj komentarz