library(sf)
library(tidyverse)
library(tmap)
library(tmaptools)国土数値情報とRを活用した立地適正化計画における居住誘導区域の人口推移分析
本ドキュメントは、クリエイティブ・コモンズ・ライセンス表示4.0国際(CC BY 4.0)ライセンスのもとで提供されています(クリエイティブ・コモンズ・ライセンスについては、下記のサイトを参照してください)。 クリエイティブ・コモンズ・ライセンス表示4.0国際
本ドキュメントは下記の著作物をもとに改変して作成しています: 国土交通省 政策統括官付 地理空間情報課「国土数値情報とQGISを活用した立地適正化計画における居住誘導区域の人口推移分析」(2025年4月) https://nlftp.mlit.go.jp/ksj/manual/QGIS_manual_04.htm (CC BY 4.0)
はじめに
この記事では、主に自治体の都市計画・まちづくりに関わる方々を対象に、立地適正化計画における居住誘導区域の2015年から2030年までの人口推移を分析する手法として、以下の解析方法を紹介します。
- 立地適正化計画データの前処理と整備
- 立地適正化計画データを追加して、居住誘導区域を抽出します。
- 将来推計人口データの処理と結合
- 基準となる500 mメッシュを作成し、R6国政局推計とH30国政局推計のデータをもとに、2015年から2030年までの人口推移データを作成します。
- 居住誘導区域内の人口推移分析
- 居住誘導区域と交差する人口推計メッシュを抽出し、人口増減を可視化します。
- 鉄道データやバスルートデータを追加して、人口増減が公開資料と同様の結果となっているか確認します。
これらの分析により、立地適正化計画の効果検証や今後の施策立案に活用できる基礎資料を作成することができます。
- この記事は、Rの基本操作ができることを前提として書かれています。
立地適正化計画とは
立地適正化計画とは、人口の急激な減少と高齢化の進行を背景に、安心できる健康で快適な生活環境の実現と、財政面・経済面において持続可能な都市経営を可能とするために、居住機能や医療・福祉・商業、公共交通等のさまざまな都市機能を誘導したコンパクトなまちづくりを目指す包括的なマスタープランです。 2014年(平成26年)の都市再生特別措置法の改正により制度が創設されました。
また、立地適正化計画においては、人口減少の中にあっても一定エリアにおいて人口密度を維持することにより、生活サービスやコミュニティが持続的に確保されるよう、居住を誘導すべき区域として、「居住誘導区域」が定められます。

公共交通を軸とした居住・都市機能の誘導の一体的な推進事例:富山県富山市
国土交通省の「立地適正化計画の手引き【資料編】」(令和6年4月改訂)に事例が掲載されている富山県富山市では、立地適正化計画とあわせて公共交通を軸とした計画的なまちづくりを推進しています。 特に、公共交通沿線への居住の推進や公共交通軸の活性化等の取組みを通じて、持続可能な都市構造の形成を目指し、さまざまな取り組みを実施しています。 これらの取り組みの結果、居住誘導区域では、平成24年度以降、転入者が転出者を上回る傾向が続くなど、具体的な成果が表れています。
なお、この記事では、富山市を対象エリアとして、立地適正化計画における居住誘導区域の人口推移を分析する手法を解説します。

立地適正化計画データの追加・前処理
データのダウンロードと追加
国土数値情報では、立地適正化計画のデータは単体で提供されておらず、「都市計画決定情報」に内包されて配布がされています。
国土数値情報の「都市計画決定情報」のページにアクセスして、対象の市区町村のデータをダウンロードします。 年度やデータ形式、市区町村を選択することで、下部にダウンロードボタンが表示されます。 ここでは、2024年度の富山県富山市、GeoJSON形式のデータをダウンロードしました。

データのダウンロード時にアンケートが表示されたら、回答もしくは[スキップする]をクリックするとデータのダウンロードが開始されます。

