Lesson 17

L17 用途地域 21市町統合分析 — 広島県の Zoning 指定構造と都市プロファイル

都市計画用途地域Zoninggeopandask-means クラスタリング21市町統合21 dataset_id
所要 25-35 分(コード実行は約 1 分) / 想定レベル: リテラシ+(geopandas 入門済を想定、L15/L16 連携、k-means 初学) / データ: DoBoX 都市計画区域情報_区域データ_各種用途地域 21 件

データ取得手順

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

IDデータセット名
#444dataset #444
#794都市計画区域情報_区域データ_広島市_各種用途地域
#804都市計画区域情報_区域データ_呉市_各種用途地域
#811都市計画区域情報_区域データ_竹原市_各種用途地域
#821都市計画区域情報_区域データ_三原市_各種用途地域
#831都市計画区域情報_区域データ_尾道市_各種用途地域
#837都市計画区域情報_区域データ_福山市_各種用途地域
#847都市計画区域情報_区域データ_府中市_各種用途地域
#855都市計画区域情報_区域データ_三次市_各種用途地域
#861都市計画区域情報_区域データ_庄原市_各種用途地域
#867都市計画区域情報_区域データ_大竹市_各種用途地域
#875都市計画区域情報_区域データ_東広島市_各種用途地域
#885都市計画区域情報_区域データ_廿日市市_各種用途地域
#893都市計画区域情報_区域データ_安芸高田市_各種用途地域
#899都市計画区域情報_区域データ_江田島市_各種用途地域
#904都市計画区域情報_区域データ_府中町_各種用途地域
#910都市計画区域情報_区域データ_海田町_各種用途地域
#915都市計画区域情報_区域データ_熊野町_各種用途地域
#921都市計画区域情報_区域データ_坂町_各種用途地域
#932都市計画区域情報_区域データ_広島県_各種用途地域
#940都市計画区域情報_区域データ_北広島町_各種用途地域
#946都市計画区域情報_区域データ_世羅町_各種用途地域

実行コマンド:

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

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

1. 学習目標と問い

本レッスンは、広島県オープンデータポータル DoBoX の 「都市計画区域情報_区域データ_各種用途地域」シリーズ 21 件を 1 つに統合し、広島県の用途地域 (Zoning) 指定構造市町ごとの用途構成プロファイルを読み解く研究記事です。

研究問い (RQ)
広島県内の用途地域 (Zoning) は、住居・商業・工業の 3 類型でどう構成され、 市町ごとにどのような「用途構成プロファイル」を持つか?

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

仮説 H1〜H5(要件 D)

到達点

  1. 21 GeoJSON を 1 個の GeoDataFrame に統合し、YOTO_CD で 13 用途地域を識別する手法(L15/L16 と同パターン)
  2. dissolve(by="YOTO_CD") による用途地域の幾何統合と 連結成分数・市町またぎ数の計量
  3. 13 用途地域 → 4 類型の集約と 3 類型主題図での視覚化
  4. 市町別 用途構成プロファイル(4 類型比率ベクトル)の構築と 100% 積み上げ可視化
  5. k-means クラスタリング による 20 市町の都市プロファイル自動分類
  6. 整合性検証: 21 市町別ファイルと県全域 ds=932 のポリゴン単位の同一性確認
  7. 図 9 種・表 9 種で用途地域指定構造を多角的に提示
注: 本記事の対象範囲
本記事は 用途地域 (Zoning, 指定情報) に集中する。 区域階層上は L16 都計区域 ⊃ 用途地域 という入れ子関係であり、 用途地域は都計区域の内部にしか指定できない(白地は対象外)。
- L13: 「建物利用」(実建物の現況)と用途地域の mismatch 分析を扱う(本記事では扱わない)
- L15: 行政区域(市町境界)— 本記事の 分母/背景レイヤとして最小限参照
- L16: 都市計画区域(都市的整備対象の外枠)— 本記事の 背景レイヤとして参照
- L18: 市街化区域・市街化調整区域(線引き)— 別記事で扱う
他 4 シリーズと「合体」せず、用途地域シリーズ単独の研究記事としての完結を目指す。

2. 使用データ

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

データ仕様と YOTO_CD 凡例

項目
シリーズ都市計画区域情報_区域データ_各種用途地域
件数(カバー)21 dataset_id(市町別 20 + 県全域 1)
形式GeoJSON(ZIP 内同梱)
CRSEPSG:6671 (JGD2011 平面直角第III系) ※全 21 件で統一
列構造FID, TOKEI_CD, CITY_CD, YOTO_CD, geometry(5列、全 21 件で同一)
YOTO_CD 値域1〜13 の整数(13 用途地域)
ジオメトリ型Polygon
合計ポリゴン数2629(市町別 21 ファイル合計)/ 2629(県全域 ds=932)
本記事で扱うサイズ2629 ポリゴン × 9 列 ≈ 数 MB(軽量)

