2021年11月15日月曜日

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

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


環境


WSL2(Ubuntu20.04)とJupyter Lab。


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

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

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

1
2
3
import wbgapi as wb
 
display(wb.series.info(q='power'))

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


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

1
2
3
import wbgapi as wb
 
display(wb.economy.info())

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


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

1
2
3
import wbgapi as wb
 
display(wb.region.info())

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

1
2
3
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: 一次純所得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
%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 件のコメント:

コメントを投稿