【Python】スクレイピングしたデータで、日本地図を爆速で塗り分けるためのTips

#はじめに
ふとしたきっかけで、サクッと日本地図を塗り分けたくなる場面がありますよね（多分）

ライブラリが非常に豊富な **Python** を使って
<font color="Red">**スクレイピング → 日本地図の塗り分け**</font>
のステップを爆速にするためのコツを紹介します。

どんな雰囲気の可視化ができるのか、<font color="Blue">47 都道府県の最低賃金</font>を例に取って、YouTube の動画にしたのでぜひご覧ください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/t8mWy3hwQK4?start=65" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


#1. 可視化したいデータを収集する

このステップの目標は、**47 都道府県の数値データを格納したリストを作成すること**です。

ここでは Web スクレイピングの例を紹介しますが、その他の方法でも目標が達成できれば問題ありません。

### (1) Web スクレイピング

Web スクレイピングが初めての人は、
[図解！Python BeautifulSoupの使い方を徹底解説！(select、find、find_all、インストール、スクレイピングなど) - AI-interのPython3入門](https://ai-inter1.com/beautifulsoup_1/) 
という非常に分かりやすい記事があるので参考にしてください。

注意点として、<font color="Red">スクレイピングで抽出したままの状態では文字列型</font>なので、<font color="Red">必ず数値型に変換</font>するようにしましょう。

以下のサンプルコードでは、[厚生労働省のサイト] (https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/minimumichiran/)から都道府県別の最低賃金を取得しています。

```python
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](https://note.nkmk.me/python-pandas-read-excel/)
が参考になります。

いずれの方法でも、47 都道府県の数値データを格納したリストが作成できれば問題ありません。

#2. 白地図を塗り分ける
ステップ１で作成した数値リストを用いて、真っ白な日本地図を塗り分けていきます。

###(1) japanmap のインストール

日本地図を県別に色分けする Python のライブラリが提供されているのでインストールします。

```bash
pip install japanmap
```

japanmap の活用例として、もっと色々なことにチャレンジしている
[県別データの可視化 - Qiita](https://qiita.com/SaitoTsutomu/items/6d17889ba47357e44131)
という記事がとても分かりやすかったので、詳しく知りたい人は参考にしてください。

以下では、数値データで白地図を塗り分けることに焦点を当てたいと思います。

###(2) ヒートマップの作成
原理としては、

* **カラーマップの選択**（[Choosing Colormaps — Matplotlib 2.0.2 documentation](https://matplotlib.org/2.0.2/users/colormaps.html)）
* **標準化関数の作成**（[matplotlib.colors.Normalize — Matplotlib 3.4.3 documentation](https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.Normalize.html)）
* **mappable オブジェクトの作成**（[Customized Colorbars Tutorial — Matplotlib 3.4.3 documentation](https://matplotlib.org/stable/tutorials/colors/colorbar_only.html)）
* **数値データ → カラーコード への変換**
* **都道府県名（or都道府県番号）と対応させたディクショナリの作成**
* **japanmap による白地図の塗り分け**（[japanmap · PyPI](https://pypi.org/project/japanmap/)）

の６ステップから成り立っています。

手順は複雑に見えますが、よく分からなければコピペで OK です。

カラーマップはかなり好みが分かれる部分なので、私の好きな```'plasma'```以外も試してみてください。


```python
import matplotlib.pyplot as plt # pip install matplotlib
import numpy as np  # pip install numpy
from japanmap import picture    # pip install japanmap


# ステップ１で作成したリストを 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))
```
![日本地図(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832523/eb765b7a-2915-8ecd-51dd-b26462ff6373.png)

最低賃金の差が一目で分かるように可視化できました。

低賃金の都道府県は東北地方、四国地方、九州地方に密集していることが分かります。


# おわりに
Python には便利なライブラリがたくさんあるので、**データビジュアライゼーションに使える手段が増えると嬉しく**なりますよね。
心が躍る可視化の方法をたくさん模索していきましょう！
Enjoy Pythoning!