Lesson 16

L16 都市計画区域 21市町統合分析 — 広島県の都市計画指定構造と広域圏域

都市計画都市計画区域geopandas広域指定白地分析21市町統合21 dataset_id
所要 20-30 分(コード実行は約 30 秒) / 想定レベル: リテラシ+(geopandas 入門済を想定、L15 連携) / データ: DoBoX 都市計画区域情報_区域データ_都市計画区域 21 件

データ取得手順

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

IDデータセット名
#787都市計画区域情報_区域データ_広島市_都市計画区域
#798都市計画区域情報_区域データ_呉市_都市計画区域
#808都市計画区域情報_区域データ_竹原市_都市計画区域
#815都市計画区域情報_区域データ_三原市_都市計画区域
#825都市計画区域情報_区域データ_尾道市_都市計画区域
#833都市計画区域情報_区域データ_福山市_都市計画区域
#841都市計画区域情報_区域データ_府中市_都市計画区域
#851都市計画区域情報_区域データ_三次市_都市計画区域
#857都市計画区域情報_区域データ_庄原市_都市計画区域
#863都市計画区域情報_区域データ_大竹市_都市計画区域
#869都市計画区域情報_区域データ_東広島市_都市計画区域
#879都市計画区域情報_区域データ_廿日市市_都市計画区域
#889都市計画区域情報_区域データ_安芸高田市_都市計画区域
#895都市計画区域情報_区域データ_江田島市_都市計画区域
#901都市計画区域情報_区域データ_府中町_都市計画区域
#906都市計画区域情報_区域データ_海田町_都市計画区域
#912都市計画区域情報_区域データ_熊野町_都市計画区域
#917都市計画区域情報_区域データ_坂町_都市計画区域
#923都市計画区域情報_区域データ_広島県_都市計画区域
#936都市計画区域情報_区域データ_北広島町_都市計画区域
#942都市計画区域情報_区域データ_世羅町_都市計画区域

実行コマンド:

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

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

1. 学習目標と問い

本レッスンは、広島県オープンデータポータル DoBoX の 「都市計画区域情報_区域データ_都市計画区域」シリーズ 21 件を 1 つに統合し、広島県の都市計画指定構造「○○圏都市計画区域」という広域指定の機能を読み解く研究記事です。

研究問い (RQ)
広島県内に指定された都市計画区域は、どのような種類・規模・行政市町との関係を持ち、 「広域都市計画区域(○○圏)」はどう機能しているか?

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

仮説 H1〜H5(要件D)

到達点

  1. 21 GeoJSON を 1 個の GeoDataFrame に統合し、 TOKEI_NAME でグループ化して 23 都市計画区域を識別する手法
  2. dissolve による広域圏域の幾何学的同定 (複数市町ファイルにまたがる同一名のポリゴンを1個にまとめる)
  3. 都市計画区域指定率(都計面積 / 行政面積)を市町別に計算する手法 —— L15 で構築した行政区域 GeoDataFrame を分母として再利用
  4. 「白地」を派生指標として可視化する手法(重ね合わせと Stacked bar)
  5. 整合性検証: 市町別ファイルと県全域ファイルのポリゴン単位の同一性を 0.001% 精度で確認
  6. 図 8 種・表 9 種で都市計画指定構造を多角的に提示
注: 本記事の対象範囲
本記事は 都市計画区域(区域が指定されているか/外か)に集中する。 区域内の用途地域(住居/商業/工業 等の細分指定)は L17市街化区域・市街化調整区域(線引き)は L18 で扱う。 本記事内では行政区域は「比率の分母」「ベースマップ」としてのみ参照し、 L15 と内容を重複させない。

2. 使用データ

本記事で使う 21 dataset_id(市町別 20 + 県全域 1)は、DoBoX で「都市計画区域情報」配下「区域データ」配下の 都市計画区域 シリーズである。列構造が 21 件すべてで完全に同一FID, TOKEI_CD, CITY_CD, TOKEI_NAME, geometry の 5 列)であることが事前監査で確認済みのため、pd.concat による単純な縦結合で県全域 GeoDataFrame が組み立てられる。