YOTO_CD 凡例(13 用途地域)

YOTO_CD用途地域名3類型カテゴリ本記事カラー用途の趣旨(建築基準法)
1第一種低層住居専用地域住居系  低層住宅専用、絶対高さ 10/12m 制限
2第二種低層住居専用地域住居系  低層住宅 + 小規模店舗(150㎡まで)
3第一種中高層住居専用地域住居系  中高層住宅専用、店舗は小規模のみ
4第二種中高層住居専用地域住居系  中高層住宅 + 中規模店舗(1500㎡まで)
5第一種住居地域住居系  住宅環境を主とし、3000㎡以下の店舗・事務所可
6第二種住居地域住居系  住宅環境を主とし、店舗・事務所等の用途緩和
7準住居地域住居系  道路沿道地域。住居 + 自動車関連施設
8近隣商業地域商業系  近隣住民の日用品供給。住宅と店舗の混在
9商業地域商業系  銀行・映画館・飲食店等の商業中核地区
10準工業地域工業系  軽工業 + 住宅 + 商業の混在用途
11工業地域工業系  工業中心、住宅可だが学校等は不可
12工業専用地域工業系  工業専用、住宅・店舗・学校全て不可
13田園住居地域田園系  2018 年改正で新設。農業 + 低層住宅の調和地域

21 dataset_id 一覧(直リンク)

市町タイプ海岸/内陸DoBoXページZIP保存先
広島市政令市海岸DoBoX #794data/extras/L17_use_zones/use_zone_794_広島市.zip
呉市海岸DoBoX #804data/extras/L17_use_zones/use_zone_804_呉市.zip
竹原市海岸DoBoX #811data/extras/L17_use_zones/use_zone_811_竹原市.zip
三原市海岸DoBoX #821data/extras/L17_use_zones/use_zone_821_三原市.zip
尾道市海岸DoBoX #831data/extras/L17_use_zones/use_zone_831_尾道市.zip
福山市海岸DoBoX #837data/extras/L17_use_zones/use_zone_837_福山市.zip
府中市内陸DoBoX #847data/extras/L17_use_zones/use_zone_847_府中市.zip
三次市内陸DoBoX #855data/extras/L17_use_zones/use_zone_855_三次市.zip
庄原市内陸DoBoX #861data/extras/L17_use_zones/use_zone_861_庄原市.zip
大竹市海岸DoBoX #867data/extras/L17_use_zones/use_zone_867_大竹市.zip
東広島市海岸DoBoX #875data/extras/L17_use_zones/use_zone_875_東広島市.zip
廿日市市海岸DoBoX #885data/extras/L17_use_zones/use_zone_885_廿日市市.zip
安芸高田市内陸DoBoX #893data/extras/L17_use_zones/use_zone_893_安芸高田市.zip
江田島市離島自治体海岸DoBoX #899data/extras/L17_use_zones/use_zone_899_江田島市.zip
府中町内陸DoBoX #904data/extras/L17_use_zones/use_zone_904_府中町.zip
海田町海岸DoBoX #910data/extras/L17_use_zones/use_zone_910_海田町.zip
熊野町内陸DoBoX #915data/extras/L17_use_zones/use_zone_915_熊野町.zip
坂町海岸DoBoX #921data/extras/L17_use_zones/use_zone_921_坂町.zip
北広島町内陸DoBoX #940data/extras/L17_use_zones/use_zone_940_北広島町.zip
世羅町内陸DoBoX #946data/extras/L17_use_zones/use_zone_946_世羅町.zip
広島県(全域集約)DoBoX #932data/extras/L17_use_zones/use_zone_932_広島県.zip

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

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

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

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

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

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L17_use_zones\fetch_use_zones.py

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

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

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

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

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

狙い

21 個の ZIP(市町ごとに別ファイル)を、プログラム上は 1 個の GeoDataFrame として扱える形にする。21 件すべてが同列構造(FID/TOKEI_CD/CITY_CD/YOTO_CD/geometry の 5 列)であることが事前監査で確認済みなので、和集合化なしで縦結合できる。L15(行政区域)・L16(都計区域)と全く同じパターン。

手法

直感: ZIP→geopandas→属性付与→concat→YOTO 展開 の 5 ステップ。重要な追加処理は、YOTO_CD(1〜13 の数値)を意味のある列に展開する点。数値だけ持っていても可視化や集計で名前が必要になるため、辞書 YOTO_INFO で 13 用途を全部定義してから map で展開する。

