#はじめに
ふとしたきっかけで、サクッと日本地図を塗り分けたくなる場面がありますよね(多分)
ライブラリが非常に豊富な Python を使って
スクレイピング → 日本地図の塗り分け
のステップを爆速にするためのコツを紹介します。
どんな雰囲気の可視化ができるのか、47 都道府県の最低賃金を例に取って、YouTube の動画にしたのでぜひご覧ください。
#1. 可視化したいデータを収集する
このステップの目標は、47 都道府県の数値データを格納したリストを作成することです。
ここでは Web スクレイピングの例を紹介しますが、その他の方法でも目標が達成できれば問題ありません。
(1) Web スクレイピング
Web スクレイピングが初めての人は、
図解!Python BeautifulSoupの使い方を徹底解説!(select、find、find_all、インストール、スクレイピングなど) - AI-interのPython3入門
という非常に分かりやすい記事があるので参考にしてください。
注意点として、スクレイピングで抽出したままの状態では文字列型なので、必ず数値型に変換するようにしましょう。
以下のサンプルコードでは、[厚生労働省のサイト] (https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/minimumichiran/)から都道府県別の最低賃金を取得しています。
from bs4 import BeautifulSoup # pip install beautifulsoup4
import requests
# スクレイピングしたい Web サイトの URL
url = 'https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/minimumichiran/'
# 指定した Web サイトの情報を取得し,変数に格納する
r = requests.get(url)
# BeautifulSoup() に Web サイトの情報と解析に使用するパーサーを渡す
soup = BeautifulSoup(r.text, "html.parser")
# HTML タグで該当する箇所を検索してリストに格納する
minimums = [int(i.text.replace(',','')) for i in soup.find_all('td', attrs={'class':'xl65'})][:-1]
# リストの長さが 47 であることを確認する
print(len(minimums))
print(minimums)
>>>
[861, 793, 793, 825, 792, 793, 800, 851, 854, 837, 928, 925, 1013, 1012, 831, 849, 833, 830, 838, 849, 852, 885, 927, 874, 868, 909, 964, 900, 838, 831, 792, 792, 834, 871, 829, 796, 820, 793, 792, 842, 792, 793, 793, 792, 793, 793, 792]
###(2) その他の方法
Web スクレイピングの他にも、様々なデータ収集の方法が考えられます。
例えば、Python で Excel ファイルのデータを読み込みたいときには、
pandasでExcelファイル(xlsx, xls)の読み込み(read_excel) | note.nkmk.me
が参考になります。
いずれの方法でも、47 都道府県の数値データを格納したリストが作成できれば問題ありません。
#2. 白地図を塗り分ける
ステップ1で作成した数値リストを用いて、真っ白な日本地図を塗り分けていきます。
###(1) japanmap のインストール
日本地図を県別に色分けする Python のライブラリが提供されているのでインストールします。
pip install japanmap
japanmap の活用例として、もっと色々なことにチャレンジしている
県別データの可視化 - Qiita
という記事がとても分かりやすかったので、詳しく知りたい人は参考にしてください。
以下では、数値データで白地図を塗り分けることに焦点を当てたいと思います。
###(2) ヒートマップの作成
原理としては、
- カラーマップの選択(Choosing Colormaps — Matplotlib 2.0.2 documentation)
- 標準化関数の作成(matplotlib.colors.Normalize — Matplotlib 3.4.3 documentation)
- mappable オブジェクトの作成(Customized Colorbars Tutorial — Matplotlib 3.4.3 documentation)
- 数値データ → カラーコード への変換
- 都道府県名(or都道府県番号)と対応させたディクショナリの作成
- japanmap による白地図の塗り分け(japanmap · PyPI)
の6ステップから成り立っています。
手順は複雑に見えますが、よく分からなければコピペで OK です。
カラーマップはかなり好みが分かれる部分なので、私の好きな'plasma'
以外も試してみてください。
import matplotlib.pyplot as plt # pip install matplotlib
import numpy as np # pip install numpy
from japanmap import picture # pip install japanmap
# ステップ1で作成したリストを NumPy 配列に変換する
minimum_wages = np.array(minimums)
# カラーマップを選択する
# 参考:https://matplotlib.org/2.0.2/users/colormaps.html
cmap = plt.get_cmap('plasma')
# 最小値を 0,最大値を 1 とする標準化関数を作成する
norm = plt.Normalize(vmin=minimum_wages.min(), vmax=minimum_wages.max())
# 標準化関数とカラーマップを指定した "mappable" オブジェクトを作成する
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
# 数値データをカラーコードに変換する
colors = ['#' + bytes(cmap(norm(x), bytes=True)[:3]).hex() for x in minimum_wages]
# 都道府県番号(1~47)をキー,カラーコードを値としたディクショナリを作成する
datas = dict(zip([i for i in range(1,48)], colors))
# print(datas)
# 作成したディクショナリをもとに,白地図を塗り分ける
plt.imshow(picture(datas))
最低賃金の差が一目で分かるように可視化できました。
低賃金の都道府県は東北地方、四国地方、九州地方に密集していることが分かります。
おわりに
Python には便利なライブラリがたくさんあるので、データビジュアライゼーションに使える手段が増えると嬉しくなりますよね。
心が躍る可視化の方法をたくさん模索していきましょう!
Enjoy Pythoning!