データ仕様

項目
シリーズ都市計画区域情報_区域データ_都市計画区域
件数(カバー)21 dataset_id(市町別 20 + 県全域 1)
形式GeoJSON(ZIP 内同梱)
CRSEPSG:6671 (JGD2011 平面直角第III系) ※全 21 件で統一
列構造FID, TOKEI_CD, CITY_CD, TOKEI_NAME, geometry(5列、全 21 件で同一)
TOKEI_CD 意味1=都市計画区域, 2=準都市計画区域
TOKEI_NAME「広島圏都市計画区域」「備後圏都市計画区域」「東広島都市計画区域」「湯来準都市計画区域」など
ジオメトリ型Polygon
合計ポリゴン数102(市町別 21 ファイル合計)/ 102(県全域 ds=923)
本記事で扱うサイズ102 ポリゴン × 5 列 ≈ 数 KB(軽量)

21 dataset_id 一覧(直リンク)

市町タイプ海岸/内陸DoBoXページZIP保存先
広島市政令市海岸DoBoX #787data/extras/L16_city_planning_zones/city_planning_787_広島市.zip
呉市海岸DoBoX #798data/extras/L16_city_planning_zones/city_planning_798_呉市.zip
竹原市海岸DoBoX #808data/extras/L16_city_planning_zones/city_planning_808_竹原市.zip
三原市海岸DoBoX #815data/extras/L16_city_planning_zones/city_planning_815_三原市.zip
尾道市海岸DoBoX #825data/extras/L16_city_planning_zones/city_planning_825_尾道市.zip
福山市海岸DoBoX #833data/extras/L16_city_planning_zones/city_planning_833_福山市.zip
府中市内陸DoBoX #841data/extras/L16_city_planning_zones/city_planning_841_府中市.zip
三次市内陸DoBoX #851data/extras/L16_city_planning_zones/city_planning_851_三次市.zip
庄原市内陸DoBoX #857data/extras/L16_city_planning_zones/city_planning_857_庄原市.zip
大竹市海岸DoBoX #863data/extras/L16_city_planning_zones/city_planning_863_大竹市.zip
東広島市海岸DoBoX #869data/extras/L16_city_planning_zones/city_planning_869_東広島市.zip
廿日市市海岸DoBoX #879data/extras/L16_city_planning_zones/city_planning_879_廿日市市.zip
安芸高田市内陸DoBoX #889data/extras/L16_city_planning_zones/city_planning_889_安芸高田市.zip
江田島市離島自治体海岸DoBoX #895data/extras/L16_city_planning_zones/city_planning_895_江田島市.zip
府中町内陸DoBoX #901data/extras/L16_city_planning_zones/city_planning_901_府中町.zip
海田町海岸DoBoX #906data/extras/L16_city_planning_zones/city_planning_906_海田町.zip
熊野町内陸DoBoX #912data/extras/L16_city_planning_zones/city_planning_912_熊野町.zip
坂町海岸DoBoX #917data/extras/L16_city_planning_zones/city_planning_917_坂町.zip
北広島町内陸DoBoX #936data/extras/L16_city_planning_zones/city_planning_936_北広島町.zip
世羅町内陸DoBoX #942data/extras/L16_city_planning_zones/city_planning_942_世羅町.zip
広島県(全域集約)DoBoX #923data/extras/L16_city_planning_zones/city_planning_923_広島県.zip

海岸/内陸 区分は本記事独自の分類(瀬戸内海岸線にポリゴンが接するかで決定)。三次市・庄原市・北広島町・世羅町・安芸高田市・府中市・府中町・熊野町は内陸。他は海岸を持つ。L15 と同じ分類を使うことで、L15-L18 の区域系記事間で参照軸を統一する。

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

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

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

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

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L16_city_planning_zones\fetch_city_planning_zones.py

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

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

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

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

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

