Pythonでビッグマック指数をグラフ化して異常な円安を視覚化する

このサイトを参考にして、Big Mac Index(ビッグマック指数)のグラフ化を試みる。ビッグマック指数とは、wikiによると、各国の経済力を測るための指数で、マクドナルドで販売されているビッグマック1個の価格を比較することで得られるとなっている。今がどれだけ円安なのかを知る良い指標の1つと言えるだろう。

スポンサーリンク

データ準備と関数実装

import pandas as pd
import numpy as np
import random
import plotly
import plotly.graph_objs as go

以下のサイトからデータをダウンロードする。

%download https://raw.githubusercontent.com/Oysiyl/Big-Mac-Price/master/Big%20Mac%20Index.csv
Downloaded 'Big_Mac_Index.csv'.

サイトの先頭行を見てみる。

File = read_csv('Big_Mac_Index.csv')
File.iloc[0]
date             2000-04-01
iso_a3                  ARG
currency_code           ARS
name              Argentina
local_price             2.5
dollar_ex                 1
dollar_price            2.5
USD_raw              -0.004
EUR_raw                0.05
GBP_raw              -0.167
JPY_raw              -0.099
CNY_raw               1.091
GDP_dollar              NaN
adj_price               NaN
USD_adjusted            NaN
EUR_adjusted            NaN
GBP_adjusted            NaN
JPY_adjusted            NaN
CNY_adjusted            NaN
Name: 0, dtype: object
df = pd.read_csv("Big_Mac_Index.csv", usecols=["date", "iso_a3", "name",
                                               "dollar_price", "USD_raw"])
df["date"] = pd.to_datetime(df["date"])
df.rename(columns={"iso_a3": "country"}, inplace=True)
df["USD_raw"] = df["USD_raw"]*100
df = df.round({"dollar_price": 2, "USD_raw": 1, "EUR_raw": 1, "GBP_raw": 1,
"JPY_raw": 1, "CNY_raw": 1})
print(df.head(5))
print(df.dtypes)
usa = df[df["name"] == "United States"].reset_index(drop=True)
jap = df[df["name"] == "Japan"].reset_index(drop=True)
print(usa)
print(jap)
        date country         name  dollar_price  USD_raw
0 2000-04-01     ARG    Argentina          2.50     -0.4
1 2000-04-01     AUS    Australia          1.54    -38.6
2 2000-04-01     BRA       Brazil          1.65    -34.3
3 2000-04-01     CAN       Canada          1.94    -22.8
4 2000-04-01     CHE  Switzerland          3.47     38.3
date            datetime64[ns]
country                 object
name                    object
dollar_price           float64
USD_raw                float64
dtype: object
         date country           name  dollar_price  USD_raw
0  2000-04-01     USA  United States          2.51      0.0
1  2001-04-01     USA  United States          2.54      0.0
2  2002-04-01     USA  United States          2.49      0.0
3  2003-04-01     USA  United States          2.71      0.0
4  2004-05-01     USA  United States          2.90      0.0
5  2005-06-01     USA  United States          3.06      0.0
6  2006-01-01     USA  United States          3.15      0.0
7  2006-05-01     USA  United States          3.10      0.0
8  2007-01-01     USA  United States          3.22      0.0
9  2007-06-01     USA  United States          3.41      0.0
10 2008-06-01     USA  United States          3.57      0.0
11 2009-07-01     USA  United States          3.57      0.0
12 2010-01-01     USA  United States          3.58      0.0
13 2010-07-01     USA  United States          3.73      0.0
14 2011-07-01     USA  United States          4.07      0.0
15 2012-01-01     USA  United States          4.20      0.0
16 2012-07-01     USA  United States          4.33      0.0
17 2013-01-01     USA  United States          4.37      0.0
18 2013-07-01     USA  United States          4.56      0.0
19 2014-01-01     USA  United States          4.62      0.0
20 2014-07-01     USA  United States          4.80      0.0
21 2015-01-01     USA  United States          4.79      0.0
22 2015-07-01     USA  United States          4.79      0.0
23 2016-01-01     USA  United States          4.93      0.0
24 2016-07-01     USA  United States          5.04      0.0
25 2017-01-01     USA  United States          5.06      0.0
26 2017-07-01     USA  United States          5.30      0.0
27 2018-01-01     USA  United States          5.28      0.0
28 2018-07-01     USA  United States          5.51      0.0
         date country   name  dollar_price  USD_raw
