地理データの可視化
Contents
地理データの可視化#
本節では緯度・経度の情報をもつ、地理データを可視化する手法を学びます。
国土交通省のGISホームページから、滋賀県の地価公示データを取得します。
https://nlftp.mlit.go.jp/ksj/old/datalist/old_KsjTmplt-L01.html
!wget https://nlftp.mlit.go.jp/ksj/old/data/L01/L01-2022P/L01-2022P-25-01.0a.zip
!unzip -o L01-2022P-25-01.0a.zip
--2022-11-19 05:51:51-- https://nlftp.mlit.go.jp/ksj/old/data/L01/L01-2022P/L01-2022P-25-01.0a.zip
Resolving nlftp.mlit.go.jp (nlftp.mlit.go.jp)... 192.29.39.162, 192.29.39.48, 192.29.41.65
Connecting to nlftp.mlit.go.jp (nlftp.mlit.go.jp)|192.29.39.162|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 55443 (54K) [application/zip]
Saving to: ‘L01-2022P-25-01.0a.zip’
L01-2022P-25-01.0a. 100%[===================>] 54.14K --.-KB/s in 0.005s
2022-11-19 05:51:51 (11.7 MB/s) - ‘L01-2022P-25-01.0a.zip’ saved [55443/55443]
Archive: L01-2022P-25-01.0a.zip
creating: L01-2022P-25-01.0a/
inflating: L01-2022P-25-01.0a/KS-META-L01-2022P-2K_25.xml
inflating: L01-2022P-25-01.0a/L01-2022P-25-01.0a.html
inflating: L01-2022P-25-01.0a/L01-2022P-2K_25.csv
from io import StringIO
import json
import pandas as pd
import plotly.express as px
shiga_land_price = pd.read_csv("./L01-2022P-25-01.0a/L01-2022P-2K_25.csv", encoding="cp932")
shiga_land_price.loc[:, ["経度", "緯度"]] = shiga_land_price.loc[:, ["経度", "緯度"]] / 3600
shiga_land_price.head()
経度 | 緯度 | 所在地コード | 用途 | 連番 | 年次 | 前年所在地コード | 前年用途 | 前年連番 | 市区町村名 | ... | 属性移動H25 | 属性移動H26 | 属性移動H27 | 属性移動H28 | 属性移動H29 | 属性移動H30 | 属性移動H31 | 属性移動R2 | 属性移動R3 | 属性移動R4 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 135.911983 | 35.108868 | 25201 | 0 | 1 | 2022 | 25201 | 0 | 1 | 大津 | ... | 40000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 |
1 | 135.915560 | 35.122949 | 25201 | 0 | 2 | 2022 | 25201 | 0 | 2 | 大津 | ... | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 |
2 | 135.900566 | 35.097219 | 25201 | 0 | 3 | 2022 | 25201 | 0 | 3 | 大津 | ... | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 |
3 | 135.876694 | 35.074805 | 25201 | 0 | 4 | 2022 | 25201 | 0 | 4 | 大津 | ... | 10000000000000 | 10100000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 |
4 | 135.972987 | 35.251884 | 25201 | 0 | 5 | 2022 | 25201 | 0 | 5 | 大津 | ... | 20000000000000 | 20000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 | 10000000000000 |
5 rows × 126 columns
散布図#
Plotly Expressの scatter_mapbox
関数を利用して、地図上に散布図を描画します。
data_frame(第1引数): 描画対象のDataFrame
lat: 緯度が格納されている列名
lon: 経度が格納されている列名
size: 要素の大きさをとなる列名
color: 要素の色となる列名
hover_name: ホバーツールのタイトルとなる列名
hover_data: ホバーツールに表示するデータとなる列名
height: 描画領域の高さ
center: 中心となる位置を辞書で指定(lat: 緯度, lon: 経度)
zoom: 縮尺
scatter_mapbox
関数はmapboxというサービスのAPIを利用しています。デフォルトを含め、いくつかのスタイルはmapboxのアクセストークンを渡す必要がありますが、トークンを必要としないスタイル( layout.mapbox.style
)もあります。
layout.mapbox.style
https://plotly.com/python/mapbox-layers/
mapboxアカウントは無料で作成でき、アカウント画面からアクセストークンが生成できます。
https://account.mapbox.com
px.scatter_mapbox(
shiga_land_price,
lat="緯度",
lon="経度",
size="R4価格",
color="用途区分",
hover_name="市区町村名",
hover_data=["所在並びに地番"],
center={"lat": 35.09, "lon": 136.18},
opacity=0.5,
width=800,
height=800,
mapbox_style="carto-positron",
).show()