Lesson 19

居住誘導区域 9 件 統合分析 — 広島県 LIP 8 市のコンパクトシティ実装構造

都市計画立地適正化計画LIP居住誘導区域都市機能誘導区域geopandask-meansコンパクトシティ横断統合
所要 60-90 分 / 想定レベル: 中級〜上級 / データ: DoBoX 都市計画区域情報_区域データ_居住誘導区域 9 件 (LIP 策定 8 市 + 県全域 1) + L15 行政区域 21 件

データ取得手順

このスクリプトは初回実行時にデータを自動取得します(DoBoX からの直接ダウンロード)。

IDデータセット名
#444dataset #444
#555土砂災害警戒区域・特別警戒区域情報_尾道市
#666dataset #666
#795都市計画区域情報_区域データ_広島市_居住誘導区域
#805都市計画区域情報_区域データ_呉市_居住誘導区域
#812都市計画区域情報_区域データ_竹原市_居住誘導区域
#822都市計画区域情報_区域データ_三原市_居住誘導区域
#838都市計画区域情報_区域データ_福山市_居住誘導区域
#848都市計画区域情報_区域データ_府中市_居住誘導区域
#876都市計画区域情報_区域データ_東広島市_居住誘導区域
#886都市計画区域情報_区域データ_廿日市市_居住誘導区域
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#933都市計画区域情報_区域データ_広島県_居住誘導区域
#999dataset #999

実行コマンド:

cd "2026 DoBoX 教材"
python -X utf8 lessons/L19_residential_induction.py

DoBoX のオープンデータは申請不要・商用/非商用とも利用可。 data/extras/.gitignore 対象(約 57 GB のキャッシュ)。 スクリプト実行で自動再生成されます。

1. 学習目標と問い

本レッスンは、広島県オープンデータポータル DoBoX の 「都市計画区域情報_区域データ_居住誘導区域」シリーズ 9 件 (立地適正化計画 LIP 策定済 8 市 + 県全域 1) を統合し、 広島県の「コンパクトシティ+ネットワーク」実装構造を読み解く研究記事です。

研究問い (RQ)
広島県 21 市町中 立地適正化計画 (LIP) を策定した 8 市は、 居住誘導区域 (KUIKI_CD=1)都市機能誘導区域 (KUIKI_CD=3)面積規模・地理配置・粒度・行政比率 の観点でどのように設計しているか? そこから「コンパクトシティ+ネットワーク」のどんな実装スタンスが読み取れるか? さらに 非策定 12 市町策定 8 市は、 人口・面積・タイプの観点でどう分かれているか?

独自用語の定義 (要件 M)

仮説 H1〜H5 (要件 D)

到達点

  1. 9 GeoJSON (8 市別 + 県全域) を 1 個の GeoDataFrame に統合し、 KUIKI_CD のフラグ別構造 (面 vs 線) を識別する手法
  2. dissolve(by=["source_city", "KUIKI_CD"]) による 市町×類型ごとの幾何統合と、面積・周長・連結成分・円形度の計量
  3. 都市機能 ⊆ 居住誘導 の入れ子検証を geometry.intersection で実施し、 「拠点ネットワーク型 LIP」の幾何学的整合性を定量化する手法
  4. 21 市町中 8 LIP 策定市 vs 12 非策定市町を、人口・面積・密度で比較し、 「LIP 策定の選別ロジック」を可視化する手法
  5. 4 特徴量で 8 市を k-means クラスタリングし、都市制御プロファイル別に分類
  6. 整合性検証: 8 市別 8 ファイルと県全域 ds=933 の同一性確認
  7. 図 10 種・表 9 種で居住誘導構造を多角的に提示 (要件 Q)
注: 本記事の対象範囲
本記事は 「居住誘導区域 (立地適正化計画)」のみに集中。 広島県の 21 市町中 8 市のみが LIP を策定 (本記事の対象)。 残り 12 市町 (尾道市・大竹市・三次市・庄原市・安芸高田市・江田島市・ 府中町・海田町・熊野町・坂町・北広島町・世羅町) は LIP 未策定で、 DoBoX に居住誘導区域ファイルが存在しない。
(注: 広島県内には他に安芸太田町・大崎上島町・神石高原町の 3 町もあるが、 本記事では L15 行政区域 21 件の枠で 8 LIP + 12 非策定 = 計 20 市町を分析対象とする。)
- L13: 「建物利用 × 土地利用」のメッシュ集計 — 別軸
- L15: 行政区域 (市町境界) — 本記事の分母/背景として参照
- L16: 都市計画区域 — 本記事の背景レイヤとして参照
- L17: 用途地域 (Zoning, 市街化内のさらに細分) — 別記事
- L18: 市街化+市街化調整 (区域区分; 13 市町) — 居住誘導の上位概念。 L18 と本記事の関係は: 市街化区域 ⊃ 居住誘導区域 ⊃ 都市機能誘導区域 の三段入れ子。
他のサブシリーズと「合体」せず、居住誘導区域シリーズ単独の研究記事として完結を目指す。

2. 使用データ

本記事で使う 9 dataset_id は、DoBoX で「都市計画区域情報」配下「区域データ」配下の 居住誘導区域シリーズである (LIP 策定 8 市 + 県全域 1)。列構造が 9 件すべてで完全に同一(FID/TOKEI_CD/CITY_CD/KUIKI_CD/RITTEKI_CD/geometry の 6 列) であることが事前監査で確認済みのため、pd.concat による単純な縦結合で県全域 GeoDataFrame が組み立てられる。KUIKI_CD フラグ (5 値: 0/1/2/3/4)居住誘導/都市機能誘導/境界線/その他を識別する。L18 の市街化/調整シリーズとは KUIKI_CD の意味体系が異なる (L18 は 1=市街化, 2=調整 の 2 値、L19 は 5 値)。また1 ファイルに『面データ』と『線データ』が混在するため、面解析時は KUIKI_CD.isin([1, 3]) でフィルタが必須。

