pythonで東京の人口密度のちずを使いましょう！

最近pythonで地図を使って見てる。僕はプロなんか全くないけど今まで作り方法を書きます。このポストの結果は東京の人口密度の地図です。

###データを取ります
東京の堺と人口データを[e-stat](https://www.e-stat.go.jp/)から取れます。[e-stat](https://www.e-stat.go.jp/)は日本政府のデータポータルです。この**[リンク](https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=13&coordSys=1&format=shape&downloadType=5)**からシェープファイル形式でデータをダウンロードできる。僕にとってシェープファイルを使うことが嫌いからgeojsonに変換する。変換は必要じゃないけどmapshaperというツールで便利にできる。シェープファイルに比べたらgeojsonの利点は：

* 一つのファイルだけです。
* 「properties」の名前は文字の数が限らない。
* 自分でファイルを見ったら情報が分かってくる。
* geojsonはjavascriptの種類だからweb可視化をすればこれはいいフォーマット。

###シェープファイルからgeojsonに変換する・（必要じゃない。シェープファイルが嫌い人のため）
シェープファイルからgeojsonに変換する時に僕は[「mapshaper」](https://mapshaper.org/)という便利なwebツールを使う。mapshaperにいって、ダウンロードされた東京データの全部のファイルをアップロードする。そして「Import」ボタンをクリックして。
![Screenshot 2018-11-24 at 17.15.10.png](https://qiita-image-store.s3.amazonaws.com/0/282576/2edbf02e-f1fb-32af-be3b-dc64646f0470.png)

「Import」をクリックしてからこの下イメージを見ているはず。
![Screenshot 2018-11-24 at 17.17.58.png](https://qiita-image-store.s3.amazonaws.com/0/282576/02fe10a4-08ea-8e88-9035-59c8a12132ad.png)
ええ？それは東京か？なんでそんなちっちゃいのか？と思っているかもしれない。これはたしかに東京。あまりわからないけど東京の中にこの小さくて、遠い島がある。pythonでこの島を削除をするから気にしないで。一番上の形状を拡大したら東京の形が現れる。
![Screenshot 2018-11-24 at 17.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/282576/eb07a04b-4efc-fbbc-c1ca-e8ed01141da6.png)
次はエクスポートです。右上である「Export」のボタンをクリックして、geojsonのオプションを選んで、そしてもう一度「Export」をクリックする。geojson形式で東京データがダウンロードされる。

###pythonの[geopandas](https://githubja.com/geopandas/geopandas)でデータを整理する
やっとpythonを使い始める。このポストのために「jupyter lab」か「jupyter notebook」を使うことをお勧めする。こんなデータ整理と可視化をする時「jupyter lab」と「jupyter notebook」はとても便利。僕はjupyter labを使う。

はじめに必要なパケージをimportする。この前にこのパケージをpipかcondaでインストールをしなければいけない。

```python
%matplotlib inline #これはjupyterを使うことだけ必要

import geopandas as gpd
import matplotlib.pyplot as plt
import matplotlib
```
次はgeopandasでgeodataframeにgeojson形式データを読み込み：

```python
tokyo = gpd.read_file("あなたのファイル")

#例
tokyo = gpd.read_file("data/tokyo.geojson")
```
データは[geopandas](https://githubja.com/geopandas/geopandas)のgeodataframeに格納されました。geodataframeを使用しているので`.plot`を使って便利にデータを見れる。

```python
tokyo.plot()
```
出力は下：
![Screenshot 2018-11-25 at 17.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/282576/fbd7a976-0ed5-a7b5-d03b-fb90afb8a35a.png)
mapshaper同じように、東京自体は小さくて、島がいっぱいある。ちょっと整理しましょう。

島を削除するように「SITYO_NAME」がない列だけを保持して：

```python
filter = tokyo["SITYO_NAME"] == ""
tokyo_l = tokyo[filter]
```
そして、水だけ含まれているポリゴンを削除する。

```python
#このデータではHCODEが8154の場合、水だけ含まれている。
tokyo_nw = tokyo_l[tokyo_l.HCODE != 8154]
tokyo_nw.plot()
```

![Screenshot 2018-11-25 at 18.58.42.png](https://qiita-image-store.s3.amazonaws.com/0/282576/65d15d32-8c60-b72f-f476-328d5740031a.png)

###地図投影法を変換する
この地図にとって地方面積の関係があるデータが表示されるから面積が正しく示されるのは大切です。だから[ランベルト正積方位図法](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%99%E3%83%AB%E3%83%88%E6%AD%A3%E7%A9%8D%E6%96%B9%E4%BD%8D%E5%9B%B3%E6%B3%95)の投影法に変換を使う。僕はこんな規模のためにランベルト正積方位図法をよく使う。東京の中心に置くランベルト正積方位図法に変換しましょう。

```python
#tokyo_crsのなかで投影法の情報が書いてある。
tokyo_crs = {'proj': 'laea', 'lat_0': '35.6895', 'lon_0': '139.6917', 'elipse': 'WGS84', 'datum': 'WGS84', 'units': 'm', 'no_defs': True}
tokyo_prj = tokyo_nw.to_crs(tokyo_crs)
tokyo_prj.plot()
```

![Screenshot 2018-11-25 at 19.46.20.png](https://qiita-image-store.s3.amazonaws.com/0/282576/d8f20bb9-6c4d-e0c9-78a2-429603950540.png)

形の違いを気が付ける？

###もうちょっとデータを掃除する
東京のgeodataframeをちょっと見てみましょう。

```python
tokyo_prj.head()
```

![Screenshot 2018-11-27 at 21.07.49.png](https://qiita-image-store.s3.amazonaws.com/0/282576/eb0eaa7c-04ff-e728-a6d5-6e47458294c4.png)

propertiesのカラムがいっぱいある。ちょっと狭めましょう。

```python
#このカラム(geojsonのproperties)だけ保持する。
tokyo_f = tokyo_proj[['KEY_CODE', 'CITY_NAME', 'S_NAME', 'GST_NAME', 'AREA', 'JINKO', 'SETAI', 'geometry']]
```

JINKOとAREAを使って、POP_DENSITY(Population Density=人口密度)のカラムを作る。そしてメーテルからキロメーテルを変換する。

```python
#POP_DENSITYを作る。
tokyo_pd = tokyo_f.assign(POP_DENSITY=tokyo_f.JINKO/tokyo_f.AREA)
#メートルからキロメートル。
tokyo_pd['POP_DENSITY'] = (tokyo_pd['POP_DENSITY'] * 1000)

tokyo_pd.head()
```

![Screenshot 2018-11-27 at 21.49.56.png](https://qiita-image-store.s3.amazonaws.com/0/282576/37a84110-792b-905f-99e1-bc25e4eb0965.png)

最後に[matplotlib](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)で地図を作りましょう！

```python
matplotlib.rc('font', family='TakaoPGothic')
f, ax = plt.subplots(figsize=(15, 15), subplot_kw={'aspect': 'equal'})

tokyo_pd.plot(column='POP_DENSITY', scheme='Fisher_Jenks', k=9, cmap="bone", ax=ax, legend=True)

leg = ax.get_legend()
leg.set_bbox_to_anchor([0.2, 0.4])
ax.set_axis_off()
ax.set_title('Population Density of Tokyo', fontsize=20)
```

![Screenshot 2018-11-27 at 22.23.41.png](https://qiita-image-store.s3.amazonaws.com/0/282576/cc99497f-26e0-452b-449e-d7f0290cf3f6.png)

よしゃ！東京の人口密度地図を作りました！僕のmatplotlibの能力が低いからもっといいキャプションをできる読者さんがいたら僕を教えてください！または、何かがわからなかったら聞いてくれね。

###他のちず
したに同じ方法で作られた大阪と名古屋と東京23特別区の地図がアップロードする。

![nagoya-pd.png](https://qiita-image-store.s3.amazonaws.com/0/282576/0be7629a-764c-2fb1-74a7-23d34944290b.png)
![osaka-pd.png](https://qiita-image-store.s3.amazonaws.com/0/282576/91df1fd1-134a-7d75-8ee3-947edc77eb6f.png)
![tokyo-pd.png](https://qiita-image-store.s3.amazonaws.com/0/282576/69ade9ff-c3e4-d485-c778-a91331b513f2.png)