大筋(5 ステップ)

  1. 21 件の ZIP を 1 個ずつ load_geojson_zip() で読む
  2. 各 GeoDataFrame に source_city/source_dsid/coastal/ctype 列を付与
  3. 21 個を pd.concat で縦結合 → 2629 行 1 個
  4. to_crs(EPSG:6671) で広島県平面直角座標系に投影変換
  5. YOTO_INFO 辞書で YOTO_NAME / YOTO_TYPE 列を展開、面積計算

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

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

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

実装

 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
31
32
33
34
35
36
37
38
39
DATA_DIR = ROOT / "data" / "extras" / "L17_use_zones"
TARGET_CRS = "EPSG:6671"  # JGD2011 平面直角 III, 広島県, m 単位

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

# YOTO_CD 1-13 → (用途名, 3類型カテゴリ, カラー)
YOTO_INFO = {
    1:  ("第一種低層住居専用地域", "住居系", "#a6dba0"),
    2:  ("第二種低層住居専用地域", "住居系", "#7fbc41"),
    # ... 13 行
    13: ("田園住居地域", "田園系", "#ffd92f"),
}

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"use_zone_{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 = gpd.GeoDataFrame(pd.concat(frames, ignore_index=True),
                        geometry="geometry", crs=frames[0].crs)
zone = zone.to_crs(TARGET_CRS)             # m 単位 化
zone["YOTO_NAME"] = zone["YOTO_CD"].map(lambda c: YOTO_INFO[c][0])
zone["YOTO_TYPE"] = zone["YOTO_CD"].map(lambda c: YOTO_INFO[c][1])
zone["poly_area_km2"] = zone.geometry.area / 1e6

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

段階サイズこのデータで起きていること
① 元 ZIPZIP(中身は1個の .geojson)~2.4 MB広島市の 999 ポリゴンが GeoJSON 1 ファイルに格納(8 区にまたがる用途地域指定)
load_geojson_zip()GeoDataFrame999 行 × 5 列FID, TOKEI_CD, CITY_CD, YOTO_CD (1-13), geometry
③ 属性付与GeoDataFrame999 行 × 9 列source_city="広島市", source_dsid=794, coastal=True, ctype="政令市"
pd.concat(21 市町分)GeoDataFrame2629 行 × 9 列20 市町分のポリゴンが 1 枚に
to_crs(EPSG:6671)GeoDataFrame2629 行JGD2011 平面直角第III系(m 単位)に投影変換 → 面積計算可能化
⑥ YOTO_NAME / YOTO_TYPE 付与GeoDataFrame2629 行 × 11 列YOTO_CD を辞書で名前と 3 類型に展開
⑦ 面積計算GeoDataFrame2629 行 × 13 列poly_area_km2, poly_perim_km を追加

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

このステップで zone(2629 行 × 13 列)とken_gdf(県全域版 ds=932、2629 行)が用意できた。以降の分析は全部この 2 つだけで完結する。YOTO_CD 別ポリゴン数の概観は 5=578 件(最多: 第一種住居)、9=348 件(商業)、11=340 件(工業)と続く。

5. 分析2: 13 用途地域と 4 類型を集約する(dissolve + groupby)

狙い

21 個の市町別ファイルにバラバラに格納されている用途地域を、YOTO_CD(用途地域コード)でグルーピングして1 用途地域 = 1 単位にまとめる。これにより「県内に第一種住居地域は何 km² あるか」のような全県スケールの質問に答えられる。また 13 用途を 4 類型(住居系/商業系/工業系/田園系)に集約することで、都市計画思想の大枠が見えてくる。

手法(dissolve + 集約)

直感: 「同じ YOTO_CD を持つポリゴン同士を融合する」。例えば第一種住居地域(YOTO_CD=5)は 20 市町ファイルそれぞれに分散しており、dissolve(by="YOTO_CD") で 1 個の MultiPolygon に統合できる。これにより県全体での用途地域別面積が即座に分かる。

大筋

  1. zone.dissolve(by="YOTO_CD") で 13 個の MultiPolygon を作る
  2. 各 MultiPolygon の 連結成分数(部分数)を n_parts() で数える(島嶼や飛び地で分散している場合の数)
  3. 面積を計算(geometry.area / 1e6 で km² に)
  4. pd.crosstabYOTO_CD × source_city の表を作り、各用途地域がいくつの市町に導入されているか(cities_count)を算出
  5. YOTO_TYPE で 4 類型集計、シェア (%) を計算

入出力: 入力=2629 行の GeoDataFrame、出力 1 = 13 行の用途地域集約 GeoDataFrame、出力 2 = 4 行の 4 類型集計表