データ仕様と KUIKI_CD 凡例

項目
シリーズ都市計画区域情報_区域データ_居住誘導区域
件数9 dataset_id (LIP 策定 8 市 + 広島県全域 1)
形式GeoJSON (ZIP 内同梱)
CRSEPSG:6671 (JGD2011 平面直角第III系) ※全 9 件で統一
列構造FID, TOKEI_CD, CITY_CD, KUIKI_CD, RITTEKI_CD, geometry6 列、全 9 件で同一
KUIKI_CD5 値 (0/1/2/3/4) — 詳細は下表
RITTEKI_CD常に 1 (立地適正化計画対象フラグの定数列)
ジオメトリ型Polygon (広島市・県全域は MultiPolygon 混在)
合計ポリゴン数 (8 市別)9752 (内訳: 居住誘導 563, 都市機能 31, 線/その他 9158)
合計ポリゴン数 (県全域)9752

KUIKI_CD 凡例 (5 値)

KUIKI_CD名称カラー意味
0その他/非誘導  誘導指定外の参考エリア
1居住誘導区域  都計法 81 条 / 都市再生特別措置法 — 居住を誘導
2居住誘導 境界線  面ではなく線データ (境界の細片)
3都市機能誘導区域  商業・医療・行政等の都市機能を誘導
4都市機能誘導 境界線  面ではなく線データ

9 GeoJSON (LIP 策定 8 市 + 県全域) 一覧 (本記事の対象)

市町タイプ 行政面積 km²人口 (千人) datasetpolys 数備考
広島市政令市906.71189DoBoX #7954485jukyo_795_広島市.zip
呉市中核市352.8210DoBoX #80569jukyo_805_呉市.zip
竹原市118.224DoBoX #812125jukyo_812_竹原市.zip
三原市471.690DoBoX #822199jukyo_822_三原市.zip
福山市中核市518.1459DoBoX #8382330jukyo_838_福山市.zip
府中市195.837DoBoX #84834jukyo_848_府中市.zip
東広島市施行時特例市635.3198DoBoX #8762499jukyo_876_東広島市.zip
廿日市市489.5117DoBoX #88611jukyo_886_廿日市市.zip
広島県(全域)DoBoX #9339752整合性検証用 (8 市の集約版)

非策定 12 市町 一覧 (本記事の対象外、参考)

市町タイプ行政面積 km²人口 (千人)備考
尾道市285.1130居住誘導区域ファイル無し (LIP 未策定)
大竹市78.726居住誘導区域ファイル無し (LIP 未策定)
三次市778.150居住誘導区域ファイル無し (LIP 未策定)
庄原市1246.533居住誘導区域ファイル無し (LIP 未策定)
安芸高田市537.827居住誘導区域ファイル無し (LIP 未策定)
江田島市100.722居住誘導区域ファイル無し (LIP 未策定)
府中町10.453居住誘導区域ファイル無し (LIP 未策定)
海田町13.830居住誘導区域ファイル無し (LIP 未策定)
熊野町33.723居住誘導区域ファイル無し (LIP 未策定)
坂町15.712居住誘導区域ファイル無し (LIP 未策定)
北広島町646.217居住誘導区域ファイル無し (LIP 未策定)
世羅町278.215居住誘導区域ファイル無し (LIP 未策定)

広島県全 23 自治体 (21 市町 + 2 単体) のうち、本記事は 21 市町を対象とする (安芸太田町・大崎上島町・神石高原町はL15 行政区域に含まれず、DoBoX で取得しなかったため除外)。立地適正化計画の策定状況は 2025 年現在の DoBoX 公開データに基づく — 計画は任意制度のため、未策定市町は法的に問題ない。

3. ダウンロード (再現用データ・中間データ・図・スクリプト)

本記事の再現性を担保するため、HTML 1 枚から 生データ・中間 CSV・図 PNG・再現 Python を直リンクで取得できるようにしてある。

(1) 生データ ZIP (DoBoX 直)

9 件の ZIP は前項の表からそれぞれ DoBoX へリンクしている。 あるいは一括取得スクリプトを使う:

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L19_residential_induction\fetch_residential_induction.py

(2) 中間 CSV (本スクリプトの出力)

(3) 図 PNG (本記事掲載)

(4) 再現用 Python スクリプト

実行は cd "2026 DoBoX 教材"; py -X utf8 lessons\L19_residential_induction.py。 9 ZIP がローカルにあれば 1 分以内で全図 + CSV 再生成 (要件 S 準拠)。 ZIP が無い場合は事前に fetch_residential_induction.py を実行。

4. 分析1: 9 GeoJSON を 1 枚の GeoDataFrame に統合する

狙い

9 個の ZIP (8 市別 + 県全域) を、プログラム上は 1 個の GeoDataFrame として扱える形にする。9 件すべてが同列構造 (FID/TOKEI_CD/CITY_CD/KUIKI_CD/RITTEKI_CD/geometry の 6 列) であることが事前監査で確認済みなので、和集合化なしで縦結合できる。ただしL18 の市街化/調整シリーズとは KUIKI_CD の意味が異なる点 (L18 は 2 値 1/2、本記事は 5 値 0-4) と、1 ファイルに面データと線データが混在する点は丁寧に扱う。

手法

直感: ZIP×8→geopandas→属性付与→concat→KUIKI_CD 展開→面/線フラグ の 6 ステップ。KUIKI_CD は 5 値の数値フラグなので、辞書 1 つで名前展開すれば良い。面データ (KUIKI=1,3) と線データ (KUIKI=2,4) を is_area/is_line 列で識別し、面分析時は zone[zone['is_area']] で絞る。県全域 ds={KEN_DSID} は整合性検証用として別途読み込み、本論の主分析には使わない。

