Świąteczne pierniki, Big Mac i ekonomia

big mac index, the economist, analiza, data science

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ę:

  1. Jak zmieniała się wartość płacy minimalnej w ciągu ostatnich kilkudziesięciu lat?
  2. Ile hamburgerów można było kupić za płacę minimalną w ciągu ostatnich kilkudziesięciu lat?
  3. Ile gram złota można było kupić za płacę minimalną w ciągu ostatnich kilkudziesięciu lat?
  4. 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.

In [1]:
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.

In [2]:
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')
In [3]:
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
In [4]:
big_mac = pd.concat([big_mac_1, big_mac_2])
In [5]:
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'})
In [6]:
big_mac_pl.head()
Out[6]:
name iso_a3 currency_code cena_big_mac kurs_dolara date
166 Poland POL PLN 31000.0 22433.00 1994-04-01
200 Poland POL PLN 3.4 2.34 1995-04-01
232 Poland POL PLN 3.8 2.64 1996-04-01
265 Poland POL PLN 4.3 3.10 1997-04-01
299 Poland POL PLN 5.3 3.46 1998-04-01

Usuwam pierwszy wiersz (dane sprzed denominacji PLN) i zbędne kolumny, których nie będę używał.

In [7]:
big_mac_pl = big_mac_pl.drop(columns = ['name', 'iso_a3', 'currency_code'])
In [8]:
big_mac_pl = big_mac_pl.iloc[1:]

Dodaję nową kolumnę: rok. Będę używać jej jako identyfikatora podczas łączenia zbiorów.

In [9]:
big_mac_pl = big_mac_pl.assign(rok = big_mac_pl.date.astype(str).str[0:4])
In [10]:
big_mac_pl = big_mac_pl.assign(rok = big_mac_pl.rok.astype(int))
In [11]:
big_mac_pl.set_index('date', inplace = True)

Sprawdzam, czy w zbiorze nie ma duplikatów. Jeśli są, to usuwam je.

In [12]:
big_mac_pl.rok.value_counts().head()
Out[12]:
2020    2
2013    2
2006    2
2019    2
2010    2
Name: rok, dtype: int64
In [13]:
big_mac_pl.drop_duplicates(subset = 'rok', keep = 'first', inplace = True)

I jeszcze szybki wykres ceny Big Maca na przestrzeni ostatniego ćwierćwiecza.

In [18]:
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
In [19]:
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.

In [20]:
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
In [21]:
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)
In [22]:
placa_minimalna_1.head()
Out[22]:
data placa_minimalna
1 1 stycznia 2020 2 600[7]
2 1 stycznia 2019 2 250[8]
3 1 stycznia 2018 2100
4 1 stycznia 2017 2000
5 1 stycznia 2016 1850

Niestety w tabeli placa_minimalna_1 znajdują się niepotrzebne znaki, przez co dane zostały wczytane jako typ "object". Będę to musiał poprawić.

In [23]:
placa_minimalna_2.head()
Out[23]:
Lata 1970–2000
data placa_minimalna
0 1 XI 1999 670
1 1 I 1999 528
2 1 II 1998 500
3 1 VII 1997 450
4 1 II 1997 406

Jak widać tabela placa_minimalna_2 ma podwójny indeks kolumnowy. Pozbywam się go.

In [24]:
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.

In [25]:
placa_minimalna_1['rok'] = placa_minimalna_1['data'].str[-4:]

Łączę oba zbiory.

In [26]:
placa_minimalna = pd.concat([placa_minimalna_1, placa_minimalna_2])

Z powstałego zbioru wycinam rok, który posłuży za identyfikator.

In [27]:
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))
In [28]:
placa_minimalna.drop(columns = ['data'], inplace = True)
In [29]:
placa_minimalna.head()
Out[29]:
placa_minimalna rok
1 2 600[7] 2020
2 2 250[8] 2019
3 2100 2018
4 2000 2017
5 1850 2016

Niektóre wiersze zawierają adnotacje w nawiasach kwadratowych. Pozbywam się ich, używając wyrażenia regularnego.

In [30]:
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).

In [31]:
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.

In [32]:
ceny_zlota = pd.read_html('https://andrzejbaranowski.pl/cena-zlota-w-latach-1800-2017', decimal = ',', header = 0)[0]

Usuwam zbędne kolumny/zmienne.

In [33]:
ceny_zlota = ceny_zlota.loc[:,['ROK', 'CENA31 grudnia(w USD)']]
In [34]:
ceny_zlota.head()
Out[34]:
ROK CENA31 grudnia(w USD)
0 1800 19.3939
1 1801 19.3939
2 1802 19.3939
3 1803 19.3939
4 1804 19.3939
In [35]:
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.

In [36]:
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.

In [37]:
abt = placa_minimalna.merge(big_mac_pl, on = 'rok')
abt = abt.merge(ceny_zlota, on = 'rok')
In [38]:
abt.set_index('rok', inplace = True)
In [39]:
abt.head()
Out[39]:
placa_minimalna cena_big_mac kurs_dolara cena_zlota
rok
2020 2 600 11.0 3.79660 1 522,50
2019 2 250 10.5 3.74845 1 282,10
2018 2100 10.1 3.40575 1 302,50
2017 2000 9.6 4.17215 1 150.90
2016 1850 9.6 4.04770 1 061.00

