政府統計の総合窓口「e-Stat」のAPIを使って市区町村の境界データと目的の統計データをマージするツールを公開！

# はじめに

みなさま。今、世界で一番熱いWebアプリケーションをご存知でしょうか？

そう。

e-Statです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/a28cbb09-4073-8303-92d3-99fa5dbd4554.png)

政府の統計情報が分野・データ作成組織ごとに取りまとめられており、データの検索も可能。
さらにはグラフ・表など様々な形式で閲覧することのできるポータルサイトです。

APIも用意され、サイトデザインも可愛いくてモダンーな感じに仕上がっていますね。

また、統計データを地図上で可視化する統計GISという機能も用意されているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/06e65059-89ec-4c41-9f69-b440e7217a71.png)

こちらは国勢調査・人口動態統計・医療施設調査など、特定の統計データを選択して地図上で可視化できる機能のようです。

ステキ！

こういうアプリケーションを見るとGIS屋としては当然いてもたってもいられず

「僕もこんなの作りたい！！！！！」

と思うわけです。

が、この「e-Stat」。素人が安易に手を出すと深い沼に落ちていくポイントがいくつもあったのでした…

## 目次

- [はじめに](#はじめに)
- [沼ポイント](#沼ポイント)
- [e-stat-api-tools](#e-stat-api-tools)
- [市区町村の境界データと目的の統計データをマージしてみる](#市区町村の境界データと目的の統計データをマージしてみる)
- [おわりに](#おわりに)

## 沼ポイント

### ポイント①：データ多すぎ問題

e-Statには多岐にわたるデータが登録されています。

まず、「国土・気象」や「人口・世帯」など統計分野として17種類。
[分野から探す](https://www.e-stat.go.jp/statistics-by-theme/)

組織として「内閣官房」・「経済産業省」など所管の政府統計が14省庁ほどあります。
[組織から探す](https://www.e-stat.go.jp/statistics-by-organization/)

合計約150万件（！）のデータの中から自分に必要なデータを検索してくる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/7f0b8dc4-294b-995c-b875-7ea130c4edaf.png)


さらにデータの形式は各分野・省庁バラバラでのため、目的の統計データを取得できたとしても有効に活用できるかは見てからのお楽しみ…という状態です。

### ポイント②：API結構複雑だよ問題

僕はGIS分野のWebアプリケーションの作成を専門としているので、Webで利用できるAPIが用意されていたのは大歓迎だったのですが、[政府統計の総合窓口（e-Stat）のAPI 仕様 3.0版](https://www.e-stat.go.jp/api/api-info/e-stat-manual3-0)を見ているとどうやらAPIは以下の7つも用意されているようです。

- 統計表情報取得
- メタ情報取得
- 統計データ取得
- データセット登録
- データセット参照
- データカタログ情報取得
- 統計データ一括取得

「仕様をよく読め」の一言で済む話かもしれませんが、とりあえず手軽に統計データを取得しようと思っても、目的のAPIがどれをなのかを調べる段階からのスタートになり、ちょっと辛いです。（データが多すぎなので仕方ない）

### ポイント③：〇〇コード多すぎ問題

各種データは先ほど紹介した「統計分野」以外にもいくつかのコードで管理されています。

特に取りまとめられたページは確認できなかったのですが、APIの仕様などなどを見ていると統計分野含め少なくとも4つほどの〇〇コード・IDが出てきました。

- 統計分野の小分類コード
- 政府統計コード
- 統計表ID
- 標準地域コード

結論から言うと、上記のコードと先ほど紹介したAPIのうち3種類を組み合わせて利用することで目的の統計データを入手することができるのですが、これらフレーズの意味を理解するだけでも、もしかしたら数時間〜数日かかってしまうのではないでしょうか？（僕はかかった）

一応、[開発ガイド](https://www.e-stat.go.jp/api/api-dev/dev_guide)は用意されていて、目的の統計データを取得するためのフローまで丁寧に記載されていますが、具体的に「どんな統計データを入手」できるのかがわからない上、添付画像が小さすぎて文字を読み取ることができず結局色々なページを探索して情報を集めることになります。

辛い。

### ポイント④：意外とGISで使えるデータないよ問題

e-Statを利用するユーザーはおそらく統計データを元に様々な分析を行いたい！という方だと思います。

その中でもGISを利用した分析を行いたい方は多いのではないかなーと思うのですが、実際はGISで利用できるデータはそこまで多くありませんでした。

データを検索するページをよくみると、「データベース」として管理されているデータは263件/911件に対し、その他謎のファイルとして管理されているのが648件/911件になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/ea6a5edb-3300-ec68-947d-248f1d8eae20.png)

しかも高確率でPDF。

自作のアプリケーションから手軽に利用できるようなデータではないでしょう。

ちなみに[Q1 : API機能で利用できるデータを知りたい。](https://www.e-stat.go.jp/api/api-dev/faq#q_4_1)の「提供データ」のリンク先を覗くと以下のようなページに飛ばされるので、APIとして利用できるのは150万件のうち約18万件のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/846d920e-df87-8960-e3a5-22548fd1ccb5.png)

### その他ちょこちょこしたつらみ

#### json出力かcsv出力かでURL変わんねん

- JSON出力：`…/getStatsData?<パラメータ群>`
- CSV出力：`…/getSimpleStatsData?<パラメータ群>`

(なんでやねん…)

#### csvで吐き出してんのに変な出力すな

```
"RESULT"
"STATUS","0"
"ERROR_MSG","正常に終了しました。"
"DATE","2020-12-18T15:58:49.161+09:00"
"TABLE_INF","0000010101"
"STAT_NAME","00200502","社会・人口統計体系"
"GOV_ORG","00200","総務省"
"STATISTICS_NAME","都道府県データ 基礎データ"
"TITLE","0000010101","Ａ　人口・世帯"
"CYCLE","年度次"
"SURVEY_DATE","0"
"OPEN_DATE","2020-03-06"
"SMALL_AREA","0"
"COLLECT_AREA","全国"
"MAIN_CATEGORY","99","その他"
"SUB_CATEGORY","99","その他"
"OVERALL_TOTAL_NUMBER","486096"
"UPDATED_DATE","2020-03-06"
"STATISTICS_NAME_SPEC","都道府県データ","基礎データ","","","",""
"TITLE_SPEC","","Ａ　人口・世帯","","",""
"CLASS_INF"
"CLASS_OBJ_ID","CLASS_OBJ_NAME","CLASS_CODE","CLASS_NAME","CLASS_LEVEL","CLASS_UNIT","CLASS_PARENT_CODE","CLASS_ADD_INF"
```

（いつ目的のcsv出てくんねん…）

あと、旧バージョンのAPIがいくつも残っていたりして情報を追うのが大変だったりとか色々…

## e-stat-api-tools

と、いうことで色々とデータやAPIを舐め回してみましたが非常に便利ながらもちょこちょことしたハマりポイントを抱えるe-Stat。

僕と同じように「ちょっと敷居が高いな…」と思っている方も多いのではないでしょうか？

そんな迷える僕たちのために[MIERUNE](https://mierune.co.jp/)が利用可能データ一覧の整備・主要APIのラッパーの作成を行った上で、市区町村境界ポリゴンと目的の統計データをマージしてGeoJSONで出力できるCLIツールを作成しました！

[e_stat_api_tools](https://github.com/MIERUNE/e_stat_api_tools)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/db35a845-883d-4036-54f3-a5bd9948d94a.png)

### データ整備

#### 政府統計コード

結論として目的の統計データを取得するには

- `統計データ取得API`に`統計表ID`と`メタ情報（詳細項目情報）`を入力する

必要があるわけなんですが、ここまでたどり着くためには`統計表ID`と`メタ情報`を別APIから取得してこなければなりません。

e-StatのAPIでは、[開発ガイド](https://www.e-stat.go.jp/api/api-dev/dev_guide)に記載の通り

- `統計表情報取得API`で`政府統計コード`や`調査年月`などを入力して目的の統計表の`統計表ID`を取得
- `メタデータ情報取得API`に、取得した`統計表ID`を入力して、目的の統計表に係る`メタ情報（詳細項目情報）`を取得
- `統計データ取得API`に`統計表ID`と`メタ情報（詳細項目情報）`を入力して目的の統計データを取得

の流れで3つのAPIを叩いて目的の統計データを取得します。

（各種APIについては公式の[API機能テストフォーム バージョン3.0](https://www.e-stat.go.jp/api/sample/testform3-0/)で試せるのでどんなインプットでどんなレスポンスが返ってくるか眺めてみると理解が進むかなと思います。）

が、ファーストステップである`政府統計コード`が[政府統計コード一覧](https://www.e-stat.go.jp/help/stat-search-3-5)から参照できますが、PDFになっています。

なのでまず初めにこのデータを機械判読できるようにtsvに変換しました。

リポジトリに格納してあるのでご自由にご利用ください。
[government_statistics_codes.tsv](https://github.com/MIERUNE/e_stat_api_tools/blob/master/e_stat/assets/government_statistics_codes.tsv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/747f6e98-d260-e901-7cbb-8cf93e0ed0ed.png)

#### 統計表ID

前述の政府統計コードを利用して統計表IDを取得しますが、e-Statのデータを眺めてみたり業界の動向を伺ってみたりしていると、GISで利用したくなる主要な統計データって[社会・人口統計体系](https://www.e-stat.go.jp/stat-search/database?page=1&layout=datalist&toukei=00200502&tstat=000001111375&cycle=8&tclass1=000001111377&result_page=1&tclass2val=0)なのではないかな？と（勝手に）思いました。

なのでスムーズに社会・人口統計体系を利用できるように統計表ID一覧をリポジトリに格納しておきました。
[default_stats_table_ids.csv](https://github.com/MIERUNE/e_stat_api_tools/blob/master/e_stat/assets/default_stats_table_ids.csv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/9865d5f3-7eec-d62e-b0cd-420f59e90be9.png)

#### 標準地域コード

標準地域コードとは「都道府県及び市町村の区域」を示すコードになります。
[統計に用いる標準地域コード](https://www.soumu.go.jp/toukei_toukatsu/index/seido/9-5.htm)

統計データ取得というよりは後述の境界データ取得に関わる部分になりますが、こちらもリポジトリに入れてあります。

2020/12現在のデータですので、市区町村の統合などありましたら[市区町村を探す](https://www.e-stat.go.jp/municipalities/cities/areacode)からダウンロードして更新してください。

[standard_area_codes.csv](https://github.com/MIERUNE/e_stat_api_tools/blob/master/e_stat/assets/standard_area_codes.csv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/b676c3bd-58b6-642e-2d8b-02c41b8cf655.png)

### Pythonラッパー

以下の主要APIについては[e-statパッケージ](https://github.com/MIERUNE/e_stat_api_tools/tree/master/e_stat)でラッピングしているのでPythonから呼び出し可能になっておりますが、現段階ではまだ整備が完璧ではなくPyPIに登録されていないため、説明は省略します。
(いづれ対応します)

- 統計表情報取得API
- メタデータ情報取得API
- 統計データ取得API

### CLIツール

前述のパッケージを利用してコマンドラインから以下の5つについて操作可能なツールを作成しました。

- ids：統計表ID一覧を取得
- meta：統計表メタデータを取得
- stats：統計データを取得
- boundary：境界データを取得
- merge-boundary：統計データと境界データを取得してマージする

各種コマンドの細かい利用方法は[README.md](https://github.com/MIERUNE/e_stat_api_tools)に詳しく記載しておりますのでご覧ください。

## 市区町村の境界データと目的の統計データをマージしてみる

ということでこのツールを利用して境界データと統計データをマージしてみましょう！

まずは[e_stat_api_tools](https://github.com/MIERUNE/e_stat_api_tools)をCloneし、`e_stat_api_sample`ディレクトリに移動しましょう。

```
% cd .../e_stat_api_sample
% pwd
.../e_stat_api_sample
```

その後、`pipenv install`コマンドで必要なパッケージをインストールしていきます。

pipenvがインストールされていない方は

```
% brew install pipenv
```

又は

```
% pip install -U pip
% pip install pipenv
```

でインストールしてください。

本ツールではe-statのアプリケーションIDが必要になりますので[利用ガイド](https://www.e-stat.go.jp/api/api-info/api-guide)に従いユーザー登録を済ませアプリケーションIDして、以下のコマンドを実行し`.env`ファイルを作成してください。

※`<YOUR_APP_ID>`には取得したアプリケーションIDを入力してください。

```
% touch /e_stat_api_sample/e_stat/.env
% echo "app_id=<YOUR_APP_ID>" >> /e_stat_api_sample/e_stat/.env
```

アプリケーションIDを格納した`.env`ファイルを作成したら`merge-boundary`コマンドで以下の項目をインプットして実行します。

```
  -p, --pref_name TEXT        取得するshpファイルの都道府県名を入力  [required]
  -d, --download_dir TEXT     ダウンロードするshpファイルを格納するディレクトリのパス文字列を入力  [required]
  -a, --area TEXT             取得する統計データの標準地域コードを入力  [required]
  -c, --class_code TEXT       取得する統計データの項目を入力  [required]
  -y, --year TEXT             取得する統計データの年度を入力  [required]
  -st, --stats_table_id TEXT  取得したい統計データの統計表IDを入力  [required]
  -o, --output_dir TEXT       ダウンロードしたcsvを格納するディレクトリのパス文字列を入力  [required]
```

具体的には以下のようなコマンドになります。

```
% pipenv run python -m e_stat merge-boundary \
  -p 北海道 \
  -d ./download_file \
  -a 01101 \
  -c A1101 \
  -y 2000 \
  -st 0000020101 \
  -o ./created
```

`merge-boundary`に限らずその5種類の各種コマンドはサンプルとしてshell scriptを用意していますので動作確認には以下のコマンドを利用できます。

```
% bash merge_boundary.sh
```

試しに`bash merge_boundary.sh`を実行すると以下のようなログが流れたのち、`created`ディレクトリに`merge_boundary.geojson`が生成されているはずです。

```
% bash merge_boundary.sh
0.00B [00:00, ?B/s]url='https://www.e-stat.go.jp/gis/statmap-search/data?dlserveyId=A002005212015&code=01&coordSys=1&format=shape&downloadType=5', res.status_code=200
A002005212015DDSWC01.zipのダウンロードを開始します
15.8MB [00:05, 2.75MB/s]
読み込みファイル： .../e_stat_api_tools/download_file/A002005212015DDSWC01.zip
.zipファイル内のshpファイルをgdfに変換します

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  super(GeoDataFrame, self).__setitem__(key, value)
gdfを指定キー(AREA_CODE)で結合します。
gdfをgeojsonに変換します。
.../e_stat_api_tools/created/boundary.geojsonを書き出しました。
.../e_stat_api_tools/created/boundary.csvを書き出しました。
統計表を取得します。URL=http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?appId=9a10491cd87e8877b5410283228bb64b7805ff79&cdArea=01101&cdCat01=A1101&cdTime=2000100000&statsDataId=0000020101&lang=J&metaGetFlg=N&c&explanationGetFlg=N&annotationGetFlg=N&sectionHeaderFlg=2
gdfをgeojsonに変換します。
.../e_stat_api_tools/created/merge_boundary.geojsonを書き出しました。
.../e_stat_api_tools/created/merge_boundary.csvを書き出しました。
```

作成された`merge_boundary.geojson`をQGISで開いてみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203944/d63d83f7-f3f6-80b8-1d39-2125866c16f4.png)

`01101`つまり札幌市中央区の境界データに以下の統計データがマージされていることが確認できると思います。

- A1101(Ａ　人口・世帯 総人口)
- 2000（2000年）
- 0000020101（社会・人口統計体系 市区町村データ)

## おわりに

簡単にe-Statの境界データと統計データをマージできるツールを作成・紹介していきましたが、いかがでしたでしょうか？

オープンソース（MITライセンス）のツールとなっておりますので、機能の追加・改善など随時行っていきますが、不具合や要望などありましたらIssueにいただけますと幸いです。

弊社は様々なデータの可視化・分析、ツールの作成やWebGISの作成なども得意としており、これまで多くのお客様の多様なニーズに沿った機能を受注・開発してきております。もしご興味がございましたら、[弊社ウェブサイト](https://mierune.co.jp/)よりご気軽にお問い合わせくださいませ。

また地図配信サービスMapTilerを日本向けに展開しております。他社に比べ圧倒的に高いコストパフォーマンスでベクタータイル含む高品質な地図データを利用する事が出来ます。詳細は[MapTiler.jp](https://maptiler.jp/)からどうぞ！