大筋 (6 ステップ)

  1. 8 市について、それぞれの居住誘導 ZIP を load_geojson_zip() で読む
  2. 各 GeoDataFrame に source_city/source_dsid/ctype 列を付与
  3. 8 個を pd.concat で縦結合 → 9752 行 1 個
  4. to_crs(EPSG:6671) で広島県平面直角座標系に投影変換
  5. KUIKI_NAME 列展開、面積・周長計算
  6. is_area/is_line フラグで面/線を識別

入出力: 入力 = 8 ZIP、出力 = 9752 行 × 13 列の GeoDataFrame 1 個。県全域 ds=933 も別途読み込み、整合性検証用に使う。21 行政区域 (L15 共有) も背景描画用に統合する。

前提と限界: 9 件の列構造が同一であることが大前提 (事前監査で OK 確認済)。KUIKI_CD の意味体系は L18 とは違うので、L18 のコードをそのまま流用できない。本記事独自の凡例辞書を用意した。

パラメータの意味: TARGET_CRS=EPSG:6671 は広島県専用の平面直角座標系で、面積計算が m² 単位で正確になる。緯度経度 (EPSG:4326) のままだと面積が度² になり意味がない。

実装

L19_residential_induction.py 行 80–251

 1
 2
 3
 4
 5
 6
 7
 8
 9
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
DATA_DIR = ROOT / "data" / "extras" / "L19_residential_induction"
ADMIN_DIR = ROOT / "data" / "extras" / "L15_admin_zones"
TARGET_CRS = "EPSG:6671"  # JGD2011 平面直角 III, 広島県, m 単位

# (居住誘導 dsid, 市町名, タイプ, 行政_dsid)
LIP_CITY_DEFS = [
    (795, "広島市",   "政令市",       786),
    (805, "呉市",     "中核市",       797),
    (812, "竹原市",   "市",           807),
    (822, "三原市",   "市",           814),
    (838, "福山市",   "中核市",       832),
    (848, "府中市",   "市",           840),
    (876, "東広島市", "施行時特例市", 868),
    (886, "廿日市市", "市",           878),
]
KEN_DSID = 933

# KUIKI_CD 凡例 (5 値, L18 とは別の意味体系)
KUIKI_INFO = {
    0: ("その他/非誘導",       "#cccccc", "誘導指定外の参考"),
    1: ("居住誘導区域",        "#1f78b4", "都計法 81 条 居住誘導 (面)"),
    2: ("居住誘導 境界線",     "#a6cee3", "面ではなく線 (細片)"),
    3: ("都市機能誘導区域",    "#e31a1c", "都計法 81 条 都市機能誘導 (面)"),
    4: ("都市機能誘導 境界線", "#fb9a99", "面ではなく線"),
}


def load_geojson_zip(zip_path):
    """ZIP 内の単一 .geojson を BytesIO 経由で読む (一時ファイル不要)"""
    import io, zipfile
    with zipfile.ZipFile(zip_path) as zf:
        gjs = [n for n in zf.namelist() if n.endswith(".geojson")]
        with zf.open(gjs[0]) as f:
            return gpd.read_file(io.BytesIO(f.read()))

# 8 LIP 策定市の居住誘導 GeoJSON 8 ファイルを 1 GDF に縦結合
frames = []
for dsid, name, ctype, _ in LIP_CITY_DEFS:
    g = load_geojson_zip(DATA_DIR / f"jukyo_{dsid}_{name}.zip")
    g["source_city"] = name; g["source_dsid"] = dsid
    g["ctype"] = ctype
    frames.append(g)

zone = gpd.GeoDataFrame(pd.concat(frames, ignore_index=True),
                        geometry="geometry", crs=frames[0].crs)
zone = zone.to_crs(TARGET_CRS)             # m 単位 化
zone["KUIKI_NAME"] = zone["KUIKI_CD"].map(lambda c: KUIKI_INFO[c][0])
zone["poly_area_km2"] = zone.geometry.area / 1e6
zone["poly_perim_km"] = zone.geometry.length / 1e3
# 「面データ」と「線データ」を識別 (KUIKI=1,3 は面、=2,4,0 は実質線)
zone["is_area"] = zone["KUIKI_CD"].isin([1, 3])
zone["is_line"] = zone["KUIKI_CD"].isin([2, 4])

入出力 Before/After (具体例: ds=795 広島市 居住誘導区域)

段階サイズこのデータで起きていること
① 元 ZIPZIP (中身は 1 個の .geojson)2.6 MB広島市の居住誘導区域 + 都市機能誘導 + 境界線 計 4485 ポリゴン
load_geojson_zip()GeoDataFrame4485 行 × 6 列FID, TOKEI_CD, CITY_CD (101-108 8 区), KUIKI_CD (0/1/2 混在), RITTEKI_CD (=1), geometry
③ 属性付与GeoDataFrame4485 行 × 9 列source_city, source_dsid, ctype 付与
pd.concat (8 GDF)GeoDataFrame9752 行 × 9 列8 市分が 1 個に縦結合される (広島市 4485 + 呉市 69 + ... + 廿日市市 11)
to_crs(EPSG:6671)GeoDataFrame9752 行JGD2011 平面直角第III系 (m 単位) に投影変換
⑥ KUIKI_NAME + 面積計算 + is_area/is_lineGeoDataFrame9752 行 × 13 列KUIKI_NAME 文字列展開、poly_area_km2, poly_perim_km, is_area, is_line 4 列追加
⑦ 面データのみ抽出GeoDataFrame594 行zone[zone['is_area']] で面 (KUIKI=1,3) のみに絞る。線データ (KUIKI=2,4) は実空間面積ほぼ 0 で集計上のノイズになるため除く

