1 目的

  • Kontur提供の六角形(Hexbin)グリッド(セル)を利用して都市(都市圏)人口分布の可視化.
    • 都市圏:都市圏は,日常的な活動の空間的な広 がりに着目して定義される結節地域(金本・徳岡,2002)
  • 都市人口(都市規模)とその順位を利用してランク・サイズルール(順位・規模の法則)が成立しているのかを確認.
    • ランク・サイズルールジップの法則の一例.n番目に出現したある都市圏の人口が,1位の都市圏の人口の1/n倍になるという法則.縦軸に都市圏人口の対数,横軸に順位の対数をとり,散布図を示すと,その組み合わせが右下がり直線上に配置.

パッケージsftidyverseigraphmodelsummaryscalesviridis

library(sf)
library(tidyverse)

#都市圏作成のため
library(igraph)
#表の作成
library(modelsummary)
#目盛りの指数表記
library(scales)
#地図の色分け
library(viridis)
  • 六角形マップによる人口密度の可視化同様に,HDXから提供されているオープンデータの一つであるKontur Populationを利用.
    • 各H3セルに人口データが含まれる.各セルは同じ面積だと見なされているため,人口密度として解釈可能.

2 データのダウンロードと読込

  • HDX Kontur > 検索欄にJapanと入力し,Enterキー > Japan: Population Density for 400m H3 Hexagons 
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セルに含まれる人口.

3 都市人口分布の可視化

3.1 都市の定義 

  • を参考に都市を作成.
    • 上記は1㎢メッシュを利用.H3セルの大きさは平均0.74㎢.
      • 解像度(res):8(Uber Technologies参照).
      • 利用しているセルのサイズ,形状が異なるため,次のように都市の定義を変更.
  本ウェブサイト
資料 国勢調査地域メッシュ統計 Kontur Population dataset
2020年 2023年
セル 1㎢メッシュ 0.74㎢H3
人口密度 1000人/㎢以上 740人/0.74㎢以上
総人口 10000人以上 7400人以上
都市 連続するメッシュの結節地域 連続するセルの結節地域
都市数 431都市 337都市
  • H3セルは六角形のため,接する箇所が多くなり,より大きなまとまりが形成.結果として都市数が少なくなると考えられる.

3.2 結節地域の作成

  • 人口密度0.74㎢あたり740人以上の連続するセルの結節地域を作成した上で,総人口が7400人以上になる都市を作成.

[1] H3セル内の人口(population)が740人以上を抽出.

  • オブジェクトをhexagons_rとする.
#人口密度0.74㎢あたり740人以上のH3セルの抽出
hexagons_r <- hexagons %>% 
  filter(population >= 740)

[2] 隣接するH3セルリストを作成する.

  • st_intersects()st_intersects(x, y)で2つのsfオブジェクト(xy)間の空間的に交差する(各H3セルがどのH3セルと隣接するかの)リスト(以下,隣接リストとよぶ)を取得.
    • オブジェクトをneighborsとする.
#隣接リスト作成
neighbors <- hexagons_r %>% 
  st_intersects(hexagons_r)

[3] 連続するセルの結節地域をする.

  • 上で隣接リストを作成した.
    • 例としてセルAとセルBは隣接(AーB)し,セルBとセルC(B-C)も隣接しているが,セルAとセルCは隣接していないとする.リストでは,セルAとセルBの組み合わせ,セルBとセルCの組み合わせは掲載されているが,セルAとセルCは隣接していないため掲載されていない.
    • しかし,ここではセルAとセルCはセルBを通して,繋がっているため,一つの都市(A-B-c)として考える.
  • 連続するH3セルの結節地域を作成するため,ネットワークを解析するパーケージigraphを利用.
    • graph_from_adj_list():隣接リストからネットワーク(igraphグラフオブジェクト)を作成.
    • グラフオブジェクト:点(ノード)とそれらを結ぶ線(エッジ)を表現するためのオブジェクト. ノードはあとでH3セルと結びつける.
      • mode="all":無向グラフ(ノードを結ぶエッジに矢印を用いていない)を指示.向きが関係なく,繋がっていることだけが重要なため,無向グラフを使用.
  • 連続して繋がったノードが結節地域.これをオブジェクトregionに格納.