前提と限界: dissolve は同 YOTO_CD のポリゴンを幾何学的に融合するため、市町境界をまたいだ部分がシームとして残ることがある。本データでは事前にスナップ済みのため問題なし。
また、用途地域は都計区域内にしか指定できないため、本記事の zone 全体面積(≈ 489 km²)は L16 の都計区域面積(5,500 km²)よりずっと小さい。用途地域は都計区域の内部のさらに細分指定であることに注意。

実装

 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
# YOTO_CD 別にジオメトリを統合 (dissolve)
# → 「第一種住居地域」は 20 市町ファイルに分割されているが、
#   1 個の MultiPolygon にまとまる
zone_diss_yoto = zone.dissolve(by="YOTO_CD", aggfunc={
    "YOTO_NAME": "first",
    "YOTO_TYPE": "first",
}).reset_index()

# 連結成分数 (n_parts): 統合後の物理的な「部分」数
def n_parts(geom):
    if geom is None or geom.is_empty:
        return 0
    if geom.geom_type == "MultiPolygon":
        return len(list(geom.geoms))
    return 1
zone_diss_yoto["n_parts"]    = zone_diss_yoto.geometry.apply(n_parts)
zone_diss_yoto["area_km2"]   = zone_diss_yoto.geometry.area / 1e6
zone_diss_yoto["polys_count"] = zone_diss_yoto["YOTO_CD"].map(
    zone["YOTO_CD"].value_counts())
zone_diss_yoto["cities_count"] = zone_diss_yoto["YOTO_CD"].map(
    pd.crosstab(zone["YOTO_CD"], zone["source_city"]).gt(0).sum(axis=1))

# 4 類型集計
type_agg = zone.groupby("YOTO_TYPE").agg(
    polys_count=("poly_area_km2", "size"),
    area_km2=("poly_area_km2", "sum"),
).reset_index()
type_agg["share_pct"] = type_agg["area_km2"] / type_agg["area_km2"].sum() * 100

表(要件 G): 13 用途地域 集約一覧

なぜこの表か: 13 用途地域全体の俯瞰。「どの用途地域が県全体でどれだけ広く、何市町に導入されているか」を一覧で見る。

YOTO_CD用途地域名3 類型ポリゴン数面積 km²連結成分数導入市町数
1第一種低層住居専用地域住居系24663.4721116
2第二種低層住居専用地域住居系642.43648
3第一種中高層住居専用地域住居系31248.2729418
4第二種中高層住居専用地域住居系12919.1412010
5第一種住居地域住居系578161.8154820
6第二種住居地域住居系18520.3316314
7準住居地域住居系714.076915
9商業地域商業系34838.4826820
10準工業地域工業系15014.975916
11工業地域工業系34052.7431920
12工業専用地域工業系16834.3916117
13田園住居地域田園系3829.073712

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

表(要件 G): 4 類型 集計(住居系/商業系/工業系/田園系)

なぜこの表か: 13 用途を 4 類型に集約した粗視化ビュー。都市計画思想の大枠(住居中心 vs 商業中心 vs 工業中心)が一目で見える。

4 類型ポリゴン数面積 km²シェア %含む YOTO_CD 数
住居系1585319.5265.32%7
工業系658102.1020.87%3
商業系34838.487.87%1
田園系3829.075.94%1

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

6. 分析3: 主題図と small multiples で地理パターンを掴む

狙い

前セクションで識別した 13 用途地域を地図で可視化する。「県内のどこにどの用途地域が指定されているか」を直感的に掴む(要件 T)。

図 1: 13 用途地域 主題図(YOTO_CD 別カラー)

なぜこの図か(要件 H): 県全域に対して「13 用途地域の地理的配置」の基準ビュー。住居系(緑系)・商業系(赤橙)・工業系(紫)・田園系(黄)のカラーコーディングで 4 類型と 13 細分の両方が一目で分かる。

図1: 13 用途地域 主題図(YOTO_CD 別塗分け、行政区域は薄灰の背景)
図1: 13 用途地域 主題図(YOTO_CD 別塗分け、行政区域は薄灰の背景)

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

図 2: 4 類型 主題図 + 面積パイ

なぜこの図か: 13 用途は色数が多すぎて全体構造が見にくい。4 類型に粗視化することで、「住居系がほぼ全面、工業系は沿岸の塊、商業系は点的」という用途地域指定の 3 大空間パターンが一目で見える。右のパイチャートで面積構成比を数値化。

図2: 左=4 類型主題図(緑=住居系, 赤=商業系, 紫=工業系, 黄=田園系)、右=面積パイ
図2: 左=4 類型主題図(緑=住居系, 赤=商業系, 紫=工業系, 黄=田園系)、右=面積パイ

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