結果 (次セクションで使う)

このステップで zone (9752 行 × 13 列、うち面 KUIKI=1,3 が 594 行、線 KUIKI=2,4 が 8992 行) と ken (9752 行、県全域版) と admin_diss (21 市町、LIP 策定/非策定フラグ付) が用意できた。以降の分析は全部これで完結する。面データと線データは zone[zone['is_area']] / zone[zone['is_line']] で簡単に分離できる。

5. 分析2: 全県・市町×KUIKI_CD 集計 + dissolve

狙い

統合した zone から、(a) 全県スケールの KUIKI_CD 別集計、(b) 市町×KUIKI_CD ごとの dissolve 集計 (居住誘導の連結成分構造)、(c) 8 市のサマリ DataFrame (面積・行政比率・主島・粒度) を一気に作る。全県スケールの集計は H1 (LIP 策定の人口集中) と H2 (居住誘導 << 行政) の検証材料を用意するためで、市町×類型 dissolve は H3 (入れ子) と H4 (粒度差) のため。

手法

直感: groupby で全県 KUIKI_CD 別集計、dissolve(by=...) で市町×類型ごとに幾何統合 (生のポリゴンを 1 つの大きい面にまとめる)。dissolve同じ市町・同じ KUIKI_CD のポリゴン群を 1 つの (Multi)Polygon に統合し、n_parts で連結成分数 (= 飛び地の数) が分かる。面データのみを対象にする (線データを dissolve しても意味のある面にならない)。

独自指標『円形度 (compactness)』: 4πA/P² で計算。完全円なら 1、細長い形ほど 0 に近づく。市町ごとに居住誘導の形がコンパクトか細長いかの指標になる。

サマリ DataFrame の主要列: jukyo_area_km2 (居住誘導面積)、kinou_area_km2 (都市機能誘導面積)、jukyo_in_admin_pct (居住誘導/行政面積)、kinou_in_jukyo_pct (都市機能/居住誘導 — 入れ子率の上限近似)、main_island_share_pct (主島シェア)、n_polys_jukyo (居住誘導ポリゴン数; 粒度指標)、compactness_jukyo (円形度) 等。

実装

L19_residential_induction.py 行 1676–1730

 1
 2
 3
 4
 5
 6
 7
 8
 9
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
# (a) 全県スケール KUIKI_CD 別集計
type_agg = zone.groupby(["KUIKI_CD", "KUIKI_NAME"]).agg(
    polys_count=("poly_area_km2", "size"),
    area_km2=("poly_area_km2", "sum"),
    perim_km=("poly_perim_km", "sum"),
).reset_index()

# (b) 市町×KUIKI_CD で dissolve (面データ KUIKI=1,3 のみ)
zone_face = zone[zone["is_area"]].copy()
zone_diss = zone_face.dissolve(by=["source_city", "KUIKI_CD", "KUIKI_NAME"],
                                as_index=False)
zone_diss["dissolve_area_km2"] = zone_diss.geometry.area / 1e6
zone_diss["dissolve_perim_km"] = zone_diss.geometry.length / 1e3

def n_parts(g):
    if g.geom_type == "MultiPolygon":
        return len(list(g.geoms))
    return 1
zone_diss["n_parts"] = zone_diss.geometry.apply(n_parts)

# 円形度 (compactness): 4πA / P^2 (1=完全円, 0=線)
zone_diss["compactness"] = (
    4 * np.pi * zone_diss["dissolve_area_km2"] * 1e6
) / (zone_diss["dissolve_perim_km"] * 1e3) ** 2

# (c) 8 市サマリ (居住誘導 + 都市機能誘導 + 行政比率 + 主島シェア)
city_summary = ...  # 詳細は本スクリプト参照

表 1: 全県 KUIKI_CD 別 集計

KUIKI_CD名称ポリゴン数面積 km²周長 km1 ポリゴン平均面積 km²
1居住誘導区域563285.0142106.60.506242
3都市機能誘導区域3111.991141.30.386821
2居住誘導 境界線84800.370592.40.000044
4都市機能誘導 境界線5120.33534.40.000654
0その他/非誘導1660.00315.40.000016

表 1 から読み取れること:

表 2: 8 市 × KUIKI_CD 別 面積クロス (km²)

市町その他/非誘導居住誘導 境界線居住誘導区域都市機能誘導 境界線都市機能誘導区域合計
広島市0.0000.001145.6980.0000.000145.699
呉市0.0000.00014.8340.3201.47816.632
竹原市0.0000.0000.0000.0023.2903.292
三原市0.0020.0346.4270.0121.7388.213
福山市0.0000.31173.1870.0000.00073.498
府中市0.0000.0235.5330.0000.0005.556
東広島市0.0000.00020.5690.0003.94724.516
廿日市市0.0000.00018.7650.0001.53820.303

表 2 から読み取れること:

6. 分析3: 21 市町 LIP 策定 vs 非策定 — どこが選ばれたか

狙い

21 市町中なぜ 8 市だけが LIP を策定したのか。人口・面積・人口密度の 3 軸で「策定 vs 非策定」の境界線を可視化し、LIP 策定の選別ロジックを読み解く (H1 の検証)。

なぜこの図か

図 1 (主題図): 21 市町を地理的に並べ、LIP 策定/非策定で色分けし、策定市内には居住誘導区域 (青) と都市機能誘導 (赤) を上書きする。「県内のどこが LIP 対象で、どこが対象外か」を一目で把握できる。図 4 (規模散布): 行政面積 vs 人口の log-log 散布で、策定/非策定がどの規模帯で分かれるかを定量化。boxplot で人口密度の中央値差も比較。

