2015〜2019年の世界幸福度ランキング推移をPlotlyで視覚化

Plotlyを使ってworld happiness ranking(世界幸福度ランキング)2015年〜2019年の推移をプロットする。Plotly_expressを使えば、5年間の幸福度推移を簡単にアニメーション化できる。Plotlyのchoroplethマップを使用し、アニメーションの中で色の変化を見ることでランキングの推移を見て取れる。

スポンサーリンク

世界幸福度ランキングデータの準備

先ず、github.comから拾って来たデータをロードする。

import pandas as pd

df = pd.read_csv('2015.csv')
df1 = pd.read_csv('2016.csv')
df2 = pd.read_csv('2017.csv')
df3 = pd.read_csv('2018.csv')
df4 = pd.read_csv('2019.csv')

2018年の幸福度ランキングのトップ5をチラ見する。

df3.head()
Rank Country Score GDP_Per_Capita Social_Support Healthy_Life_Expectancy Freedom_To_Make_Life_Choices Generosity Perceptions_Of_Corruption Residual
0 1 Finland 7.632 1.305 1.592 0.874 0.681 0.192 0.393 2.988
1 2 Norway 7.594 1.456 1.582 0.861 0.686 0.286 0.340 2.723
2 3 Denmark 7.555 1.351 1.590 0.868 0.683 0.284 0.408 2.779
3 4 Iceland 7.495 1.343 1.644 0.914 0.677 0.353 0.138 2.564
4 5 Switzerland 7.487 1.420 1.549 0.927 0.660 0.256 0.357 2.675

次に、2019年の幸福度ランキングをチラ見する。

df4.head()
Country (region) Ladder SD of Ladder Positive affect Negative affect Social support Freedom Corruption Generosity Log of GDP\nper capita Healthy life\nexpectancy
0 Finland 1 4 41.0 10.0 2.0 5.0 4.0 47.0 22.0 27.0
1 Denmark 2 13 24.0 26.0 4.0 6.0 3.0 22.0 14.0 23.0
2 Norway 3 8 16.0 29.0 3.0 3.0 8.0 11.0 7.0 12.0
3 Iceland 4 9 3.0 3.0 1.0 7.0 45.0 3.0 15.0 13.0
4 Netherlands 5 1 12.0 25.0 15.0 19.0 12.0 7.0 12.0 18.0

国名とランクの列名が違うので、2018年度版データに合わせる。

df4.rename(columns={'Country (region)': 'Country', 'Ladder': 'Rank'},inplace=True)
df.rename(columns={ 'Happiness Rank': 'Rank'},inplace=True)
df1.rename(columns={ 'Happiness Rank': 'Rank'},inplace=True)
df2.rename(columns={ 'Happiness.Rank': 'Rank'},inplace=True)

幸福度ランキングの発表された年をデーターフレームに追加する。

df['Year'] = 2015
df1['Year'] = 2016
df2['Year'] = 2017
df3['Year'] = 2018
df4['Year'] = 2019

必要な列(国、順位、年度)だけを抽出する。

df5 = df[['Country','Rank','Year']]
df6 = df1[['Country','Rank','Year']]
df7 = df2[['Country','Rank','Year']]
df8 = df3[['Country','Rank','Year']]
df9 = df4[['Country','Rank','Year']]

データフレームを1つにまとめる。

df10 = pd.concat([df5, df6, df7, df8, df9], ignore_index=True)

国と年でまとめたデータをソートする。

df11 = df10.sort_values(by=["Country",'Year'])
スポンサーリンク

Plotlyで幸福度順位の推移を視覚化

import plotly_express as px
import plotly.graph_objs as go
from plotly.offline import plot,iplot
fig = px.choropleth(df11,locations="Country",color="Rank",hover_name="Country",
      animation_frame="Year",range_color=[0,200],color_continuous_scale=px.colors.cmocean.matter,
      locationmode = 'country names',scope = "world")
fig.update_layout(title_text="世界幸福度ランキング2015年〜2019年",title_font=dict(size=22),
     autosize=False,width=835,height=800,margin=dict(l=50,r=50,b=50,t=50,pad=0,autoexpand=True),
     hoverlabel=dict(font=dict(size=24)),geo=dict(showcountries=True,showocean=True,showrivers=True,
     landcolor='lightgray',resolution=110,showframe=False,showlakes=True,showland=True,
     countrywidth=2,countrycolor='white',lakecolor='rgb(0,0,200)',
     projection=dict(type='orthographic')))
plot(fig,show_link=False,filename="1.html",include_plotlyjs=False)

データが5年分しかないので、アニメーションさせてもそれ程変化の差を感じることができない。せめて10年分以上のデータが必要だろうと思われる。

スポンサーリンク
スポンサーリンク