不動産情報ライブラリAPIを使ってみる！

# はじめに

不動産情報ライブラリをご存知ですか？

[不動産情報ライブラリ](https://www.reinfolib.mlit.go.jp/)

> 不動産情報ライブラリとは、不動産の取引価格、地価公示等の価格情報や防災情報、都市計画情報、周辺施設情報等、不動産に関する情報をご覧になることができる国土交通省のWEBサイトです。
(公式サイトより)
> 

主に不動産に関連する情報を提供しているサイトです。
APIも提供しているので、試し打ちして遊んでいきたいと思います！

APIのアクセスキーはこちらのお問い合わせから申請することで、通常5営業日以内に対応していただけるそうです。
[不動産情報ライブラリ](https://www.reinfolib.mlit.go.jp/api/request/)

:::note warn
2024年4月8日現在、APIキーが５営業日以内に発行できない場合があるそうです。
:::

# 実際に遊んでみる
## 前準備
Postmanを使用してAPIを叩いていきます。
Postmanの使用方法は調べたらいくらでも出てくると思うので、そちらをご確認ください。
[Postman API Platform | Sign Up for Free](https://www.postman.com/)
今回は国土数値情報（将来推計人口500mメッシュ）APIを使っていきます。

前提として不動産情報ライブラリAPIを叩くにはリクエストヘッダの`Ocp-Apim-Subscription-Key`にAPIキーを設定する必要があります。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/0e9aea12-93c9-44ed-9164-c7ccb4489b32.png)


## APIを呼び出す

リクエストパラメータを確認すると、以下の値を設定する必要があるそうです。
| パラメータ | 内容 | 備考 | 必須 |
| --- | --- | --- | --- |
| response_format | 応答形式 | 応答形式（GeoJSON応答／バイナリベクトルタイル応答）を設定。geojson...GeoJSON応答。pbf…バイナリベクトルタイル応答 | ○ |
| z | ズームレベル（縮尺） | XYZ方式における、ズームレベル（縮尺）を指定。11（市）～15（詳細）で指定可能であり、値が大きいほどズームレベルは高くなります（カバーする地理的領域は狭くなります）。 | ○ |
| x | タイル座標のX値 | XYZ方式における、タイル座標のX値を指定 | ○ |
| y | タイル座標のY値 | XYZ方式における、タイル座標のY値を指定 | ○ |


対象の座標は津田沼駅周辺を例にAPIを呼び出してみます。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/3ed00a99-70e5-c65b-7139-2c4b628ed238.png)

xyz方式における地図は大体この辺です。

https://maps.gsi.go.jp/development/tileCoordCheck.html#15/35.6865/140.0223
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/79b44d86-d597-0e16-c625-76354e4ca84a.png)



## レスポンスを確認する

長いので省略しますが、このようなJSON形式で値が返却されます。

