石川県の人口分布と公共交通網をRで可視化する

R
作者

伊東宏樹

公開

2025年7月11日

石川県広域データ連携基盤推進事業 公式note の記事「 2030年の交通空白地をオープンデータで見つけよう」を見て、同様のことをRでやってみました。まったく同じというのもなんなので、2025年の推計人口と公共交通網とをmapglを使って可視化してみます。

準備

パッケージ

今回は、データ整形にtidyverseを、地理情報データにsfを、地図描画にmapglパッケージをそれぞれ使用します。

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.3.0
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(mapgl)

データの準備

国土数値情報から以下のデータをダウンロードします。いずれもGeoJSON形式のファイルを使います。

バス停留所・バスルート・鉄道駅・鉄道路線・人口推計データのそれぞれのGeoJSONファイルをdataディレクトリに置いておきます。

data_files <- c(
  "data/P11-22_17.geojson",              # Bus stops
  "data/N07-22_17.geojson",              # Bus routes
  "data/N02-24_Station.geojson",         # Railway stations
  "data/N02-24_RailroadSection.geojson", # Railway lines
  "data/250m_mesh_2024_17.geojson")      # Population

データ読み込みと整形

データ読み込み

purrrパッケージのmap関数を使って、データファイルをまとめて読み込みます。読み込んだリストには、各要素に名前を付けておきます。

data_list <- purrr::map(data_files,
                        \(f) read_sf(f))
names(data_list) <- c("Bus_stop", "Bus_route", "Station", "Rail", "Population")

データの整形

あとで地図のラベルに使用するので、駅名とバス亭名に、事業者と路線名を付ける処理をおこないます。

また、250mメッシュにおける2025年の男女計総数人口(秘匿なし)の最大値を取得しておきます。

# Station
data_list$Station <- data_list$Station |>
  dplyr::mutate(Label = str_c(N02_004, N02_003, N02_005, sep = " : "))

# Bus stop
data_list$Bus_stop <- data_list$Bus_stop |>
  dplyr::mutate(Label = str_c(P11_002, P11_003_01, P11_001, sep = " : "))

# Maximum population in the 250m meshes
max_population <- max(data_list$Population$PTN_2025)

地図作成

mapglを使って地図を作成します。

まずはmaplibreでベースの地図を作成し、人口、鉄道路線、鉄道駅、バスルート、バス停のレイヤーを重ねて行きます。鉄道駅とバス停ではツールチップで情報が表示されるようにしました。

maplibre(style = maptiler_style("basic"),
         center = c(136.8, 36.8),
         zoom = 8,
         pitch = 0,
         bearing = 0) |>
  add_navigation_control() |>
  add_scale_control() |>
  # Population
  add_fill_layer(
    id = "2025年人口",
    source = data_list$Population,
    fill_color = interpolate(
      column = "PTN_2025",
      type = "linear",
      values = c(0, max_population),
      stops = c("#BB0000", "#FFFF00")
      ),
    fill_opacity = 0.7
   ) |>
  # Railway
  add_line_layer(
    id = "鉄道路線",
    source = data_list$Rail) |>
  # Railway station
  add_line_layer(
    id = "鉄道駅",
    source = data_list$Station,
    line_width = 4,
    tooltip = "Label") |>
  # Bus route
  add_line_layer(
    id = "バス路線",
    source = data_list$Bus_route,
    line_color = "skyblue") |>
  # Bus stop
  add_circle_layer(
    id = "バス停",
    source = data_list$Bus_stop,
    circle_color = "blue",
    circle_radius = 4,
    min_zoom = 10,
    tooltip = "Label") |>
add_layers_control()

このような地図になりました。mapglではインタラクティブな地図が作成されますが、サーバーの都合上、静止画を張り付けてあります。

金沢市中心部です。色は赤いほうが人口が少なく、黄色いほうが多いことを示します。

金沢城公園内はさすがに住んでいる人はいません。

七尾線高松駅あたりは、のと里山海道を通る特急バス以外の路線バスはないようです。

小松市佐美にもバス路線が来ていますが、ここは1日1往復となっています。小松基地内に人口がわりと多そうなところがぽつんとあるのは、職員宿舎でしょうか。