3
9

More than 3 years have passed since last update.

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

Posted at

はじめに

ふとしたきっかけで、サクッと日本地図を塗り分けたくなる場面がありますよね(多分)

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

どんな雰囲気の可視化ができるのか、47 都道府県の最低賃金を例に取って、YouTube の動画にしたのでぜひご覧ください。

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

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

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

(1) Web スクレイピング

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

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

以下のサンプルコードでは、厚生労働省のサイトから都道府県別の最低賃金を取得しています。

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) ヒートマップの作成

原理としては、

の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))

日本地図(1).png

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

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

おわりに

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

3
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
9