狙い

21 個の ZIP(市町ごとに別ファイル)を、プログラム上は1個の GeoDataFrame として扱える形にする。21 件すべてが同列構造(FID/TOKEI_CD/CITY_CD/TOKEI_NAME/geometry の5列)であることが事前監査で確認済みなので、和集合化なしで縦結合できる。

手法

直感: ZIP→geopandas→属性付与→concat の4ステップ。ZIP は zipfile で開いて中身の .geojson を io.BytesIO に流し込み、それを geopandas.read_file に渡せば中間ファイルを書かずに直接読める。L15(行政区域)と全く同じパターンで実装する。これは「区域データシリーズ」が市町ごとの分割しか違わない統一スキーマだから可能。

大筋(5 ステップ)

  1. 21 件の ZIP を1個ずつ load_geojson_zip() で読む
  2. 各 GeoDataFrame に source_city/source_dsid/coastal/ctype 列を付与
  3. 21 個を pd.concat で縦結合 → 102 行 1 個
  4. to_crs(EPSG:6671) で広島県平面直角座標系に投影変換
  5. 面積(geometry.area)と周長(geometry.length)を列追加

入出力: 入力=21 ZIP、出力=102 行 × 11 列の GeoDataFrame 1 個。

前提と限界: 21 件の列構造が同一であることが大前提(事前監査で OK 確認済)。DoBoX が将来列を増やしても pd.concat は和集合化するため列が増えて NaN が出るだけで、既存処理には影響しない。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DATA_DIR = ROOT / "data" / "extras" / "L16_city_planning_zones"
TARGET_CRS = "EPSG:6671"  # JGD2011 平面直角 III, 広島県, m 単位

CITY_DEFS = [
    (787, "広島市", True, "政令市"),
    (798, "呉市",   True, "市"),
    # ... 計 20 行
]

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()))

frames = []
for dsid, name, coastal, ctype in CITY_DEFS:
    z = DATA_DIR / f"city_planning_{dsid}_{name}.zip"
    g = load_geojson_zip(z)
    g["source_city"] = name; g["source_dsid"] = dsid
    g["coastal"]     = coastal; g["ctype"]    = ctype
    frames.append(g)

zone_all = gpd.GeoDataFrame(pd.concat(frames, ignore_index=True),
                             geometry="geometry", crs=frames[0].crs)
zone_all = zone_all.to_crs(TARGET_CRS)             # m 単位 化
zone_all["poly_area_km2"] = zone_all.geometry.area / 1e6
zone_all["poly_perim_km"] = zone_all.geometry.length / 1e3

入出力 Before/After(具体例: ds=787 広島市)

段階サイズこのデータで起きていること
① 元 ZIPZIP(中身は1個の .geojson)~1 MB広島市の 36 ポリゴンが GeoJSON 1 ファイルに格納(8 区 + 区内分割)
load_geojson_zip()GeoDataFrame36 行 × 5 列FID, TOKEI_CD, CITY_CD, TOKEI_NAME, geometry。TOKEI_NAME は「広島圏都市計画区域」または「湯来準都市計画区域」
③ 属性付与GeoDataFrame36 行 × 9 列source_city="広島市", source_dsid=787, coastal=True, ctype="政令市"
pd.concat(21 市町分)GeoDataFrame102 行 × 9 列21 市町分のポリゴン全部が1枚に
to_crs(EPSG:6671)GeoDataFrame102 行JGD2011 平面直角第III系(m 単位)に投影変換 → 面積計算可能化
⑥ 面積計算GeoDataFrame102 行 × 11 列poly_area_km2, poly_perim_km を追加

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

このステップで zone_all(102 行 × 11 列)とken_gdf(県全域版 ds=923、102 行)が用意できた。以降の分析は全部この2つだけで完結する。

5. 分析2: TOKEI_NAME で広域圏域を同定する(dissolve)

狙い