4. Korekta typów zmiennych i zamiana jednostek.

In [40]:
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])
In [41]:
abt.head()
Out[41]:
placa_minimalna cena_big_mac kurs_dolara cena_zlota
rok
2020 2600.0 11.0 3.79660 1522.5
2019 2250.0 10.5 3.74845 1282.1
2018 2100.0 10.1 3.40575 1302.5
2017 2000.0 9.6 4.17215 1150.9
2016 1850.0 9.6 4.04770 1061.0

Wyznaczam płacę minimalną netto (Wikipedia podaje wartości brutto). Przyjmuję, że średnio stanowi/-ła ona 75% wartości płacy brutto.

In [42]:
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.

In [43]:
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?
In [44]:
abt = abt.assign(zloto_za_najnizsza_krajowa = abt.placa_minimalna_netto / abt.cena_zlota_pln)
In [48]:
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ę...

In [51]:
abt.head(20)
Out[51]:
placa_minimalna cena_big_mac kurs_dolara cena_zlota placa_minimalna_netto cena_zlota_pln zloto_za_najnizsza_krajowa
rok
2020 2600.0 11.00 3.79660 1522.50 1950.000 203.894911 9.563750
2019 2250.0 10.50 3.74845 1282.10 1687.500 169.522702 9.954419
2018 2100.0 10.10 3.40575 1302.50 1575.000 156.474921 10.065511
2017 2000.0 9.60 4.17215 1150.90 1500.000 169.375951 8.856039
2016 1850.0 9.60 4.04770 1061.00 1387.500 151.487899 9.159147
2015 1750.0 9.20 3.70660 1182.90 1312.500 154.659996 8.486357
2014 1680.0 9.20 3.06840 1205.50 1260.000 130.476840 9.656886
2013 1600.0 9.10 3.09200 1664.00 1200.000 181.487638 6.612021
2012 1500.0 9.10 3.52045 1556.40 1125.000 193.274094 5.820749
2011 1386.0 8.63 2.79680 1421.60 1039.500 140.246835 7.411932
2010 1317.0 8.10 2.83565 1096.50 987.750 109.676985 9.005992
2009 1276.0 7.60 3.15525 830.30 957.000 92.410869 10.355925
2008 1126.0 7.00 2.03145 833.20 844.500 59.704854 14.144579
2007 936.0 6.90 2.97175 636.30 702.000 66.700400 10.524675
2006 899.1 6.50 3.11510 475.65 674.325 52.265335 12.901955
2005 849.0 6.50 3.30960 455.75 636.750 53.205488 11.967750
2004 824.0 6.30 3.87000 414.80 618.000 56.624445 10.914014
2003 800.0 6.30 3.89000 346.70 600.000 47.572687 12.612279
2001 760.0 5.90 4.03000 272.15 570.000 38.687229 14.733544
2000 700.0 5.50 4.30000 287.50 525.000 43.607435 12.039231

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.

In [49]:
abt.cena_zlota.corr(abt.kurs_dolara, method = 'spearman')
Out[49]:
-0.21846153846153843
In [50]:
abt.placa_minimalna.corr(abt.cena_zlota, method = 'spearman')
Out[50]:
0.8561538461538462

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.

In [57]:
print('Za 5000 zł mozna kupić ok. {} gram złota.'.format(np.round(5000 / 203.894911, 3)))
Za 5000 zł mozna kupić ok. 24.522 gram złota.

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?
In [58]:
abt = abt.assign(big_mac_za_najnizsza_krajowa = abt.placa_minimalna_netto / abt.cena_big_mac)
In [59]:
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.

In [60]:
abt.corr(method = 'spearman')
Out[60]:
placa_minimalna cena_big_mac kurs_dolara cena_zlota placa_minimalna_netto cena_zlota_pln zloto_za_najnizsza_krajowa big_mac_za_najnizsza_krajowa
placa_minimalna 1.000000 0.998845 0.180000 0.856154 1.000000 0.946923 -0.149231 0.987692
cena_big_mac 0.998845 1.000000 0.178668 0.854833 0.998845 0.944937 -0.150173 0.983443
kurs_dolara 0.180000 0.178668 1.000000 -0.218462 0.180000 0.135385 0.291538 0.207692
cena_zlota 0.856154 0.854833 -0.218462 1.000000 0.856154 0.919231 -0.470769 0.817692
placa_minimalna_netto 1.000000 0.998845 0.180000 0.856154 1.000000 0.946923 -0.149231 0.987692
cena_zlota_pln 0.946923 0.944937 0.135385 0.919231 0.946923 1.000000 -0.300769 0.925385
zloto_za_najnizsza_krajowa -0.149231 -0.150173 0.291538 -0.470769 -0.149231 -0.300769 1.000000 -0.109231
big_mac_za_najnizsza_krajowa 0.987692 0.983443 0.207692 0.817692 0.987692 0.925385 -0.109231 1.000000

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 :-)

Bądź pierwszy, który skomentuje ten wpis!

Dodaj komentarz

Twój adres email nie zostanie opublikowany.


*