実装の要点

21 市町行政区域を admin_diss[lip] でフィルタしながら塗り分け、上書きで zone[KUIKI_CD==1]/[KUIKI_CD==3] をそれぞれ重ねる。boxplot は plt.boxplot で 2 群 (策定/非策定) の分布を比較。中央値差を log スケールで見ると 1 桁 (10 倍) のオーダーで違うはず。

図 1: 広島県 21 市町 — LIP 策定 (青背景) vs 非策定 (灰背景) と 居住誘導+都市機能誘導
図 1: 広島県 21 市町 — LIP 策定 (青背景) vs 非策定 (灰背景) と 居住誘導+都市機能誘導

図 1 から読み取れること:

図 4: 21 市町 LIP 策定 (赤●) vs 非策定 (灰×) — 面積・人口散布 + 人口密度 boxplot
図 4: 21 市町 LIP 策定 (赤●) vs 非策定 (灰×) — 面積・人口散布 + 人口密度 boxplot

図 4 から読み取れること:

7. 分析4: 8 市 small multiples + 居住誘導 行政比率

狙い

8 LIP 市の個別の地理形状居住誘導の行政面積比を見ることで、「コンパクトシティ」が本当に『コンパクト』なのか定量化する (H2 検証)。市町別 small multiples で形状の哲学差を、ランキング棒グラフで規模感を提示。

なぜこの図か

図 2 (small multiples): 8 市の個別形状を並列比較。「広島市は中心都市の 145 km²」「廿日市市は西側沿岸の 19 km²」など、市域全体に対する居住誘導の相対位置を直感的に把握。図 3 (行政比率 + 容器密度): ランキングで市町間の偏りを定量化。右の容器密度 (人口/居住誘導面積) は H2 の補助指標で、居住誘導の現状受け皿としての適切さを示す。

実装の要点

small multiples は plt.subplots(2, 4) で 2×4 個の panel を作り、各 panel に行政区域→居住誘導→都市機能誘導 の 3 層を重ねる。ランキングは city_summary.sort_values('jukyo_in_admin_pct') で並べ、都市タイプで色分け。容器密度 = 人口千人×1000 / 居住誘導 km² で計算。

図 2: 8 LIP 市 — 居住誘導 (青) + 都市機能誘導 (赤) small multiples
図 2: 8 LIP 市 — 居住誘導 (青) + 都市機能誘導 (赤) small multiples

図 2 から読み取れること:

図 3: 居住誘導 行政比率 ランキング (左) + 居住容器密度 ランキング (右)
図 3: 居住誘導 行政比率 ランキング (左) + 居住容器密度 ランキング (右)

図 3 から読み取れること:

表 3: 8 市 居住誘導 + 都市機能誘導 行政比率 / 容器密度 (行政比率降順)

市町タイプ行政面積 km²居住誘導 km²都市機能 km²居住/行政 %都市機能/行政 %人口千人居住容器密度 人/km²
広島市政令市957.4145.700.00015.22%0.000%1,1898,161
福山市中核市521.373.190.00014.04%0.000%4596,272
廿日市市489.118.761.5383.84%0.315%1176,235
呉市中核市388.414.831.4783.82%0.380%21014,156
東広島市施行時特例市634.720.573.9473.24%0.622%1989,626
府中市195.65.530.0002.83%0.000%376,687
三原市478.66.431.7381.34%0.363%9014,002
竹原市117.90.003.2900.00%2.792%24

表 3 から読み取れること:

8. 分析5: 都市機能 ⊆ 居住誘導 入れ子検証

狙い (重要発見セクション)

「コンパクトシティ+ネットワーク」理論では、都市機能誘導 ⊆ 居住誘導 の入れ子関係が前提 (都市機能は居住域の中心拠点として配置される) とされる。本記事の 8 市データで、この入れ子が幾何学的に成立しているか検証する (H3)。結果は理論を反証する重要な発見となった

手法 — 幾何重なり率と最近接距離の算出

直感: 各市町について、居住誘導 polygon (KUIKI=1 の dissolve) と 都市機能誘導 polygon (KUIKI=3 の dissolve) を取り出し、g_kinou.intersection(g_jukyo)共通エリアを計算。そのエリアの面積を都市機能誘導の総面積で割れば入れ子率 %になる。100% なら完全な入れ子、0% なら全く重ならない (= 分離型)。重なり 0% の場合は、最近接距離 (km) を g_j.distance(g_k) で計算し、「居住誘導と都市機能誘導がどれだけ離れているか」を把握する。

大筋 (4 ステップ)

  1. 市町ごとに居住誘導 dissolve と 都市機能誘導 dissolve を抽出
  2. shapely の g_kinou.intersection(g_jukyo) で共通部分の面積を計算
  3. 共通面積 / 都市機能誘導全面積 × 100 = 入れ子率
  4. 重なり 0% の市町について g_j.distance(g_k) で最近接距離を計算

実装

L19_residential_induction.py 行 2013–2050

 1
 2
 3
 4
 5
 6
 7
 8
 9
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
nest_rows = []
for dsid, name, ctype, _ in LIP_CITY_DEFS:
    sub_j = zone_diss[(zone_diss["source_city"] == name) & (zone_diss["KUIKI_CD"] == 1)]
    sub_k = zone_diss[(zone_diss["source_city"] == name) & (zone_diss["KUIKI_CD"] == 3)]
    if len(sub_j) == 0 or len(sub_k) == 0:
        # 居住誘導 or 都市機能誘導 のいずれかが無い (竹原市・広島市・福山市・府中市)
        continue
    g_j = sub_j.geometry.iloc[0]
    g_k = sub_k.geometry.iloc[0]
    inter = g_k.intersection(g_j)
    a_kinou = g_k.area / 1e6
    a_inter = inter.area / 1e6
    pct = a_inter / a_kinou * 100   # 都市機能 ⊆ 居住誘導 重なり率
    distance_km = g_j.distance(g_k) / 1000  # 重なり 0 のときの分離距離
    nest_rows.append({
        "city": name,
        "kinou_in_jukyo_pct_geom": pct,
        "distance_km": distance_km,
    })