``` json
{
    "type": "FeatureCollection",
    "name": "estimated_future_population",
    "crs": {
        "type": "name",
        "properties": {
            "name": "urn:ogc:def:crs:EPSG::6668"
        }
    },
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            140.02073854207993,
                            35.675136541801635
                        ],
                        [
                            140.02073854207993,
                            35.67916732501216
                        ],
                        [
                            140.0250005722046,
                            35.67916732501216
                        ],
                        [
                            140.0250005722046,
                            35.675136541801635
                        ],
                        [
                            140.02073854207993,
                            35.675136541801635
                        ]
                    ]
                ]
            },
            "properties": {
                "_id": "kw3i-Y0Byh1a-fbIoMNa",
                "_index": "bs012_estimated_future_population_202403010914",
                "PT12_2035": 246.9577,
                "PTB_2020": 2263.1274,
                "RTB_2020": 59.429,
                "PT10_2020": 280.0035,
                "PT10_2025": 261.8926,
                "PT12_2030": 263.4825,
                "RTD_2040": 16.7526,
                "PT14_2050": 225.8327,
                "PT9_2035": 225.8016,
                "HITOKU2030": "",
                "PT9_2030": 249.9801,
                "PT7_2025": 230.7086,
                "PTD_2045": 595.3625,
                "RTD_2045": 18.2402,
                "PTD_2040": 565.0514,
                "HITOKU2035": "",
                "PT7_2020": 251.0547,
                "PT12_2025": 272.1242,
                "RTB_2035": 59.1411,
                "HITOKU2050": "",
                "PT10_2030": 266.2361,
                "PTB_2030": 2161.2243,
                "RTB_2030": 59.9942,
                "PT0_2050": 3162.614,
                "PT10_2035": 246.9048,
                "PT12_2020": 187.5249,
                "PT7_2030": 179.9098,
                "RTD_2050": 19.8282,
                "PT14_2045": 221.9929,
                "PT9_2025": 269.7416,
                "PT14_2040": 236.3577,
                "PT9_2020": 264.9401,
                "PTB_2025": 2183.8438,
                "PT7_2035": 154.3629,
                "HITOKU2040": "",
                "PTD_2050": 627.0889,
                "RTB_2025": 58.7518,
                "HITOKU2045": "",
                "PT5_2035": 197.4558,
                "RTB_2045": 56.7777,
                "RTB_2040": 57.8443,
                "PT5_2030": 144.0284,
                "PT10_2040": 222.3502,
                "PT10_2045": 179.5706,
                "PT7_2040": 139.6529,
                "PT14_2030": 168.1201,
                "PT16_2045": 213.5354,
                "PT14_2035": 244.6362,
                "PT7_2045": 186.0778,
                "PT16_2040": 146.05,
                "PTD_2020": 682.0584,
                "PT16_2050": 206.1034,
                "PT5_2025": 154.3572,
                "PT10_2050": 153.7859,
                "PTD_2025": 726.6232,
                "RTB_2050": 55.3206,
                "PT5_2020": 179.1264,
                "PT14_2020": 207.0308,
                "PT17_2020": 239.6487,
                "PT7_2050": 183.1388,
                "PT17_2025": 241.9423,
                "HITOKU2020": "",
                "PTD_2035": 617.7293,
                "HITOKU2025": "",
                "PT14_2025": 176.1508,
                "PT4_2050": 142.0335,
                "PTD_2030": 686.6029,
                "PT2_2030": 136.318,
                "PT3_2040": 134.8559,
                "PT3_2045": 130.5376,
                "PT16_2025": 228.0165,
                "PT4_2045": 147.021,
                "PT16_2020": 279.4735,
                "PT2_2035": 134.0756,
                "PT4_2040": 150.1719,
                "PT15_2025": 193.8149,
                "PT2_2040": 129.8341,
                "PT15_2020": 249.7059,
                "PT3_2050": 123.183,
                "RTA_2050": 11.0867,
                "PT16_2035": 151.6038,
                "PT4_2035": 162.5226,
                "PT2_2045": 122.5437,
                "PT4_2030": 165.7341,
                "PT16_2030": 177.2613,
                "PT2_2050": 115.3024,
                "PT4_2025": 118.4337,
                "RTA_2035": 11.5818,
                "PT15_2030": 165.2257,
                "PT15_2035": 158.2648,
                "PT3_2020": 106.3766,
                "PT8_2050": 186.5253,
                "RTA_2040": 11.5535,
                "PT3_2025": 150.5471,
                "RTA_2045": 11.3558,
                "PT4_2020": 124.5409,
                "PT9_2050": 140.022,
                "PT15_2040": 230.7763,
                "PT3_2030": 148.2213,
                "RTA_2025": 11.7467,
                "PTE_2050": 420.9855,
                "PT15_2045": 222.7707,
                "PT3_2035": 137.2268,
                "RTA_2030": 11.6927,
                "PT9_2045": 155.4023,
                "PT9_2040": 181.3867,
                "PT8_2035": 181.4911,
                "PTE_2040": 419.0013,
                "PT13_2040": 233.9592,
                "PTN_2025": 3717.0671,
                "PTN_2020": 3808.1198,
                "PTE_2045": 381.8271,
                "RTE_2045": 11.6981,
                "PT13_2045": 237.5329,
                "PT6_2020": 236.8321,
                "PT15_2050": 209.4861,
                "RTE_2040": 12.4225,
                "PTC_2030": 1019.9487,
                "RTC_2030": 28.3131,
                "RTC_2035": 29.2771,
                "PT8_2030": 227.8778,
                "PT6_2025": 175.0585,
                "PT11_2030": 255.9737,
                "PTC_2025": 1096.589,
                "RTA_2020": 10.6666,
                "PTA_2020": 406.1974,
                "MESH_ID": 534040112,
                "PT11_2035": 259.91,
                "PTN_2035": 3486.1075,
                "RTE_2035": 13.3709,
                "PT8_2045": 140.1287,
                "PTE_2030": 509.3416,
                "PT13_2030": 257.9033,
                "PTE_2035": 466.1255,
                "PTN_2030": 3602.3889,
                "SHICODE": 12216, // 注目！
                "PT13_2035": 249.401,
                "PTC_2040": 1032.1853,
                "RTC_2040": 30.6022,
                "RTE_2030": 14.139,
                "PT8_2040": 155.536,
                "PTC_2045": 1040.1261,
                "RTC_2045": 31.8665,
                "PTC_2035": 1020.6303,
                "PT11_2040": 241.1783,
                // 省略
                
```

