Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

分析結果を地図上に可視化してみよう!

f:id:kenken0326:20200127175928p:plain

f:id:kenken0326:20191021153602p:plain
tsutomu PyQチームのtsutomuです。最近はGIS(地理情報システム Geographic Information System)に関連した仕事をしています。

データ分析した結果を地図上で表示したくなることがあると思います。GISソフトウェアでできるはずですが、なかなかしきいが高いです。

今回は、都道府県別の結果を日本地図上に表示するライブラリーを使って簡単に可視化する方法を紹介します。
分析結果を地図上で可視化する手順を全部のせるので、実際にやってみましょう。

分析データの準備:都道府県別の人口とごみ排出量

データは、総務省統計局の「なるほど統計学園」のデータを使いましょう。
下記のURLを開いてください。

www.stat.go.jp

「探す・使う・作る」をクリックして、左のメニューの「都道府県別に知る」をクリックしてください。 今回は、県別の人口とゴミの量の可視化をします。

f:id:tsutomu3:20200109131804p:plain

「2. 人口」の「2-1 人口(都道府県別)」をクリックしてください。下記のように県別の人口を確認できます。 「ダウンロード」をクリックしてExcelファイル(02-01.xls)をダウンロードしてください。

f:id:tsutomu3:20200109131903p:plain

同じようにして、「22. 環境」の「22-1 ごみ総排出量(都道府県別)」で開いた画面からもExcelファイル(22-01.xls)をダウンロードしてください。

分析環境の準備:pandas, japanmapライブラリー

可視化は、Jupyter Notebook上で、pandasと japanmapライブラリーを使って行います。

Pythonをインストール(参考)したあとで、pip install -U jupyter matplotlib pandas xlrd japanmap でライブラリーをインストールします。

ダウンロードしたExcelファイルがあるフォルダから、jupyter-notebook でJupyter Notebookを起動してください。

都道府県別の人口を可視化する

セルに下記を記述し実行しましょう。

人口データの読み込みとカラーマップの設定

コード

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
cmap = plt.get_cmap('Reds')

df1 = pd.read_excel('02-01.xls', skiprows=3)
df1 = df1[1:48].set_index('都道府県')

人口データをdf1に読み込み、人口に応じて色を決めます。色はRedsというカラーマップを使います(人口が少ないと白で、多いと濃い赤になります)。

日本地図に人口とカラーマップを可視化

下記を実行しましょう。人口が県ごとに色分けされて表示されます。

コード

from japanmap import picture
cmap = plt.get_cmap('Reds')
norm = plt.Normalize(vmin=df1.人口.min(), vmax=df1.人口.max())
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
plt.imshow(picture(df1.人口.apply(fcol)));

実行結果

f:id:tsutomu3:20200109231102p:plain

cmapでカラーマップを作成します。 カラーマップと値を対応させるために、normで人口を正規化します。 fcolは、人口の値を色に変換する関数です。 pictureに、df1.人口.apply(fcol)を与えることで、人口ごとの色に塗ることができます。

都道府県別のごみの排出量を可視化する

次に、県別のゴミの量を見てみましょう。下記を実行してください。

コード

df2 = pd.read_excel('22-01.xls', skiprows=3)
df2 = df2[1:48].set_index('都道府県')
norm = plt.Normalize(vmin=df2.ごみ総排出量.min(), vmax=df2.ごみ総排出量.max())
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
plt.imshow(picture(df2.ごみ総排出量.apply(fcol)));

実行結果

f:id:tsutomu3:20200109231641p:plain

人口一人あたりのゴミの量を可視化する

当たり前ですが、人口が多いとゴミの量も多いです。1人当りのゴミの量を確認してみましょう。 1人当りのゴミの量をIndicator列として作成します。

コード

df2['Indicator'] =  df2.ごみ総排出量 / df1.人口
norm = plt.Normalize(vmin=df2. Indicator.min(), vmax=df2. Indicator.max())
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
plt.imshow(picture(df2. Indicator.apply(fcol)));

実行結果

f:id:tsutomu3:20200109231918p:plain

まとめ

Pythonを使うと簡単に可視化できるのが体験できたでしょうか?

PyQでは、今回紹介した Jupyter Notebook、Matplotlib、Pandas、japanmapのコンテンツが用意されています。 より深く学習したい方は、ぜひ、お試しください。

Copyright ©2017- BeProud Inc. All rights reserved.