パッケージ:sf
,tidyverse
,igraph
,modelsummary
,scales
,viridis
library(sf)
library(tidyverse)
#都市圏作成のため
library(igraph)
#表の作成
library(modelsummary)
#目盛りの指数表記
library(scales)
#地図の色分け
library(viridis)
Japan
と入力し,Enterキー > Japan:
Population Density for 400m H3 Hexagons
gpkg
)形式の地理空間データ.read_sf()
でsfオブジェクトとして読み込める.st_transform()
:EPSG:6668
(JGD2011)に投影するため.hexagons <-
read_sf("kontur_population_JP_20231101.gpkg") %>%
st_transform("EPSG:6668")
#最初の6行
hexagons %>%
head()
h3 | population | geom |
---|---|---|
884ec9aeb3fffff | 1 | POLYGON ((142.1747 26.61367… |
884ec9acddfffff | 73 | POLYGON ((142.1776 26.62691… |
884ec9acd9fffff | 1 | POLYGON ((142.1715 26.62109… |
884ec9acd7fffff | 65 | POLYGON ((142.1651 26.63593… |
884ec9acd5fffff | 8 | POLYGON ((142.1744 26.63433… |
884ec9acd3fffff | 11 | POLYGON ((142.1591 26.63011… |
h3
:ポリゴンとして表現されるH3セルのインデックス(H3Indexとよばれる).population
:各H3セルに含まれる人口.森 | 本ウェブサイト | |
---|---|---|
資料 | 国勢調査地域メッシュ統計 | Kontur Population dataset |
年 | 2020年 | 2023年 |
セル | 1㎢メッシュ | 0.74㎢H3 |
人口密度 | 1000人/㎢以上 | 740人/0.74㎢以上 |
総人口 | 10000人以上 | 7400人以上 |
都市 | 連続するメッシュの結節地域 | 連続するセルの結節地域 |
都市数 | 431都市 | 337都市 |
[1]
H3セル内の人口(population
)が740
人以上を抽出.
hexagons_r
とする.[2] 隣接するH3セルリストを作成する.
st_intersects()
:st_intersects(x, y)
で2つのsfオブジェクト(x
とy
)間の空間的に交差する(各H3セルがどのH3セルと隣接するかの)リスト(以下,隣接リストとよぶ)を取得.
neighbors
とする.[3] 連続するセルの結節地域をする.
igraph
を利用.
graph_from_adj_list()
:隣接リストからネットワーク(igraph
のグラフオブジェクト)を作成.mode="all"
:無向グラフ(ノードを結ぶエッジに矢印を用いていない)を指示.向きが関係なく,繋がっていることだけが重要なため,無向グラフを使用.region
に格納.[5]都市IDを作成する.
components()
:igraph
の関数.各ノードがどの結節地域(membership
という情報として付与)に属するかを見つけ出す.
これにより,次の作業で,membership
情報を使ってH3セルがどの結節地域に属しているかどうかを確認できる.
オブジェクトhexagons_r
の各H3セルに都市ID(city_id
)を割当.
pluck()
:purrr
パッケージの関数(ただし,tidyverse
パッケージに含まれる).リストの特定の要素の取得.
region_components
オブジェクトからmembership
の要素を抽出.pluck()
を使わずcity_id=components$membership
でも同じ結果が返る.[6]都市を作成する.
city_id
)毎に総人口(total_pop
)を計算.
hexagons_c
オブジェクトに格納.7400人
以上.総人口7400人以上の都市の抽出.city
とする.#各結節地域の総人口を計算
hexagons_c <- hexagons_r %>%
group_by(city_id) %>%
summarise(total_pop=sum(population))
#都市を満たす結節地域
city <- hexagons_c %>%
filter(total_pop >= 7400)
[7]記述統計を見る.
#記述統計
datasummary(Heading("総人口(人)")*total_pop~
Heading("平均")*Mean+
Heading("標準偏差")*SD+
Heading("最小値")*Min+
Heading("最大値")*Max+
Heading("都市数")*N,
data=city,
title="記述統計量")
平均 | 標準偏差 | 最小値 | 最大値 | 都市数 | |
---|---|---|---|---|---|
総人口(人) | 252554.18 | 2033473.31 | 7440.00 | 33395974.00 | 337 |
[8]都市人口分布を可視する.
hexagons_g
とし,H3セルをグレー(gray
)で表現.viridis
カラーのmako(option="G"
)色を利用.
viridis(4, option="G")[#]
:mako色を4
色使い,そのうちの#
つ目の要素を選択.labels=label_log()
(scale
パッケージの関数)により目盛りの指数表記が維持.#人口密度74人以上のH3セルを抽出
hexagons_g <- hexagons %>%
filter(population >= 74)
#都市の色分け
my_colors <- c(viridis(4, option="G")[4],
viridis(4, option="G")[3],
viridis(4, option="G")[2])
#総人口の目盛りを指数表記
my_breaks <- c(10^2, 10^3, 10^4, 10^5, 10^6, 10^7)
trans="log"
により,総人口を自然対数に変換.可視化
kontur_population_JP_20231101.gpkg
に含まれる範囲で都市を作成.
ggplot() +
geom_sf(data=hexagons_g,
fill="gray", color="gray")+
geom_sf(data=city,
aes(fill=total_pop, color=total_pop))+
scale_fill_gradientn(trans="log",
colors=my_colors,
breaks=my_breaks,
label=label_log())+
scale_color_gradientn(trans="log",
colors=my_colors,
breaks=my_breaks,
label=label_log())+
labs(fill="総人口", color="総人口",
caption="出典:Kontur Population")+
ggtitle("都市人口分布(2023年)")+
coord_sf(xlim = c(125, 145), ylim = c(30, 45))+
theme_void()
hexagons_r
)から総人口の条件(city
)を満たすオブジェクト(hexagons_d
)を作成.city
のジオメトリはhexagons_r
に合わないため,削除(st_drop_geometry()
).オブジェクトをcity_d
とする.semi_join()
:hexagons_r
からcity_d
の条件を満たす行を両方に含まれるcity_id
を基に取り出す.#ジオメトリの削除
city_d <- city %>%
st_drop_geometry()
hexagons_d <- hexagons_r %>%
semi_join(city_d, by="city_id")
可視化
#人口密度の目盛り
my_breaks2 <- c(1000, 5000, 10000)
#可視化
ggplot()+
geom_sf(data=hexagons_g,
fill="gray", color="gray")+
geom_sf(data=hexagons_d,
aes(fill=population,
color=population))+
scale_fill_gradientn(trans="log",
colors=my_colors,
breaks=my_breaks2)+
scale_color_gradientn(trans="log",
colors=my_colors,
breaks=my_breaks2)+
labs(fill="人口密度", color="人口密度",
caption="出典:Kontur Population")+
ggtitle("都市人口密度分布(2023年)")+
coord_sf(xlim= c(125, 145),
ylim=c(30, 45))+
theme_void()
hexagons_c
から740人以上を抽出.arrange()
:値の並び替え.desc()
で降順(大きい順).row_number()
:行数.降順に並んでいるので,行数が順位.上に位置するほど順位が上位.列名をrank
と指示.#結節地域の総人口740人以上
rank_size <- hexagons_c %>%
filter(total_pop >= 740)
rank_size <- rank_size %>%
arrange(desc(total_pop)) %>%
mutate(rank=row_number())
対数を取った総人口と対数を取った順位の間の関係を散布図と示すことで,ランク・サイズルールが成立しているかどうかを可視できる.
scale_x_continuous()
:横軸の調整.trans=log
で順位の対数を取る.
scale_y_continuous()
:縦軸の調整.trans=log
で総人口の対数を取る.
labels=label_log()
.#順位の目盛り
my_breaks3 <- c(1, 10, 100, 1000)
#可視化
ggplot() +
geom_point(data=rank_size,
aes(x=rank, y=total_pop),
alpha=0.5) +
scale_x_continuous(trans="log",
breaks=my_breaks3) +
scale_y_continuous(trans="log",
breaks=my_breaks,
labels=label_log(),
limits=c(10^2, NA)) +
labs(x="人口順位", y="総人口",
caption="出典:Kontur Population")+
ggtitle("ランク・サイズ分布(2023年)") +
theme_classic()
[1] hexagons_rの中身
hexagons_r
の最初の19行目まで見ると,最初のh3セルは都市1と識別され,次の上から7つのh3セルは都市2と識別され,最後の11つのh3セルは都市3と識別されている.h3 | population | geom | city_id |
---|---|---|---|
884ba90233fffff | 793 | POLYGON ((125.2043 24.84024… | 1 |
884ba900bbfffff | 836 | POLYGON ((125.2859 24.79381… | 2 |
884ba900b9fffff | 956 | POLYGON ((125.277 24.79438,… | 2 |
884ba9009dfffff | 1043 | POLYGON ((125.2794 24.80796… | 2 |
884ba90097fffff | 934 | POLYGON ((125.2915 24.80031… | 2 |
884ba90095fffff | 1036 | POLYGON ((125.2827 24.80089… | 2 |
884ba90091fffff | 889 | POLYGON ((125.2883 24.80739… | 2 |
884ba90083fffff | 849 | POLYGON ((125.2738 24.80146… | 2 |
884ba872c7fffff | 909 | POLYGON ((124.1432 24.34926… | 3 |
884ba872c1fffff | 918 | POLYGON ((124.1399 24.35633… | 3 |
884ba87297fffff | 1020 | POLYGON ((124.1815 24.3401,… | 3 |
884ba87295fffff | 1460 | POLYGON ((124.1727 24.34063… | 3 |
884ba87293fffff | 920 | POLYGON ((124.1871 24.34665… | 3 |
884ba8728dfffff | 929 | POLYGON ((124.1464 24.3422,… | 3 |
884ba8728bfffff | 1039 | POLYGON ((124.1607 24.34822… | 3 |
884ba87289fffff | 1361 | POLYGON ((124.1519 24.34874… | 3 |
884ba87287fffff | 1072 | POLYGON ((124.1584 24.3346,… | 3 |
884ba87283fffff | 1633 | POLYGON ((124.164 24.34115,… | 3 |
884ba87281fffff | 1364 | POLYGON ((124.1552 24.34167… | 3 |
[2] ネットワークの可視化
[3] 総人口と順位
city_id | total_pop | geom | rank |
---|---|---|---|
1 | 793 | POLYGON ((125.2043 24.84024… | 2128 |
2 | 6543 | POLYGON ((125.2883 24.80739… | 374 |
3 | 12625 | POLYGON ((124.1687 24.34316… | 223 |
1都3県(南関東)に焦点をあてる(拡大して見る)ことにより,都市がどのように形成されているのかを確認.
scale="large"
を指示.R
コードも原則同じ.ただし,都市人口分布の都市ポリゴンの色付けはscale_fill_viridis_b()
,scale_color_viridis_b()
を利用.中国
韓国
Rによる地理空間データの可視化
アイコン
Font Awesome 6.7.2
生成AIの使用について
ChatGPTのサービスを利用した後,内容を確認し,必要に応じて編集を行った.
南鳥島周辺(北緯24.3度,東経154度あたり)にはH3セルが5つあるが,ここでは省略している.↩︎