図 3: 13 用途地域 small multiples(同一スケール)

なぜこの図か: 主題図 1 枚だと色重なりで個別用途の地理パターンが見にくい。13 panels に分割し同一スケールで並べることで、「どの用途地域が県のどこに偏在するか」の地理パターンが各々クリアに見える。

図3: 13 用途地域 小マルチプル(同一スケールで全県俯瞰、ヘッダに面積・件数・市町数)
図3: 13 用途地域 小マルチプル(同一スケールで全県俯瞰、ヘッダに面積・件数・市町数)

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

7. 分析4: 13 用途地域の面積序列と平均ポリゴン規模

狙い

13 用途地域それぞれの「規模感」と「ポリゴン分割の細かさ」を比較する。面積大 = 主流用途、ポリゴン多 = 細分指定が多い など、面積とポリゴン数の関係から制度上の役割が見える。

手法

STEP1: 面積横棒
各 YOTO_CD の面積を横棒にし、3 類型でカラー分け。ポリゴン数と市町導入数を右側にラベルで並記する。

STEP2: ポリゴン数 × 平均面積(log-log)
x 軸=ポリゴン数(log)、y 軸=ポリゴン平均面積(log)。右上=「広いポリゴンが多い」 = 主流用途、左下=「狭いポリゴンが少ない」 = ニッチ用途。log-log にするのは値域が桁違い(数件〜数百件、0.01〜10 km²)なため。

図 4: 13 用途地域 面積バー + ポリゴン数×平均面積散布

なぜこの図か: 表(前セクション)の数値だけでは「規模感」が伝わらない。横棒で序列を、log-log で構造を見せる。主流 vs ニッチの構造がここで定量化される。

図4: 左=13 用途地域 面積バー(色=4 類型)、右=ポリゴン数×平均面積 (log-log)
図4: 左=13 用途地域 面積バー(色=4 類型)、右=ポリゴン数×平均面積 (log-log)

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

8. 分析5: 市町別 用途プロファイル + 工業の沿岸偏在

狙い

各市町を「用途構成プロファイル」として特徴付け、「住宅都市的」「工業都市的」「商業中核的」の都市タイプを可視化する。また工業系(YOTO 10/11/12)の沿岸偏在を仮説 H5 として詳細検証する。

手法

STEP1: 100% 積み上げ棒で 20 市町を比較
各市町の用途地域内訳を「住居系/商業系/工業系/田園系」の % にし、100% 積み上げ横棒として並べる。住居系比率昇順にソートすることで、「左ほど工業・商業・田園が多い特異な市町」が浮き上がる。

STEP2: 工業系 3 種クローズアップ
工業系(YOTO 10/11/12)だけを抽出し、左に主題図、右に市町ランキング棒。沿岸 vs 内陸の比較で偏在を定量化。

図 5: 20 市町 用途構成プロファイル 100% 積み上げ

なぜこの図か: 市町別の用途バランスを 1 枚で比較。「市町ごとに本当に都市タイプが異なるのか?」をビジュアルに直答する。

図5: 20 市町 用途地域構成 100% 積み上げ(住居系比率 昇順、右=用途地域 総面積)
図5: 20 市町 用途地域構成 100% 積み上げ(住居系比率 昇順、右=用途地域 総面積)

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

表(要件 G): 20 市町 用途構成プロファイル詳細(用途地域面積 降順)

なぜこの表か: 図 5 の数値版。指定密度(用途地域 / 行政面積)も同時に見ることで、「面積規模 vs 指定密度 vs 用途構成」の 3 軸を1表で確認できる。

市町ctype行政面積
km²
用途地域
合計 km²
指定密度 %住居
%
商業
%
工業
%
田園
%
主用途
広島市政令市957.4162.1516.9472.08.417.81.85住居系
福山市521.399.0018.9958.56.821.513.22住居系
呉市388.442.2010.8764.18.521.16.35住居系
東広島市634.735.695.6269.07.916.76.50住居系
尾道市295.929.039.8161.09.326.72.99住居系
廿日市市489.123.974.9075.26.418.40.00住居系
三原市478.616.553.4652.97.726.912.51住居系
府中市195.612.576.4351.64.936.27.30住居系
三次市777.69.881.2757.210.230.91.68住居系
大竹市78.79.7512.4056.25.412.525.99住居系
竹原市117.98.977.6159.23.726.310.87住居系
庄原市1246.57.740.6265.37.623.53.55住居系
府中町10.55.7154.5979.37.713.00.00住居系
熊野町33.65.5616.5291.72.06.30.00住居系
海田町14.05.4338.7057.421.720.90.00住居系
北広島町646.14.830.7530.88.061.20.00工業系
坂町24.53.8615.7460.51.537.90.00住居系
世羅町278.02.390.8656.719.024.30.00住居系
江田島市離島自治体99.92.112.1180.59.510.00.00住居系
安芸高田市538.11.790.3364.418.66.710.22住居系

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