APIレスポンスを確認すると`SHICODE`というカラムがあります。こちらはドキュメントを見ると`行政区域コード`として設定されており、返却された行政地区コードが正しいものか確認してみます。

実際に確認すると津田沼駅は千葉県習志野市なので正しく設定されていますね！
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/8461702e-58d0-ed8f-4aff-73f9871e6268.png)


## 取得したデータをこねてみる

レスポンスで取得したデータをグラフを作成してみます。

APIのレスポンスボディを見ると、PTAやPTBとなっているものは老年人口や生産年齢人口で分けた値に見えますので、PTn(nは数値)_20XXとなっているデータを加工していきます。

データの整形は力技(おまけで乗せておきます)で行い、Pythonで可視化していきます。

```python
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
import numpy as np

# CSVファイルの読み込み
df = pd.read_csv('data.csv')

# 年齢グループと年でデータを整理
age_groups = df['age'].unique()
years = df['year'].unique()

# 年ごとに色を割り当てるための準備
colors = plt.cm.viridis(np.linspace(0, 1, len(years)))

# グラフの描画、ここで figsize の横幅を20に変更
fig, ax1 = plt.subplots(figsize=(20, 8))

for year, color in zip(years, colors):
    # 年ごとにデータをフィルタリング
    subset = df[df['year'] == year]
    # x軸に年齢グループ、y軸に人数、年ごとに色分けしてプロット
    ax1.plot(subset['age'], subset['people'], label=year, color=color, marker='o', linestyle='-')

# x軸（年齢）の設定
ax1.set_xlabel('Age Group', fontsize=14)
ax1.set_xticks(np.arange(len(age_groups)))
ax1.set_xticklabels(age_groups, rotation=45, ha='right')

# 左側のy軸（人数）の設定
ax1.set_ylabel('People (thousands)', fontsize=14)
ax1.tick_params(axis='y')

# 凡例の設定
ax1.legend(title='Year', bbox_to_anchor=(1.15, 1), loc='upper left')

# タイトルの設定
plt.title('Estimated future population around Tsudanuma Station', fontsize=14)

# グリッドを追加
ax1.grid(True, which='both', linestyle='--', linewidth=0.5)

plt.tight_layout()
plt.show()
```

## 結果
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3351724/53d6c702-1137-3eff-b33a-ddbbd13932ae.png)

グラフを見ると分かる通り、どの年代も緩やかに減少していく予想が出ています。
本当はもう少しこねてみたいですが、試し打ちだったのでこれで〆ます。

# まとめ

ドキュメントを見ると様々な情報があり、次はこのあたりのAPIで実際にアプリとか作ってみたいですね。

- 都道府県内市区町村一覧取得API
- 地価公示・地価調査のポイント（点）API
- 国土数値情報（医療機関）API
- 国土数値情報（災害危険区域）API
- 国土数値情報（自然公園地域）API