region <- neighbors %>% 
  graph_from_adj_list(mode="all")

[5]都市IDを作成する.

  • components()igraphの関数.各ノードがどの結節地域(membershipという情報として付与)に属するかを見つけ出す.

  • これにより,次の作業で,membership情報を使ってH3セルがどの結節地域に属しているかどうかを確認できる.

  • オブジェクトhexagons_rの各H3セルに都市ID(city_id)を割当.

    • pluck()purrrパッケージの関数(ただし,tidyverseパッケージに含まれる).リストの特定の要素の取得.
      • region_componentsオブジェクトからmembershipの要素を抽出.
      • pluck()を使わずcity_id=components$membershipでも同じ結果が返る.
#membershipの付与
region_components <- region %>% 
  components()

#各H3セルに地域IDを付与
hexagons_r <- hexagons_r %>%
  mutate(city_id=pluck(region_components, "membership"))

3.3 都市の作成

[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]記述統計を見る.

  • 都市数は337,最大値は約3340万人(東京都市圏)と確認.
#記述統計
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

3.4 都市人口分布の可視化

[8]都市人口分布を可視する.

  • では都市の条件を満たさない地域で,人口密度が1㎢あたり100人以上のところをグレーで,残りの,より人口密度が低い地域は白で表現.
    • 本ウェブサイトでは,人口密度が0.74㎢あたり74人以上を抽出.オブジェクトをhexagons_gとし,H3セルをグレー(gray)で表現.
  • 337都市は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()

4 都市人口密度分布の可視化

  • 上では,各都市の総人口を可視化.次に,都市の人口密度(各H3セルの人口密度)を可視化.
    • 人口密度の条件を満たすオブジェクト(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()

5 ランク・サイズ分布の可視化

  • では総人口を1000人にして,ランク・サイズ分布を可視化.
    • 本ウェブサイトでは総人口を740人して可視化.総人口が少なくなったことから,観測数は377都市から2527地域に増加.
      • 結節地域の総人口が格納されているオブジェクト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()

  • ランク・サイズ分布を見ると,ランク・サイズルール(観測値が右下がり直線上に配置)に概ね従っている.

参考文献・参考ウェブサイト

補論

ネットワークの可視化

  • 連続するH3セルの結節地域を作成する過程で,ノードとエッジから成るネットワークを作成した.
    • ネットワークが確かにできてるかを確認.

[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] ネットワークの可視化

  • 都市がどのように結節しているのかを可視化.
    • 確かに,都市1は1つのH3セルから,都市2は7つのH3セルから,都市3は11つのH3セルから構成されている.

[3] 総人口と順位

  • 都市1から都市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

北緯30°以南を含んだ可視化

1都3県の可視化

1都3県(南関東)に焦点をあてる(拡大して見る)ことにより,都市がどのように形成されているのかを確認.

  • 国土数値情報の行政区域シェープファイルを利用して1都3県を切り抜き,都市人口分布を可視化.
    • 東京都離島を除いて,可視化.
    • 都市数は26.

北東北3県の可視化

  • 国土数値情報の行政区域シェープファイルを利用して北東北3県(青森県,岩手県,秋田県)を切り抜き,都市人口分布を可視化.
    • 都市数は17.   

中国,韓国のランク・サイズ分布の可視化

中国

  • 都市数は13806.最大都市圏の人口は約4342万人(珠江デルタ都市圏).

韓国

  • 都市数は114.最大都市圏の人口は約2337万人(ソウル都市圏).

Rによる地理空間データの可視化

アイコン

Font Awesome 6.7.2

生成AIの使用について

ChatGPTのサービスを利用した後,内容を確認し,必要に応じて編集を行った.


  1. 南鳥島周辺(北緯24.3度,東経154度あたり)にはH3セルが5つあるが,ここでは省略している.↩︎