図 6: 居住誘導 (青) と 都市機能誘導 (赤) の空間配置 — 入れ子クローズアップ
図 6: 居住誘導 (青) と 都市機能誘導 (赤) の空間配置 — 入れ子クローズアップ

図 6 から読み取れること (重要発見):

表 4: 都市機能誘導 ⊆ 居住誘導 入れ子率 (重なり率降順)

市町居住誘導 km²都市機能 km²都市機能 ∩ 居住誘導 / 都市機能 (%)居住誘導外の都市機能 km²
呉市14.831.4780.0%1.4778
三原市6.431.7380.0%1.7380
東広島市20.573.9470.0%3.9472
廿日市市18.761.5380.0%1.5384
竹原市0.003.290—(居住誘導無し)0.0000

表 4 から読み取れること:

9. 分析6: 計画粒度 — 細密 vs 大括り の哲学差

狙い

同じ「居住誘導区域」でも、市町によってデータの粒度 (= 1 ポリゴンの細かさ) が大きく異なる。広島市 4485 polys vs 廿日市市 11 polys は計画策定スタンスの哲学差を反映している (H4)。本セクションでは粒度を 3 角度から定量化:(a) ポリゴン数、(b) 1 ポリゴン平均面積、(c) 連結成分数。

なぜこの図か

図 7 (粒度散布): 居住誘導の面積 vs polys 数 を log-log プロットすると、同面積で polys が多い市は細密モデル化、polys が少ない市は大括りと一目で分かる。横ランキングで定量比較。図 8 (KUIKI_CD 構成 stack): 各市の KUIKI_CD 別の構成比を log スケールで提示し、「線データ (KUIKI=2,4) がどの市でも面データを上回るか」を確認 (H5)。

図 7: 居住誘導 面積 vs polys 数 (log-log) と 粒度ランキング
図 7: 居住誘導 面積 vs polys 数 (log-log) と 粒度ランキング

図 7 から読み取れること:

表 5: 8 市 居住誘導 計画粒度 (1 ポリゴン平均面積 昇順)

市町居住誘導 polys 数面積 km²1 ポリゴン平均 km²連結成分数円形度 (4πA/P²)
広島市471145.700.30934380.0013
三原市96.430.714290.0248
呉市1514.830.9890150.0160
東広島市1520.571.3713150.0093
福山市4773.191.5572470.0046
府中市35.531.844330.1398
廿日市市318.766.255030.0286

表 5 から読み取れること:

図 8: 8 市 × KUIKI_CD 構成 stacked bar (左: ポリゴン数 log, 右: 面積)
図 8: 8 市 × KUIKI_CD 構成 stacked bar (左: ポリゴン数 log, 右: 面積)

図 8 から読み取れること:

10. 分析7: 連結成分・主島シェア — 中心集中 vs 分散

狙い

居住誘導が1 つの塊 (中心集中型) か複数の飛び地 (分散型) かを定量化する。連結成分数と主島シェアで、市町の都市構造の核数を明らかにする。

手法

直感: dissolve した市町ごとの居住誘導 (Multi)Polygon を、geom.geoms で個別の Polygon に分割し、面積最大のものを「主島」、それ以外を「飛び地」とする。

主島シェア % = 主島の面積 / 居住誘導全体面積 × 100。100% に近い = 単一の中心集中型、低いほど分散飛び地都市化。

図 5: 居住誘導 主島シェア choropleth + 連結成分散布
図 5: 居住誘導 主島シェア choropleth + 連結成分散布

図 5 から読み取れること:

表 6: 8 市 居住誘導 連結成分構造 (主島シェア昇順)

市町連結成分数 (= 飛び地数)主島シェア %主島面積 km²飛び地計面積 km²
広島市43822.6%32.86112.84
呉市1527.9%4.1510.69
東広島市1541.3%8.4912.07
福山市4753.6%39.2033.99
三原市982.2%5.281.14
廿日市市394.2%17.671.10
府中市394.7%5.240.29

表 6 から読み取れること:

11. 分析8: k-means クラスタリング

狙い

4 つの定量指標 (居住誘導比率・主島シェア・居住誘導面積・polys 数) で 8 LIP 市をk-means クラスタリングし、都市制御プロファイルのパターンを発見する。

手法 — k-means クラスタリング

直感: 各市町を 4 次元の数値 (= 4 列の表データ) で表現し、似ているもの同士をグループ化する手法。k=3 として 8 市を 3 グループに分ける (居住誘導なしの竹原市は除外して 7 市で分類)。

大筋 (3 ステップ)

  1. 4 特徴量 (居住誘導/行政比率, 主島シェア, 居住誘導面積, polys 数) を StandardScaler で標準化 (スケール差を吸収: 居住誘導面積は km² で 0-150、polys 数は 0-4500 とスケールが大きく違うため)
  2. KMeans(n_clusters=3, random_state=42, n_init=10) で 3 グループに分類
  3. 各クラスタの平均特徴量で都市制御プロファイル名を自動付与

シルエット係数: 0.428。1 に近いほど良いクラスタ分離。0.3 以上で「ある程度納得できる分類」、0.5 以上で「明確な分類」。サンプル数が少ない (n=7) ので絶対値より地理直観との一致を重視する。

