kepler.glで東京の人口を可視化してみた

## はじめに
初めまして。データサイエンティストの伊藤です。株式会社GEOTRA(@GEOTRA)にてGIS（Geographic Information System：地理情報システム）データを用いた分析を行っております。

本記事ではe-Statから取得したメッシュ単位の人口データをPythonで前処理をした後、`kepler.gl`で可視化・分析を行います。

## kepler.glとは
[kepler.gl](https://kepler.gl/)はUber社が開発した地理空間データを可視化するためのWebベースの視覚化ツールです。地理情報を含んだcsvファイルやJsonファイルなどを用意すればノーコードで可視化をすることができます。

## データについて
政府統計ポータルサイトであるe-Statから取得しました。2020年の国勢調査により集計されたデータで、5次メッシュ(250mメッシュ)単位の人口と世帯数が含まれています。今回は東京都の大部分を占める1次メッシュ(5339)に含まれる地域のデータを使用しました。

https://www.e-stat.go.jp/gis/statmap-search?page=1&type=1&toukeiCode=00200521&toukeiYear=2020&aggregateUnit=Q&serveyId=Q002005112020&statsId=T001102

## Pythonでデータの前処理
### 必要なライブラリのインポート

```python
import pandas as pd #2.1.2
from shapely.geometry import Polygon #2.0.3
import jismesh.utils as ju #2.1.0
```

### データの読み込みと前処理
データの文字コードがShift_JISになっていることに注意して、読み込みます。
また、カラム名はデータの定義書に従って分かりやすいように変えています。
```python
df = pd.read_csv('<ダウンロードしたデータのパス>',encoding='shift-jis')
df = df[~df['KEY_CODE'].isna()][['KEY_CODE','T001102001']] \
    .rename(columns={'KEY_CODE':'meshcode','T001102001':'総人口'}).astype('int')
```

### メッシュコードからgeometryを付与
jismesh.utils.to_meshpointはベクトライズされているため、pd.Seriesをそのまま与えることで高速に計算することができます。
```python
def meshcode_to_geometry(meshcode):
    """
    meshcodeの配列が渡された時に、高速でPolygonを取得する関数
    meshcode: Array like
    return : List of Polygon
    """
    lat_sw, lon_sw = ju.to_meshpoint(meshcode, 0, 0) # 南西点の緯度・経度
    lat_ne, lon_ne = ju.to_meshpoint(meshcode, 1, 1) # 北東点の緯度・経度
    
    return [
        Polygon([
            (float(lon_sw[i]), float(lat_sw[i])),
            (float(lon_sw[i]), float(lat_ne[i])),
            (float(lon_ne[i]), float(lat_ne[i])),
            (float(lon_ne[i]), float(lat_sw[i])),
            (float(lon_sw[i]), float(lat_sw[i]))
        ]) for i in range(len(lon_sw))
    ]

df['geometry'] = meshcode_to_geometry(df['meshcode'])
```

### csvファイルとして出力
```python
df.to_csv('メッシュ居住人口.csv',index=False)
```

## kepler.glで可視化
[kepler.gl](https://kepler.gl/)のホームページからGET STARTEDをクリックし、ブラウザ上で今回処理したデータを可視化します。

データを投入し、Layerの設定を調整することで綺麗に可視化することができました。

<br>

![スクリーンショット 2024-11-19 18.27.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782929/a9cd4b54-7fb4-6f72-cc6f-7acedc3e62b1.png)

赤色が濃いほど人口が多いメッシュになります。色分けは1000人ごと等間隔に行いました。メッシュに色がついていないところは居住人口が0人のメッシュになります。
23区内のメッシュの色が濃くなっており、人口が多いことがわかります。一方、23区外になった途端に色は薄くなり人口が少なくなっていることがわかります。
また、皇居周辺の人口が少ないこともわかります。

<br>

![スクリーンショット 2024-11-19 18.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782929/567a1e84-c63e-16c2-8185-568dea1e95e4.png)

さらに、`kepler.gl`ではこのように3Dで可視化することもできます。棒の高さがメッシュの人口を表しています。
武蔵小杉や湾岸エリアなど、タワーマンションが立ち並ぶ地域の人口が跳ね上がっていることがわかります。

## 結論
このように地理空間データを`kepler.gl`で可視化することでデータの全体像を直感的に把握することができます。

## おわりに
最後までお読みくださりありがとうございました。

また、こちらの記事を読んでGEOTRAに興味を持ってくださった方は、是非[Wantedly](https://www.wantedly.com/stories/s/geotra_introduction)から会社紹介記事もご覧ください！GEOTRAは、学生インターンを含め、現在一緒に働く仲間を募集しております。興味をお持ちの方は、Wantedly上の募集ページやストーリー、各種サイトをご確認ください！

企業HP： https://www.geotra.jp/

note： https://note.com/2022geotra/

Wantedly： https://www.wantedly.com/stories/s/geotra_introduction

LinkedIn： https://www.linkedin.com/company/%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEgeotra/

GEOTRAのQiitaでは、引き続き地理空間情報に関する情報を中心に技術系のテクニックを発信していきます。今後も皆さんのお役に立てるコンテンツを配信できればと思っておりますので、皆様のいいね・フォローをお待ちしています！