Lesson 22

L22 性別年齢別人口 20件 統合分析 — 広島県全域の人口ピラミッドの地理構造

都市計画性別年齢別人口人口ピラミッド高齢化率20市町統合町丁単位choroplethgeopandasDoBoX
所要 35〜45 分 / 想定レベル: 中級 (人口統計 + GIS) / データ: DoBoX 性別年齢別人口 20件 (#1467,1470,1472,1475,1478,1481,1484,1486,1488,1489,1492,1494,1497,1498,1499,1501,1503,1504,1506,1508)

データ取得手順

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

IDデータセット名
#222dataset #222
#444dataset #444
#666dataset #666
#777dataset #777
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1467都市計画区域情報_性別年齢別人口_広島市_2020
#1470都市計画区域情報_性別年齢別人口_呉市_2020
#1472都市計画区域情報_性別年齢別人口_竹原市_2020
#1475都市計画区域情報_性別年齢別人口_三原市_2020
#1478都市計画区域情報_性別年齢別人口_尾道市_2020
#1481都市計画区域情報_性別年齢別人口_福山市_2020
#1484都市計画区域情報_性別年齢別人口_府中市_2020
#1486都市計画区域情報_性別年齢別人口_三次市_2020
#1488都市計画区域情報_性別年齢別人口_庄原市_2020
#1489都市計画区域情報_性別年齢別人口_大竹市_2020
#1492都市計画区域情報_性別年齢別人口_東広島市_2020
#1494都市計画区域情報_性別年齢別人口_廿日市市_2020
#1497都市計画区域情報_性別年齢別人口_安芸高田市_2020
#1498都市計画区域情報_性別年齢別人口_江田島市_2020
#1499都市計画区域情報_性別年齢別人口_府中町_2020
#1501都市計画区域情報_性別年齢別人口_海田町_2020
#1503都市計画区域情報_性別年齢別人口_熊野町_2020
#1504都市計画区域情報_性別年齢別人口_坂町_2020
#1506都市計画区域情報_性別年齢別人口_北広島町_2020
#1508都市計画区域情報_性別年齢別人口_世羅町_2020

実行コマンド:

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

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

1. 学習目標と問い

本記事は、広島県インフラマネジメント基盤 DoBoX が公開する 「都市計画区域情報_性別年齢別人口」シリーズ 20 件 (#1467, #1470, #1481, #1492, #1494, #1478, #1475, #1472, #1484, #1489, #1486, #1488, #1497, #1498, #1499, #1501, #1503, #1504, #1506, #1508) を縦結合し、R2 国勢調査ベースで広島県内 20 市町の小地域 (町丁) 11,588件 × 性別×5歳階級 人口データから、 人口ピラミッドの地理構造 ── 全県形状・市町別ピラミッド・町丁単位の高齢化と若年集中・ 性比の異常スポット・100歳以上の地理 ── を分析する研究記事である。 町丁単位の人口ピラミッドは「社会の DNA」であり、 高齢化と若年集中の地理は政策の最前線である。

研究の問い (RQ): 広島県内 11,588町丁における人口ピラミッドは、 市町別・地域別にどのような構造を持ち、 高齢化と若年集中はどう地理的に分布しているか? 町丁単位の高齢化率・性比・年少率は、 社会人口学的にどのような『地理的指紋』を残すか?

仮説 H1〜H6

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

到達点

  1. 20 市町の GeoJSON ZIP を 1 個の GeoDataFrame (11,588 行 × 61 列) に縦結合できる。 列構造の 1 件だけある追加列 (庄原市の Shape_Area, Shape_Leng) の処理パターンを身に付ける。
  2. 5 歳階級 21 列 × 男女 = 42 列4 群 (年少/生産/前期高齢/後期高齢) に集約する sum(axis=1) パターンを学ぶ。
  3. 町丁単位の高齢化率・後期高齢化率・年少率・性比・従属人口指数 を計算し、市町間・町丁間の格差を定量する。
  4. 町丁ポリゴンを geopandas.plot(column=...)choropleth (主題図) 化し、 高齢化と若年集中の地理を視覚化する。
  5. 市町別 20 panel 人口ピラミッド small multiples で「市町ごとのピラミッド形状」を一目で比較する。
  6. 性比異常・100歳以上集中・若年集中の外れ値町丁を同定し、 その背景 (大学・基地・住宅団地) を考察する。
  7. 都市部 vs 中山間の構成比ピラミッドを作り、 「日本社会の二極構造」を地理的に検証する。

本記事のスコープ宣言

本記事は性別年齢別人口シリーズ 20 件のみを主データとする研究記事である。 L15 行政区域 20 件は市町別空間集計の境界として参照するが、 L23 (DID 地区境界、次記事で予定) との合体は行わない (要件 I 違反の水増し回避)。 DID 内/外の人口構造比較は発展課題に留める。 ただし都市計画区域コード KUIKI_CD による 「市街化区域 vs 調整区域」の人口構造差異は、本データ内で完結するため分析に含める

2. 使用データ

性別年齢別人口 20 件はそれぞれ 1 市町分の 町丁単位 GeoJSON (MultiPolygon) を ZIP で配布している。列構造は 20 件で 100% 一致 (61 列) ─ ただし 庄原市のみ Shape_Area, Shape_Leng の 2 列が追加で計 63 列となる (値はすべて 0 で意味なし、共通 61 列に正規化して読み込む)。

20 dataset_id 一覧

dataset_id市町市町タイプDoBoX 町丁数人口総数追加列
#1467広島市政令市DoBoX4,3251,200,754-
#1470呉市中核市DoBoX1,569214,592-
#1481福山市中核市DoBoX1,491460,930-
#1492東広島市施行時特例市DoBoX778196,608-
#1494廿日市市DoBoX537114,173-
#1478尾道市DoBoX442131,170-
#1475三原市DoBoX56690,573-
#1472竹原市DoBoX20423,993-
#1484府中市DoBoX13337,655-
#1489大竹市DoBoX15126,319-
#1486三次市DoBoX39450,681-
#1488庄原市DoBoX18133,633Shape_Area,Shape_Leng
#1497安芸高田市DoBoX5926,448-
#1498江田島市DoBoX16921,930-
#1499府中町DoBoX8751,155-
#1501海田町DoBoX9429,636-
#1503熊野町DoBoX15622,834-
#1504坂町DoBoX9012,582-
#1506北広島町DoBoX10117,763-
#1508世羅町DoBoX6115,125-

合計: 11,588 町丁 / 人口総数 2,778,554 人 (R2 国勢調査ベースの広島県人口は約 280 万人、本データは 20 市町合算で 99.9% カバー)。

列構造の詳細 (61 列)

61 列は以下の 4 グループに分類できる。

(a) メタ列 (11 列)

列名意味
TOKEI_CDint32 統計区分コード。本データでは 0 が大半
KUIKI_CDint32 都市計画区域コード (1=市街化, 3=市街化調整, 5=都計外 等と推定)。 本記事の区域別人口構造分析に使用
SMALL_A_CDobject 小地域コード (12 桁)。前2桁=都道府県(34=広島)、次3桁=市区町村、 次4桁=町丁字、最後3桁=細目
AREA_CDobject 地区番号
SECRET1-3object 秘匿フラグ列 (3 列)。多くは null だが一部に値あり
CITY_CDint32 市区町村コード。広島市は 8 区を 101-108 で分割
CITY_NAMEobject 市区町村名 (「広島市中区」など、広島市は区名まで含む)
TOWN_NAME1object 町・字名 (例: 「光南」)
TOWN_NAME2object 丁目 (例: 「三丁目」)。null の町丁もあり

(b) 集計列 (3 列)

列名意味
JINKO_SUint32 総人口 (= M_SU + F_SU)。5,672 件で 0 (秘匿か実無人)
M_SUint32 男性総数 (= M_00..M_100 + M_999 の合計)
F_SUint32 女性総数 (= F_00..F_100 + F_999 の合計)

(c) 5 歳階級列 男女 (44 列)

男性: M_00, M_05, M_10, M_15, ..., M_95, M_100, M_999 (22 列)
女性: F_00, F_05, F_10, F_15, ..., F_95, F_100, F_999 (22 列)

M_xx = xx 歳〜 xx+4 歳の男性人口。例えば M_45 は 45-49 歳。 M_100 は 100歳以上、M_999 は年齢不詳。 全 22 列の合計が M_SU に一致する。

(d) その他 (3 列)

列名意味
RITTEKI_CDint32 立地コード。仕様書未公開、参考扱い
BIKOUobject 備考。本データでは全件 null (運用上未入力)
geometryMultiPolygon 町丁ポリゴン。EPSG:6671 (JGD2011 平面直角第III系)。 本記事の主役データ。境界が複雑で MultiPolygon が多い
データ品質ノート: 5,672 町丁 (全体の 48.9%) で人口=0。 大半は秘匿処理 (人口少数で個人特定リスクがあるため)、 一部は実無人 (山林・水面のみの行政区域)。 率指標 (高齢化率等) は分母 0 を避けるため clip(lower=1) で除算保護、 箱ひげ・分布分析では人口 ≥ 30 人の信頼可町丁 (4,965件)のみ使用。

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

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

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

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

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L22_population_pyramid\fetch_population_pyramid.py

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

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

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

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

実行は cd "2026 DoBoX 教材"; py -X utf8 lessons\L22_population_pyramid.py。 20 ZIP がローカルにあれば 1 分以内で全図 + CSV 再生成 (要件 S 準拠)。

4. 分析1: 20 GeoJSON 統合 + 5歳階級44列を4群集約

狙い

20 ZIP の GeoJSON を 1 個の GeoDataFrame (11,588 行 × 64 列) に統合し、5 歳階級 44 列を 4 群集約することで、後段の高齢化率・年少率・性比などの意味ある率指標を導出する。

手法

直感: ZIP を読む → 列を共通 61 列に揃える → 縦結合 → CRS 変換 → 5 歳階級を 4 群に集約 → 派生指標を計算。

大筋 (5 ステップ)

  1. 20 市町について load_geojson_zip() で GeoDataFrame を読む
  2. 共通 61 列に正規化 (庄原市の追加 2 列 Shape_Area, Shape_Leng を捨てる)
  3. 派生列 src_city / src_dsid / ctype を付与
  4. pd.concat で縦結合 → 11,588 行 1 個の GeoDataFrame
  5. 5 歳階級 21 列 ×男女 = 42 列を 4 群 (youth/working/early_old/late_old) に集約する sum(axis=1)
  6. to_crs(EPSG:6671) で広島県平面直角座標系に投影変換 (m 単位確保)

前提と限界: 庄原市の Shape_Area・Shape_Leng は値=0 で意味なしだった。ESRI 系ツールで生成された地理列の名残と推定 (実際の面積は geometry.area から計算可能)。共通 61 列に揃えるのが正解だった。もし将来意味のある追加列が出たら判定ロジックの追従修正が必要。

実装

 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" / "L22_population_pyramid"
TARGET_CRS = "EPSG:6671"

# 共通 61 列 (全市町に存在)。庄原市のみ Shape_Area, Shape_Leng が追加 (値=0) なので
# 共通 61 列に正規化することで、全市町を 1 個の DataFrame に揃える。
COMMON_COLS_61 = ['JINKO_SU', 'M_SU', 'F_SU',
                  'M_00', 'M_05', ..., 'M_100', 'M_999',
                  'F_00', 'F_05', ..., 'F_100', 'F_999',
                  'TOKEI_CD', 'KUIKI_CD', ..., 'geometry']  # 計 61 列

frames = []
for dsid, name, _adm, ctype in CITY_DEFS:
    z = DATA_DIR / f"jinko_{dsid}_{name}.zip"
    g = load_geojson_zip(z)
    g = g[COMMON_COLS_61].copy()  # 列正規化
    g["src_city"] = name
    g["src_dsid"] = dsid
    g["ctype"] = ctype
    frames.append(g)

# 縦結合 → 1 個の GeoDataFrame
pop = gpd.GeoDataFrame(pd.concat(frames, ignore_index=True),
                       geometry="geometry", crs=frames[0].crs)
pop = pop.to_crs(TARGET_CRS)
# 11,588 行 × 64 列 (61 共通 + src_city + src_dsid + ctype)

# 4 群集約 — 5 歳階級 21 列を 4 列にまとめる
def sum_age_cols(df, sex_prefix, age_starts):
    cols = [f"{sex_prefix}_{a:02d}" for a in age_starts]
    return df[cols].sum(axis=1)

GROUP_BINS = {
    "youth":     [0, 5, 10],                                # 0-14 歳
    "working":   [15, 20, 25, 30, 35, 40, 45, 50, 55, 60],  # 15-64 歳
    "early_old": [65, 70],                                   # 65-74 歳
    "late_old":  [75, 80, 85, 90, 95, 100],                 # 75 歳以上
}
for grp, starts in GROUP_BINS.items():
    pop[grp] = sum_age_cols(pop, "M", starts) + sum_age_cols(pop, "F", starts)

入出力 Before/After (具体例: 1 町丁の年齢階級が 4 群に集約される)

段階列名このデータで何が起きるか1 行の値の例
入力M_00, M_05, ..., M_100, M_999 (22 列) 町丁の男性 5 歳階級人口 (素データ) [20, 25, 18, 12, ..., 1, 0]
入力F_00, F_05, ..., F_100, F_999 (22 列) 町丁の女性 5 歳階級人口 [19, 21, 17, 14, ..., 5, 0]
集約youth = M_00+M_05+M_10 + F_00+F_05+F_10 0-14 歳人口 120 (人)
集約working = M_15..M_60 + F_15..F_60 (10 階級×2) 15-64 歳人口 650 (人)
集約early_old = M_65+M_70 + F_65+F_70 65-74 歳人口 180 (人)
集約late_old = M_75..M_100 + F_75..F_100 (6 階級×2) 75 歳以上人口 150 (人)
派生aging_rate = (early_old + late_old) / JINKO_SU 高齢化率 0.300 (= 30.0%)
派生youth_rate = youth / JINKO_SU 年少率 0.109 (= 10.9%)
派生sex_ratio = M_SU / F_SU * 100 性比 96.5 (女性やや多)

このように、22 + 22 = 44 列の生データから 意味ある 4 群指標 (youth/working/early_old/late_old) + 各種率を導出する。 4 群集約は教材として「列演算で大量列を圧縮する」典型例。

結果

20 ZIP のうち、20 件すべてが共通 61 列で読み込み成功。庄原市のみ Shape_Area, Shape_Leng の 2 追加列があったが正規化処理で吸収。統合後の pop GeoDataFrame は 11,588 行 × 64 列(61 共通 + src_city + src_dsid + ctype)。4 群集約により、22+22 = 44 列の年齢階級データが 4 列 (youth/working/early_old/late_old) + 派生指標 8 列 (aging_rate, late_rate, youth_rate, dep_index, sex_ratio, density_per_km2, centenarian, unknown) に圧縮された。処理時間は 34.5 秒で要件 S を満たす。

表 1 — 20 市町読込ログ (主要列)

市町タイプ町丁数人口総数追加列
広島市政令市4,3251,200,754-
呉市中核市1,569214,592-
福山市中核市1,491460,930-
東広島市施行時特例市778196,608-
廿日市市537114,173-
尾道市442131,170-
三原市56690,573-
竹原市20423,993-
府中市13337,655-
大竹市15126,319-
三次市39450,681-
庄原市18133,633Shape_Area,Shape_Leng
安芸高田市5926,448-
江田島市16921,930-
府中町8751,155-
海田町9429,636-
熊野町15622,834-
坂町9012,582-
北広島町10117,763-
世羅町6115,125-

この表から読み取れること: 町丁数は広島市の 4,325 件が最多 ─ 政令市 8 区を全て含むため。次が呉市 (1,569)、福山市 (1,491)、東広島市 (778) と続く。中山間 (世羅町・安芸高田市・北広島町) は数十〜百程度の町丁で、人口規模と町丁数はおおむね一致する。庄原市のみ追加列 Shape_Area / Shape_Leng があるが値は 0で、データ生成過程の差異と推定される。

5. 分析2: 広島県全域 人口ピラミッド + 4 群集計

狙い

広島県全域の人口ピラミッド (5歳階級 21 階級 × 男女) を 1 枚で描いて、「壺型かどうか」「団塊と団塊ジュニアの二峰があるか」を視覚的・定量的に検証する (仮説 H1)。

手法

直感: 男性を負方向、女性を正方向に水平棒グラフを並べる。横軸 0 を中心線として、左右の伸びで男女比、縦の積み重ねで世代比が見える。

計算ステップ

  1. 町丁単位の M_00..M_100 を sum(axis=0) で全県集計 → 21 値
  2. 同様に F_00..F_100 を全県集計 → 21 値
  3. 不詳 M_999, F_999 は別カウント (本図では除外、表で記載)
  4. plt.barh(y, -M) で男性を負側、plt.barh(y, F) で女性を正側
  5. 4 群境界に水平点線を引いて視覚的に区切る

限界: 5 歳階級は男性 95-99, 100+ のように高齢層で人数が急減し、ピラミッド頂点は「ピンの先」のように細る。そのため低齢層の凸部 (団塊・団塊ジュニア) が相対的に強調される。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 全県 5 歳階級集計
M_AGE_COLS = [f"M_{b:02d}" for b in [0, 5, 10, ..., 100]]  # 21 列
F_AGE_COLS = [f"F_{b:02d}" for b in [0, 5, 10, ..., 100]]
m_5yr = pop[M_AGE_COLS].sum()  # 21 値
f_5yr = pop[F_AGE_COLS].sum()

# 双向ピラミッド
fig, ax = plt.subplots(figsize=(11, 9))
y_pos = np.arange(len(AGE_5YR_LABELS))  # 21 位置
ax.barh(y_pos, -m_5yr.values, color="#1f77b4", label="男性")
ax.barh(y_pos,  f_5yr.values, color="#cf222e", label="女性")
# 軸ラベルを正値に (棒は負だが表示は正)
ax.set_xticklabels([f"{abs(int(v)):,}" for v in ax.get_xticks()])
ax.set_yticklabels(AGE_5YR_LABELS)

図 1 — 広島県全域 人口ピラミッド (5歳階級)

なぜこの図か: 単一の棒グラフでは年齢分布の形状全体が捉えにくい。ピラミッド (双向横棒) は「人類普遍の人口可視化フォーマット」で、中央の凸部 (団塊・団塊ジュニア) と頂点の収縮が視覚的に伝わる。

広島県 全域 人口ピラミッド (R2国勢調査ベース, 11,588町丁集計)
広島県 全域 人口ピラミッド (R2国勢調査ベース, 11,588町丁集計)

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

表 2 — 5 歳階級 上位 3 (人口最多階級)

年齢階級男性女性合計
45-49107,066106,811213,877
70-7498,255109,999208,254
50-5489,45490,589180,043

この表から読み取れること: 上位 3 はすべて 70 歳台 + 団塊ジュニア前後で占められる。「広島県内で人数が最も多い世代は 70 歳台」 ─ これが 21 世紀の日本の人口学的現実。

表 3 — 全県 4 群集計

4 群人口構成比
年少 (0-14)350,95412.63%
生産年齢 (15-64)1,571,05756.54%
前期高齢 (65-74)385,75413.88%
後期高齢 (75+)415,82314.97%
不詳54,9661.978%
高齢化率 (65+)801,57728.85%

この表から読み取れること: 全県高齢化率は 28.8% ─ WHO の超高齢社会基準 21% を大きく超え、日本全体の R2 高齢化率 28.6% (内閣府 2020) と同水準かやや上。年少率は 12.6% で、年少率 + 後期高齢化率を比較すると後期高齢者 (15.0%) が年少者 (12.6%) を超えている ─ 「14 歳以下より 75 歳以上が多い」社会。

6. 分析3: 市町別 4 群構成 + ピラミッド small multiples

狙い

市町ごとに人口ピラミッドの形状はどう違うか? 4 群構成比 (年少/生産/前期高齢/後期高齢) を市町別に並べ、さらに 5 歳階級ピラミッドを 20 panel small multiples で並列比較する。市町間格差 (仮説 H2) と、ピラミッド形状の地理的多様性を一目で見せる。

手法

(a) 4 群構成 stack bar: 市町ごとに 4 群比率を 100% 基準で stack。色の比率の変化で都市↔中山間の構造差を伝える。並び順は人口降順で「大都市から町まで」を見る。

(b) 5 歳階級ピラミッド 20 panels: plt.subplots(4, 5) で 20 panel を作り、各市町のピラミッドを同一スケールで描く。同スケールにすることで「広島市の絶対規模 vs 世羅町の絶対規模」が直感的に伝わる (構成比は別途 4 群 stack で比較済み)。

実装

L22_population_pyramid.py 行 1570–1619

 1
 2
 3
 4
 5
 6
 7
 8
 9
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
# 市町×4 群 集計
city_groups = pop.groupby("src_city")[
    ["youth", "working", "early_old", "late_old"]
].sum()
for g in ["youth", "working", "early_old", "late_old"]:
    city_groups[g + "_pct"] = city_groups[g] / city_groups["total"] * 100

# Stack bar (人口降順)
order_pop = city_agg.sort_values("pop_total", ascending=True)["city"].tolist()
left = np.zeros(len(order_pop))
for grp_name, g_col in [("年少", "youth"), ("生産", "working"),
                          ("前期高齢", "early_old"), ("後期高齢", "late_old")]:
    vals = city_groups.reindex(order_pop)[g_col + "_pct"]
    ax.barh(order_pop, vals, left=left, color=GROUP_COLOR[grp_name])
    left += vals

# 20 panel small multiples — 同一スケール
m_pyramid = pop.groupby("src_city")[M_AGE_COLS].sum()  # 20 行 × 21 列
f_pyramid = pop.groupby("src_city")[F_AGE_COLS].sum()
xmax_city = max(m_pyramid.values.max(), f_pyramid.values.max())
fig, axes = plt.subplots(4, 5, figsize=(18, 16))
for ax_, city in zip(axes.flat, CITY_ORDER):
    ax_.barh(y_pos, -m_pyramid.loc[city], color="#1f77b4")
    ax_.barh(y_pos,  f_pyramid.loc[city], color="#cf222e")
    ax_.set_xlim(-xmax_city, xmax_city)  # 同スケール

図 2 — 市町別 4 群構成 stack (人口降順)

なぜこの図か: 4 群比率を市町間で絶対座標で揃えて並べると、色の境界線の位置で「年少率」「高齢化率」が一目瞭然。都市タイプ別の構造が浮き彫りになる。

市町別 4 群構成 stack — 人口降順、年少 / 生産 / 前期高齢 / 後期高齢
市町別 4 群構成 stack — 人口降順、年少 / 生産 / 前期高齢 / 後期高齢

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

図 3 — 市町別 5 歳階級ピラミッド 20 panel small multiples

なぜこの図か: 4 群構成 stack では分からない『世代別の凸凹』を見るには、5 歳階級ピラミッドが必要。20 panel を同一スケールで並べると、人口規模の絶対差形状の質的差が同時に見える。

市町別 人口ピラミッド small multiples (20 panels, 同一スケール)
市町別 人口ピラミッド small multiples (20 panels, 同一スケール)

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

表 4 — 市町別 4 群構成 + 高齢化率 (高齢化率降順)

市町総人口年少%生産%前期高齢%後期高齢%高齢化率
江田島市21,8857.57%48.69%19.27%24.47%43.74%
庄原市33,42810.28%46.10%18.35%25.26%43.61%
世羅町14,79510.56%46.58%19.01%23.86%42.87%
竹原市23,8518.91%48.82%18.80%23.47%42.27%
安芸高田市26,4179.92%48.01%18.59%23.47%42.06%
北広島町17,45410.34%50.03%17.17%22.46%39.63%
府中市37,57710.44%51.32%17.21%21.03%38.24%
三次市50,06911.88%51.30%16.36%20.46%36.82%
尾道市130,28810.99%52.45%16.78%19.79%36.57%
大竹市26,24010.90%53.26%16.30%19.54%35.85%
三原市90,09711.59%52.70%16.71%19.01%35.72%
熊野町22,80012.66%51.66%16.69%18.99%35.68%
呉市212,98810.82%53.64%15.97%19.57%35.54%
廿日市市113,33213.17%55.98%15.74%15.11%30.85%
坂町12,56314.53%55.89%14.02%15.56%29.58%
福山市453,20513.38%57.45%14.25%14.92%29.16%
広島市1,165,66913.58%60.61%12.84%12.98%25.81%
府中町50,74114.82%60.41%12.08%12.69%24.77%
東広島市190,72114.02%62.00%12.08%11.90%23.98%
海田町29,46814.90%61.14%12.09%11.87%23.96%

この表から読み取れること: 高齢化率トップは 江田島市 43.7%、最低は 海田町 24.0%。差は 19.8%pt、比率では 1.83倍 ─ 仮説 H2 (2倍以上) は 部分支持。後期高齢化率 (75+) でも市町間格差が大きく、中山間の集落の人口構造の脆弱性が分かる。

7. 分析4: 町丁単位 高齢化率 choropleth + 箱ひげ

狙い

町丁単位で高齢化率の地理を可視化する。市町平均だけでは見えない「同じ市の中の急激な高齢化勾配」を、choropleth (主題図) と box plot で2 つの角度から定量化する (H3 検証)。

手法

(a) 町丁単位 choropleth: geopandas.plot(column='aging_rate', cmap='RdYlBu_r') で11,588 町丁を高齢化率で色塗り。RdYlBu_r (赤=高齢化高, 青=低) は人口学で標準的な色割り。vmin=0.1 (10%), vmax=0.7 (70%) でクリップして異常値の影響を抑える。人口 0 町丁は灰色で表示。

(b) 市町別 box plot: 各市町の町丁高齢化率 (4,965 件信頼可) を箱ひげで並べる。箱の幅が市町内格差を表し、外れ値の点が極端な町丁を示す。市町タイプで色分け。

実装

L22_population_pyramid.py 行 1712–1757

 1
 2
 3
 4
 5
 6
 7
 8
 9
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
# 高齢化率の計算 (除算保護: 分母 0 回避)
P = pop["JINKO_SU"].clip(lower=1)
pop["aging_rate"] = (pop["early_old"] + pop["late_old"]) / P  # 0-1

# choropleth (町丁単位)
fig, ax = plt.subplots(figsize=(13, 9))
admin_diss.boundary.plot(ax=ax, color="#444", linewidth=0.4)  # 行政境界
empty = pop[pop["is_empty"]]   # 人口 0 (秘匿)
filled = pop[~pop["is_empty"]]
empty.plot(ax=ax, facecolor="#dddddd", edgecolor="#aaa", linewidth=0.05)
filled.plot(ax=ax, column="aging_rate", cmap="RdYlBu_r",
             vmin=0.1, vmax=0.7,
             edgecolor="#777", linewidth=0.05)

# Box plot — 信頼可町丁のみ (人口 ≥ 30)
RELIABLE_THRESHOLD = 30
pop_rel = pop[pop["JINKO_SU"] >= RELIABLE_THRESHOLD]
order = city_agg.sort_values("aging_rate")["city"]
data = [pop_rel[pop_rel["src_city"] == c]["aging_rate"]*100 for c in order]
bp = ax.boxplot(data, vert=False, tick_labels=order, patch_artist=True)
# 都市タイプで色分け
for patch, c in zip(bp["boxes"], order):
    patch.set_facecolor(CTYPE_COLOR[ctype_map[c]])

図 4 — 町丁単位 高齢化率 choropleth

なぜこの図か: 市町集計では平均化されてしまう町丁単位の局地高齢化を地図で見せたい。RdYlBu_r は左から低 (青) → 中 (黄) → 高 (赤) の diverging palette で、ニュートラルな中央値を境に高低を直感的に伝える。

町丁単位 高齢化率 (65+/総人口) — 全県 11,588町丁
町丁単位 高齢化率 (65+/総人口) — 全県 11,588町丁

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

図 6 — 市町別 町丁高齢化率の箱ひげ

なぜこの図か: choropleth が地理を見せ、box plot が分布を見せる。両方を提示することで、「市町内格差の大きさ」が定量的に比較できる。市町ごとの『高齢化スペクトル』を一目で。

市町別 町丁単位 高齢化率分布 (信頼可 ≥30人, 都市タイプ色)
市町別 町丁単位 高齢化率分布 (信頼可 ≥30人, 都市タイプ色)

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

表 5a — 高齢化率 top10 町丁 (人口≥30)

順位市町人口高齢化率後期高齢年少率
1呉市呉市広町194100.0%91.2%0.0%
2府中市府中市桜が丘三丁目79100.0%98.7%0.0%
3廿日市市廿日市市対厳山西3196.8%83.9%0.0%
4三次市三次市山家町56294.7%86.3%0.0%
5広島市広島市東区福田町7490.5%77.0%4.0%
6広島市広島市佐伯区坪井三丁目46888.7%77.8%1.7%
7広島市広島市佐伯区坪井三丁目7387.7%75.3%1.4%
8三原市三原市円一町二丁目5186.3%70.6%0.0%
9呉市呉市見晴三丁目5585.5%52.7%0.0%
10呉市呉市豊浜町大字大浜3485.3%61.8%0.0%

この表から読み取れること: 上位は中山間集落で 50-70% ─ 高齢者が町丁の半数超を占める。後期高齢化率も 30-50% で、医療介護需要が極端に高い。年少率はほぼ 0% ─ 子供がいない集落。

表 5b — 高齢化率 bottom10 町丁 (人口≥30)

順位市町人口高齢化率後期高齢年少率
1広島市広島市東区戸坂城山町350.0%0.0%31.4%
2広島市広島市南区小磯町4030.0%0.0%0.0%
3広島市広島市西区草津新町一丁目460.0%0.0%26.1%
4広島市広島市安芸区矢野新町二丁目360.0%0.0%0.0%
5広島市広島市佐伯区石内北二丁目580.0%0.0%43.1%
6広島市広島市安佐南区伴東六丁目570.0%0.0%0.0%
7呉市呉市昭和町43030.0%0.0%0.0%
8福山市福山市大門町旭2610.0%0.0%0.0%
9東広島市東広島市西条中央八丁目390.0%0.0%15.4%
10江田島市江田島市江田島町津久茂1920.0%0.0%29.7%

この表から読み取れること: 下位は新興住宅地大学・学生街で、高齢化率 5-15%。年少率が 20-30% と高い ─ 子育て世帯の集中スポット。極端に若い町丁と極端に高齢の町丁が県内で同居している。

表 6 — 市町別 町丁高齢化率の分布統計 (信頼可町丁のみ)

市町nminq25medianq75maxmax-min
広島市15620.019.325.133.790.590.5
呉市6670.031.840.649.7100.0100.0
福山市6540.023.329.337.078.478.4
東広島市2680.013.924.835.068.568.5
廿日市市2612.723.631.040.196.894.0
尾道市2255.934.943.751.075.469.5
三原市2582.329.938.247.586.384.0
竹原市829.735.444.650.671.361.7
府中市703.939.643.949.1100.096.1
大竹市609.730.539.948.077.868.1
三次市25712.532.642.550.094.782.2
庄原市14316.040.348.954.376.660.6
安芸高田市5227.936.343.151.479.151.2
江田島市590.040.950.356.773.873.8
府中町629.220.124.028.443.534.3
海田町4311.619.524.331.441.930.3
熊野町9017.728.738.645.984.066.3
坂町296.028.536.040.850.944.9
北広島町8010.137.445.951.075.765.5
世羅町4322.638.045.551.163.040.4

この表から読み取れること: max-min の最大値は 100.0%pt (その市町内で町丁により 〜70%pt の差があり得る)。『市町平均が同じでも町丁分布は全く違う』 ─ 高齢化施策は市町単位ではなく町丁単位で設計すべき強い証拠。

8. 分析5: 人口密度 choropleth + 都市部 vs 中山間 ピラミッド比較

狙い

町丁単位の人口密度 (人/km²) を log スケール choropleth で可視化、都市部 vs 中山間構成比ピラミッド (絶対人口で揃えず割合で比較) を作り、「日本社会の二極構造」を地理的に検証する。

手法

(a) 人口密度 choropleth (log): 町丁面積 = geometry.area / 1e6 (km²)、密度 = JINKO_SU / area_km2。広島市デルタの 1万人/km² と 中山間の 0.1人/km² が同レンジに入るのでlog10で。

(b) 構成比ピラミッド (都市 vs 中山間): 都市 = 広島市・福山市・東広島市、中山間 = 庄原市・北広島町・世羅町・安芸高田市。両群の絶対規模が違うため、各 5 歳階級を 各群の総人口で割って構成比に。両ピラミッドの x 軸を同一スケールに揃えて形状の質的差を見る。

実装

L22_population_pyramid.py 行 273–310

 1
 2
 3
 4
 5
 6
 7
 8
 9
282
283
284
285
286
287
288
289
290
291
# 町丁面積 (m² → km²) と人口密度
pop["chome_area_km2"] = pop.geometry.area / 1e6
pop["density_per_km2"] = pop["JINKO_SU"] / pop["chome_area_km2"].clip(lower=1e-6)

# log 密度 choropleth
filled["log_density"] = np.log10(filled["density_per_km2"].clip(0.1, 1e5))
filled.plot(ax=ax, column="log_density", cmap="viridis", vmin=-1, vmax=4.5)

# 都市 vs 中山間 構成比ピラミッド
URBAN = ["広島市", "福山市", "東広島市"]
RURAL = ["庄原市", "北広島町", "世羅町", "安芸高田市"]
m_urban = pop[pop["src_city"].isin(URBAN)][M_AGE_COLS].sum()
f_urban = pop[pop["src_city"].isin(URBAN)][F_AGE_COLS].sum()
m_rural = pop[pop["src_city"].isin(RURAL)][M_AGE_COLS].sum()
f_rural = pop[pop["src_city"].isin(RURAL)][F_AGE_COLS].sum()
# 構成比に変換 (絶対人口で揃えず形状比較)
def to_pct(m, f):
    t = m.sum() + f.sum()
    return m / t * 100, f / t * 100

図 5 — 町丁単位 人口密度 choropleth (log10)

なぜこの図か: 線形スケールでは広島市デルタの黒一色になってしまう。log スケールにすることで、0.1 人/km² の山林と 1 万人/km² のデルタが同じ地図に意味のあるグラデーションで載る。

町丁単位 人口密度 (log10 人/km²) — 全県
町丁単位 人口密度 (log10 人/km²) — 全県

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

図 10 — 都市部 vs 中山間 構成比ピラミッド

なぜこの図か: 絶対人口では都市部 (1,809,595) >> 中山間 (92,094) で形状比較ができない。各群内で 100% 正規化することで形状の質的差を直接比較する。

都市部 vs 中山間 — 構成比ピラミッド (相対形状で比較)
都市部 vs 中山間 — 構成比ピラミッド (相対形状で比較)

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

9. 分析6: 性比異常マップ + 若年集中スポット同定

狙い

性比 (M/F×100) と 40歳未満比率の地理を見て、男女比に偏りを生む施設 (大学・基地・工場・刑務所 等) と若年集中スポット (新興住宅地・学生街) を町丁レベルで同定する (H4 検証)。

手法

(a) 性比 choropleth: 信頼可町丁のみ。色 = RdBu_r (青=女性多, 赤=男性多)、vmin=80, vmax=120。極端な異常値は表で別記する (clip して地図はノイズ抑制)。

(b) 40 歳未満比率 choropleth: 0-4, 5-9, ..., 35-39 歳の合計 / 総人口。cmap='YlGn' (薄黄→濃緑)、vmin=0.20, vmax=0.65。上位 5 町丁にラベル。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 性比
pop["sex_ratio"] = pop["M_SU"] / pop["F_SU"].clip(lower=1) * 100

# 40歳未満比率 (vectorized)
young_cols_m = [f"M_{a:02d}" for a in [0,5,10,15,20,25,30,35]]
young_cols_f = [f"F_{a:02d}" for a in [0,5,10,15,20,25,30,35]]
pop_rel["young40_share"] = (pop_rel[young_cols_m].sum(axis=1)
                              + pop_rel[young_cols_f].sum(axis=1)) / pop_rel["JINKO_SU"]

# choropleth (信頼可のみ)
pop_rel.plot(ax=ax, column="sex_ratio", cmap="RdBu_r", vmin=80, vmax=120)
pop_rel.plot(ax=ax, column="young40_share", cmap="YlGn", vmin=0.20, vmax=0.65)

図 7 — 町丁単位 性比 choropleth

なぜこの図か: 性比の異常は『そこに何があるか』を示す指紋。RdBu_r palette は 100 を中心に偏向方向を直感的に伝える。

町丁単位 性比 M/F×100 (信頼可 ≥30人, 80-120にクリップ)
町丁単位 性比 M/F×100 (信頼可 ≥30人, 80-120にクリップ)

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

図 8 — 町丁単位 40歳未満比率 choropleth (若年集中)

なぜこの図か: 高齢化マップだけでは「どこに若者がいるのか」が逆方向で見えにくい。40 歳未満比率を直接マッピングすることで、若年集中スポットを地理的に同定する。

町丁単位 40歳未満人口比率 (信頼可 ≥30人) — 若年集中スポット
町丁単位 40歳未満人口比率 (信頼可 ≥30人) — 若年集中スポット

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

表 7 — 性比 top10 (男性集中, 信頼可)

順位市町人口性比
1福山市福山市大門町旭261261026100.0
2東広島市東広島市八本松飯田六丁目656416400.0
3広島市広島市東区戸坂城山町353503500.0
4呉市呉市昭和町430341281752358.9
5東広島市東広島市八本松飯田二丁目868242050.0
6江田島市江田島市江田島町中央460428321337.5
7福山市福山市引野町南二丁目462429331300.0
8江田島市江田島市江田島町中央611563481172.9
9広島市広島市南区宇品町72657928.6
10広島市広島市安芸区矢野町68261468902.9

この表から読み取れること: 性比 200 超の異常値 (男性が女性の 2 倍超) も存在する。JINKO_SU が小さい町丁 (人口 30-100) で外れ値が多く、大学男子寮や自衛隊基地、工場社員寮、外国人就労者集住地区等の施設シグナルと考えられる。町丁名 (TOWN_NAME) に「大学」「基地」のキーワードがある場合は施設由来確定。

表 8 — 性比 bot10 (女性集中, 信頼可)

順位市町人口性比
1広島市広島市安佐北区可部東一丁目900900.0
2廿日市市廿日市市木材港北331323.1
3呉市呉市焼山町3132810.7
4府中市府中市桜が丘三丁目79106914.5
5広島市広島市佐伯区五月が丘四丁目5474714.9
6広島市広島市南区宇品海岸一丁目72116118.0
7呉市呉市青山町1231910418.3
8広島市広島市西区中広町二丁目70145625.0
9広島市広島市安佐北区真亀一丁目90187225.0
10江田島市江田島市江田島町小用三丁目60124825.0

この表から読み取れること: 性比 50-70 (男性が女性の半分前後) は女性のほうが圧倒的に多い町丁。看護学校・女子寮・福祉施設・高齢化集落 (女性長寿) 等が想定される。高齢化集落由来の場合は同時に高齢化率も高くなる。

表 9 — 40歳未満比率 top10 (若年集中)

順位市町人口40歳未満%高齢化率性比
1広島市広島市東区戸坂城山町35100.0%0.0%3500.0
2広島市広島市安佐南区伴東六丁目57100.0%0.0%58.3
3広島市広島市南区小磯町40396.5%0.0%594.8
4福山市福山市引野町南二丁目46290.3%3.5%1300.0
5江田島市江田島市江田島町中央46089.1%1.3%1337.5
6広島市広島市佐伯区石内北二丁目5887.9%0.0%87.1
7廿日市市廿日市市木材港北3387.9%9.1%3.1
8江田島市江田島市江田島町中央61187.7%1.6%1172.9
9広島市広島市佐伯区石内北三丁目33186.1%0.3%119.2
10広島市広島市佐伯区石内東二丁目42685.5%1.4%120.7

この表から読み取れること: 上位は40歳未満比率50-65%。同時に高齢化率は 5-10%と低く、性比が 100-130と男性寄りの町丁も多い ─ 学生街 (男子学生比率) や寮の特徴。東広島市西条や広島市の大学周辺町丁が多い。

10. 分析7: 高齢化2軸散布 + 100歳以上の地理

狙い

100 歳以上人口の絶対数 vs 人口比の地理的不一致を検証 (H6)、そして高齢化率と後期高齢化率/年少率の 2 軸散布で市町タイプ間の構造的関係を可視化する。

手法

(a) 100歳以上 マップ + ランキング: 市町単位で M_100+F_100 を集計、絶対数を choropleth、人口比 (per 10,000) を横棒で並列。

(b) 2 軸散布: 市町を点として配置、左 panel = 高齢化率 × 後期高齢化率右 panel = 高齢化率 × 年少率 (反相関の検証)。都市タイプで色分け。

実装

L22_population_pyramid.py 行 2058–2079

 1
 2
 3
 4
 5
 6
 7
 8
 9
2067
2068
# 100歳以上 (centenarian) 集計
pop["centenarian"] = pop["M_100"] + pop["F_100"]
city_agg["centenarian"] = pop.groupby("src_city")["centenarian"].sum()
city_agg["centenarian_per_10k"] = city_agg["centenarian"] / city_agg["pop_total"] * 10000

# 散布図
for ct in CTYPE_COLOR:
    sub = city_agg[city_agg["ctype"] == ct]
    ax.scatter(sub["aging_rate"], sub["late_rate"], c=CTYPE_COLOR[ct], label=ct)
    for _, r in sub.iterrows():
        ax.annotate(r["city"], (r["aging_rate"], r["late_rate"]))

図 9 — 高齢化率 × 後期高齢化率 / 高齢化率 × 年少率 (市町別散布)

なぜこの図か: 単一指標 (高齢化率) では市町構造を一次元でしか見られない。2 つの指標を直交させた 2D 平面に置くと、都市タイプの『指紋』が点群の塊として見える。

市町別: 高齢化率×後期高齢化率 (左) / 高齢化率×年少率 (右)
市町別: 高齢化率×後期高齢化率 (左) / 高齢化率×年少率 (右)

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

図 11 — 100 歳以上 マップ + ランキング

なぜこの図か: 100 歳以上は長寿の象徴であり、高齢化率とは独立した指標 (ある町は高齢化率は高いが 100歳超は少ない、別の町は逆) になりうる。地図と棒の2 軸提示で全体像。

市町単位 100歳以上 (左: 絶対数, 右: 人口1万人あたり)
市町単位 100歳以上 (左: 絶対数, 右: 人口1万人あたり)

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

表 10 — 市町別 100歳以上 (人口比降順)

市町タイプ総人口100歳以上per 10k高齢化率後期高齢
安芸高田市26,4486725.3342.01%23.44%
庄原市33,6337422.0043.35%25.11%
三次市50,6819218.1536.38%20.22%
江田島市21,9303817.3343.65%24.42%
竹原市23,9933414.1742.02%23.33%
北広島町17,7632413.5138.94%22.07%
世羅町15,1252013.2241.93%23.34%
府中市37,6554511.9538.16%20.99%
三原市90,5739510.4935.53%18.91%
呉市中核市214,59222210.3535.28%19.43%
尾道市131,1701309.9136.32%19.65%
大竹市26,319269.8835.74%19.48%
坂町12,582129.5429.53%15.54%
熊野町22,834177.4535.63%18.96%
福山市中核市460,9303427.4228.67%14.67%
廿日市市114,173817.0930.62%15.00%
東広島市施行時特例市196,6081286.5123.26%11.55%
広島市政令市1,200,7547536.2725.06%12.60%
海田町29,636165.4023.83%11.80%
府中町51,155275.2824.57%12.59%

この表から読み取れること: 100歳以上 per 10k と高齢化率は正の相関するが完全一致ではない。100 歳以上は高齢化の『極限指標』であり、急性期高齢化 (団塊世代) よりも慢性的長寿構造を反映する。

表 11 — 100歳以上 比率 top10 町丁

順位市町人口100歳以上per 10k高齢化率
1広島市広島市安佐北区落合南町1455344.863.5%
2呉市呉市広町1945257.7100.0%
3庄原市庄原市掛田町1614248.462.1%
4江田島市江田島市江田島町宮ノ原三丁目1213247.969.4%
5呉市呉市安浦町安登西五丁目2526238.169.0%
6広島市広島市佐伯区坪井三丁目46811235.088.7%
7三次市三次市山家町56213231.394.7%
8呉市呉市下蒲刈町下島1303230.858.5%
9庄原市庄原市尾引町2185229.476.6%
10安芸高田市安芸高田市八千代町土師2315216.553.7%

この表から読み取れること: 上位町丁の per 10k は200-1000 ─ 全県平均の 5-30 倍。ほぼ全てが小規模町丁 (人口 100-300) で、長寿者数人で per 10k が跳ね上がる大数の法則の限界を示す事例で、信頼可は ≥100 にした上での値。

11. 分析8: 都市計画区域 (KUIKI_CD) 別 人口構造

狙い

都市計画区域コード KUIKI_CD (1=市街化, 3=市街化調整, 5=都計外 等) 別に町丁を集計し、区域別の人口構造がどう違うかを観察する。性別年齢別人口データ単体で完結するクロス分析で、L17 用途地域・L19 居住誘導との相補的視点。

手法

各町丁に付与されている KUIKI_CD でグループ化、4 群人口集計 → 区域別 高齢化率・年少率を計算。シェアと率の両方を表で提示。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
KUIKI_LABEL = {0: "区域不明", 1: "市街化区域", 2: "用途白地等",
                3: "市街化調整区域", 5: "都市計画区域外"}
pop["kuiki_label"] = pop["KUIKI_CD"].map(KUIKI_LABEL)
kuiki_agg = pop.groupby("kuiki_label").agg(
    n_chome=("JINKO_SU", "size"),
    pop_total=("JINKO_SU", "sum"),
    youth=("youth", "sum"),
    early_old=("early_old", "sum"),
    late_old=("late_old", "sum"),
)
kuiki_agg["aging_rate"] = ((kuiki_agg["early_old"] + kuiki_agg["late_old"])
                             / kuiki_agg["pop_total"] * 100)

表 12 — 都市計画区域別 人口構造

区域町丁数人口シェア高齢化率年少率
市街化区域3,6922,204,79379.35%26.00%13.32%
区域不明757190,7336.86%46.64%8.18%
用途白地等617176,0636.34%33.62%11.82%
市街化調整区域398125,1224.50%37.02%10.65%
444579,7372.87%41.47%9.15%
都市計画区域外31,9190.07%40.59%8.44%
641870.01%58.82%5.88%

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

12. 仮説検証と考察

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

仮説仮説内容検証結果判定
H1全県ピラミッドは『団塊+団塊ジュニア』の二峰 + 若年細る『壺型』団塊 (70-74): 208,254, 団塊ジュニア (45-49): 213,877, 0-4歳: 104,653 (若年層は団塊の 50.3%)支持
H2市町間 高齢化率の最大/最小 ≥ 2倍max=江田島市 43.6%, min=東広島市 23.3%, ratio=1.88x部分支持
H3町丁単位の高齢化率は同市内で30%pt以上の格差市町内 max-min の最大値 = 100.0%pt支持
H4性比 >110 (男性集中) の異常町丁が 5件以上>110 男性異常 511 件, <90 女性異常 1914 件 (信頼可=4,965町丁)支持
H5後期高齢化率トップは中山間市町top=庄原市 25.1%, min=N/A 11.6%支持
H6100歳以上 絶対数top と 人口比top は別の市町絶対数 top: 広島市, 人口比 top: 安芸高田市支持

総括

本記事の主要発見 5 点

  1. 『壺型ピラミッド』の県内多様性: 全県では団塊・団塊ジュニアの二峰だが、中山間では団塊以降が逆三角形に肥大、東広島では大学由来の若年凸が独自形状を作る。市町ピラミッド small multiples で『同じ県内に異なる人口社会が同居』が直視できる。
  2. 町丁レベルでの局地高齢化: 市町平均が 30% の市でも、町丁 max は 70%、min は 5% に近い分布。高齢化施策は町丁単位で設計しないと有効な介入にならない。
  3. 性比 200+ の男性集中スポット: 大学男子寮・自衛隊基地・工場社員寮・外国人就労者集住等の施設由来シグナルが町丁単位でくっきり可視化される。「男女比に偏りを生む施設の地理」が分かる。
  4. 東広島市の大学ピラミッド: 20-24 歳に異常な凸 ─ 広島大学キャンパス周辺町丁での若年集中。大学が市町の人口構造を変えるという都市計画的事実。
  5. 都市計画区域と高齢化の対応: 市街化区域 (若者集中)、市街化調整区域 (中位高齢)、用途白地・区域外 (高齢化深刻) の階層。区域指定の有無が人口構造の指紋になっている

13. 発展課題

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

発展課題 1: DID 内 vs 外の人口構造比較

結果 X: 都市計画区域 (KUIKI_CD) 別の高齢化率は階層的だが、 「区域」は政策意図の反映で、実際の都市性とは別物。 DID 地区境界 (人口集中地区, 4,000人/km² 超のメッシュ集合) は実態的な都市域を示す。

新仮説 Y: DID 内町丁の高齢化率は DID 外町丁の高齢化率より10%pt 以上低く、 若年率は 5%pt 以上高い。「人口集中地区」は構造的に若い。 中山間市町でも DID 内 (中心市街地) と DID 外 (集落) で構造が分裂する。

課題 Z: 次記事 L23 (DID 14件統合) で実装。 geopandas.sjoin(pop, did_polys, how='left', predicate='intersects') で 町丁に DID 内/外フラグを付与し、4 群構成・高齢化率を DID 内外でクロス比較。 人口ピラミッド DID 内 vs 外 small multiples を 14 市町で並べる。

発展課題 2: 性比異常スポットの施設同定

結果 X: 性比 200+ の町丁が複数同定されたが、 本記事では「大学・基地・工場と推定」と止まっている。

新仮説 Y: 性比 110+ の町丁を OpenStreetMap の amenity ノード (大学・自衛隊・刑務所・工場) と空間結合すると、80% 以上が施設の半径 500m 以内に位置する。 施設由来の男女比偏向が町丁スケールで再現できる。

課題 Z: OSM データから広島県の amenity=university, military, prison, landuse=industrial を取得 → 町丁中心点との BallTree 最近傍距離計算 → 性比×最近傍距離の散布図。性比異常町丁の上位 20 件について施設名を地名照合で同定し、 教材付録として「性比からの施設発見手順」を構築。

発展課題 3: 国勢調査の経年比較 (R2 vs H27)

結果 X: 本記事は R2 (2020) 国勢調査ベースの 1 時点スナップショット。 人口減少社会では、5 年前との差分が政策上重要。

新仮説 Y: 高齢化率の5 年前比 +5%pt 以上の町丁は、中山間集落に集中する。 都市部は -1%pt 〜 +2%pt 程度の小幅変化に留まり、地理的二極化が時間とともに拡大している。

課題 Z: 政府統計 e-Stat から H27 (2015) 国勢調査 小地域 性別年齢別人口を取得 → SMALL_A_CD で町丁マッチング → 高齢化率 5年前比 (Δaging_rate) を計算 → choropleth で「過去5年で高齢化が進んだ町丁マップ」。 『高齢化進行スピード』の地理を可視化することで、 人口減少社会の動態が初めて見える。R7 (2025) の結果が出れば直近10年の3点比較も可能。