21 個の市町別ファイルにバラバラに格納されている都市計画区域を、TOKEI_NAME(区域固有名)でグルーピングして1 区域 = 1 単位にまとめる。これにより広島圏のような複数市町をまたぐ広域指定を初めて1個の幾何体として扱える。本記事の最重要ステップ。

手法(dissolve による幾何統合)

直感: 「同じ TOKEI_NAME を持つポリゴン同士を融合する」。例えば広島圏都市計画区域は、広島市・廿日市市・大竹市・東広島市・海田町・府中町・熊野町・坂町の 8 市町ファイルに分割されている。これを dissolve(by="TOKEI_NAME") で1 個の MultiPolygon に統合できる(全市町境界線が消えて1個の広域区域として可視化できる)。

大筋

  1. zone_all.dissolve(by="TOKEI_NAME") で 23 個の MultiPolygon を作る
  2. 各 MultiPolygon の 連結成分数(部分数)を n_parts() で数える(島嶼や飛び地で分散している場合の数)
  3. 面積・周長・円形度を計算
  4. pd.crosstabTOKEI_NAME × source_city の表を作り、各区域がいくつの市町をまたぐか(cities_count)を算出
  5. cities_count >= 2 なら広域、=1 なら単一市町に分類

入出力: 入力=102 行の GeoDataFrame、出力=23 行の集約 GeoDataFrame(区域単位)。

前提と限界: dissolve は同名ポリゴンを幾何学的に融合するため、市町境界をまたいだ部分が「シーム」として残る場合がある。本データでは事前にスナップ済みのため問題なし。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# TOKEI_NAME 別にジオメトリを統合 (dissolve)
# → 例えば「広島圏都市計画区域」は 8 市町ファイルに分割されているが、
#   1 個の MultiPolygon にまとまる
zone_diss_name = zone_all.dissolve(by="TOKEI_NAME", aggfunc={
    "TOKEI_CD": "first",
}).reset_index()

# 連結成分数 (n_parts): 統合後の物理的な「部分」数
def n_parts(geom):
    if geom.geom_type == "MultiPolygon":
        return len(list(geom.geoms))
    return 1
zone_diss_name["n_parts"] = zone_diss_name.geometry.apply(n_parts)

# 面積・円形度
zone_diss_name["area_km2"]  = zone_diss_name.geometry.area / 1e6
zone_diss_name["perim_km"]  = zone_diss_name.geometry.length / 1e3
zone_diss_name["compactness"] = (4*np.pi*zone_diss_name["area_km2"]*1e6) \
                                / (zone_diss_name["perim_km"]*1e3)**2

# 各 TOKEI_NAME がいくつの市町をまたぐか
crosstab_zc = pd.crosstab(zone_all["TOKEI_NAME"], zone_all["source_city"])
zone_diss_name["cities_count"] = zone_diss_name["TOKEI_NAME"].map(
    crosstab_zc.gt(0).sum(axis=1))

# 広域 vs 単一の判定
zone_diss_name["scope"] = zone_diss_name["cities_count"].apply(
    lambda n: "広域(複数市町)" if n >= 2 else "単一市町")

表(要件 G): 23 都市計画区域 集約一覧(面積降順)

なぜこの表か: 23 区域全体の俯瞰。各区域が広域か単一か、面積・形状はどうかを一覧で比較する。

