foliumを色々いじってみた。(避難所の分布)

こんにちは、TaKaです。

今回は、自己紹介でお話しした通り、データを使って街を可視化してみようという企画を始めました。

まず、この企画を使う前提として、データの取り扱いと結果についてお話しいたします。

データの取り扱いについてですが、この企画では、オープンデータとよばれる商用利用も可能なデータを使っており、利用規約に応じて使っていることです。次に、結果についてですが、この企画は、私のプログラミング言語の使用練習の一環としての面も含めており、このデータをこういう見方でやってみたらどう見えるのかなという個人的な関心を持って結果を出しています。使用する題材には、避難所など人によってはデリケートな部分も含まれるので、この結果に一喜一憂されることのないこと、自治体の計画や分析に基づいた結果がこの企画の結果よりも優先されるべきであることを念頭に置いていただきたく思います。

なぜなら、私自身が、より多くの詳細なデータが得られたりその検討に耐えうる知見や権限を有している立場にないこと、まちで起こる事柄には多分にいろんな要素が絡み合い、ある一面ではよく見えても違う面から見ると違う結果になるなど、まだまだ解明されていないことが多いという複雑性があるからです。そのため、こういう見方もあるのかという程度にお考えいただければと思います。

前置きが長くなりましたが、早速、行ってみましょう!

今回は、私の地元に関係のある自治体である青森県八戸市の「避難所」に関するオープンデータを使って、地図に落とし込んでみました。

オープンデータの利用規約に沿って、データの出典を示します。

この記事は以下の著作物を改変して利用しています。
「指定避難所一覧」、八戸市、クリエイティブ・コモンズ・ライセンス 表示 4.0 国際(https://creativecommons.org/licenses/by/4.0/deed.ja)

使った言語はpython、ライブラリはfolium、pandasです。

pythonはデータ分析に有用とされている言語とされています。

foliumは、いろんなデータをleaflet.jsという地図を表示する言語に落とし込むことで、データを地図上で可視化できるpythonのライブラリです。

pandasは、excelやcsvといったいろんなファイル形式のデータをdataframeという統一されたデータ形式に変換できるpythonのライブラリです。

今回の「見てみた!?」は?

今回は、地震や水害といった自然災害における避難所の分布をプロットしてみました。

まずは、避難するにもそこがどれだけ収容できるのか気になってしまったので、収容可能人数を円の大きさ(folium.Circle)としてそれぞれの避難所をプロットしてみました。その結果とコードを以下に示します。

画像1

ご覧のように、緑色以外の白い地域(市街地)にまんべんなく避難所が設置されていると思われます。また、円の大きさ的にも、画像内のポップアップにあるように1000人程度収容できる避難所も海側と山側で見られます。

それでは、この「1000人収容できる避難所がどれだけあるか」をヒストグラムにしてみました。その結果がこちらです。

画像2

その結果、全避難所数は137か所でしたが、200人ほど収容できる避難所が突出して多いことがわかりました。しかし、仮説として挙げた1000人収容できる避難所に関しては、「1000人近くまたはそれ以上の収容能力がある避難所がどれだけあるか」に仮説を変えて検証すると、40か所近くあり、200人収容できる避難所の数に匹敵することがわかりました。このことから、円の大きさで地図に落とし込むことは、分布とともに量についてもだいたい把握できると言えます。

しかし、地図を見ていて気になる点があります。赤色やオレンジ、黄色などで示される比較的大きい道路(幹線)沿いに位置する避難所は多いものの、それらの間に位置している市街地には見られないケースも見受けられました。

避難所の想定人数としては、夜間人口と昼間人口の両方を加味する必要があります。そのため、この結果だけでは何とも言えません。本当は住民基本台帳ベースで公開されている地域ごとの夜間人口と照らし合わせてみたいですが、時間と自分のスキル不足の都合上、ここでは、これまでにしておきます。

以上、ありがとうございました。

下に、マッピングに使ったコードを載せます。

import pandas as pd
import folium

m = folium.Map(location=[40.512326,141.488386],zoom_start=13)
df = pd.read_excel("siteihinanjo.xls", index_col=1).fillna("0")
for i in range(1,len(df)-1):
   folium.Circle(location=[df["緯度"][i],df["経度"][i]],radius=int(df['収容可能人員'][i])/100,color="blue",fill_color=False).add_to(m)


m.save("data.jpg")

この記事が気に入ったらサポートをしてみませんか?