0  2000-04-01     JPN  Japan          2.77     10.5
1  2001-04-01     JPN  Japan          2.37     -6.7
2  2002-04-01     JPN  Japan          2.02    -19.1
3  2003-04-01     JPN  Japan          2.18    -19.4
4  2004-05-01     JPN  Japan          2.32    -20.0
5  2005-06-01     JPN  Japan          2.34    -23.4
6  2006-01-01     JPN  Japan          2.19    -30.6
7  2006-05-01     JPN  Japan          2.23    -28.1
8  2007-01-01     JPN  Japan          2.30    -28.5
9  2007-06-01     JPN  Japan          2.29    -32.9
10 2008-06-01     JPN  Japan          2.62    -26.6
11 2009-07-01     JPN  Japan          3.46     -3.2
12 2010-01-01     JPN  Japan          3.50     -2.4
13 2010-07-01     JPN  Japan          3.67     -1.7
14 2011-07-01     JPN  Japan          4.08      0.5
15 2012-01-01     JPN  Japan          4.16     -0.9
16 2012-07-01     JPN  Japan          4.09     -5.5
17 2013-01-01     JPN  Japan          3.51    -19.5
18 2013-07-01     JPN  Japan          3.20    -29.8
19 2014-01-01     JPN  Japan          2.97    -35.7
20 2014-07-01     JPN  Japan          3.64    -24.0
21 2015-01-01     JPN  Japan          3.14    -34.4
22 2015-07-01     JPN  Japan          2.99    -37.7
23 2016-01-01     JPN  Japan          3.12    -36.7
24 2016-07-01     JPN  Japan          3.47    -31.2
25 2017-01-01     JPN  Japan          3.26    -35.6
26 2017-07-01     JPN  Japan          3.36    -36.6
27 2018-01-01     JPN  Japan          3.43    -35.0
28 2018-07-01     JPN  Japan          3.51    -36.4

最新の2018年7月のビッグマック指数によると、円は米ドルに対して36.4%も過小評価されていることになる。このサイトによると、国民一人当たりのGDPを加味した場合は30%となっている。

df2 = pd.DataFrame({"country1": usa["name"],
                    "country2": jap["name"],
                    "price1": usa["dollar_price"],
"price2": jap["dollar_price"]})
print(df2)
         country1 country2  price1  price2