TOKEI_NAME区域種別構成市町数面積 km²連結成分数円形度scope
広島圏都市計画区域都市計画区域8692.130.053広域(複数市町)
備後圏都市計画区域都市計画区域4530.8110.047広域(複数市町)
東広島都市計画区域都市計画区域1351.710.284単一市町
竹原都市計画区域都市計画区域1117.940.112単一市町
三次圏都市計画区域都市計画区域190.510.112単一市町
川尻安浦都市計画区域都市計画区域179.560.205単一市町
因島瀬戸田都市計画区域都市計画区域172.480.096単一市町
安芸津都市計画区域都市計画区域165.080.189単一市町
本郷都市計画区域都市計画区域157.310.213単一市町
河内都市計画区域都市計画区域151.410.089単一市町
庄原都市計画区域都市計画区域144.010.226単一市町
佐伯都市計画区域都市計画区域139.710.121単一市町
江田島都市計画区域都市計画区域135.510.056単一市町
宮島都市計画区域都市計画区域130.210.314単一市町
千代田都市計画区域都市計画区域129.210.241単一市町
東城都市計画区域都市計画区域127.810.376単一市町
御調都市計画区域都市計画区域123.210.097単一市町
世羅甲山都市計画区域都市計画区域114.510.121単一市町
吉田都市計画区域都市計画区域112.910.327単一市町
音戸都市計画区域都市計画区域112.510.050単一市町
上下都市計画区域都市計画区域17.010.300単一市町
湯来準都市計画区域準都市計画区域14.650.025単一市町
西城都市計画区域都市計画区域14.410.313単一市町

この表から読み取れること

表(要件 G): 広島圏都市計画区域 構成 8 市町

なぜこの表か: 「広島圏」と一口に言っても、各市町がどれだけの面積を寄与しているかを定量化する。

構成市町都計指定面積 km²
広島市400.51
呉市145.51
廿日市市48.54
熊野町33.64
大竹市23.98
坂町15.69
海田町13.75
府中町10.46

この表から読み取れること: 広島市が約 4 割を占めるが、東広島市・廿日市市・大竹市も大きく寄与。東広島市など合併で広域化した市が、独自の都計区域(東広島都市計画区域)と広島圏の両方に所属するのは、都市計画上の多重指定の例。

表(要件 G): 備後圏都市計画区域 構成 4 市町

構成市町都計指定面積 km²
福山市335.12
三原市86.90
尾道市74.15
府中市34.61

この表から読み取れること: 福山市が圧倒的(県東部の中核)。三原市・尾道市・府中市が補完する。備後地域の4市連携の経済・通勤圏がそのまま都市計画上の広域指定として表現されている。

6. 分析3: 主題図と広域圏域のクローズアップ

狙い

前セクションで識別した 23 区域を地図で可視化する。「県内のどこにどの都市計画区域が指定され、広域圏はどう広がっているか」を直感的に掴む(要件 T)。

図 1: 23 都市計画区域 主題図(TOKEI_NAME 別カラー)

なぜこの図か(要件 H): 県全域に対して「どの色塗りでどの区域か」の基準ビュー。以降のすべての分析はこの位置感覚を前提にする。色分けは TOKEI_NAME 別、上位の主要区域を固有色(広島圏=赤、備後圏=青、三次圏=紫、東広島=緑、湯来準=橙)で示し、行政区域境界も薄く重ねる。

図1: 23 都市計画区域 主題図 (TOKEI_NAME 別塗り分け)
図1: 23 都市計画区域 主題図 (TOKEI_NAME 別塗り分け)

この図から読み取れること(要件 F)

図 2: 広島圏・備後圏のクローズアップ + 構成市町

なぜこの図か: 広域指定 2 区域の正確な空間範囲どの市町をどこまで含むかを、構成市町の輪郭と並べて見せる。

図2: 左=広島圏(赤)+8市町、右=備後圏(青)+4市町
図2: 左=広島圏(赤)+8市町、右=備後圏(青)+4市町

この図から読み取れること

7. 分析4: 都計指定率 choropleth と白地マップ

狙い

市町ごとに「行政区域全体に占める都計指定の割合」を計算する。都市計画区域に指定されない領域は白地と呼び、都市計画法の主要な開発・建築規制が適用されない。白地の地理的分布が、広島県の都市計画の地理的偏りを直接示す。

手法

直感: 「分子=都計指定面積、分母=行政区域面積」で割り算。分母はL15で構築した行政区域 GeoDataFrameを再利用する。L15 を「合体」するのではなく、分母としてだけ参照するのがポイント。