# おまけ

<details><summary>CSVファイル</summary>

``` csv
age,people,year
0~4,150.1539,2020
0~4,138.8424,2025
0~4,136.6767,2030
0~4,132.4527,2035
0~4,125.0002,2040
0~4,117.5724,2045
0~4,112.1448,2050
5~9,149.6669,2020
5~9,147.2448,2025
5~9,136.318,2030
5~9,134.0756,2035
5~9,129.8341,2040
5~9,122.5437,2045
5~9,115.3024,2050
10~14,106.3766,2020
10~14,150.5471,2025
10~14,148.2213,2030
10~14,137.2268,2035
10~14,134.8559,2040
10~14,130.5376,2045
10~14,123.183,2050
15~19,124.5409,2020
15~19,118.4337,2025
15~19,165.7341,2030
15~19,162.5226,2035
15~19,150.1719,2040
15~19,147.021,2045
15~19,142.0335,2050
20~24,179.1264,2020
20~24,154.3572,2025
20~24,144.0284,2030
20~24,197.4558,2035
20~24,192.4883,2040
20~24,177.0114,2045
20~24,172.3481,2050
25~29,236.8321,2020
25~29,175.0585,2025
25~29,150.0984,2030
25~29,136.9146,2035
25~29,183.6908,2040
25~29,180.9129,2045
25~29,166.1591,2050
30~34,251.0547,2020
30~34,230.7086,2025
30~34,179.9098,2030
30~34,154.3629,2035
30~34,139.6529,2040
30~34,186.0778,2045
30~34,183.1388,2050
35~39,270.6914,2020
35~39,250.7256,2025
35~39,227.8778,2030
35~39,181.4911,2035
35~39,155.536,2040
35~39,140.1287,2045
35~39,186.5253,2050
40~44,264.9401,2020
40~44,269.7416,2025
40~44,249.9801,2030
40~44,225.8016,2035
40~44,181.3867,2040
40~44,155.4023,2045
40~44,140.022,2050
45~49,280.0035,2020
45~49,261.8926,2025
45~49,266.2361,2030
45~49,246.9048,2035
45~49,222.3502,2040
45~49,179.5706,2045
45~49,153.7859,2050
50~54,281.9612,2020
50~54,273.3153,2025
50~54,255.9737,2030
50~54,259.91,2035
50~54,241.1783,2040
50~54,216.8103,2045
50~54,175.1966,2050
55~59,187.5249,2020
55~59,272.1242,2025
55~59,263.4825,2030
55~59,246.9577,2035
55~59,250.6262,2040
55~59,232.7647,2045
55~59,209.4154,2050
60~64,186.4522,2020
60~64,177.4864,2025
60~64,257.9033,2030
60~64,249.401,2035
60~64,233.9592,2040
60~64,237.5329,2045
60~64,220.9514,2050
65~69,207.0308,2020
65~69,176.1508,2025
65~69,168.1201,2030
65~69,244.6362,2035
65~69,236.3577,2040
65~69,221.9929,2045
65~69,225.8327,2050
70~74,249.7059,2020
70~74,193.8149,2025
70~74,165.2257,2030
70~74,158.2648,2035
70~74,230.7763,2040
70~74,222.7707,2045
70~74,209.4861,2050
75~79,279.4735,2020
75~79,228.0165,2025
75~79,177.2613,2030
75~79,151.6038,2035
75~79,146.05,2040
75~79,213.5354,2045
75~79,206.1034,2050
80~84,239.6487,2020
80~84,241.9423,2025
80~84,199.0611,2030
80~84,155.5477,2035
80~84,133.6745,2040
80~84,129.4142,2045
80~84,190.396,2050
85~89,123.2447,2020
85~89,175.9141,2025
85~89,182.0771,2030
85~89,151.6133,2035
85~89,119.9611,2040
85~89,103.5409,2045
85~89,101.2725,2050
90～,39.6915,2020
90～,80.7503,2025
90～,128.2034,2030
90～,158.9646,2035
90～,165.3657,2040
90～,148.8721,2045
90～,129.317,2050
```
</details>