図 6: 工業系 3 種クローズアップ + 市町別ランキング

なぜこの図か: 仮説 H5「工業系は沿岸偏在」を地図と棒グラフの両方で検証。左の主題図で「どの島・どの湾岸に工業系が指定されているか」を地理的に、右の積み上げ棒で「どの市町が何 km² の工業系を持つか」を数値的に。

図6: 左=工業系 3 種主題図(10/11/12 別色)、右=市町別 工業系面積ランキング
図6: 左=工業系 3 種主題図(10/11/12 別色)、右=市町別 工業系面積ランキング

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

表(要件 G): 市町別 工業系面積ランキング

市町沿岸/内陸10:準工業 km²11:工業 km²12:工業専用 km²工業系合計 km²
広島市海岸7.0414.337.4228.79
福山市海岸2.3912.306.5721.27
呉市海岸1.433.823.668.91
尾道市海岸0.783.843.157.76
東広島市海岸0.283.172.495.94
府中市内陸0.403.730.424.55
三原市海岸0.541.552.364.45
廿日市市海岸0.562.321.544.42
三次市内陸0.410.512.133.05
北広島町内陸0.120.342.492.96
竹原市海岸0.171.840.342.36
庄原市内陸0.191.050.581.82
坂町海岸0.111.080.271.46
大竹市海岸0.240.610.361.22
海田町海岸0.000.800.341.13
府中町内陸0.150.340.250.74
世羅町内陸0.150.420.010.58
熊野町内陸0.000.350.000.35
江田島市海岸0.000.210.000.21
安芸高田市内陸0.000.120.000.12

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

9. 分析6: 20 市町 small multiples + k-means クラスタリング

狙い

20 市町を用途プロファイル(4 類型比率ベクトル)で自動分類し、「住宅都市型」「工業都市型」「商業中核型」のような都市タイプを浮き上がらせる。また 20 市町それぞれの用途地域分布をsmall multiplesで並列表示し、市町ごとの形状を視覚比較する。

手法

STEP1: 20 市町 small multiples
20 panels に各市町の用途地域分布(4 類型カラー)を配置。各 panel はその市町の行政面積に最大化(個別スケール)。市町ごとの幾何形状(沿岸線・市街地・島嶼)と用途配置の関係を見せる。

STEP2: k-means クラスタリング
直感: 「20 市町を 4 類型比率ベクトル (住居 %, 商業 %, 工業 %, 田園 %) で「似た都市同士に分ける」」。k-means「k 個のグループ重心を反復で動かして、各点を最寄りの重心に割り当てる」クラスタリング手法(中身の数式は黒箱で OK、要件 J)。入出力: 入力=20 行 × 4 列の % ベクトル、出力=各市町に 0〜3 のクラスタ番号。
パラメータ k: 「いくつのグループに分けるか」を事前指定する数値。本記事では k=4 を採用(4 類型ある以上 4 程度が自然)。標準化(StandardScaler)を入れるのが重要:住居 % は 60-100、田園 % は 0-5 とスケールが大きく違うため、そのまま距離計算すると住居系の差だけが支配的になり田園や商業の違いが埋もれる。silhouette score でクラスタの分離度を 0-1 で評価(>0.5 が良好)。

実装

 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
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# 4 類型比率 (%) を特徴量に
feat_cols = ["住居系_pct", "商業系_pct", "工業系_pct", "田園系_pct"]
X = city_profile[feat_cols].fillna(0).values

# 標準化(各列を平均 0, 標準偏差 1 に)
# 住居系は 60-100% の範囲、田園系は 0-5% の範囲のように
# スケールが違うため、そのままユークリッド距離を使うと住居系で支配される
Xs = StandardScaler().fit_transform(X)

# k=4 で kmeans (4 プロファイル想定: 住居優勢/工業優勢/混在/田園濃厚 等)
KM_K = 4
km = KMeans(n_clusters=KM_K, random_state=42, n_init=10)
city_profile["cluster"] = km.fit_predict(Xs)

# クラスタごとの平均比率を計算しラベル化
# (どのクラスタが何優勢か、4 類型の最大値で名付け)
cluster_means = city_profile.groupby("cluster")[feat_cols].mean()
cluster_label = {}
for c, row in cluster_means.iterrows():
    dom = row.idxmax().replace("_pct", "")
    cluster_label[c] = f"C{c}: {dom}優勢 ({row[dom+'_pct']:.0f}%)"