大筋

  1. 行政区域を admin_all.dissolve(by="city") で 20 市町合計面積に集約
  2. 都計区域を zone_all.groupby("source_city").sum() で市町別合計面積に
  3. 両者をマージして zone_ratio_pct = zone_area / admin_area * 100
  4. white_area = admin_area - zone_area で白地面積

前提: 行政区域も都計区域も 同じ EPSG:6671(m 単位)で投影変換済み。面積計算が単位整合的にできる。

実装

L16_city_planning_zones.py 行 1182–1221

 1
 2
 3
 4
 5
 6
 7
 8
 9
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
# 行政区域 (L15 と共有) を読み、市町別合計面積を計算
admin_diss = admin_all.dissolve(by="city").reset_index()
admin_diss["admin_area_km2"] = admin_diss.geometry.area / 1e6

# 市町別 都計指定面積
city_zone_agg = zone_all.groupby("source_city").agg(
    n_polys=("poly_area_km2", "size"),
    zone_area_km2=("poly_area_km2", "sum"),
    n_zone_names=("TOKEI_NAME", "nunique"),
).reset_index().rename(columns={"source_city": "city"})

# 行政面積をマージし、指定率を算出
admin_areas = admin_diss.set_index("city")["admin_area_km2"]
city_zone_agg["admin_area_km2"] = city_zone_agg["city"].map(admin_areas)
city_zone_agg["zone_ratio_pct"] = (
    city_zone_agg["zone_area_km2"] / city_zone_agg["admin_area_km2"] * 100
)
city_zone_agg["white_area_km2"] = (
    city_zone_agg["admin_area_km2"] - city_zone_agg["zone_area_km2"]
)

図 3: 市町別 都計指定率 choropleth + 白地マップ

なぜこの図か: choropleth は「どの市町が高指定率か」の概観、右の白地マップは「県全域でどこに指定外の山林・田畑が残っているか」を視覚化。色を変えることで「都計優勢」と「白地優勢」のコントラストが立体的に伝わる。

図3: 左=指定率 choropleth(赤=低、緑=高)、右=都計エリア(緑)と白地(灰)
図3: 左=指定率 choropleth(赤=低、緑=高)、右=都計エリア(緑)と白地(灰)

この図から読み取れること

表(要件 G): 市町別 都計指定率(指定率降順)

なぜこの表か: choropleth の数値版。指定率の高低をランキング形式で確認。

市町ctype行政面積 km²都計面積 km²白地 km²指定率 %区域種別数
熊野町33.633.6-0.0100.01
府中町10.510.5-0.0100.01
竹原市117.9117.90.0100.01
海田町14.013.70.397.91
東広島市634.7468.2166.573.83
福山市521.3335.1186.164.31
坂町24.515.78.864.01
呉市388.4237.5150.961.23
尾道市295.9169.8126.157.43
広島市政令市957.4405.1552.342.32
江田島市離島自治体99.935.564.435.61
大竹市78.724.054.730.51
三原市478.6144.2334.430.12
廿日市市489.1118.4370.724.23
府中市195.641.6154.021.32
三次市777.690.5687.111.61
庄原市1246.576.21170.36.13
世羅町278.014.5263.55.21
北広島町646.129.2616.94.51
安芸高田市538.112.9525.22.41

この表から読み取れること

図 4: 23 都市計画区域 small multiples

なぜこの図か: 一覧表だけだと各区域の幾何形状が見えない。23 panels で並べて見ることで、大都市圏型・島嶼型・中山間型の形状の違いが一目で対比できる。

図4: 23 都市計画区域 個別形状(パネルごとに最大化、スケール非統一)
図4: 23 都市計画区域 個別形状(パネルごとに最大化、スケール非統一)

この図から読み取れること

8. 分析5: 行政区域との関係(重ね合わせ + 散布相関)

狙い

都市計画区域は人口・産業集中地に偏在するという仮説(H4)を、行政区域との重ね合わせと散布図で確かめる。「面積の大きい中山間市町ほど指定率が低い」という負の相関が見える。

手法