ダウンロードしたデータを解凍すると、都市計画決定情報に関するデータが複数格納されています。 立地適正化計画のデータは、「<市区町村コード>_ritteki.geojson」となっているデータです。
Rに読み込んで表示してみましょう。
以降では、ワーキングディレクトリに「data」という名前のデータフォルダがあり、使用するファイルはすべてdataフォルダに入っているものとします。
ritteki <- read_sf("data/16201_ritteki.geojson")
gsi_tile <- "https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png"
gsi_credit <- "地理院タイル(淡色地図)を加工して作成"
tm_shape(ritteki) + tm_polygons() +
tm_layout(text.fontfamily = "BIZ UDPGothic") +
tm_credits(gsi_credit) +
tm_basemap(gsi_tile)
追加したデータの属性テーブルのAreaType(区域区分)を確認してみると、立地適正化計画区域、都市機能誘導区域、居住誘導区域にデータが分類されていることがわかります。
glimpse(ritteki)Rows: 4
Columns: 12
$ AreaType <chr> "居住誘導区域", "立地適正化計画区域", "立地適正化計画区域", "都市機能誘導区域"…
$ AreaCode <int> 31, 0, 0, 32
$ Pref <chr> "富山県", "富山県", "富山県", "富山県"
$ Citycode <chr> "16201", "16201", "16201", "16201"
$ Cityname <chr> "富山市", "富山市", "富山市", "富山市"
$ INDate <chr> NA, NA, NA, NA
$ FNDate <chr> NA, NA, NA, NA
$ ValidType <chr> NA, NA, NA, NA
$ Custodian <chr> NA, NA, NA, NA
$ INNumber <chr> NA, NA, NA, NA
$ FNNumber <chr> NA, NA, NA, NA
$ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((137.208 36...., MULTIPOLYGON (((137.1502 36.…
居住誘導区域の抽出
今回分析の対象としたいのは、立地適正化計画のうち「居住誘導区域」です。 dplyr::filter関数を使って、データを抽出します。
# label: Residential Induction Area
residentialArea <- ritteki |>
filter(AreaType == "居住誘導区域")
tm_shape(residentialArea) + tm_polygons() +
tm_layout(text.fontfamily = "BIZ UDPGothic") +
tm_credits(gsi_credit) +
tm_basemap(gsi_tile)
将来推計人口データの追加・データの結合
データのダウンロードと追加
次に、R6国政局推計とH30国政局推計の将来推計人口データをダウンロードし、Rに読み込みます。 人口推計メッシュデータは都道府県単位で配布されているため、富山県のデータをダウンロードします。
R6国政局推計のデータはシェープファイル形式しか提供されていませんのでシェープファイル形式を、H30国政局推計のデータはGeoJSON形式をそれぞれダウンロードしています。
pop_h30 <- read_sf("data/500m_mesh_2018_16.shp")
pop_r6 <- read_sf("data/500m_mesh_2024_16.geojson")
tm_shape(pop_r6) + tm_polygons() +
tm_layout(text.fontfamily = "BIZ UDPGothic") +
tm_credits(gsi_credit) +
tm_basemap(gsi_tile)
将来推計人口データは、国勢調査を基に各メッシュの将来人口を推計し、500mメッシュごとに集計したデータです。 属性「PTN_20xx」は20XX年の男女総人口を示しています。
# 最初の5つのデータ列と"PTN_"から始まるデータだけ表示
glimpse(select(pop_r6, c(1:5, starts_with("PTN_"))))Rows: 5,475
Columns: 16
$ MESH_ID <chr> "543646292", "543646392", "543646394", "543646592", "543646…
$ SHICODE <chr> "16210", "16210", "16210", "16210", "16210", "16210", "1621…
$ PTN_2020 <dbl> 8.0155, 12.0255, 45.1191, 15.0143, 81.0871, 14.0230, 29.047…
$ HITOKU2025 <chr> NA, NA, "@", NA, NA, NA, NA, NA, "*", NA, NA, NA, "@", "*",…
$ GASSAN2025 <chr> NA, NA, NA, NA, NA, NA, NA, NA, "543646394", NA, NA, NA, NA…
$ PTN_2025 <dbl> 5.6272, 10.8300, 39.2381, 12.6915, 69.6182, 12.5386, 26.268…
$ PTN_2030 <dbl> 4.6230, 9.7882, 34.8087, 10.9507, 60.1779, 11.5444, 23.8193…
$ PTN_2035 <dbl> 4.0612, 8.7027, 30.8671, 9.5247, 53.0718, 10.4007, 21.0500,…
$ PTN_2040 <dbl> 3.9029, 7.9100, 27.8801, 7.9214, 46.8001, 9.0406, 18.5173, …
$ PTN_2045 <dbl> 0.0000, 7.2750, 25.6433, 6.3210, 41.0474, 8.0143, 16.1424, …
$ PTN_2050 <dbl> 0.0000, 6.7802, 23.1938, 5.1379, 35.2797, 7.0709, 14.0082, …
$ PTN_2055 <dbl> 0.0000, 6.1145, 20.7559, 4.3230, 30.0038, 6.1973, 12.2067, …
$ PTN_2060 <dbl> 0.0000, 5.2957, 18.8891, 3.5410, 26.0616, 5.1899, 10.6916, …
$ PTN_2065 <dbl> 0.0000, 4.3589, 16.8524, 2.6289, 22.5730, 3.9343, 9.5149, 9…
$ PTN_2070 <dbl> 0.0000, 3.5283, 15.2243, 2.1544, 19.4979, 2.9678, 8.2704, 8…
$ geometry <POLYGON [°]> POLYGON ((136.8688 36.35, 1..., POLYGON ((136.8688 …
今回の分析では、「500m_mesh_2018_16(H30国政局推計 将来推計人口データ)」から「PTN_2015」を、「500m_mesh_2024_16(R6国政局推計 将来推計人口データ)」から「PTN_2020、PTN_2025、PTN_2030」のデータを使用して、2015年から2030年までの人口推計を確認します。
また、この二つのデータについては、人口が存在しないメッシュについてはデータが作成されていません。 そのため、まずは、富山市における「居住誘導区域」レイヤの範囲を基準として、500 mメッシュを作成し、そのメッシュに対して二つの人口推計メッシュの属性データを結合し、一つの統合データを作成する手順でデータを作成します。
(H30国政局推計 将来推計人口データ)は、2015年(平成27年)の国勢調査に基づき、2050年までのメッシュ別の将来人口の試算をおこなったデータであり、(R6国政局推計 将来推計人口データ)は、2020年(令和2年)の国勢調査に基づき、2070年までのメッシュ別の将来人口の試算をおこなったデータです。 そのため、立地適正化計画制度が開始したころの2015年の人口は、(H30国政局推計 将来推計人口データ)の数値を用い、それ以降の2020年~2030年までの人口は、(R6国政局推計 将来推計人口データ)の数値を用いて、分析をおこないます。
基準となる500mメッシュの作成
メッシュの作成は「jpgrid」というパッケージを利用して行います。
# install.packages("jpgrid")
library(jpgrid)jpgrid::geometry_to_grid関数を使うと、sfオブジェクトを地域メッシュコードに変換することができます。 さらに、jpgrid::grid_as_sf関数によって地域メッシュ(gridクラス)を含むデータをsfオブジェクトに変換できます。
mesh <-
geometry_to_grid(residentialArea, "500m") |> first() |>
grid_as_sf(crs = st_crs(residentialArea)) |>
mutate(MESH_ID = as.character(grid)) |> select(-grid)
tm_shape(mesh) + tm_polygons() +
tm_layout(text.fontfamily = "BIZ UDPGothic") +
tm_credits(gsi_credit) +
tm_basemap(gsi_tile)
上図のように、居住誘導区域が含まれる500 mメッシュ(2分の1地域メッシュ)が作成されました。
また、属性データ確認すると、メッシュのIDを示す「MESH_ID」が格納されていることがわかります。
glimpse(mesh)Rows: 321
Columns: 2
$ geometry <POLYGON [°]> POLYGON ((137.2063 36.55833..., POLYGON ((137.2125 36…
$ MESH_ID <chr> "543761762", "543761771", "543761764", "543761773", "54376186…
H30国政局推計 将来推計人口データを結合
次に、作成したメッシュデータに「pop_h30(H30国政局推計 将来推計人口データ)」のデータを結合します。
それぞれの属性のキーとなるメッシュIDをもとに結合を行いますが、H30国政局推計 将来推計人口データの「MESH_ID」属性は数値型のため、このままでは2分の1地域メッシュと結合できません。 「MESH_ID」属性をテキスト型に変換します。
さらに、使用するデータ列(MESH_IDとPTN_2015)だけを残して、ジオメトリも含め他のデータ列を削除しておきます。
pop_h30 <- pop_h30 |>
mutate(MESH_ID = as.character(MESH_ID)) |>
select(MESH_ID, PTN_2015) |>
st_drop_geometry()これでテーブル結合の準備が整ったので、メッシュデータに人口データを結合します。 Rでは、dplyr::left_join関数を使って2つのデータフレームを結合することができます。
# label: Join H30 Population Data
mesh <- mesh |> left_join(pop_h30, by = join_by(MESH_ID)) R6国政局推計 将来推計人口データを結合
同じ要領で、「pop_r6(R6国政局推計 将来推計人口データ)」も結合します。 なお、GeoJSON形式のデータを読み込んだpop_r6については、MESH_IDのデータ型はテキスト型になっているため、変換の必要はありません。
pop_r6 <- pop_r6 |>
select(MESH_ID, PTN_2020, PTN_2025, PTN_2030) |>
st_drop_geometry()
mesh <- mesh |> left_join(pop_r6, by = join_by(MESH_ID))ここで、メッシュデータの属性テーブルを確認すると、2015年から2030年までの各年の人口値が格納されていることがわかります。 なお、NAと表示されているメッシュは、そのメッシュに人口が存在しないことを表しています。
glimpse(mesh)Rows: 321
Columns: 6
$ geometry <POLYGON [°]> POLYGON ((137.2063 36.55833..., POLYGON ((137.2125 36…
$ MESH_ID <chr> "543761762", "543761771", "543761764", "543761773", "54376186…
$ PTN_2015 <dbl> 117.8837, 262.7664, 374.6574, 477.3721, 266.8334, 355.7457, 9…
$ PTN_2020 <dbl> 120.7522, 240.3946, 354.0785, 404.5936, 282.1063, 292.5998, 8…
$ PTN_2025 <dbl> 111.5109, 220.5033, 318.7942, 382.5512, 270.7866, 277.1128, 7…
$ PTN_2030 <dbl> 102.1974, 204.3489, 292.6079, 361.6317, 264.0929, 260.7597, 7…
居住誘導区域内の人口推移の分析
データの準備が整ったので、居住誘導区域と交差する人口推計メッシュを抽出して人口がどのように推移しているのか確認してみたいと思います。
なお、今回は分析を簡易的にするため交差するメッシュを対象としており、一部のメッシュは必ずしも全域が居住誘導区域に含まれていない場合があります。 より正確な分析を行いたい場合は、面積按分などの手法を用いることを検討してください。
それでは、2015年と2020年の人口の差分についての塗り分け地図を表示します。
mesh |>
mutate(pop20_15 = PTN_2020 - PTN_2015) |>
tm_shape() +
tm_polygons(
fill = "pop20_15",
fill.scale = tm_scale_intervals(values = "brewer.rd_yl_gn", midpoint = 0),
fill.legend = tm_legend(title = "人口増減\n2015〜2020", reverse = TRUE)) +
tm_shape(residentialArea) +
tm_polygons(fill = NULL, col = "red", lty = "dashed") +
tm_layout(text.fontfamily = "BIZ UDPGothic") +
tm_credits(gsi_credit) +
tm_basemap(gsi_tile)
結果を確認してみると、一部のエリアでは人口が減少に転じており、またその他のエリアでは増加しているなど、居住誘導区域内の人口変動は地域によって異なることがわかります。
続いて、メッシュ人口の合計値を算出してみたいと思います。
mesh |> st_drop_geometry() |>
select(where(is.numeric)) |> colSums(na.rm = TRUE)PTN_2015 PTN_2020 PTN_2025 PTN_2030
252191.6 253041.6 244161.7 238335.9
結果を確認してみると、2015年から2020年にかけて人口が約870人増加していることがわかります。 しかしながら、2025年以降は人口が減少に転じると予測されています。
この分析結果については、次の2点にご留意ください。 第1に、居住誘導区域に交差するメッシュを抽出して集計を行った概算値であること、第2に、2025年以降の人口値は推計値であり、現在自治体が実施している人口誘導施策の効果が十分に反映されていない可能性がある点に注意が必要です。
なお、「富山市立地適正化計画」の資料を確認すると、「公共交通沿線居住推進地区※」においては、2014年(H26)から転入超過を維持していることが確認でき、今回の解析結果のうち、2015年から2020年の人口推移については、同様の結果が得られていることがわかります(国土数値情報の鉄道データとバスルートデータを重ね合わせて、人口増減を表示)。

富山市の資料では「公共交通沿線居住推進地区」を対象範囲としており、今回解析を行った居住誘導区域とは厳密には範囲が異なります。 しかしながら、富山県の居住誘導区域は、「都心地区」と「公共交通沿線居住推進地区」を基本に設定されており、エリアは概ね一致しています。

最後に、居住誘導区域に交差するH30国政局推計の将来推計人口データを抽出し、2015年から2020年の人口差分を分析したところ、約2,600人の減少という結果が得られました。 この数値は、R6国政局推計とH30国政局推計の二つのデータを用いた先の分析結果(2015年から2020年で人口が約870人増加)と大きく異なるものであり、H30国政局推計のデータが作成された時点では、富山市の当該地域の人口は早期に減少していくと予測されていたことが分かります。 しかし、実際の2015年と2020年の人口差分は約870人の増加であり、このことは、富山市におけるコンパクトなまちづくりが効果を上げ、人口増加が実現された可能性を示唆しています。
PTN_2015 PTN_2020
252191.6 249636.8
おわりに
この記事では、Rと国土数値情報で公開されているデータを活用して、立地適正化計画における居住誘導区域の将来推計人口データを抽出し、その推移を分析する方法を解説しました。 具体的には、以下の手順で分析を実施しました。
- 立地適正化計画から居住誘導区域を抽出
- 居住誘導区域の範囲で500 mメッシュを作成し、R6国政局推計とH30国政局推計の将来推計人口データの属性を結合
- 居住誘導区域に交差する将来推計人口データを抽出および集計
将来推計人口はあくまで推測値であり、現在その自治体で取組み中の施策の動向が十分に反映されたものではありませんが、将来のおおよその人口推移の動向は把握可能ですので、居住誘導区域の人口密度維持に備えた今後の施策検討における基礎的な資料として活用することができます。
また、この分析手法は、居住誘導区域だけでなく、その他の都市計画関連の区域や、洪水浸水想定区域、小学校区など、面的な範囲を持つあらゆる区域について、その域内の人口算出をおこなうのに応用可能な手法となります。 様々な行政の施策検討におけるEBPMの推進に是非ご活用ください。
この記事の執筆に使用したパッケージとそのバージョンは以下の通りです。
| package | loadedversion | source |
|---|---|---|
| jpgrid | 0.4.0 | CRAN (R 4.5.0) |
| sf | 1.1-0 | CRAN (R 4.5.2) |
| tidyverse | 2.0.0 | CRAN (R 4.5.0) |
| tmap | 4.2 | CRAN (R 4.5.0) |
| tmaptools | 3.3 | CRAN (R 4.5.0) |
| units | 1.0-1 | CRAN (R 4.5.2) |