この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
| 原論文が使ったデータ | 国勢調査・平成 22 年都市公園データ・平成 24 年地域経済循環率・平成 25 年財政力指数・平成 27 年鉄道データ・平成 27 年面積当たりの平均不動産取引価格・平成 28 年行政区域データ 分析単位:市区町村 中核手法:階層分析法 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 地方創生に向けた東京一極集中是正のための定量的都市圏選定指標の提案 日本統計協会賞/池田 泰成、柴辻 優樹、鶏内 朋也、石川 貴啓、佐野 岳史(慶應義塾大学リーディングプログラム) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2018_U3_suri.py(193 行)そのものです。
このページで実SSDSEから実再現できるのは図1・図2(東京一極集中の背景)だけです。コードの編集は不要です。図3・図4の都市圏選定結果は、原論文が国土数値情報・RESAS・市区町村版データを組み合わせて算出したもので現行SSDSE-Bに収録列が無いため、原論文 表4-2 の報告値(順位)を転記して可視化します。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。図1・図2は SSDSE-B の総人口(A1101)・転入(A5101)・転出(A5102)の2023年値から実再現、図3・図4は原論文 表4-2 の報告値から可視化します。
日本では人口・政治・経済・文化の諸機能が東京へ集中している。原論文は「人口や大学数は東京圏だけで全国の約30%、学生数は約40%」と指摘し、過密による住宅・通勤・防災上のリスク、そして2011年の東日本大震災を契機に再燃した首都機能移転の議論を出発点にしている。
そこで著者らは、地方創生の観点から「首都機能を移すのにふさわしい都市圏の中核都市はどこか」を、感覚ではなく定量的な指標で選び出すことを目指した。従来のAHPによる首都機能移転研究が委員の定性評価に依存し経済的観点を欠いていた点を克服し、地理・経済・生活の3観点の公的データから客観的にスコア化する点が新しい。手法の中心は階層分析法(AHP)と、順位に基づく加重平均である。
大学生・一般の部・日本統計協会賞 中核市54市 AHP(階層分析法) パーセンタイル配点・加重平均
原論文は54の中核市を単位に、地理・経済・生活の15指標を複数の出典から集めている。指標の元データは市区町村レベルで、国勢調査・国土数値情報・RESASにまたがる。
| 観点 | 指標の例 | 出典 | 本ページでの扱い |
|---|---|---|---|
| 地理 | 面積、空港・新幹線駅までの距離、鉄道・都市公園データ | 教育用標準データセット(国勢調査2015)/国土数値情報(都市公園・鉄道・行政区域) | 報告値の可視化(市区町村・GIS由来、SSDSE-B外) |
| 経済 | 地域経済循環率、財政力指数、面積当たり平均不動産取引価格 | RESAS 地域経済分析システム | 報告値(SSDSE-Bに列なし) |
| 生活 | 人口・世帯など生活環境に関わる指標 | 教育用標準データセット(国勢調査2015、市区町村) | 報告値(市区町村版、現行SSDSE-B外) |
| 背景(実再現) | 総人口(A1101)・転入(A5101)・転出(A5102) | SSDSE-B-2026(2023年) | 実再現(東京一極集中の確認) |
都市圏は複数都市が協力して大都市機能を担うため、著者は政令指定都市の次に大きい区分である中核市(2018年4月時点で人口20万人以上の54市)を候補にした。地方創生の先行研究でも、高度医療などを担う地域として中核都市が対象とされてきた。
指標ごとに単位もスケールも違うため、54市で順位を計算し、その順位を25/50/75パーセンタイルで区切って1・2・3・4点に変換する。順位ベースにすることで、外れ値の大きさに左右されず横並び比較できる。全指標の点を足したものが素点。
階層分析法(AHP)で「地方創生」という目標の下に地理・経済・生活のカテゴリと指標を階層化。重視する観点の合計点に0.6、他の2観点に0.2を掛けた加重平均で、地理重視・経済重視・生活重視の3シナリオの得点を算出した。
まず、原論文の出発点である「東京一極集中」が実データでどう表れるかを見る。都市圏選定指標そのものは現行SSDSEで再計算できないため、ここは背景の実証として、SSDSE-Bの転入・転出から転入超過数(社会増減)を都道府県別に並べる。
cp932 で読み、日本語ラベル行を skiprows=[1] で外し、年度==2023 に絞る。総人口(A1101)・転入(A5101)・転出(A5102)から転入超過数と東京圏の人口シェアを計算する。都市圏スコアは扱わず、原論文の背景「東京一極集中」だけを実データで確認する土台づくり。45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | # SSDSE-B-2026.csv は cp932・2行目が日本語ラベル行なので skiprows=[1] で外す。 # 先頭列名 'SSDSE-B-2026' が年度、A1101=総人口、A5101=転入者数、A5102=転出者数。 df = pd.read_csv(DATA_B, encoding='cp932', skiprows=[1]) d23 = df[df['SSDSE-B-2026'] == 2023].copy() # 転入超過数(社会増減)= 転入 − 転出。プラスなら人口が流入超過。 d23['転入超過数'] = d23['A5101'] - d23['A5102'] national_pop = d23['A1101'].sum() tokyo_area = ['東京都', '神奈川県', '埼玉県', '千葉県'] share_area = d23.loc[d23['Prefecture'].isin(tokyo_area), 'A1101'].sum() / national_pop * 100 share_tokyo = d23.loc[d23['Prefecture'] == '東京都', 'A1101'].iloc[0] / national_pop * 100 print('=== [1] 実SSDSE-B 2023年データ(実再現の土台)===') print(f'対象都道府県数: {len(d23)}') print(f'全国総人口(2023): {national_pop:,} 人') print(f'東京圏(1都3県)の人口シェア: {share_area:.2f}%(東京都単独 {share_tokyo:.2f}%)') print('転入超過数 上位5:') print(d23.sort_values('転入超過数', ascending=False)[['Prefecture', '転入超過数']].head(5).to_string(index=False)) |
=== [1] 実SSDSE-B 2023年データ(実再現の土台)===
対象都道府県数: 47
全国総人口(2023): 124,353,000 人
東京圏(1都3県)の人口シェア: 29.68%(東京都単独 11.33%)
転入超過数 上位5:
Prefecture 転入超過数
東京都 58489
神奈川県 22088
埼玉県 17850
千葉県 16375
大阪府 1307170 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | rank = d23.sort_values('転入超過数', ascending=False).reset_index(drop=True) top_area = rank[rank['転入超過数'] > 0] # 流入超過の県 inflow_n = len(top_area) tokyo_area_inflow = rank[rank['Prefecture'].isin(tokyo_area)]['転入超過数'].sum() positive_total = top_area['転入超過数'].sum() print('=== [2] 図1: 転入超過数ランキング(実再現)===') print(f'転入超過(プラス)の都道府県数: {inflow_n} / 47') print(f'東京圏4都県の転入超過合計: {tokyo_area_inflow:,} 人') print(f'全プラス県の合計に占める東京圏の割合: {tokyo_area_inflow/positive_total*100:.1f}%') fig, ax = plt.subplots(figsize=(9, 11)) colors = [C_ORANGE if p in tokyo_area else (C_BLUE if v > 0 else C_GRAY) for p, v in zip(rank['Prefecture'], rank['転入超過数'])] ax.barh(rank['Prefecture'], rank['転入超過数'], color=colors) ax.invert_yaxis() ax.axvline(0, color='#333', lw=0.8) ax.set_xlabel('転入超過数(転入−転出、2023年)[人]') ax.set_title('図1【実再現】都道府県別 転入超過数ランキング(実SSDSE-B-2026・2023年)\n' 'オレンジ=東京圏(1都3県)・青=その他の流入超過県・灰=流出超過県', fontsize=12) ax.tick_params(axis='y', labelsize=8) plt.tight_layout() plt.savefig(f'{FIG_DIR}/2018_U3_fig1.png', bbox_inches='tight') plt.close() |
=== [2] 図1: 転入超過数ランキング(実再現)=== 転入超過(プラス)の都道府県数: 6 / 47 東京圏4都県の転入超過合計: 114,802 人 全プラス県の合計に占める東京圏の割合: 84.1%
転入超過の集中を、今度は人口ストックのシェアで確かめる。原論文は「東京圏で全国の約30%」と述べた。この主張を、SSDSE-Bの総人口(A1101)で実際に計算して検証する。
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | labels = ['東京圏\n(東京・神奈川・埼玉・千葉)', 'その他43道府県'] values = [share_area, 100 - share_area] print('=== [3] 図2: 東京圏の人口シェア(実再現)===') print(f'東京圏(1都3県)シェア: {share_area:.2f}%') print(f'その他43道府県シェア: {100-share_area:.2f}%') print('→ 原論文が背景で述べた「東京圏で全国の約30%」を実データで確認。') fig, ax = plt.subplots(figsize=(7, 5)) bars = ax.bar(labels, values, color=[C_ORANGE, C_GRAY], width=0.55) for b, v in zip(bars, values): ax.text(b.get_x() + b.get_width() / 2, v + 1, f'{v:.1f}%', ha='center', fontsize=13, fontweight='bold') ax.set_ylim(0, 80) ax.set_ylabel('全国人口に占める割合[%]') ax.set_title('図2【実再現】東京圏の人口シェア(実SSDSE-B-2026・2023年)\n' '1都3県に全国人口の約3割が集中', fontsize=12) plt.tight_layout() plt.savefig(f'{FIG_DIR}/2018_U3_fig2.png', bbox_inches='tight') plt.close() |
=== [3] 図2: 東京圏の人口シェア(実再現)=== 東京圏(1都3県)シェア: 29.68% その他43道府県シェア: 70.32% → 原論文が背景で述べた「東京圏で全国の約30%」を実データで確認。
ここからが原論文の成果である都市圏の中核都市の選定結果だ。素点(等重み)と、地理・経済・生活を重視した3シナリオそれぞれの上位5都市を見る。この総合スコアはGIS距離計算やRESAS経済指標に依存し現行SSDSEで再計算できないため、原論文 表4-2 の順位を転記して可視化する(再計算ではない)。
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | # 原論文 表4-2「中核都市の点数ランキング」の上位5を転記(点数=表4-1は画像のため非収録)。 # 列: 素点(粗点) / 地理重視 / 経済重視 / 生活重視。順位のみを可視化し数値は作らない。 top5 = pd.DataFrame({ '素点(粗点)': ['前橋市', '金沢市', '高崎市', '高知市', '福島市'], '地理重視': ['前橋市', '高知市', '宇都宮市', '高崎市', '川口市'], '経済重視': ['宇都宮市', '金沢市', '大分市', '那覇市', '高崎市'], '生活重視': ['前橋市', '福島市', '鳥取市', '長崎市', '金沢市'], }, index=['1位', '2位', '3位', '4位', '5位']) print('=== [4] 図3: 原論文 表4-2 各シナリオ上位5(報告値の可視化)===') print(top5.to_string()) print('素点 下位(原論文 5章・低い順): 岡崎市, 大津市, 八尾市, 佐世保市, +同点で明石市・函館市・青森市') fig, ax = plt.subplots(figsize=(9, 3.6)) ax.axis('off') tbl = ax.table(cellText=top5.values, rowLabels=top5.index, colLabels=top5.columns, cellLoc='center', loc='center') tbl.auto_set_font_size(False) tbl.set_fontsize(11) tbl.scale(1, 1.7) for j in range(len(top5.columns)): tbl[0, j].set_facecolor(C_BLUE) tbl[0, j].set_text_props(color='white', fontweight='bold') ax.set_title('図3【報告値の可視化】原論文 表4-2 各シナリオ上位5都市\n' '(AHP+パーセンタイル配点による選定結果。順位のみ転記・再計算ではない)', fontsize=12, pad=14) plt.tight_layout() plt.savefig(f'{FIG_DIR}/2018_U3_fig3.png', bbox_inches='tight') plt.close() |
=== [4] 図3: 原論文 表4-2 各シナリオ上位5(報告値の可視化)=== 素点(粗点) 地理重視 経済重視 生活重視 1位 前橋市 前橋市 宇都宮市 前橋市 2位 金沢市 高知市 金沢市 福島市 3位 高崎市 宇都宮市 大分市 鳥取市 4位 高知市 高崎市 那覇市 長崎市 5位 福島市 川口市 高崎市 金沢市 素点 下位(原論文 5章・低い順): 岡崎市, 大津市, 八尾市, 佐世保市, +同点で明石市・函館市・青森市
シナリオごとに上位は入れ替わるが、どのシナリオでも上位に残る都市こそ、重みの置き方に左右されない有力候補といえる。図3の報告順位を横断集計して、各都市が上位5に何回入ったかを数える。
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | # 図3の報告値(4シナリオ×上位5)を横断集計。何回上位5に登場したかを数えるだけで、 # 新しい数値は作らない。複数シナリオで頑健に上位となる都市が見える。 from collections import Counter cnt = Counter() for col in top5.columns: for city in top5[col]: cnt[city] += 1 robust = pd.Series(cnt).sort_values(ascending=False) print('=== [5] 図4: 上位5への登場回数(報告値の集計)===') print(robust.to_string()) fig, ax = plt.subplots(figsize=(9, 5)) bar_colors = [C_ORANGE if v >= 3 else (C_BLUE if v == 2 else C_GRAY) for v in robust.values] ax.barh(robust.index, robust.values, color=bar_colors) ax.invert_yaxis() ax.set_xlabel('4シナリオ(素点・地理・経済・生活)中で上位5に入った回数') ax.set_xticks([0, 1, 2, 3, 4]) for i, v in enumerate(robust.values): ax.text(v + 0.05, i, str(v), va='center', fontweight='bold') ax.set_title('図4【報告値の集計】シナリオ横断で上位5に入った回数\n' 'オレンジ=3回以上(頑健な候補)/原論文 表4-2 の順位を集計・数値は非捏造', fontsize=12) plt.tight_layout() plt.savefig(f'{FIG_DIR}/2018_U3_fig4.png', bbox_inches='tight') plt.close() |
=== [5] 図4: 上位5への登場回数(報告値の集計)=== 前橋市 3 金沢市 3 高崎市 3 高知市 2 福島市 2 宇都宮市 2 川口市 1 大分市 1 那覇市 1 鳥取市 1 長崎市 1
著者は表4-1・表4-2の結果から、次のように考察した(原論文5章)。
素点で上位の福島市は、先行研究でも移転先候補に挙がっていた。別の指標を用いた本分析でも上位に入ったことは、同市が地理・経済・生活の様々な観点で望ましい性質を備えることの裏づけだと著者は述べる。前橋・金沢・高崎も複数シナリオで安定して上位だった(本ページ図4)。
先行研究が東京へのアクセスを見たのに対し、本研究は各地方の政令指定都市へのアクセスを考慮した。その結果、関東・東北・中部以外にも候補が現れた。特に四国の高知市は近くに政令指定都市が無いにもかかわらず上位で、著者は「高知市を中心としたネットワークの可能性」を示唆する。
素点最下位クラスの岡崎市・大津市は、他シナリオでも下位5に入った。生活重視では東京・名古屋・大阪の大都市圏に近い市が下位を占め、大都市圏の過密の影響がうかがえる。著者は「地理環境重視で低い市は総じて全体スコアも低い」とし、アクセスの重要性が他要素へ波及する可能性を指摘した。
本研究は、東京一極集中を是正する首都機能の移転先として、どの中核都市がふさわしいかという問いに、AHPとパーセンタイル配点・加重平均で定量的に迫った。54の中核市を地理・経済・生活の15指標で評価し、素点では前橋・金沢・高崎・高知・福島が上位、重視する観点を変えると顔ぶれが入れ替わる一方、前橋・金沢・高崎は複数シナリオで頑健に上位だった。著者は福島市など複数観点で望ましい都市の存在と、政令指定都市アクセスを軸にした候補の広がりを示した。本ページでは、選定スコアは報告値として可視化・集計し、出発点の東京一極集中だけを実SSDSEで実再現して切り分けた。
このページの図は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 図1(転入超過数ランキング)・図2(東京圏の人口シェア)はSSDSE-B-2026から算出した実再現です(2023年)。図3(各シナリオ上位5)は、原論文の都市圏選定スコアが国土数値情報(GIS距離計算)・RESAS(地域経済循環率・財政力指数・不動産取引価格)・市区町村版の国勢調査に由来し現行SSDSE-Bに列が無いため、原論文 表4-2 の順位を転記して可視化したものです。図4はその報告順位をシナリオ横断で集計した値で、新たな数値の捏造はしていません。原論文の点数(表4-1)は画像のため転記せず、順位のみを扱っています。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究の中心であるAHPと、順位→配点→加重平均によるスコア化を、注意点まで順に説明する。
この研究の「重視観点で最適都市が変わるが前橋・金沢・高崎は頑健」という発見は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
d23 = df[df['SSDSE-B-2026']==2023] の年を 2019 や 2020 に変えて、コロナ禍前後で東京圏の転入超過や人口シェアがどう動いたか比べてみよう。tokyo_area のリストに '茨城県' を加える、または '東京都' だけにして、人口シェアが約30%からどう変わるか確かめよう。pandas.qcut を使って25/50/75パーセンタイルで1〜4点に配点する原論文の手続きを、都道府県版で再現してみよう。「多基準を重みつきで集約して順位づける」AHP・加重スコアの発想は、行政・ビジネス・生活の意思決定で広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2018_U3_suri.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。