STEP1: 行政区域に都計区域を重ねる
L15 で作った行政区域(ctype 別カラー)の上に、都計区域を半透明黒で重ねる。「色が濃いところが都計指定範囲」として直感把握。純粋な「重ね合わせマップ」で、関係性が即座に見える。

STEP2: 行政面積 × 指定率の散布図
x軸=行政面積(log スケール)、y軸=指定率(%)。負の傾向があれば「大きな市町ほど都計指定が小さい比率」=「中山間広域市町は白地優勢」を支持。Spearman 順位相関係数で定量化(パラメトリックでない順位ベースなので、外れ値(広島市)に頑健)。

図 5: 行政 vs 都計 重ね合わせ + 散布図

なぜこの図か: 重ね合わせは「視覚的相関」、散布は「数値的相関」。両方を並べることで「色で見ても数で見ても同じ結論」を学習者が確信できる。

図5: 左=行政(色) + 都計(黒オーバレイ)、右=行政面積(log) × 指定率
図5: 左=行政(色) + 都計(黒オーバレイ)、右=行政面積(log) × 指定率

この図から読み取れること

図 6: TOKEI_NAME 別 面積バー + 連結成分散布

なぜこの図か: 23 区域の面積規模序列を一目で見せ、右で「広域は分散しがち、単一は集約的」のパターンを散布で示す。

図6: 左=面積ランキング(赤=広域,橙=準,青=単一)、右=面積×連結成分
図6: 左=面積ランキング(赤=広域,橙=準,青=単一)、右=面積×連結成分

この図から読み取れること

9. 分析6: 整合性検証 + 市町別 都計 vs 白地 積み上げ

STEP1: 整合性検証(21 市町別 vs 県全域 ds=923)

狙い: 研究記事として「使ってるデータが信じられるか」を点検。DoBoX の市町別 21 ファイルと県全域 1 ファイルが同じものを別書式で出しているだけかを、ポリゴン数・面積・TOKEI_NAME種類数の3指標で確認する。

手法: 「足し算が合うかチェック」。zone_all['poly_area_km2'].sum()ken_gdf['poly_area_km2'].sum() を比較し、± 0.001% 以内なら同一マスター由来と結論できる。

実装

L16_city_planning_zones.py 行 1372–1397

 1
 2
 3
 4
 5
 6
 7
 8
 9
1381
1382
1383
1384
# 21 市町別合計
sum_city = zone_all["poly_area_km2"].sum()
n_city   = len(zone_all)

# 県全域版 ds=923
sum_ken  = ken_gdf["poly_area_km2"].sum()
n_ken    = len(ken_gdf)

# 差
diff_pct = (sum_city - sum_ken) / sum_ken * 100
print(f"21 ファイル合計: {sum_city:.3f} km², {n_city} ポリゴン")
print(f"ds=923 合計   : {sum_ken:.3f} km², {n_ken} ポリゴン")
print(f"差: {diff_pct:+.5f}%")

表(要件 G): 整合性検証レポート

ソース面積 km²ポリゴン数TOKEI_NAME 種類備考
21 市町別 GeoJSON 積算2,394.24810223本記事のメインデータ
県全域 ds=923 GeoJSON2,394.24810223DoBoX 集約版(重複コピー検証用)

この表から読み取れること

図7: 左=面積比較、右=ポリゴン数比較(両者完全一致)
図7: 左=面積比較、右=ポリゴン数比較(両者完全一致)

この図から読み取れること: 棒グラフで両者の高さがほぼ同じ → 視覚的にも整合性確認。

STEP2: 市町別 都計 vs 白地 積み上げ

狙い: 各市町の行政面積を「都計指定」と「白地」の2区分に分けて、積み上げ棒で並べる。ランキング順を「行政面積」にすることで、面積規模と指定率の関係が立体的に見える。

なぜこの図か: 単純な指定率 choropleth(図3)よりも、「絶対量と比率を同時に見せる」のが Stacked bar の利点。「庄原市は 1,247km² の93% が白地」のような絶対面積の大きな白地が圧倒的視覚インパクトで伝わる。