city_profile["cluster_label"] = city_profile["cluster"].map(cluster_label)

図 7: 20 市町 用途地域 small multiples(4 類型カラー)

なぜこの図か: 市町ごとの用途地域配置の地理パターンを比較。small multiples で各市町個別の地形 (沿岸線/島/盆地) と用途指定の関係が見える。

図7: 20 市町 用途地域 small multiples(4 類型カラー、各市町個別スケール)
図7: 20 市町 用途地域 small multiples(4 類型カラー、各市町個別スケール)

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

図 8: k-means クラスタ choropleth + 散布図

なぜこの図か: small multiples だけでは市町間の類似性が分かりにくい。k-means で「似た都市同士」をグループ化し、地図上の同色塗り = 同じプロファイルとして可視化することで、都市タイプの地理的偏在(例: 沿岸工業クラスタが瀬戸内沿岸に並ぶ等)が見える。

図8: 左=k-means クラスタ choropleth、右=住居系比率×工業系比率 散布
図8: 左=k-means クラスタ choropleth、右=住居系比率×工業系比率 散布

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

表(要件 G): クラスタ別 市町一覧

なぜこの表か: クラスタが具体的にどの市町を含むかを明示。クラスタラベル(C0: 住居系優勢型 (住居60%), C1: 住居/工業系混在型 (住居59%/工業系26%), C2: 工業系優勢型 (住居31%/工業系61%), C3: 純住宅型 (住居78%))と各市町の数値を 1 表で照らし合わせる。

clusterラベル市町ctype用途地域
km²
住居
%
商業
%
工業
%
田園
%
0C0: 住居系優勢型 (住居60%)海田町5.457.421.720.90.00
0C0: 住居系優勢型 (住居60%)世羅町2.456.719.024.30.00
0C0: 住居系優勢型 (住居60%)安芸高田市1.864.418.66.710.22
1C1: 住居/工業系混在型 (住居59%/工業系26%)福山市99.058.56.821.513.22
1C1: 住居/工業系混在型 (住居59%/工業系26%)呉市42.264.18.521.16.35
1C1: 住居/工業系混在型 (住居59%/工業系26%)尾道市29.061.09.326.72.99
1C1: 住居/工業系混在型 (住居59%/工業系26%)三原市16.552.97.726.912.51
1C1: 住居/工業系混在型 (住居59%/工業系26%)府中市12.651.64.936.27.30
1C1: 住居/工業系混在型 (住居59%/工業系26%)三次市9.957.210.230.91.68
1C1: 住居/工業系混在型 (住居59%/工業系26%)大竹市9.856.25.412.525.99
1C1: 住居/工業系混在型 (住居59%/工業系26%)竹原市9.059.23.726.310.87
1C1: 住居/工業系混在型 (住居59%/工業系26%)庄原市7.765.37.623.53.55
1C1: 住居/工業系混在型 (住居59%/工業系26%)坂町3.960.51.537.90.00
2C2: 工業系優勢型 (住居31%/工業系61%)北広島町4.830.88.061.20.00
3C3: 純住宅型 (住居78%)広島市政令市162.272.08.417.81.85
3C3: 純住宅型 (住居78%)東広島市35.769.07.916.76.50
3C3: 純住宅型 (住居78%)廿日市市24.075.26.418.40.00
3C3: 純住宅型 (住居78%)府中町5.779.37.713.00.00
3C3: 純住宅型 (住居78%)熊野町5.691.72.06.30.00
3C3: 純住宅型 (住居78%)江田島市離島自治体2.180.59.510.00.00

この表から読み取れること: クラスタごとに用途構成の「型」が明確に分かれている。純住宅型 (住居 78%+)、住居/工業混在型 (住居 59% / 工業 26%)、住居系優勢型、工業系優勢型 (北広島町のみ)などが識別された。各クラスタが固有のシグネチャーを持ち、都市プロファイルが定量的に類型化できることを示し、仮説 H4 を支持。

10. 分析7: 21 市町別 vs 県全域 整合性検証

狙い

研究記事として「使ってるデータが信じられるか」を点検。DoBoX の市町別 21 ファイルと県全域 1 ファイル (ds=932) が同じものを別書式で出しているだけかを、ポリゴン数・面積・YOTO_CD 種類数の 3 指標で確認する。L15/L16 でも同じ検証を行ったが、用途地域はポリゴン数が桁違いに多い(2629件)ので、整合性は同じ精度で取れるか確認する意味がある。