図 9: k-means (k=3) クラスタ choropleth + 散布
図 9: k-means (k=3) クラスタ choropleth + 散布

図 9 から読み取れること:

表 7: k-means クラスタの所属と特徴量平均

クラスタ・タグ所属市町n居住/行政 %主島シェア %居住誘導 km²polys 数
C0: 小規模特化型三原市, 府中市, 廿日市市32.67%90%10.25
C1: 中核都市標準型広島市115.22%23%145.7471
C2: 大規模都市核型呉市, 福山市, 東広島市37.03%41%36.226
(対象外)竹原市10%0 (居住誘導なし)0

表 7 から読み取れること:

12. 整合性検証 (8 市別 vs 県全域)

狙い

本記事のメイン (8 市別 8 ファイルの統合) と、DoBoX 集約版 (県全域 ds=933) が同じデータを表していることを面積・ポリゴン数で検証する。差が大きいなら統合方法に欠陥がある可能性。

結果

図 10: 8 市別合計 vs 県全域 ds=933 整合性検証
図 10: 8 市別合計 vs 県全域 ds=933 整合性検証

図 10 から読み取れること:

表 8: 整合性データ詳細

データ源合計面積 km²polys 数備考
居住誘導 8市別 GeoJSON 積算285.014563本記事のメイン (8 市別 8 ファイルの居住誘導 KUIKI=1)
居住誘導 県全域 ds=933285.014563DoBoX 集約版 (重複コピー検証用)
都市機能誘導 8市別 GeoJSON 積算11.99131本記事のメイン (KUIKI=3)
都市機能誘導 県全域 ds=93311.99131DoBoX 集約版

13. 仮説検証と考察

仮説 H1〜H5 の検証結果まとめ

仮説主張主要結果判定
H1LIP 策定 8 市は人口集中型 — 県人口の 7-8 割を占める策定_8市人口千: 2324
21市町人口計千: 2762
策定_人口シェア_pct: 84.14
策定_平均人口千: 290.5
非策定_平均人口千: 36.5
支持
H2居住誘導 << 行政面積 (期待 5-10%)居住誘導_8市計_km2: 285.01
8市行政面積計_km2: 3688.0
居住誘導_行政比率_pct: 7.73
市町別平均_pct: 6.33
市町別最大: {'city': '広島市', 'pct': np.float64(15.22)}
支持
H3都市機能誘導 ⊆ 居住誘導 入れ子 (拠点ネットワーク型)重なり率_平均_pct: 0.0
重なり率_最小_市町: [{'city': '呉市', 'pct': 0.0}, {'city': '三原市', 'pct': 0.0}, {'city': '東広島市', 'pct': 0.0}]
都市機能_持つ市数: 5
解釈: 重なり0% は居住誘導と都市機能誘導が空間的に分離されている = 「居住域は中心市街地、都市機能は近接しているが別エリア」型LIP であり、広島県 8 LIP 市の幾何データで判明した重要な発見
反証 (重要発見: 分離型 LIP)
H4計画粒度 (居住誘導 polys 数) は 2 桁オーダーの差polys数_最大_市町: 広島市
polys数_最大値: 471
polys数_最小_市町: 府中市
polys数_最小値: 3
倍率: 157.0
支持
H5KUIKI_CD=2/4 は『境界線』データ (面ではなく実空間 0.1 km² 未満の細片)KUIKI=2_合計面積_km2: 0.3695
KUIKI=2_polys数: 8480
KUIKI=2_平均ポリゴン_km2: 4.4e-05
KUIKI=4_合計面積_km2: 0.3346
KUIKI=4_polys数: 512
支持

考察

(1) LIP 策定の選別ロジック (H1): 8 LIP 市の人口計 2324 千人は県人口の 84.1%。人口集中型に偏ることが定量的に確認できた。LIP は「人口減少社会への都市制度的応答」として、人口の多い市から優先的に策定される全国的傾向と整合する。ただし非策定の尾道市 (130 千人) や大竹市 (26 千人) のような規模では合致するのに策定しない例もあり、策定可否は人口だけでなく市町の財政・人的リソースにも左右されると推定。

(2) 居住誘導の精選性 (H2): 8 市の居住誘導/行政比率は 1.34%〜15% で、中央値は 3.8%。「市域全体に住む」のではなく「ここに集約する」という制度本質が表れている。政令市 (広島市 16%) と他 7 市 (1-9%) で差が顕著 で、都市規模が大きいほど居住誘導範囲も広い (面的応答)。

(3) 『分離型 LIP』の発見 (H3 の反証): 都市機能 ⊆ 居住誘導 入れ子率の平均は 0.0%。判定: 反証 (重要発見: 分離型 LIP)これは本研究の最も衝撃的な発見であり、「コンパクトシティ+ネットワーク」の理論的標準である拠点ネットワーク型 (都市機能 ⊆ 居住誘導) が広島県 8 LIP 市では成立していない。都市機能誘導を持つ 5 市すべてで、両区域は平均 2.4 km 離れて配置されている。解釈として: (a) 用途分離主義の踏襲、(b) 既存住宅地に居住誘導を合わせ、幹線沿いに都市機能誘導を新規誘導するため結果として地理分離、(c) 公共交通で結ぶ『ネットワーク』が前提なので分離しても問題ないという計画思想、が考えられる。今後、全国 LIP 策定市での横断検証でこのパターンが広島県固有か全国普遍かを確かめる必要がある。また竹原市は居住誘導なしで都市機能誘導のみの変則 LIP で、歴史町並み保全と整合する独自戦略と推定される。