図8: 市町別 都計(緑) vs 白地(灰) 積み上げ(行政面積順、右数字=指定率)
図8: 市町別 都計(緑) vs 白地(灰) 積み上げ(行政面積順、右数字=指定率)

この図から読み取れること

10. 仮説検証と考察

仮説検証 結果一覧

仮説主張判定根拠
H1広島県の市町は約3割しか都計指定されておらず、中山間地は白地が支配的支持total_zone_km2=2394.2, total_admin_km2=7826.5, ratio_pct=30.59, mountain_cities_avg_ratio_pct=5.98, mountain_cities_max_ratio_pct=11.64
H2「○○圏都市計画区域」は複数市町をまたぐ広域指定として機能する部分支持(広島圏8・備後圏4は広域、三次圏は1市町のみで例外)ken_zones=['広島圏都市計画区域', '備後圏都市計画区域', '三次圏都市計画区域'], ken_zones_with_multi_cities=['広島圏都市計画区域', '備後圏都市計画区域'], hiroshima_ken_cities=8, bingo_ken_cities=4, miyoshi_ken_cities=1
H321 市町別と ds=923 はポリゴン数・面積で完全一致する支持city_polys=102, ken_polys=102, city_area=2394.248, ken_area=2394.248, diff_pct=-0.0
H4小面積の都市部の町はほぼ全域指定、大面積の中山間市町は低指定率支持small_town_avg_ratio_pct=61.95, big_inland_avg_ratio_pct=5.98, spearman_rho_admin_area_vs_ratio=-0.571, spearman_p=0.0085
H5TOKEI_CD=2 (準都計区域) は周縁的で広島市湯来地区限定支持quasi_count=1, quasi_total_area_km2=4.58, quasi_share_pct=0.1914, quasi_zones=['湯来準都市計画区域']

この表から読み取れること

考察: なぜこの構造になったか

  1. 都市計画区域は人口集中地への限定指定。都市計画法の本来の目的が「都市的土地利用の規制と誘導」であるため、農地・山林(白地)には適用しないのが立法趣旨。中山間地域の白地が多いのは制度的な「設計通り」。
  2. 「○○圏」は経済圏の都市計画的表現。広島圏は通勤・商業・教育で一体化した広島大都市圏、備後圏は福山市を核とする備後経済圏。両者とも複数市町が連携して土地利用を計画する制度的枠組み。
  3. 瀬戸内多島海地形が都計区域を分散させる。備後圏(11部)、因島瀬戸田(8部)、安芸津(8部)、川尻安浦(6部)など島嶼を複数含む区域は連結成分数が多い。離島の都市計画は本土と分離した部分指定として立てる必要があった歴史的経緯。
  4. 合併と都計区域の継承: 平成大合併で東広島市・尾道市・三原市・廿日市市・庄原市などは複数の旧町を吸収。旧町ごとの都計区域名が残されたまま統合されたため、1 市町が複数の TOKEI_NAME を持つ状態に。尾道市は『因島瀬戸田』『御調』『備後圏』の 3 つを継承。
  5. 準都市計画区域の使われ方: 広島市湯来準のみで、「準」という制度自体が広島県内ではほぼ未活用。都市計画区域外の山間部における予防的指定として湯来温泉エリアにのみ適用。

研究上の含意

11. 発展課題(結果X → 新仮説Y → 課題Z の3段)

各課題は「結果X → 新仮説Y → 課題Z」の3段で書く(要件E)。

課題1: 広島圏 8 市町の都計内部多様性を測る

課題2: 「圏」と名付けられた 3 区域の命名理由を歴史的に追跡

課題3: 白地(指定外)の地理的特性を地形・人口で説明する

課題4: 23 都市計画区域内の用途地域比率を比較(L17 への接続)

課題5: 広島圏と備後圏の境界部の都計指定パターンを比較する