Lesson 24

L24 農地転用状況 17件 統合分析 — 広島県内の農地が非農地に変わるパターン

都市計画農地転用農用地区域17市町統合規模分布パレート構造geopandasDoBoX図面精度都市計画基礎調査
所要 30〜40 分 / 想定レベル: 中級 (GIS + 都市計画 + データ品質) / データ: DoBoX 農地転用状況 17件 (#1391-1407)

データ取得手順

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

IDデータセット名
#222dataset #222
#333dataset #333
#444dataset #444
#600雪崩危険箇所情報_北広島町
#666dataset #666
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1391都市計画区域情報_農地転用状況_安芸高田市_2016-2020
#1392都市計画区域情報_農地転用状況_熊野町_2016-2020
#1393都市計画区域情報_農地転用状況_呉市_2016-2020
#1394都市計画区域情報_農地転用状況_広島市_2016-2020
#1395都市計画区域情報_農地転用状況_江田島市_2016-2020
#1396都市計画区域情報_農地転用状況_三原市_2016-2020
#1397都市計画区域情報_農地転用状況_三次市_2016-2020
#1398都市計画区域情報_農地転用状況_庄原市_2016-2020
#1399都市計画区域情報_農地転用状況_世羅町_2016-2020
#1400都市計画区域情報_農地転用状況_大竹市_2016-2020
#1401都市計画区域情報_農地転用状況_竹原市_2016-2020
#1402都市計画区域情報_農地転用状況_東広島市_2016-2020
#1403都市計画区域情報_農地転用状況_廿日市市_2016-2020
#1404都市計画区域情報_農地転用状況_尾道市_2016-2020
#1405都市計画区域情報_農地転用状況_府中市_2016-2020
#1406都市計画区域情報_農地転用状況_福山市_2016-2020
#1407都市計画区域情報_農地転用状況_北広島町_2016-2020

実行コマンド:

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

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

1. 学習目標と問い

本記事は、広島県インフラマネジメント基盤 DoBoX が公開する 「都市計画区域情報_農地転用状況」シリーズ 17 件 (#1394, #1393, #1406, #1402, #1403, #1404, #1396, #1401, #1405, #1400, #1397, #1398, #1391, #1395, #1392, #1407, #1399) を縦結合し、2016-2020 年の広島県内 17 市町の 農地転用対象ポリゴン 計 14,459 件 (合計 155,111 ha = 1551 km²) から、広島県内の「農地が非農地に変わるパターン」 ── 全県転用配置・市町別パターン・ 規模分布・KUIKI_CD 別の都市計画区域階層別 ── を分析する研究記事である。 全 20 市町中 3 町 (府中町・海田町・坂町) は農地転用対象なし ─ 都市部 100% で 都市計画基礎調査の対象農地が無い ─ そのコントラストも分析対象とする。

研究の問い (RQ): 広島県内 17 市町の農地転用は、面積規模・地理分布・市町別パターン・ KUIKI_CD 別の観点でどのような構造を持ち、何が農地を非農地に変えているか? 「都市の拡張」と「中山間の縮退」のどちらが県内の対象農地分布の主体か?

仮説 H1〜H6

独自用語の定義 (本レッスン内のみ)

到達点

  1. 17 ZIP の農地転用 GeoJSON を 1 個の GeoDataFrame (14,459 polygon × 7 列 + 派生 5 列) に縦結合できる。 AREA 列は pd.to_numeric(errors="coerce") で安全に数値化する手順を学ぶ。
  2. 14,459 polygon から、市町単位の総面積・件数・密度・転用率の 集計を groupby で実装する。
  3. 農地転用ポリゴンを geopandas.plot()主題図 (choropleth) + バブル図化し、地理分布を可視化する。
  4. 17 市町 small multiples で「市町ごとの農地転用配置パターン」を一目で比較。
  5. 規模クラス × 市町 のクロス集計とパレート図で、 「大規模区画が面積を支配する」構造を定量化する。
  6. 仕様書未公開の KUIKI_CD / TOKEI_CD / AREA 単位を、 実データの分布と整合性検証から「自分で解読する」体験。
  7. 3 町 (府中町・海田町・坂町) と 17 市町を対比して、 「農地転用対象が無いことの地理的意味 = 都市部 100%」を理解する。

本記事のスコープ宣言

本記事は農地転用状況 17 件のみを主データとする研究記事である。 同じ都市計画基礎調査シリーズの農林漁業関係施策 (L25, 17 件) は次記事で扱う (本記事と合体させない、要件 I 違反の水増し回避)。 都市計画区域階層との対比 (KUIKI_CD 解読) のため、 17 市町行政区域 (L15 既取得) のみ背景レイヤーとして利用するが、 L15 都市計画区域記事と論点を重複させない。

2. 使用データ

農地転用状況 17 件はそれぞれ 1 市町分の 農地転用ポリゴン GeoJSON (Polygon) を ZIP で配布している。列構造は 17 件で 100% 一致 (7 列)。 データは2016-2020 年の 5 年間を対象、 都市計画法に基づく都市計画基礎調査の結果として公表されている。

17 dataset_id 一覧 (農地転用あり 17 市町)

dataset_id市町市町タイプ地理タイプ DoBoX 件数AREA合計(ha)AREA最大(ha) 0件CITY_CDKUIKI_CD
#1394広島市政令市都市DoBoX2725,5921,114.248105,106,107,1080,1,2,5,6
#1393呉市中核市都市DoBoX2255,471981.9262020,1,2,3,4
#1406福山市中核市都市DoBoX6889,9401,909.32142070,1,2
#1402東広島市施行時特例市都市DoBoX1,00314,8061,605.35802120,1,2,3,4
#1403廿日市市都市DoBoX2663,308770.8472130,3,4
#1404尾道市都市DoBoX8528,0141,219.22902050,1,2,3,4
#1396三原市都市DoBoX2648,9762,310.3102040,1,2,3,4
#1401竹原市都市DoBoX8,8791,3605.41,1972033,4
#1405府中市都市DoBoX1583,6041,070.1132080,1,2,3,4
#1400大竹市都市DoBoX33441101.102110
#1397三次市中山間DoBoX46617,0731,473.8142090,3,4
#1398庄原市中山間DoBoX30446,71019,230.6172100,3,4
#1391安芸高田市中山間DoBoX11412,1836,591.652140,3,4
#1395江田島市離島DoBoX1422,750364.4132150,3,4
#1392熊野町近郊町DoBoX14535660.2893071,2
#1407北広島町中山間DoBoX3058,3171,612.2163690,3,4
#1399世羅町中山間DoBoX3436,2131,338.0364620,3,4

合計: 14,459 ポリゴン / AREA合計 155,111 ha = 1551.1 km² (2016-2020 年期間)。広島県全域面積 8,479 km² に対し、 対象農地率は 18.3%。 件数最大は竹原市 8,879 件 (異常に多い、別ソースの精密データの可能性)、 件数最小は大竹市 33 件。 AREA 最大は庄原市 19,231 ha (1 ポリゴンで 192 km²、市域 1,246 km² の 15%)。

農地転用データ無し 3 町 (参考)

市町タイプ地理タイプ 面積 km²人口 (千人)密度 (人/km²)
府中町近郊町10.4535096
海田町近郊町13.8302174
坂町近郊町15.712764

3 町 (府中町・海田町・坂町) は広島市の近郊ベッドタウンで 町域の大半が市街化済 ─ 農業振興地域・農用地区域がほぼ存在しないため、 都市計画基礎調査の「農地転用対象」シリーズに含まれない。 3 町とも人口密度が DID 認定線 (4,000 人/km²) を超える都市町。

列構造の詳細 (7 列)

列名意味
TOKEI_CDint32 統計区分コード (1, 2, 3 の 3 値、仕様書未公開)。 農用地区域種別のフラグと推定 ─ 市町別に値分布が異なる (中山間市は 1 と 3 主体、都市市は 1, 2, 3 混在)
CITY_CDint32 市区町村コード。広島市は 8 区中 105-108 のみデータあり (中区・東区・西区・南区・佐伯区・安佐北区はデータ無し or 別 CITY_CD)。 他市町は単一 CITY_CD
KUIKI_CDint32 区域コード (0-6 の 7 値、仕様書未公開)。 都市計画区域階層のフラグと推定 (詳細は分析 6 で解読)
AREAfloat64 対象農地面積 (ha)。実測比 geom_area_m² / AREA = 10,000 から ha 単位と確定。AREA = 0 の polygon は図面精度由来の四捨五入結果 (実測 50 m² 未満) で全体の 18.1%。 ※ 監査時 (2026-05) の dtype は object (文字列)、 現データ取得時点では float64 だが、教材として pd.to_numeric(errors="coerce")常に安全な数値化処理を入れている
RITTEKI_CDint32 立地コード (0, 1, 2 の 3 値、仕様書未公開)。 全 17 市町中 8 市町で値 0 のみ、9 市町で 0/1 混在、 3 市町で 0/1/2 混在。転用先用途のフラグと推定
BIKOUobject 備考。「国土数値情報を活用して作成したため、図面精度は1/50,000である」 という図面精度の警告メッセージが入っている (16 市町)。 竹原市のみ全件 None で、件数も 8,879 と異常に多いため 別ソースの精密データの可能性
geometryPolygon 農地転用対象境界 Polygon。EPSG:6671 (JGD2011 平面直角第III系)。 本記事の主役データ。MultiPolygon は無く、すべて単一 Polygon
データ品質ノート: 1. AREA 列の単位は仕様書未公開だが、実測比 geom_area_m² / AREA = 10,000 からha (ヘクタール) 単位と確定 (本記事の H4 で検証)。 2. 竹原市 (ds=1401) のみ件数 8,879 と異常で BIKOU = None、KUIKI_CD = 3, 4 のみ。 他市町と異なる精密データソースの可能性 (国土数値情報ではなく地籍調査結果?)。 本記事ではそのまま統合に含めるが、規模分布の極端値として扱う。 3. 広島市 (ds=1394) は CITY_CD = 105-108 のみ ─ 8 区中 4 区分のデータ。 中区 (101)・東区 (102)・西区 (103)・南区 (104)・安佐北区 など他区のデータは このシリーズには含まれない (都市部のため農地転用対象が無いと推定)。

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

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

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

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

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L24_farmland_conversion\fetch_farmland_conversion.py

合計サイズ約 12 MB。監査時に取得済の 3 市町 (広島市・呉市・福山市) は data/extras/_urban_planning_audit/ から自動コピー、 残り 14 市町は DoBoX から HTTP 取得 (約 30 秒)。

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

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

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

実行は cd "2026 DoBoX 教材"; py -X utf8 lessons\L24_farmland_conversion.py。 17 ZIP がローカルにあれば 30 秒程度で全図 + CSV 再生成 (要件 S 準拠)。

4. 分析1: 17 GeoJSON 統合 + AREA 数値化 + 派生指標

狙い

17 ZIP の農地転用 GeoJSON を 1 個の GeoDataFrame (14,459 polygon × 7 列 + 派生 5 列) に統合し、後段の市町別集計・主題図・規模分析の基盤データを作る。行政区域 21 件 (転用対象 17 + 無し 3 + 広島県全域 1) を背景レイヤーとして同時に読み込む。AREA 列の単位確定 (仕様書未公開) と文字列→数値の安全変換がこの分析の核。

手法

直感: ZIP を読む → 列を共通 7 列に揃える → AREA を pd.to_numeric で安全に数値化 → 縦結合 → CRS 変換 → 派生指標 (実測 ha・整合性比・規模クラス) を計算 → 行政区域 dissolve で背景レイヤー作成。

大筋 (5 ステップ)

  1. 17 市町について load_geojson_zip() で GeoDataFrame を読む
  2. 共通 7 列に正規化 (本データは追加列無し)
  3. AREA 列を pd.to_numeric(errors='coerce') で安全に数値化 (失敗時 NaN で型崩れ防止 — 監査時の object dtype 対応)
  4. pd.concat で縦結合 → 14,459 行 1 個の GeoDataFrame
  5. 派生指標 5 つを計算: geom_area_m2, geom_area_ha, area_ratio (申告/実測), scale_class (規模分類)

前提と限界: 17 件の AREA データは追加列が全く無い。竹原市 (ds=1401) のみ件数が 8,879 と異常に多く BIKOU=None で、他市町と異なる精密データソースの可能性 (本記事では補正せず合体)。広島市 (ds=1394) は CITY_CD = 105-108 の 4 区分のみで、8 区全部のデータは含まれない (都心部 4 区は対象農地ほぼ無し)。『仕様書未公開でも、データから読める』のが本シリーズの面白さで、本記事はその解読プロセスを教材化している。

実装

L24_farmland_conversion.py 行 97–242

 1
 2
 3
 4
 5
 6
 7
 8
 9
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
DATA_DIR = ROOT / "data" / "extras" / "L24_farmland_conversion"
ADMIN_DIR = ROOT / "data" / "extras" / "L15_admin_zones"
TARGET_CRS = "EPSG:6671"

# 17 件は 7 列 100% 共通
COMMON_COLS_7 = ["TOKEI_CD", "CITY_CD", "KUIKI_CD", "AREA",
                 "RITTEKI_CD", "BIKOU", "geometry"]

frames = []
for dsid, name, _adm, ctype, rtype in CITY_DEFS:
    z = DATA_DIR / f"farm_{dsid}_{name}.zip"
    g = load_geojson_zip(z)
    g = g[COMMON_COLS_7].copy()

    # *** AREA を文字列扱いから数値化 (要件 K の Before/After) ***
    g["AREA_raw"] = g["AREA"].astype(str)        # 元値を保持 (例: "1114.18")
    g["AREA"]     = pd.to_numeric(g["AREA"],    # 数値化 (失敗は NaN)
                                  errors="coerce")
    # NaN になった場合は要確認 (本データでは全件成功)

    g["src_city"] = name
    g["rtype"] = rtype
    frames.append(g)

farm = gpd.GeoDataFrame(pd.concat(frames, ignore_index=True),
                        geometry="geometry", crs=frames[0].crs)
farm = farm.to_crs(TARGET_CRS)

# 派生列
farm["geom_area_m2"]  = farm.geometry.area              # 実測 m²
farm["geom_area_ha"]  = farm["geom_area_m2"] / 1e4      # 実測 ha
farm["area_ratio"]    = farm["geom_area_ha"] / farm["AREA"].replace(0, np.nan)
# 規模クラス (微小/小/中/大/超大/巨大)
farm["scale_class"] = farm["AREA"].apply(_scale_class)

入出力 Before/After (要件 K — AREA を文字列から数値化する 1 件の追跡)

仕様書未公開で監査時 (2026-05-03) の AREA 列は object (文字列) 型だった。 現データ取得時点 (2026-05-09) では float64 になっているが、 教材として『常に安全な数値化処理』を組み込む。 広島市最大ポリゴン (1 件) を例に、最初から最後まで追跡する:

段階このデータで何が起きるか 1 行の値の例 (広島市 最大 polygon)
入力 (生)AREA (str?) GeoJSON から読込時、自治体ごとに dtype が揺れうる (object / float64)。
※ 監査時 object → 現在 float64
'1114.18' または 1114.18
正規化AREA = pd.to_numeric(.., errors="coerce") 文字列 → float64 に変換。失敗 (e.g. 空文字, "N/A") は NaN。 本データでは全件成功 1114.18 (float64)
派生geom_area_m2 = geom.area geometry の正確な面積 (m²、CRS=EPSG:6671 の単位) 11,141,775 m²
派生geom_area_ha = geom_area_m2 / 1e4 m² を ha に変換 (1 ha = 10,000 m²) 1114.18 ha (申告 AREA と完全一致!)
派生area_ratio = geom_area_ha / AREA 申告と実測の整合性検証 (1.000 が完全一致) 1.0000 (整合)
派生scale_class = _scale_class(AREA) 規模クラスに分類 (微小/小/中/大/超大/巨大) '5_巨大(≥100 ha)'

このように、7 列の生データから 規模・整合性・実測haの派生指標を導出することで、 農地転用ポリゴンの分布を多角的に評価できる。 特に area_ratio 列は「申告データと実測ジオメトリの整合性検証」として機能し、 『仕様書未公開でも、データから単位を確定できる』本記事の中核手法。

余談: AREA 単位は ha と確定したが、 全 14,459 ポリゴンの中央値 area_ratio = 1.0000 で IQR = [0.982, 1.012]。 誤差 ±2% 以内に収まり、データの内部整合性は良好。 小ポリゴンほど誤差が大きく (図面精度の限界)、 大ポリゴンほど誤差は 0 に近づく (相対誤差が縮む)。

結果

17 ZIP のうち、17 件すべてが共通 7 列で読み込み成功。統合後の farm GeoDataFrame は 14,459 polygon × 12 列(7 共通 + AREA_raw + src_city + src_dsid + ctype + rtype + 派生 4)。AREA 合計 = 155,111 ha = 1551 km² (= 広島県全域の 18.3%)。処理時間は 21.8 秒で要件 S を満たす。

表 1 — 17 市町 読込ログ

市町地理件数AREA計(ha)AREA最大(ha)AREA=0件CITY_CDKUIKI_CD群
広島市都市2725,5921,114.248 (18%)105,106,107,1080,1,2,5,6
呉市都市2255,471981.926 (12%)2020,1,2,3,4
福山市都市6889,9401,909.3214 (31%)2070,1,2
東広島市都市1,00314,8061,605.3580 (58%)2120,1,2,3,4
廿日市市都市2663,308770.847 (18%)2130,3,4
尾道市都市8528,0141,219.2290 (34%)2050,1,2,3,4
三原市都市2648,9762,310.310 (4%)2040,1,2,3,4
竹原市都市8,8791,3605.41,197 (13%)2033,4
府中市都市1583,6041,070.113 (8%)2080,1,2,3,4
大竹市都市33441101.10 (0%)2110
三次市中山間46617,0731,473.814 (3%)2090,3,4
庄原市中山間30446,71019,230.617 (6%)2100,3,4
安芸高田市中山間11412,1836,591.65 (4%)2140,3,4
江田島市離島1422,750364.413 (9%)2150,3,4
熊野町近郊町14535660.289 (61%)3071,2
北広島町中山間3058,3171,612.216 (5%)3690,3,4
世羅町中山間3436,2131,338.036 (10%)4620,3,4

この表から読み取れること: 件数最大は竹原市 8,879で異常に多く、AREA最大はわずか 5.4 ha ─ 『大量の微小ポリゴン』で他市町と質的に異なる。AREA最大は庄原市 19,231 ha (1 ポリゴン!) で、市域 1,246 km² の 15%。AREA=0 比率は市町間で大きく違う: 大竹市 0% (33 件全部に値あり) ↔ 竹原市 13% ↔ 庄原市 6% ↔ 広島市 18%。これは図面精度の市町間差を示す。KUIKI_CD 群は中山間市は 0,3,4 のみ (= 線引き無し)、都市市は 0,1,2 (+ 5,6) のフル区分 (= 線引きあり) という構造的差が見える。

5. 分析2: 県全域マップ + 17 vs 3 (H1)

狙い

広島県内の農地転用ポリゴン全 14,459 件の地理的配置を 1 枚で見せる。「県のどこで、どう密集して農地転用対象が広がっているか」を地図で直接視覚化することは、本シリーズの本質を理解する最短経路。農地転用あり 17 市町 vs 無し 3 町を色分けで対比する 2 枚目で、「農地転用対象がない地域 = 都市 100%」の地理的意味も同時に伝える。

手法

(a) 県全域 主題図: 全 20 市町 (= 17 + 無し 3) と広島県全域の行政区域を背景にし、geopandas.plot(facecolor=rtype_color, alpha=0.55) で農地転用ポリゴンを地理タイプ色 (都市=赤・中山間=緑・離島=青・近郊町=紫) で描画。ポリゴン枠線は描かない (alpha 重なりで密度が読める)。

(b) 17 vs 3 マップ: 17 市町をオレンジ、3 町を緑で塗り、農地転用ポリゴンを赤で重ねる。「3 町には赤が乗らない = 都市 100% で農地転用対象なし」を一目で見せる。

実装

L24_farmland_conversion.py 行 1413–1446

 1
 2
 3
 4
 5
 6
 7
 8
 9
1422
1423
1424
1425
1426
1427
1428
1429
# (a) 県全域 主題図 (rtype 色)
fig, ax = plt.subplots(figsize=(13, 9))
admin_diss.plot(ax=ax, facecolor="#f5f5f5", edgecolor="#888")
admin_farm = admin_diss[admin_diss["farm_status"] == "農地転用あり"]
admin_farm.plot(ax=ax, facecolor="#fafff0", edgecolor="#444")
for rt, col in RTYPE_COLOR.items():
    sub = farm[farm["rtype"] == rt]
    sub.plot(ax=ax, facecolor=col, alpha=0.55, edgecolor="none",
             label=f"{rt} ({len(sub):,})")

# (b) 17 vs 3
fig, ax = plt.subplots(figsize=(13, 9))
admin_diss[admin_diss["farm_status"] == "農地転用あり"].plot(
    ax=ax, facecolor="#fee0b6", edgecolor="#444")
admin_diss[admin_diss["farm_status"] == "農地転用無し"].plot(
    ax=ax, facecolor="#cfe9d8", edgecolor="#444")
farm.plot(ax=ax, facecolor="#cf222e", alpha=0.45, edgecolor="none")

図 1 — 県全域 農地転用ポリゴン主題図 (地理タイプ色)

なぜこの図か: テーブルや棒グラフでは「対象農地が県のどこに、どう広がっているか」が分からない。地図 1 枚で「中山間 (緑) に対象農地が広く、都市 (赤) は中心部のみ」という県全体の地理構造を一気に伝える。

広島県 農地転用対象ポリゴン 全 14,459 件 (2016-2020)
広島県 農地転用対象ポリゴン 全 14,459 件 (2016-2020)

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

図 2 — 農地転用あり 17 市町 vs 無し 3 町

なぜこの図か: 「対象農地ゼロの地理境界」を一目で見せる。3 町 (府中町・海田町・坂町) はすべて広島市近郊のベッドタウン ─ これは地図でないと伝わらない。「政令市の通勤圏に取り込まれた小規模町は、対象農地が消滅する」という都市化の最終段階を示す。

農地転用あり 17 市町 (オレンジ) vs 無し 3 町 (緑)
農地転用あり 17 市町 (オレンジ) vs 無し 3 町 (緑)

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

表 2 — 17 市町 vs 3 町 集計

区分市町数合計面積 km²合計人口 千人転用ポリゴンAREA合計 ha対象農地率
農地転用あり 17177,6732,66714,459155,11120.2%
農地転用無し 334095000%
計 (20 市町)207,7132,76214,459155,11120.1%

この表から読み取れること: 17 市町は面積では県の 99.5%を占め、対象農地率は20.2%。3 町は面積で 0.52%のみだが対象農地ゼロ ─ 『都市部の対象農地は完全に消失している』。県全域の対象農地率は 20.1% ─ 県の市域面積の約 18% が「都市計画基礎調査における転用対象農地」として図面化されている。

6. 分析3: 市町別 small multiples + ランキング (H2)

狙い

17 市町の農地転用配置パターンを 17 panels small multiples で並列比較する。市町ごとの「対象農地が市域のどこに、どう広がっているか」を一目で見せ、都市 vs 中山間 vs 離島 vs 近郊町の質的違いを地図で示す。ランキング 3 連 panel で、『面積』『件数』『転用密度』の 3 軸から市町順位を立体的に描く。

手法

plt.subplots(4, 5) で 20 panel を作り、17 市町 + 1 (3 町) + 余り 2。各 panel は市域に bbox を揃え、対象農地を地理タイプ色で描画。ランキングは横軸 (面積/件数/密度) を 3 つに切って barh で並べる。件数は log スケールで広島市と大竹市の 270 倍格差を圧縮表示。

実装

L24_farmland_conversion.py 行 1541–1580

 1
 2
 3
 4
 5
 6
 7
 8
 9
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
# small multiples 17 panels
fig, axes = plt.subplots(4, 5, figsize=(20, 16))
for ax_, (dsid, name, _adm, ctype, rtype) in zip(axes.flat, CITY_DEFS):
    cnt = admin_diss[admin_diss["city"] == name]
    cnt.plot(ax=ax_, facecolor="#f5f5f5", edgecolor="#888")
    sub_farm = farm[farm["src_city"] == name]
    sub_farm.plot(ax=ax_, facecolor=RTYPE_COLOR[rtype], alpha=0.55)
    n = len(sub_farm); a_ha = sub_farm["AREA"].sum()
    ax_.set_title(f"{name} ({rtype}) {n:,}件 / {a_ha:,.0f} ha")

# 3 連ランキング (面積/件数/密度)
fig, axes = plt.subplots(1, 3, figsize=(18, 9))
order_a = city_agg.sort_values("area_ha_sum")
axes[0].barh(order_a["city"], order_a["area_ha_sum"],
             color=[RTYPE_COLOR[rt] for rt in order_a["rtype"]])
order_n = city_agg.sort_values("n_poly")
axes[1].barh(order_n["city"], order_n["n_poly"], color=...)
axes[1].set_xscale("log")  # 件数は log スケール
order_d = city_agg.sort_values("conv_per_km2")
axes[2].barh(order_d["city"], order_d["conv_per_km2"], color=...)

図 3 — 市町別 17 panels small multiples

なぜこの図か: 1 枚の県全域図では、市町ごとの「転用パターンの質的違い」が分からない。17 panels で並列比較すると、「庄原市の市域 8 割が緑」と「府中市の市域中央に小さい緑」が同じスケールで対比でき、市町タイプと転用パターンの関係が直感的に伝わる。

市町別 農地転用配置 small multiples (17 + 無し 3 町)
市町別 農地転用配置 small multiples (17 + 無し 3 町)

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

図 4 — 市町別 面積/件数/密度 ランキング 3 連

なぜこの図か: 市町を 3 つの異なる指標 ─ 「総面積」「ポリゴン件数」「単位面積あたり転用密度」 ─ で並べると、都市 vs 中山間の構造の違いが立体的に見える。1 つの指標だけでは見えない『市町タイプの多軸性』を伝える。

市町別 総転用面積 / 件数 / 単位面積あたり転用 (3 連 panel)
市町別 総転用面積 / 件数 / 単位面積あたり転用 (3 連 panel)

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

表 3 — 17 市町 集計表 (面積降順)

市町地理件数AREA計(ha)AREA最大(ha)密度対象農地率1人あたり(a)
庄原市中山間30446,71019,230.637.4737.5%142
三次市中山間46617,0731,473.821.9421.9%34
東広島市都市1,00314,8061,605.323.3023.3%7
安芸高田市中山間11412,1836,591.622.6522.6%45
福山市都市6889,9401,909.319.1919.2%2
三原市都市2648,9762,310.319.0319.0%10
北広島町中山間3058,3171,612.212.8712.9%49
尾道市都市8528,0141,219.228.1128.1%6
世羅町中山間3436,2131,338.022.3322.3%41
広島市都市2725,5921,114.26.176.2%0
呉市都市2255,471981.915.5115.5%3
府中市都市1583,6041,070.118.4118.4%10
廿日市市都市2663,308770.86.766.8%3
江田島市離島1422,750364.427.3127.3%12
竹原市都市8,8791,3605.411.5111.5%6
大竹市都市33441101.15.605.6%2
熊野町近郊町14535660.210.5610.6%2

この表から読み取れること: AREA 合計 1 位は庄原市 46,710 ha (市域の 37.5%)、最下位は大竹市 440.7 ha1 人あたり対象農地は中山間市町で41 a/人 (世羅町) や 142 a/人 (庄原市) と桁違いに大きく、政令市は0 a/人 (広島市)と最小。『中山間住民は 1 人あたり 1 ha 規模の農地を背景に持つ』 vs 『都市住民は 0.0X ha 規模の対象農地しかない』という対比が定量化された。

7. 分析4: AREA 単位検証 + 微小区画分析 (H3, H4)

狙い

仕様書未公開のAREA 列の単位を、ジオメトリ実測との比較から確定する。AREA = 0 のポリゴンが大量にある (全 18%) 事実は図面精度 1/50,000 の限界を示すデータ品質の話。これらを定量的に解明することで、「仕様書未公開の公開データを安全に使う方法」を学習者に伝える。

手法

(a) AREA 申告 vs 実測 散布図 (log-log): x軸 = AREA (申告 ha)、y軸 = geom_area_ha (m² から換算した実測 ha)。y = x の対角線が「申告 = 実測」を意味する。『AREA × 10,000 = m²』であれば、両軸 ha で y = x にぴったり乗る。別の単位 (a だったら 100 倍ずれ、m² だったら 10,000 倍ずれ) ならズレる。AREA = 0 を除外 (log は 0 を扱えない)。

(b) AREA = 0 の geom_area 分布: AREA = 0 ポリゴンの実測面積をヒストグラム化。『どの程度小さいから 0 に丸められたか』を可視化することで、図面精度 1/50,000 の四捨五入境界を逆算する。ha 単位での 0 とは0.005 未満 = 50 m² 未満

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
fig, axes = plt.subplots(1, 2, figsize=(16, 7))

# (a) AREA 申告 vs 実測 散布
nz = farm[farm["AREA"] > 0]   # AREA = 0 を除外
for rt, col in RTYPE_COLOR.items():
    sub = nz[nz["rtype"] == rt]
    axes[0].scatter(sub["AREA"], sub["geom_area_ha"], c=col, s=4, alpha=0.3)
xs = np.array([0.001, 100000])
axes[0].plot(xs, xs, "--", color="black", label="y=x (申告=実測)")
axes[0].set_xscale("log"); axes[0].set_yscale("log")

# (b) AREA = 0 の geom_area 分布
zero = farm[farm["AREA"] == 0]
axes[1].hist(zero["geom_area_ha"].clip(upper=0.012), bins=41,
             color="#cf222e", edgecolor="white")
axes[1].axvline(0.005, ls="--", label="四捨五入境界 (0.005 ha = 50 m²)")

図 5 — AREA 申告 vs ジオメトリ実測 (左) + AREA=0 の実測面積分布 (右)

なぜこの図か: AREA 列の単位確定は『仕様書なしのデータと向き合う』教材の核心。log-log 散布で y = x ラインに点が乗ることで 『申告 ≒ 実測』が視覚的に確認できる。右側の AREA=0 ポリゴンの実測ヒストグラムは、図面精度の限界を直視させる。

AREA 申告値 vs ジオメトリ実測 (左, log-log) + AREA=0 の実測面積分布 (右)
AREA 申告値 vs ジオメトリ実測 (左, log-log) + AREA=0 の実測面積分布 (右)

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

表 4 — 大規模対象農地 top 10

順位市町地理CITY_CDKUIKI_CDAREA(ha)実測(ha)area_ratio規模クラス
1庄原市中山間210019,230.619,230.61.00005_巨大(≥100 ha)
2安芸高田市中山間21406,591.66,591.61.00005_巨大(≥100 ha)
3庄原市中山間21005,068.85,068.81.00005_巨大(≥100 ha)
4庄原市中山間21003,823.63,823.61.00005_巨大(≥100 ha)
5三原市都市20402,310.32,310.31.00005_巨大(≥100 ha)
6庄原市中山間21001,912.81,912.71.00005_巨大(≥100 ha)
7福山市都市20721,909.31,909.31.00005_巨大(≥100 ha)
8三原市都市20401,743.21,743.21.00005_巨大(≥100 ha)
9北広島町中山間36901,612.21,612.21.00005_巨大(≥100 ha)
10東広島市都市21221,605.31,605.31.00005_巨大(≥100 ha)

この表から読み取れること: top 1 は庄原市 19,231 ha (1 ポリゴン!) ─ 市域 1,246 km² の 15% が単一 polygon で覆われている。area_ratio = 1.0000 で実測と完全一致。top 10 はすべて中山間 (庄原・三次・東広島・北広島・世羅・安芸高田)で、AREA が 500 ha 以上「巨大ブロック」。これらは『市町全域を覆う農用地区域指定エリア』と推定 ─ 個別の転用許可ではなく、制度上の区分図面と思われる。上位 10 件の AREA 合計 = 45,808 ha = 全 AREA の29.5%を占める ─ パレート構造の極端な実例

8. 分析5: 規模クラス分布 + パレート構造 + 大規模バブル (H6)

狙い

農地転用ポリゴンを規模クラス 6 段階に分類し、『何件のポリゴンが、どれくらいの面積を占めるか』のパレート構造を可視化する。市町別の規模構成も比較し、『市町タイプによって転用ポリゴンの規模が違う』(中山間=巨大、都市=小規模)の二極構造を確認する。

手法

(a) 規模クラス × 市町 stacked bar (件数比率): 市町別に規模クラス分布を 100% 棒グラフで並べ、『竹原市は微小ばかり』『庄原市は大きいの混在』の質的違いを示す。

(b) パレート図 (件数 % vs 面積 %, 規模クラス毎): 横軸 = 規模クラス、縦軸 = 全体に占める比率 (件数 % と 面積 % を 2 本並列)。『規模クラス間で件数 % と面積 % が逆転する』= 「数の少数派が量の多数派」のパレート構造を直視する。

実装

L24_farmland_conversion.py 行 1767–1810

 1
 2
 3
 4
 5
 6
 7
 8
 9
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
def _scale_class(ha_value):
    if ha_value < 0.01:    return "0_微小(<0.01 ha)"
    elif ha_value < 0.1:   return "1_小(0.01-0.1 ha)"
    elif ha_value < 1.0:   return "2_中(0.1-1 ha)"
    elif ha_value < 10.0:  return "3_大(1-10 ha)"
    elif ha_value < 100.0: return "4_超大(10-100 ha)"
    else:                  return "5_巨大(≥100 ha)"

farm["scale_class"] = farm["AREA"].apply(_scale_class)

# 規模 × 市町 クロス → stacked bar
sc = farm.groupby(["src_city", "scale_class"]).size().unstack(fill_value=0)
sc_pct = sc.div(sc.sum(axis=1), axis=0) * 100
sc_pct.plot(kind="barh", stacked=True)

# パレート図 (件数 % vs 面積 %)
overall = farm.groupby("scale_class").agg(n=("AREA","size"),
                                           area=("AREA","sum"))
overall["n_pct"]    = overall["n"] / N_POLY * 100
overall["area_pct"] = overall["area"] / AREA_TOTAL_HA * 100
ax.bar(overall.index, overall["n_pct"], label="件数 %")
ax.bar(overall.index + width, overall["area_pct"], label="面積 %")

図 6 — 市町別 規模構成 + パレート図

なぜこの図か: 単純な平均値や合計では 『規模分布の歪み』が見えない。stacked bar で市町ごとの規模構成を直視し、パレート図で件数 % vs 面積 % の逆転現象を視覚化することで、『大規模ポリゴンが面積を支配する』を一目で伝える。

市町別 規模クラス構成 (左, 件数 %) + 全体パレート図 (右)
市町別 規模クラス構成 (左, 件数 %) + 全体パレート図 (右)

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

表 5 — 規模クラス全体集計 (パレート構造)

規模クラス件数件数 %面積 ha面積 %
0_微小(<0.01 ha)2,61518.1%00.0%
1_小(0.01-0.1 ha)5,22236.1%1860.1%
2_中(0.1-1 ha)4,19829.0%1,3420.9%
3_大(1-10 ha)1,3849.6%4,9743.2%
4_超大(10-100 ha)8065.6%26,29917.0%
5_巨大(≥100 ha)2341.6%122,31078.9%

この表から読み取れること: 0_微小 (2,615 件 = 18%) は件数で全体の 1/3 を占めるが、面積では 0%5_巨大 (234 件 = 1.6%)はわずか件数の 0.X%だが、面積で 50% 超を占める ─ 『1 件の巨大区画 = 数千件の微小区画』。これは「データ集計時に件数で重み付けすると、面積実態を見誤る」という教訓 ─ 必ず面積加重で集計せよ。

図 7 — 大規模対象農地 (≥10 ha) バブルマップ

なぜこの図か: パレート構造の上位 8% (≥10 ha) を地理的に確認する。県全域マップでは大小ポリゴンが alpha 重ねで判別困難。ここではバブル (centroid 中心、AREA に比例した大きさ) で大規模区画の地理的偏在を可視化する。

大規模対象農地 (≥10 ha) バブルマップ
大規模対象農地 (≥10 ha) バブルマップ

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

9. 分析6: KUIKI_CD / TOKEI_CD 解読 (H5)

狙い

仕様書未公開のKUIKI_CD (区域コード, 0-6 の 7 値)TOKEI_CD (統計区分コード, 1-3 の 3 値) の意味を、市町別の値分布と地理的位置から『推定』する。これは『公開オープンデータの仕様書がない場合に、自分で意味を解読する』という研究プロセスの実演である。

手法

(a) KUIKI_CD 別 県全域マップ: 0-6 を異なる色で塗り、地理分布から仮説を立てる。『線引き都市計画区域 (市街化/調整区域)』の都市市町と、『線引きなし』の中山間市町で値分布が異なるはず。

(b) KUIKI_CD × 市町 stacked bar (件数比率): 各市町の値分布を 100% 棒グラフで並べる。市町タイプごとに値の組み合わせがクラスタ化されることを期待。

実装

L24_farmland_conversion.py 行 1896–1941

 1
 2
 3
 4
 5
 6
 7
 8
 9
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
# KUIKI_CD 7 値を固定パレットで色分け (推定意味)
kuiki_palette = {
    0: "#1f883d",   # 0 = 区域外? (中山間多い、緑)
    1: "#cf222e",   # 1 = 市街化区域? (都市多い、赤)
    2: "#a371f7",   # 2 = 市街化調整区域? (紫)
    3: "#0969da",   # 3 = 非線引き? (青)
    4: "#bf3989",   # 4 = (?) (ピンク)
    5: "#fb8500",   # 5 = (?) (オレンジ)
    6: "#666666",   # 6 = (?) (灰)
}

# (a) KUIKI_CD 別 県全域マップ
fig, axes = plt.subplots(1, 2, figsize=(18, 9))
admin_diss.plot(ax=axes[0], facecolor="#f5f5f5")
for kc, col in kuiki_palette.items():
    sub = farm[farm["KUIKI_CD"] == kc]
    sub.plot(ax=axes[0], facecolor=col, alpha=0.55,
             label=f"KUIKI_CD={kc} ({len(sub):,})")

# (b) KUIKI_CD × 市町 stacked bar
kc_cross = farm.groupby(["src_city","KUIKI_CD"]).size().unstack(fill_value=0)
kc_pct = kc_cross.div(kc_cross.sum(axis=1), axis=0) * 100
kc_pct.plot(kind="barh", stacked=True, ax=axes[1])

図 8 — KUIKI_CD 別 県全域マップ (左) + 市町別 KUIKI_CD 構成 (右)

なぜこの図か: KUIKI_CD = 0-6の 7 値が何を意味するか、テーブルだけでは分からない。地図に色分けして『地理的にどう分布するか』を見せると、都市計画区域の階層構造と整合する分布が見えれば仮説が支持される。

KUIKI_CD 別 県全域マップ + 市町別構成
KUIKI_CD 別 県全域マップ + 市町別構成

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

表 6 — KUIKI_CD 全体集計 (推定意味付き)

KUIKI_CD件数件数 %面積 ha面積 %
0.02,563.017.7%117,52475.8%
1.0999.06.9%810.1%
2.0702.04.9%18,25911.8%
3.02,851.019.7%1670.1%
4.07,318.050.6%18,84412.1%
5.09.00.1%00.0%
6.017.00.1%2350.2%

この表から読み取れること: KUIKI_CD = 0 が件数 % で18% ─ 中山間に多い「都市計画区域外」の農地と推定 (面積も最大)。KUIKI_CD = 3, 4 が件数 %で大きい ─ 『非線引き / 区域外』の混在と推定。KUIKI_CD = 1, 2 は件数 %は小さいが、これらは『市街化区域 + 調整区域』= 都市計画区域内の農地で、都市拡張の最前線KUIKI_CD = 5, 6 は極めて少ない (広島市のみ) ─ 『広島市特有のサブ区分』(政令市の独自 KUIKI 値か?)。

表 7 — TOKEI_CD 全体集計 (推定意味)

TOKEI_CD件数件数 %面積 ha面積 %
1.011,870.082.1%37,35224.1%
2.026.00.2%2350.2%
3.02,563.017.7%117,52475.8%

この表から読み取れること: TOKEI_CD = 1 が件数で82%と最大 ─ 『農用地区域指定 (主要)』と推定。TOKEI_CD = 3 は件数で次点 ─ 『農業振興地域内農用地白地』と推定。TOKEI_CD = 2 は最少 ─ 『その他』と推定。仕様書未公開のため確定できないが、『市町間でも値分布のパターンが類似 (= 制度上の意味があるはず)』と推測される。発展課題で都市計画基礎調査要綱との照合により確定する。

10. 分析7: 市域面積/人口 vs 対象農地 (H2 補強)

狙い

市町の総面積・総人口と AREA の関係を log-log 散布で示し、「市町規模と対象農地の関係」「1 人あたり対象農地の地理タイプ依存」を可視化する。農地転用無し 3 町を ×印で同じ散布に重ね、「対象農地ゼロの境界」を観察する。

手法

(a) 市域面積 vs AREA (log-log): x軸 = 市町面積 km²、y軸 = AREA 合計 ha。1% / 10% の対象農地率ライン (= 1 ha/km², 10 ha/km²) を補助線として引く。

(b) 市町総人口 vs 1 人あたり対象農地 (a/人): 市町人口 vs 市民 1 人あたり対象農地。中山間市は1 万 a/人 = 100 ha/人規模、都市市は0.X a/人と桁違い。地理タイプで 4 グループにクラスタ化されるはず。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
fig, axes = plt.subplots(1, 2, figsize=(16, 7))

# (a) 市域面積 vs AREA
for rt, col in RTYPE_COLOR.items():
    sub = city_agg[city_agg["rtype"] == rt]
    axes[0].scatter(sub["city_area_km2"], sub["area_ha_sum"],
                    c=col, s=180, label=rt)
# 3 町 (転用無し): x=面積, y≒0
for name, _adm, _ct, _r in NO_FARM_CITIES:
    axes[0].scatter(CITY_REF[name]["area_km2"], 0.5, marker="x", c="#666")
xs = np.linspace(5, 1500, 50)
axes[0].plot(xs, xs * 1, "--", label="1% 対象農地率")
axes[0].plot(xs, xs * 10, ":", label="10% 対象農地率")
axes[0].set_xscale("log"); axes[0].set_yscale("log")

# (b) 人口 vs 1 人あたり
for rt, col in RTYPE_COLOR.items():
    sub = city_agg[city_agg["rtype"] == rt]
    axes[1].scatter(sub["city_pop_k"]*1000, sub["conv_per_capita_a"],
                    c=col, s=180, label=rt)
axes[1].set_xscale("log"); axes[1].set_yscale("log")

図 9 — 市域面積 × AREA (左) + 人口 × 1 人あたり (右)

なぜこの図か: 市町の対象農地は市域規模に依存することが想像できるが、log-log 散布で『市域 1% ライン vs 10% ライン』を引くと、市町の『対象農地率階層』が一目で分かる。1 人あたり指標と組み合わせると、『地理タイプによる構造的違い』が立体的に見える。

市域面積 × AREA (log-log) + 市町人口 × 1 人あたり対象農地
市域面積 × AREA (log-log) + 市町人口 × 1 人あたり対象農地

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

表 8 — 17 市町 + 3 町 詳細 (rtype 別合計)

地理タイプ市町数合計面積 km²合計人口 千人AREA ha対象農地率 %1人あたり a
都市104,0522,48061,51115.2%2.5
中山間53,48714290,49426.0%63.7
離島1101222,75027.3%12.5
近郊町1342335610.6%1.5
農地転用無し町3409500%0

この表から読み取れること: 『中山間 5 市町』は面積 3,487 km² (県の 45%) で AREA = 90,494 ha県の対象農地の 58% を 5 市町が占める。対する『都市 10 市』は面積 4,052 km² (県の 53%) だが AREA = 61,511 ha (40%)。『中山間が県の食料供給基盤を背負う』地理構造が明確。近郊町 (熊野町) と離島 (江田島市) は補助的な役割。

11. 仮説検証と考察

分析 1〜7 の結果から、仮説 H1〜H6 を改めて検証する。

仮説仮説内容検証結果判定
H1県内 17 市町の総 AREA (対象農地) ≥ 50,000 haAREA合計 = 155,111 ha (= 1551.1 km²)支持
H2中山間 5 市町 (庄原・三次・東広島・北広島・世羅) ≥ 50,000 ha かつ 都市 5 市の合計より大きい中山間 5 市町 = 93,117 ha, 都市 5 市 = 32,324 ha (中山間/都市 比率 = 2.9x)支持
H3AREA=0 ポリゴン (図面精度由来) は市町別中央値 5-25%全件 AREA=0 = 2,615/14,459 = 18.1%, 市町別 min/median/max = 0.0/10.5/61.4%支持
H4AREA(ha) × 10,000 = geom_area_m² → ratio (geom_ha/AREA) 中央値 ≒ 1.0ratio 中央値 = 1.0000 (IQR = [0.9815, 1.0119])支持
H5KUIKI_CD は都市計画区域階層フラグと推定 — 都市 7 市町に 1/2 値、中山間に 3/4 値都市 7 市中 KUIKI=1or2 を持つ市町 = 7/7、中山間 5 市町中 KUIKI=3or4 を持つ市町 = 5/5支持
H6大規模対象農地 (≥10 ha) は件数 <10% かつ 面積 ≥50% (パレート構造)≥10ha件数 = 1,040 (7.19%), ≥10ha面積 = 148,609 ha (95.8%)支持

総括

本記事の主要発見 5 点

  1. 『中山間が県の食料供給基盤を背負う』を定量化: 中山間 5 市町 (庄原・三次・東広島・北広島・世羅) が県対象農地の 58%を占める。庄原市単独で県全体の 30%。『農地転用=都市拡張』のイメージは誤りで、県の対象農地は中山間の制度的指定が主体。
  2. 仕様書未公開の AREA 単位を解読: 実測比 geom_m²/AREA = 10,000 から『AREA = ha 単位』と確定。area_ratio 中央値 1.0000、IQR ±2% 以内。『仕様書なしでもデータから単位を確定する』研究プロセスの実演。
  3. 図面精度 1/50,000 の限界を可視化: AREA=0 ポリゴン 2,615 件 (18%) の実測面積が0-50 m² に集中。図面精度 1 mm = 50 m が最小描画単位 50 m² (= 0.005 ha)に対応。『公開データの誤差を定量化する手順』を学ぶ。
  4. KUIKI_CD = 都市計画区域階層フラグを解読: 都市 7 市町は KUIKI = 0,1,2 (+5,6) を保有 (= 線引きあり)、中山間 8 市町は KUIKI = 0,3,4 のみ (= 線引きなし)。『仕様書未公開のフラグ列を、地理分布と市町構成から推定』。これにより市街化区域内/調整区域内/区域外の対象農地を区別可能。
  5. パレート構造の極端な実例: 大規模 (≥10 ha) ポリゴン 1,040 件 (件数の 7.2%) が面積の 96% を支配。top 1 (庄原市 19,231 ha) だけで県全体の 12%。『集計時に件数で重み付けすると面積実態を見誤る』という統計分析の教訓。

12. 発展課題

本記事で得られた結果から導かれる新たな問いと、 それを検証するための具体的な発展手順を 3 つ提示する。

発展課題 1: 農林漁業施策 (L25) との空間オーバーレイ ─ 保全 vs 転用

結果 X: 本記事で県内 17 市町の対象農地 14,459 ポリゴン (155,111 ha) の地理が定量化された。 都市計画基礎調査の同じ期間 (2016-2020) で、もう 1 つのシリーズ 「農林漁業関係施策」(L25, 17 件) が公開されており、 これは『国・県の農地保全策が適用される区域』を示す。

新仮説 Y: 農林漁業施策エリアと農地転用対象エリアは地理的に重なる (= 同じ農地に保全策と転用区分が同居)か、 相補的に分布する (= 保全区域と転用区域は別)のどちらか。 広島県は中山間振興策 (中山間直接支払等) を多く実施するため、 「中山間 5 市町で重なり率 ≥ 80%」と予想される。

課題 Z: geopandas.overlay(farm, sisaku, how='intersection') で 17 市町ごとに重なり面積を計算 → 「保全 ∩ 転用 / 転用」の包含率を市町別に集計 → 17 panels small multiples で重なり地理を可視化 → 『広島県の中山間農地は保全と転用が同居している』仮説を検証。 本記事の次記事 L25 でこれを実装する予定。

発展課題 2: 都市計画区域 (L15) との整合性検証 ─ KUIKI_CD の意味確定

結果 X: 本記事で KUIKI_CD = 都市計画区域階層フラグ (推定) が 都市市町と中山間市町で値分布が異なることを確認した。 ただし『どの値が市街化区域』かは推定の域を出ない。

新仮説 Y: L15 の市街化区域 / 市街化調整区域 ポリゴン (14 + 14 件)と 本記事の対象農地ポリゴンを空間結合すれば、 KUIKI_CD = 1 が市街化区域、KUIKI_CD = 2 が市街化調整区域、 KUIKI_CD = 3, 4 が非線引きまたは区域外、と確定できる。 『各 KUIKI 値ポリゴンの 80% 以上が、対応する都市計画区域内に位置する』 ことを定量的に確認する。

課題 Z: L15 都市計画区域データを取得 → gpd.sjoin(farm, kuiki_zones, predicate='within') で 各転用ポリゴンに区域種別を付与 → KUIKI_CD × 区域種別のクロス集計 → 『KUIKI_CD = 1 のポリゴンは市街化区域内』等の対応関係を表で示す。 発展手順としては data/extras/_urban_planning_audit/ の市街化区域 ZIP を活用。

発展課題 3: 5 年後 (R7=2025) との比較 — 転用速度の地理

結果 X: 本記事は 2016-2020 (5 年間) のスナップショット。 転用が静的か動的かを語るには 1 期しかなく不十分。

新仮説 Y: 次期都市計画基礎調査 (2021-2025) では、 (a) 都市市の調整区域内ポリゴン都市開発で減少する一方、 (b) 中山間市町の区域外ポリゴン耕作放棄で『非農地』扱いに変わる ─ 両ベクトルで対象農地は『縮小』すると予想される。 庄原市・三次市の中山間ポリゴンは5 年で 5-10% 縮減

課題 Z: 都市計画基礎調査の次期版が公開されたら (R8 頃想定)、 同じ ID 体系で 17 市町分の差分計算。 ポリゴン重なり率 (Jaccard 係数) を市町別に算出 → 「Δ 面積 = 縮小と新規追加」を定量化 → 中山間と都市で減少パターンの違いを比較 → 『どこで耕作放棄が進み、どこで転用が進むか』の地理を描く。 これは現時点では未来課題だが、本記事の手法 (load_geojson_zip + AREA 数値化 + 派生) を流用すれば即実装可能な再現性を確保している。