データ分析した結果を地図上で表示したくなることがあると思います。GISソフトウェアでできるはずですが、なかなかしきいが高いです。
今回は、都道府県別の結果を日本地図上に表示するライブラリーを使って簡単に可視化する方法を紹介します。
分析結果を地図上で可視化する手順を全部のせるので、実際にやってみましょう。
分析データの準備:都道府県別の人口とごみ排出量
データは、総務省統計局の「なるほど統計学園」のデータを使いましょう。
下記のURLを開いてください。
「探す・使う・作る」をクリックして、左のメニューの「都道府県別に知る」をクリックしてください。 今回は、県別の人口とゴミの量の可視化をします。
「2. 人口」の「2-1 人口(都道府県別)」をクリックしてください。下記のように県別の人口を確認できます。 「ダウンロード」をクリックしてExcelファイル(02-01.xls)をダウンロードしてください。
同じようにして、「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)));
実行結果
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)));
実行結果
人口一人あたりのゴミの量を可視化する
当たり前ですが、人口が多いとゴミの量も多いです。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)));
実行結果
まとめ
Pythonを使うと簡単に可視化できるのが体験できたでしょうか?
PyQでは、今回紹介した Jupyter Notebook、Matplotlib、Pandas、japanmapのコンテンツが用意されています。 より深く学習したい方は、ぜひ、お試しください。