2021年11月15日月曜日

Pythonで世界銀行のオープンデータを使ってバブルチャートを作成する

世界銀行が公開しているオープンデータ(World Bank Open Data)があって、データ取得用のAPIも用意されている。Pythonでこのオープンデータを取得してバブルチャートを作成してみる。


環境


WSL2(Ubuntu20.04)とJupyter Lab。


APIで世界銀行のオープンデータを取得

オープンデータの取得にはWBGAPIを使う。WBGAPIでは世界銀行のAPIを利用してPythonでオープンデータにアクセスできる。インストールはpipでできる。

世界銀行のオープンデータには人口や所得、消費電力などいろいろなデータがある。WBGAPIで「power」という語を含むデータを検索してみる。

import wbgapi as wb

display(wb.series.info(q='power'))

以下のような結果が得られる。データを取得するときにはこの結果にあるidを使う。


次にオープンデータに含まれる国や地域を確認してみる。オープンデータには国別データの他にいくつかの国をまとめた地域ごとのデータもある。

import wbgapi as wb

display(wb.economy.info())

次のような国IDや地域などの情報が確認できる。


先の結果にあるregionの情報は以下のようにして確認できる。

import wbgapi as wb

display(wb.region.info())

データを取得するときにはデータの種類、国または地域、年を指定できる。以下では2019年のアメリカの人口を取得できる。

import wbgapi as wb

display(wb.data.DataFrame(['SP.POP.TOTL'], ['USA'], [2019]))

オープンデータをもとにバブルチャートを作成する

WBGAPIで取得したデータをもとにバブルチャートを作成してみる。まずは必要なPythonライブラリのインストール。

続いて4種類のデータを取得してバブルチャートを作成する。すべての国だと数が多すぎて見づらくなるので人口上位50にしぼってある。使用した4種類のデータは以下の通り。

  • SP.POP.TOTL: 人口
  • NY.GDP.PCAP.CD: ひとりあたりGDP
  • SP.DYN.LE00.IN: 出生時平均寿命
  • BN.GSR.FCTY.CD: 一次純所得

%matplotlib inline

import pandas as pd
import wbgapi as wb
import matplotlib.pyplot as plt
import seaborn as sns

# 地域を除いた国のリストを作成
# regionが空白になっていないidのみにする 
economy_info = wb.economy.info().items
countries = [ei['id'] for ei in economy_info if ei['region'] != '']

# 2019年の国別の以下のデータを取得する
# SP.POP.TOTL: 人口
# NY.GDP.PCAP.CD: ひとりあたりGDP
# SP.DYN.LE00.IN: 出生時平均寿命
# BN.GSR.FCTY.CD: 一次純所得
df=wb.data.DataFrame(
    ['SP.POP.TOTL', 'NY.GDP.PCAP.CD', 'SP.DYN.LE00.IN', 'BN.GSR.FCTY.CD'],
    countries,
    [2019]
)

# データがない国を省いて人口上位50にしぼる
df = df.dropna().sort_values('SP.POP.TOTL', ascending=False).head(50)

plt.figure(figsize=(18, 12))

# バブルチャート作成
# NY.GDP.PCAP.CD: Y軸
# SP.DYN.LE00.IN: X軸
# SP.POP.TOTL: 円の大きさ
# BN.GSR.FCTY.CD: 色
ax = sns.scatterplot(
    data=df, 
    x='NY.GDP.PCAP.CD', 
    y='SP.DYN.LE00.IN', 
    size='SP.POP.TOTL', 
    c=df['BN.GSR.FCTY.CD'], 
    cmap='autumn_r', 
    alpha=0.9, 
    edgecolors='grey', 
    linewidth=1, 
    legend=False, 
    sizes=(20, 5000)
)

# 各円に国IDを表示する
def put_label(x, y, labels, ax):
    a = pd.concat({'x': x, 'y': y, 'label': labels}, axis=1)
    for i, point in a.iterrows():
        ax.text(point['x']+.02, point['y'], str(point['label']))

put_label(df['NY.GDP.PCAP.CD'], df['SP.DYN.LE00.IN'], df.index.to_series(), plt.gca())

plt.show()

次のようなバブルチャートが作成された。


0 件のコメント:

コメントを投稿