(4) 計画粒度の哲学差 (H4): 居住誘導 polys 数は最大 4485 (広島市) vs 最小 3 (府中市) で1,495 倍の差。細密モデル化派 (広島・福山・東広島) と大括り派 (廿日市・呉・府中) に分かれ、これは計画担当部署の人的リソースと相関する仮説を支持。学術的には「同じ都市計画法に基づく計画の運用粒度が市町間でこれほど違う」事実は、比較都市計画研究の対象として興味深い。

(5) DoBoX 仕様の解読 (H5): KUIKI_CD=2/4 の境界線データは合計 0.7042 km² で実質ゼロ。polys 数では多数派 (8000+ 個) なのに面積はゼロに近く、1 ファイルに面と線が混在する DoBoX 仕様を実証。これは LIP データセットを使うすべての解析者が認識すべき仕様で、本記事の発見として is_area/is_line フラグ運用方法を残す。

(6) 統合 — 広島県の都市再構築スタンス: 8 LIP 市 + 12 非策定市町の二項対立は、広島県が「全市町一律の都市再構築」ではなく、「人口集中市優先・農村市町は別軸」の層別都市政策を採っていることを示す。本記事のデータからは、広島県の都市再構築は『集中させる方向』に明確に向いており、非策定市町の都市計画はL18 の市街化/調整 (区域区分制度) で枠を残すに留まる。L18 と L19 を合わせると、広島県の都市制度は「枠 (L18) ⊃ 居住誘導 (L19) ⊃ 都市機能 (L19)」の三段絞り込みになっており、都市再構築の精度が見えてくる。

14. 発展課題 (結果 X → 新仮説 Y → 課題 Z)

結果 X → 新仮説 Y → 発展課題 Z (要件 E)

X1. 結果: 8 市の居住誘導比率は 0%(竹原)〜16%(広島市) で大差

新仮説 Y1: 居住誘導比率は市町の人口減少率と相関するか? 人口減少が深刻な市は「集中させる必要が高い」ため、比率を高く設定するのではないか。

発展課題 Z1: e-Stat の R2 国勢調査と R7 中間人口推計から、 8 市の人口減少率を取得し、本記事の jukyo_in_admin_pct と相関を取る。 回帰分析で「人口減少率1%上昇 → 居住誘導比率 X%上昇」の係数を出す。 人口減少率 vs 居住誘導比率の散布で 8 市をプロットし、回帰直線+95%信頼区間を描画。

X2. 結果: 都市機能 ⊆ 居住誘導 入れ子率は0% — 5 市すべてで両区域が分離 (拠点ネットワーク型を反証)

新仮説 Y2: 広島県 LIP 市の「分離型」LIP は全国でどれだけ普遍的か? 全国 600+ LIP 策定市の中で、本記事と同じく都市機能誘導が居住誘導と分離している市は何割存在するか。 仮に過半数なら、「都市機能 ⊆ 居住誘導」入れ子は学術文献の理想であって、実装は別パターンと再定義する必要がある。

発展課題 Z2: 国交省の LIP データセット (全国版) を取得し、 全 LIP 市の居住誘導+都市機能誘導 GeoJSON を本記事と同じ手法で空間重なり率を算出。 分布ヒストグラムで「重なり 100% 派 (理論型)」「分離 0% 派 (本記事型)」「中間派 (部分入れ子型)」の三類型に分類。 全国比較で広島県 5 市の位置づけを確定。さらに 5 市の用途地域 (L17 連携)と都市機能誘導の重なりを検証し、 「都市機能誘導 = 商業地域である」仮説を空間データで実証する。

X3. 結果: 計画粒度は 4485 polys (広島市) vs 3 polys (府中市) で 1500 倍の差

新仮説 Y3: 細密モデル化は市民の参画度と相関するか? 細かい polys = ワークショップやパブコメで地域住民の意見を反映した結果なのではないか。

発展課題 Z3: 各市の LIP 策定文書 (公開 PDF) からパブリックコメント実施回数・参加者数を集計し、 本記事の polys 数と回帰。ワークショップ等の参画イベント数でも比較。 細密派 (広島・福山・東広島) は本当に市民参画が多いのか定量検証。

X4. 結果: 12 非策定市町は人口 6-130 千人で広く分布、LIP 策定の閾値が明確でない

新仮説 Y4: 非策定市町は5-10 年以内に LIP を策定するのではないか? 全国的に LIP 策定数は 2014 年から右肩上がりで、広島県内も追随しているはず。

発展課題 Z4: 国交省の LIP 策定状況リスト (年次更新) を時系列で取得し、 広島県の各市町の策定/策定中/未着手 状態を年ごとに追跡。 2025-2030 年に策定が予想される市町を特定し、本記事のデータと統合可能なシナリオを設計。

X5. 結果: 竹原市は居住誘導 0 km² で都市機能誘導のみの変則 LIP

新仮説 Y5: 竹原市の LIP は「観光・歴史保全特化」の特殊な戦略をとっているのではないか? 歴史的町並みを居住誘導で固定するより、都市機能 (商業・観光受入施設) のみ誘導するほうが 町並み保全と整合する。

発展課題 Z5: 竹原市の LIP 公開文書を読み込み、戦略の特殊性を質的分析。 全国 600+ LIP 策定市の中で、「居住誘導なし」の市町を発掘し、 そうした市町の共通点 (歴史町並み・観光地・小規模) を整理。

X6. 結果: KUIKI_CD=2/4 (境界線) は polys 多数派なのに面積ゼロ

新仮説 Y6: DoBoX の他のシリーズ (用途地域、市街化区域 等) でも同様の線データ混在がある可能性?

発展課題 Z6: L13/L15/L16/L17/L18 の DoBoX シリーズすべてで、 1 ポリゴン平均面積が 0.001 km² 未満のレコード件数を集計。 線データ混在の有無を全シリーズ横断で監査し、本記事と同じ is_area フラグの運用がどこで必要か明らかにする。