手法

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

実装

L17_use_zones.py 行 1798–1823

 1
 2
 3
 4
 5
 6
 7
 8
 9
1807
1808
1809
1810
# 21 市町別合計
sum_city = zone["poly_area_km2"].sum()
n_city   = len(zone)

# 県全域版 ds=932
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=932 合計    : {sum_ken:.3f} km², {n_ken} ポリゴン")
print(f"差: {diff_pct:+.5f}%")

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

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

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

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

この図から読み取れること: 棒グラフで両者の高さがほぼ同じ → 視覚的にも整合性確認。L15 (行政区域)・L16 (都計区域)・L17 (用途地域) のすべてで市町別と県全域は同一マスターであることが共通する。DoBoX のデータ管理が県全域 → 市町別に分割配信する形態であることが推察される。

11. 仮説検証と考察

仮説検証 結果一覧

仮説主張判定根拠
H1住居系が過半を占め、商業系はわずか、工業系は瀬戸内沿岸に集中支持住居系_share_pct=65.32, 商業系_share_pct=7.87, 工業系_share_pct=20.87, 田園系_share_pct=5.94, 工業系_沿岸シェア_pct=86.12
H2近隣商業地域 (YOTO_CD=8) は広島県で指定がなく、商業地域 (9) に統合されている支持YOTO_8_polys=0, YOTO_8_area_km2=0.0, YOTO_9_polys=348, YOTO_9_area_km2=38.479
H3田園住居地域 (YOTO_CD=13、2018年新設) は導入が限定的で 50 件未満支持YOTO_13_polys=38, YOTO_13_area_km2=29.072, YOTO_13_cities=12
H4市町は用途構成プロファイルでクラスタ分類でき、住宅都市型/工業都市型/商業中核型などが存在支持k=4, silhouette_score=0.332, cluster_distribution={'C1: 住居/工業系混在型 (住居59%/工業系26%)': 10, 'C3: 純住宅型 (住居78%)': 6, 'C0: 住居系優勢型 (住居60%)': 3, 'C2: 工業系優勢型 (住居31%/工業系61%)': 1}
H5工業専用地域 (YOTO_CD=12) は瀬戸内沿岸の臨海工業地帯に強く偏在支持YOTO_12_total_km2=34.385, YOTO_12_沿岸_km2=28.496, YOTO_12_内陸_km2=5.889, YOTO_12_沿岸シェア_pct=82.87, top3_cities_km2={'広島市': 7.42, '福山市': 6.57, '呉市': 3.66}

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

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

  1. 住居系の圧倒的シェアは制度設計上の必然。都市計画法の用途地域は「住宅環境を保全しつつ商業・工業を共存させる」のが本旨で、住居系 7 種・商業系 2 種・工業系 3 種・田園系 1 種という細分配分自体が「住居中心」を志向している。広島県だけの特性ではなく全国的な傾向と推察。
  2. 近隣商業 (8) の不採用は広島県の運用上の特徴。近隣商業地域は『商業地域』と『第二種住居地域』の中間で、用途上の差別化が現場で曖昧になりやすい。広島県は『はっきり商業 (9) かはっきり住居 (6)』の二者択一運用を選んだとみられる。制度的選択肢を全部使う必要はないという用途地域運用の地域固有戦略のサンプル。
  3. 瀬戸内沿岸の工業専用 (12) 偏在は地理的必然。重化学工業・造船・鉄鋼などは港湾アクセスが必須。瀬戸内海の水深の深い良港がそのまま工業専用地域の指定地となった。歴史的に大竹(コンビナート)・福山(鉄鋼)・尾道因島(造船)の三大工業集積地が形成された結果。
  4. 田園住居 (13) の早期導入は地方都市の合理性。農業地帯の住宅化に対する『無秩序開発の予防』として、中山間と郊外を抱える広島県の市町には合致する制度。東広島市・尾道市・三原市など合併で広域化した市が活用しやすい。
  5. 市町プロファイルの 4 クラスタは政策上有用。クラスタ分類により「同種の市町同士で連携施策を設計」が可能になる。例: 純住宅クラスタ(府中町・熊野町・坂町)は通勤・福祉施策で連携、工業クラスタ(大竹・福山・尾道・呉)は産業政策で連携、等。

研究上の含意

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

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

課題1: 用途地域 13 種別の建築物実態とのズレ(L13 接続)

課題2: 田園住居地域 (YOTO=13) の急速普及プロセス

課題3: なぜ広島県は近隣商業 (YOTO=8) を一切使わないか

課題4: 工業専用 (YOTO=12) の沿岸偏在は将来も維持されるか

課題5: 市町クラスタ間の連携施策設計