日本地図で簡単作成!コロプレスマップで都道府県を可視化する

PythonのJapanmapライブラリーで都道府県別のコロプレスマップを作成します。

Japanmapライブラリーは日本の都道府県に特化した可視化ライブラリーなので、扱いがシンプルです。

その特徴は

  • 事前準備が簡単:準備するデータが47都道府県名と数値だけ用意すれば良いのでシンプル。
  • 境界線情報がいらない:都道府県を分ける地図のジオメトリ情報(境界線情報)などを事前に設定しなくても、自動的に表示されます。

データの準備と前処理

まず独立行政法人 統計センターのSSDSE(教育用標準データセット 47都道府県×多分野90項目をダウンロードします。

!wget https://www.nstac.go.jp/sys/files/SSDSE-E-2022v2.csv

ダウンロードしたCSVファイルをみると、都道府県名と各列にデータが格納されているのがわかります。

全国部分は使わないので削除します。

# 最初の行「全国」を削除
df = df.drop(df.index[[0]])

色分けしたい列部分を[target]変数に入れるだけで生成されます。

今回は、日本人人口比で各地域に外国人人口がどれくらいいるのか?を塗り分けたいので、あらたに「人口比外国人人口」というカラムを作り、その中に各地域にいる「外国人人口」を「日本人人口」で割って格納する。という記述を行いました。これもPandasだと一行で完結するので便利です。

# ターゲット列を生成
target ="人口比外国人人口"
df[target] = df["外国人人口"] / df["日本人人口"]

地図の描画処理

あとは、塗り分けたい列を選択するだけで、地図が描画されます。

# グラフに使うカラーマップを作成 OrRd
cmap = plt.get_cmap('jet')

# カラーマップに合わせて色分けするために、最小値と最大値、正規化関数(ノーマライズ関数)を定義
min_val = df[target].min()
max_val = df[target].max()
norm = plt.Normalize(vmin=min_val, vmax=max_val)

# グラフ用の領域(サブプロット)を作成
fig, ax = plt.subplots(1,1, figsize=(12,12))
ax.set_title(target, fontsize=26)
fig.text(0.3, 0.22, f"最大 日本人一人当たり{round(df[target].max(),4)} 人", fontsize="xx-large")
fig.text(0.3, 0.2, f"最小 日本人一人当たり{round(df[target].min(),4)} 人", fontsize="xx-large")

# カラーマップの凡例を表示
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))


# コロプレス日本地図画像用の関数fcolを定義します。
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()

# 日本地図を表示
plt.imshow(jm.picture(df[target].apply(fcol)))
plt.savefig(f"{target}.png")
plt.show()

塗り分けを行いたい列にある、最小単位と最大単位をとって、カラーのグラデーションを行います。

色(cmap)の種類はこちらを参考に入力すると簡単に変えられます。

今回は「Jet」という色見本を使いました。

コードを大幅に改変することなく、データを都道府県別に用意して、列にそれぞれの値を入れるだけで、すぐにコロプレスマップが作成されるので、とても便利です。

データ分析者のためのPythonデータビジュアライゼーション入門 コードと連動してわかる可視化手法

データ分析者のためのPythonデータビジュアライゼーション入門 コードと連動してわかる可視化手法

小久保 奈都弥
2,376円(07/21 12:16時点)
発売日: 2020/08/06
Amazonの情報を掲載しています
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
view raw japanmap.ipynb hosted with ❤ by GitHub

Shareこの記事をシェアしよう!