0   United States    Japan    2.51    2.77
1   United States    Japan    2.54    2.37
2   United States    Japan    2.49    2.02
3   United States    Japan    2.71    2.18
4   United States    Japan    2.90    2.32
5   United States    Japan    3.06    2.34
6   United States    Japan    3.15    2.19
7   United States    Japan    3.10    2.23
8   United States    Japan    3.22    2.30
9   United States    Japan    3.41    2.29
10  United States    Japan    3.57    2.62
11  United States    Japan    3.57    3.46
12  United States    Japan    3.58    3.50
13  United States    Japan    3.73    3.67
14  United States    Japan    4.07    4.08
15  United States    Japan    4.20    4.16
16  United States    Japan    4.33    4.09
17  United States    Japan    4.37    3.51
18  United States    Japan    4.56    3.20
19  United States    Japan    4.62    2.97
20  United States    Japan    4.80    3.64
21  United States    Japan    4.79    3.14
22  United States    Japan    4.79    2.99
23  United States    Japan    4.93    3.12
24  United States    Japan    5.04    3.47
25  United States    Japan    5.06    3.26
26  United States    Japan    5.30    3.36
27  United States    Japan    5.28    3.43
28  United States    Japan    5.51    3.51
df3 = df.groupby(["name"])["date"].count()
print(df3)
name
Argentina               29
Australia               29
Azerbaijan               1
Bahrain                  1
Brazil                  29
Britain                 29
Canada                  29
Chile                   29
China                   29
Colombia                24
Costa Rica              23
Croatia                  1
Czech Republic          29
Denmark                 29
Egypt                   26
Euro area               29
Guatemala                1
Honduras                 1
Hong Kong               29
Hungary                 29
India                   15
Indonesia               29
Israel                  20
Japan                   29
Jordan                   1
Kuwait                   1
Lebanon                  1
Malaysia                29
Mexico                  29
Moldova                  1
New Zealand             29
Nicaragua                1
Norway                  25
Oman                     1
Pakistan                24
Peru                    26
Philippines             28
Poland                  29
Qatar                    1
Romania                  1
Russia                  29
Saudi Arabia            24
Singapore               29
South Africa            29
South Korea             29
Sri Lanka               24
Sweden                  29
Switzerland             29
Taiwan                  29
Thailand                29
Turkey                  27
UAE                     22
Ukraine                 24
United Arab Emirates     1
United States           29
Uruguay                 24
Vietnam                  9
Name: date, dtype: int64
countrynames = [*np.unique(df["name"])]
print(countrynames)
print(len(countrynames))
colors = np.random.rand(len(countrynames))
['Argentina', 'Australia', 'Azerbaijan', 'Bahrain', 'Brazil', 'Britain', 'Canada', 'Chile', 'China', 'Colombia', 'Costa Rica', 'Croatia', 'Czech Republic', 'Denmark', 'Egypt', 'Euro area', 'Guatemala', 'Honduras', 'Hong Kong', 'Hungary', 'India', 'Indonesia', 'Israel', 'Japan', 'Jordan', 'Kuwait', 'Lebanon', 'Malaysia', 'Mexico', 'Moldova', 'New Zealand', 'Nicaragua', 'Norway', 'Oman', 'Pakistan', 'Peru', 'Philippines', 'Poland', 'Qatar', 'Romania', 'Russia', 'Saudi Arabia', 'Singapore', 'South Africa', 'South Korea', 'Sri Lanka', 'Sweden', 'Switzerland', 'Taiwan', 'Thailand', 'Turkey', 'UAE', 'Ukraine', 'United Arab Emirates', 'United States', 'Uruguay', 'Vietnam']
57
def random_color():
    levels = range(32, 256, 32)
    return "rgb" + str(tuple(random.choice(levels) for _ in range(3)))

print(random_color())
rgb(192, 96, 224)
def tracing(countryname):
    eachcountry = df[df["name"] == countryname]
    trace = go.Bar(
        x=eachcountry["date"],
        y=eachcountry["dollar_price"],
        name=countryname,
        text=countryname,
        textposition='auto',
        hoverinfo="x+y",
        marker=dict(
            line=dict(
                color='rgba(0,0,0,0.0)',
                width=1
            ),
            color=random_color()
        )
    )
    del eachcountry
    return trace

ビッグマック指数のグラフ化

data = []
for i in range(len(countrynames)):
    trace = tracing(countrynames[i])
    data.append(trace)
layout = go.Layout(
    title='Big Mac index through the years',
    xaxis=dict(
        title='Years',
        tickfont=dict(
            size=14,
            color='rgb(107, 107, 107)'
        )
    ),
    yaxis=dict(
        title='Dollar price for one burger',
        titlefont=dict(
            size=16,
            color='rgb(107, 107, 107)'
        ),
        tickfont=dict(
            size=14,
            color='rgb(107, 107, 107)'
        )
    ),
    legend=dict(
        x=1.0,
        y=1.0,
        bgcolor='rgba(255, 255, 255, 0)',
        bordercolor='rgba(255, 255, 255, 0)'
    )
)

fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(fig, filename='BigMac.html', auto_open=False)
'file:///home/workspace/test/BigMac.html'

上のグラフはこのサイトで見ることができる。アメリカと日本のビッグマック指数を比較したのが下の画像。

米ドルと円のビッグマック指数を比較している上のグラフを見ると、2009年〜2012年当たり(1ドル80円時代)では、円はドルに対して適正レートだったことが伺える。この時代は、食料品や生活必需品は固より、パソコン等の輸入品が非常に安かったのでかなり生活しやすかった。今の政府日銀の常軌を逸した金融緩和による円安物価高は庶民にとっては地獄以外の何ものでもない。