このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
「地方創生」は人口減少・少子高齢化に直面する日本において最重要課題である。本研究は、既存の単一指標に頼らず、経済・人口・子育て・教育・医療・観光の6分野を統合した独自の地方創生複合指標(創生指数)を構築した。47都道府県のデータに基づくランキングと主成分分析(PCA)により、論文著者の地元・兵庫県の現状を客観的に評価し、具体的な活性化策を提言する。
まず「独自指標作成による地方創生の方法論と兵庫県活性化の提案」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
複合指標 標準化(z スコア) PCA レーダーチャート 兵庫県分析
6分野・9変数を用いて創生指数を構築した。各変数は z スコア(平均0・標準偏差1)で標準化し、分野ごとに平均してサブ指数を作成。6サブ指数の単純平均を総合創生指数とした。
| 分野 | 変数(SSDSE-B コード) | 計算式 | 意味 |
|---|---|---|---|
| 経済活力 | 有効求人倍率(F3103/F3102) | 月間有効求人数 ÷ 月間有効求職者数 | 労働需要の旺盛さ |
| 消費支出(L3221) | 二人以上世帯の月平均消費支出(円) | 家計の豊かさ | |
| 人口定着 | 純移動率(A5101-A5102)/A1101×100 | (転入者 − 転出者)÷ 総人口 × 100(%) | 人口の純流入・流出 |
| 合計特殊出生率(A4103) | TFR(女性一人あたり生涯出生数) | 自然増加への貢献 | |
| 子育て環境 | 保育所密度(J2503/A1101×10000) | 保育所等数 ÷ 総人口 × 10000(人口万対) | 保育サービスの充実度 |
| 定員余裕率(J2505/J2506) | 保育所等定員 ÷ 在所児数(>1が余裕あり) | 待機児童リスクの低さ | |
| 教育・人材 | 大学進学率(E4602/E4601×100) | 高校卒業者のうち大学・短大進学者の割合(%) | 高度人材育成環境 |
| 医療・福祉 | 病院密度(I510120/A1101×10000) | 一般病院数 ÷ 総人口 × 10000(人口万対) | 医療アクセスの良さ |
| 観光・交流 | 宿泊者 per capita(G7101/A1101) | 延べ宿泊者数 ÷ 総人口(倍率) | 交流人口の多さ |
異なる単位の変数を統合するには「標準化」が不可欠。z スコアは「この値は全国平均より何標準偏差分高いか?」を表す無次元量になるため、円・人・倍率などを同一軸で比較できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | print("=" * 65) print("■ Step 0. データ読み込み・前処理") print("=" * 65) # SSDSE-B は row0=コード行、row1=ラベル行 → header=0 でコードを列名にする df_raw = pd.read_csv( os.path.join(DATA_DIR, 'SSDSE-B-2026.csv'), encoding='cp932', header=0, ) # 列名は変数コード(例: A1101)、値の行0 がラベル行 # 実データは row 1 以降 df_data = df_raw.iloc[1:].copy() df_data = df_data.rename(columns={ 'SSDSE-B-2026': 'YEAR', 'Code': 'CODE', 'Prefecture': 'PREF', }) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。19 20 21 22 23 24 25 | # 都道府県レベルの行のみ(CODE が R\d{5} パターン) mask_pref = df_data['CODE'].astype(str).str.match(r'^R\d{5}$') df_pref = df_data[mask_pref].copy() # 2022年度に絞る df = df_pref[df_pref['YEAR'] == '2022'].copy().reset_index(drop=True) print(f"2022年度 都道府県数: {len(df)}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。26 27 28 29 30 31 32 33 34 35 36 | # 使用変数コード一覧 USE_COLS = [ 'A1101', 'A5101', 'A5102', 'A4103', 'F3102', 'F3103', 'L3221', 'J2503', 'J2505', 'J2506', 'E4601', 'E4602', 'I510120', 'G7101', ] for col in USE_COLS: df[col] = pd.to_numeric(df[col], errors='coerce') |
================================================================= ■ Step 0. データ読み込み・前処理 ================================================================= 2022年度 都道府県数: 47
[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | df['ind_求人倍率'] = df['F3103'] / df['F3102'] # 有効求人倍率 df['ind_消費支出'] = df['L3221'] # 消費支出(円/月) # 人口定着 df['ind_純移動率'] = (df['A5101'] - df['A5102']) / df['A1101'] * 100 # 純移動率(%) df['ind_TFR'] = df['A4103'] # 合計特殊出生率 # 子育て環境 df['ind_保育密度'] = df['J2503'] / df['A1101'] * 10000 # 保育所数(人口万対) df['ind_定員余裕率'] = df['J2505'] / df['J2506'] # 定員 / 在所(余裕率) # 教育・人材 df['ind_大学進学率'] = df['E4602'] / df['E4601'] * 100 # 高校→大学進学率(%) # 医療・福祉 df['ind_病院密度'] = df['I510120'] / df['A1101'] * 10000 # 病院数(人口万対) # 観光・交流 df['ind_宿泊者pc'] = df['G7101'] / df['A1101'] # 宿泊者数 per capita |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | RAW_INDS = [ 'ind_求人倍率', 'ind_消費支出', 'ind_純移動率', 'ind_TFR', 'ind_保育密度', 'ind_定員余裕率', 'ind_大学進学率', 'ind_病院密度', 'ind_宿泊者pc', ] for col in RAW_INDS: mean = df[col].mean() std = df[col].std(ddof=1) df[f'z_{col}'] = (df[col] - mean) / std print("各指標の記述統計(元スケール):") print(df[RAW_INDS].describe().round(3).to_string()) |
各指標の記述統計(元スケール):
ind_求人倍率 ind_消費支出 ind_純移動率 ind_TFR ind_保育密度 ind_定員余裕率 ind_大学進学率 ind_病院密度 ind_宿泊者pc
count 47.000 47.000 47.000 47.000 47.000 47.000 47.000 47.000 47.000
mean 1.394 289630.362 -0.131 1.358 2.758 1.143 56.623 0.689 3.265
std 0.247 19186.908 0.176 0.149 0.719 0.078 7.006 0.275 1.553
min 0.881 245054.000 -0.403 1.040 1.708 1.031 46.199 0.315 0.563
25% 1.184 276834.500 -0.240 1.245 2.161 1.084 50.761 0.493 2.395
50% 1.435 287781.000 -0.163 1.360 2.449 1.142 56.768 0.596 2.951
75% 1.570 302255.000 -0.054 1.455 3.297 1.176 61.330 0.842 3.632
max 1.940 324793.000 0.299 1.700 4.514 1.404 72.986 1.598 9.930.describe() — 件数・平均・標準偏差・四分位・最大/最小を一括計算。データの素性チェックに必須。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | df['sub_経済活力'] = df[['z_ind_求人倍率', 'z_ind_消費支出']].mean(axis=1) df['sub_人口定着'] = df[['z_ind_純移動率', 'z_ind_TFR']].mean(axis=1) df['sub_子育て環境'] = df[['z_ind_保育密度', 'z_ind_定員余裕率']].mean(axis=1) df['sub_教育人材'] = df['z_ind_大学進学率'] df['sub_医療福祉'] = df['z_ind_病院密度'] df['sub_観光交流'] = df['z_ind_宿泊者pc'] SUB_INDICES = [ 'sub_経済活力', 'sub_人口定着', 'sub_子育て環境', 'sub_教育人材', 'sub_医療福祉', 'sub_観光交流', ] SUB_LABELS = { 'sub_経済活力': '経済活力', 'sub_人口定着': '人口定着', 'sub_子育て環境': '子育て環境', 'sub_教育人材': '教育・人材', 'sub_医療福祉': '医療・福祉', 'sub_観光交流': '観光・交流', } |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。91 92 93 94 95 96 97 | # 総合創生指数(6サブ指数の単純平均) df['創生指数'] = df[SUB_INDICES].mean(axis=1) # 兵庫県の確認 hyogo_row = df[df['PREF'].str.contains(HYOGO_PREF)].iloc[0] hyogo_rank = int(df['創生指数'].rank(ascending=False)[hyogo_row.name]) print(f"\n兵庫県 創生指数: {hyogo_row['創生指数']:.4f} 全国順位: {hyogo_rank}位") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。98 99 100 101 102 103 104 105 106 107 108 109 | # PCA 用データ(9変数 z スコア) Z_COLS = [f'z_{c}' for c in RAW_INDS] Z_LABELS = [ '求人倍率', '消費支出', '純移動率', 'TFR', '保育密度', '定員余裕率', '大学進学率', '病院密度', '宿泊者pc', ] df_z = df[Z_COLS].copy() |
兵庫県 創生指数: -0.2575 全国順位: 38位
df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。構築した創生指数で47都道府県を順位付けした。東京・神奈川といった大都市圏が上位に入る一方、地方の製造業・農業型道府県が下位に集まる傾向がある。
| 分野 | 兵庫県スコア | 全国平均 | 全国順位 | 評価 |
|---|---|---|---|---|
| 経済活力 | −0.517 | 0.000 | 36位 | 中下位 |
| 人口定着 | −0.106 | 0.000 | 27位 | ほぼ平均 |
| 子育て環境 | −1.203 | 0.000 | 47位 | 最下位 |
| 教育・人材 | +1.486 | 0.000 | 5位 | 高位 |
| 医療・福祉 | −0.391 | 0.000 | 26位 | ほぼ平均 |
| 観光・交流 | −0.814 | 0.000 | 42位 | 低位 |
| 総合創生指数 | −0.258 | 0.000 | 38位 | 中下位 |
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | print("\n" + "=" * 65) print("■ 図1: 47都道府県の創生指数ランキング") print("=" * 65) df_rank = df[['PREF', '創生指数']].copy() df_rank = df_rank.sort_values('創生指数', ascending=True).reset_index(drop=True) fig1, ax1 = plt.subplots(figsize=(10, 14)) bar_colors = [ COLOR_HYOGO if '兵庫' in str(row['PREF']) else COLOR_DEF for _, row in df_rank.iterrows() ] bars = ax1.barh( df_rank['PREF'], df_rank['創生指数'], color=bar_colors, edgecolor='white', linewidth=0.5, ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。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 157 158 159 160 | # 兵庫県のバーに値ラベル for bar, (_, row) in zip(bars, df_rank.iterrows()): if '兵庫' in str(row['PREF']): ax1.text( row['創生指数'] + 0.02, bar.get_y() + bar.get_height() / 2, f" {row['創生指数']:.3f}(全国{hyogo_rank}位)", va='center', fontsize=9, color=COLOR_HYOGO, fontweight='bold', ) ax1.axvline(0, color='black', linewidth=0.8, linestyle='--', alpha=0.5) ax1.set_xlabel('創生指数(標準化済み、6分野平均)', fontsize=11) ax1.set_title( '地方創生複合指標:47都道府県の創生指数ランキング(2022年度)\n' '(出典:SSDSE-B-2026 実データ)', fontsize=12, fontweight='bold', pad=12, ) ax1.grid(axis='x', alpha=0.25) ax1.tick_params(axis='y', labelsize=9) legend_patches = [ mpatches.Patch(color=COLOR_HYOGO, label='兵庫県'), mpatches.Patch(color=COLOR_DEF, label='その他都道府県'), ] ax1.legend(handles=legend_patches, fontsize=9, loc='lower right') plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2023_H4_fig1_ranking.png'), bbox_inches='tight', dpi=150) plt.close(fig1) print(" -> 2023_H4_fig1_ranking.png 保存完了") |
================================================================= ■ 図1: 47都道府県の創生指数ランキング ================================================================= -> 2023_H4_fig1_ranking.png 保存完了
ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。レーダーチャートにより、兵庫県の6分野のプロファイルを全国平均・創生指数上位5道府県と比較した。
レーダーチャートは極座標プロットで実装する。6変数の角度を等分割し、最初の点に最後も同じ点を追加して閉じることがポイント。
162 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 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 | print("\n■ 図2: レーダーチャート(兵庫県 vs 全国平均 vs Top5)") # Top5 平均(創生指数上位5都道府県) top5_prefs = df.nlargest(5, '創生指数')['PREF'].tolist() print(f" Top5: {top5_prefs}") hyogo_vals = [hyogo_row[s] for s in SUB_INDICES] nat_vals = [df[s].mean() for s in SUB_INDICES] top5_vals = [df[df['PREF'].isin(top5_prefs)][s].mean() for s in SUB_INDICES] categories = [SUB_LABELS[s] for s in SUB_INDICES] N = len(categories) import matplotlib.pyplot as plt # already imported but re-reference for clarity angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist() angles += angles[:1] def close_loop(vals): return vals + vals[:1] hyogo_v = close_loop(hyogo_vals) nat_v = close_loop(nat_vals) top5_v = close_loop(top5_vals) fig2, ax2 = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True)) ax2.plot(angles, hyogo_v, color=COLOR_HYOGO, linewidth=2.5, label='兵庫県') ax2.fill(angles, hyogo_v, color=COLOR_HYOGO, alpha=0.18) ax2.plot(angles, nat_v, color=COLOR_NAT, linewidth=2.0, linestyle='--', label='全国平均') ax2.fill(angles, nat_v, color=COLOR_NAT, alpha=0.10) top5_label = 'Top5平均\n(' + '、'.join([p[:3] for p in top5_prefs[:3]]) + '…)' ax2.plot(angles, top5_v, color=COLOR_TOP5, linewidth=2.0, linestyle=':', label=top5_label) ax2.fill(angles, top5_v, color=COLOR_TOP5, alpha=0.10) ax2.set_xticks(angles[:-1]) ax2.set_xticklabels(categories, fontsize=11, fontweight='bold') ax2.set_ylim( min(min(hyogo_vals), min(nat_vals), min(top5_vals)) - 0.3, max(max(hyogo_vals), max(nat_vals), max(top5_vals)) + 0.3, ) ax2.set_title( '地方創生サブ指数:兵庫県 vs 全国平均 vs Top5(2022年度)\n' '(出典:SSDSE-B-2026 実データ)', fontsize=11, fontweight='bold', pad=22, ) ax2.legend(loc='upper right', bbox_to_anchor=(1.32, 1.15), fontsize=10) ax2.grid(True, alpha=0.3) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2023_H4_fig2_radar.png'), bbox_inches='tight', dpi=150) plt.close(fig2) print(" -> 2023_H4_fig2_radar.png 保存完了") |
■ 図2: レーダーチャート(兵庫県 vs 全国平均 vs Top5) Top5: ['高知県', '山梨県', '長野県', '石川県', '京都府'] -> 2023_H4_fig2_radar.png 保存完了
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。9変数の z スコアに PCA を適用し、47都道府県を2次元空間(PC1 vs PC2)に投影した。バイプロットは都道府県の散布図と変数のローディングベクトルを重ね合わせた図で、都道府県の位置づけと変数間の関係を同時に把握できる。
PCA は多変量データを「情報損失を最小にしながら低次元で表現する」手法。バイプロットは主成分スコア(点)とローディングベクトル(矢印)を重ねて、データの構造を直感的に把握できる。
219 220 221 222 223 224 225 226 227 228 229 230 231 232 | print("\n■ 図3: PCA バイプロット") X_pca = df_z.values pca = PCA(n_components=2) scores = pca.fit_transform(X_pca) pc1_var = pca.explained_variance_ratio_[0] * 100 pc2_var = pca.explained_variance_ratio_[1] * 100 loadings = pca.components_ # shape (2, n_features) print(f" PC1 寄与率: {pc1_var:.1f}% PC2 寄与率: {pc2_var:.1f}%") print(f" 累積寄与率: {pc1_var + pc2_var:.1f}%") fig3, ax3 = plt.subplots(figsize=(11, 9)) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | # 都道府県スコア散布図 for i, (x, y) in enumerate(scores): pref = df.iloc[i]['PREF'] is_hyogo = '兵庫' in str(pref) color = COLOR_HYOGO if is_hyogo else '#90CAF9' zorder = 5 if is_hyogo else 2 size = 100 if is_hyogo else 55 ax3.scatter(x, y, color=color, s=size, alpha=0.85, edgecolors='white', linewidth=0.7, zorder=zorder) fontsize = 9.5 if is_hyogo else 7 fw = 'bold' if is_hyogo else 'normal' fc = COLOR_HYOGO if is_hyogo else '#333333' ax3.annotate(pref, (x, y), fontsize=fontsize, color=fc, fontweight=fw, xytext=(4, 4), textcoords='offset points', zorder=zorder) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 | # ローディングベクトル scale = 3.0 # ベクトルを見やすい倍率にスケール for j, label in enumerate(Z_LABELS): lx = loadings[0, j] * scale ly = loadings[1, j] * scale ax3.annotate( '', xy=(lx, ly), xytext=(0, 0), arrowprops=dict(arrowstyle='->', color='#E65100', lw=1.8), ) ax3.text(lx * 1.08, ly * 1.08, label, fontsize=8.5, color='#E65100', fontweight='bold', ha='center', va='center') ax3.axhline(0, color='grey', linewidth=0.7, linestyle='--', alpha=0.5) ax3.axvline(0, color='grey', linewidth=0.7, linestyle='--', alpha=0.5) ax3.set_xlabel(f'PC1(寄与率 {pc1_var:.1f}%)', fontsize=12) ax3.set_ylabel(f'PC2(寄与率 {pc2_var:.1f}%)', fontsize=12) ax3.set_title( '主成分分析バイプロット:地方創生指標(2022年度 47都道府県)\n' '(出典:SSDSE-B-2026 実データ)', fontsize=11, fontweight='bold', pad=12, ) ax3.grid(alpha=0.2) legend_patches = [ mpatches.Patch(color=COLOR_HYOGO, label='兵庫県'), mpatches.Patch(color='#90CAF9', label='その他都道府県'), mpatches.FancyArrow(0, 0, 1, 0, color='#E65100', width=0.01, label='変数ローディング'), ] ax3.legend(handles=legend_patches, fontsize=9, loc='lower right') plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2023_H4_fig3_pca_biplot.png'), bbox_inches='tight', dpi=150) plt.close(fig3) print(" -> 2023_H4_fig3_pca_biplot.png 保存完了") |
■ 図3: PCA バイプロット PC1 寄与率: 38.5% PC2 寄与率: 15.5% 累積寄与率: 54.0% -> 2023_H4_fig3_pca_biplot.png 保存完了
ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。6つのサブ指数間のピアソン相関行列をヒートマップで可視化した。これにより、どの分野が「一緒に高い・低い」傾向にあるかを確認できる。
複合指標を作る際、構成指標が完全に正相関していると「同じものを二重計上」する問題が起きる。逆に完全無相関だと「異なる現象を足している」ことになる。適度な正相関(0.3〜0.7)が複合指標の構成要素として望ましい。
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 | import os import warnings import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches import numpy as np import pandas as pd from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler warnings.filterwarnings('ignore') plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 DATA_DIR = 'data/raw' FIG_DIR = 'html/figures' os.makedirs(FIG_DIR, exist_ok=True) HYOGO_PREF = '兵庫県' COLOR_HYOGO = '#C62828' # 兵庫県強調色(赤) COLOR_NAT = '#1565C0' # 全国平均色(青) COLOR_TOP5 = '#2E7D32' # Top5色(緑) COLOR_DEF = '#90CAF9' # デフォルト棒グラフ色 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。plt.rcParams['font.family'] — グラフの日本語表示用フォント指定(Macは Hiragino Sans、Windowsなら Yu Gothic 等)。os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。StandardScaler().fit_transform(X) — 各列を「平均0・分散1」に標準化。単位が違う変数のβを比較可能に。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 | print("\n■ 図4: 6構成指標の相関ヒートマップ") # サブ指数の相関行列 corr_data = df[SUB_INDICES].copy() corr_mat = corr_data.corr() labels_disp = [SUB_LABELS[s] for s in SUB_INDICES] fig4, ax4 = plt.subplots(figsize=(8, 7)) im4 = ax4.imshow(corr_mat.values, cmap='RdBu_r', vmin=-1, vmax=1, aspect='auto') ax4.set_xticks(range(len(SUB_INDICES))) ax4.set_xticklabels(labels_disp, fontsize=10, rotation=30, ha='right') ax4.set_yticks(range(len(SUB_INDICES))) ax4.set_yticklabels(labels_disp, fontsize=10) for i in range(len(SUB_INDICES)): for j in range(len(SUB_INDICES)): val = corr_mat.values[i, j] txt_color = 'white' if abs(val) > 0.55 else 'black' ax4.text(j, i, f'{val:.2f}', ha='center', va='center', fontsize=9.5, color=txt_color, fontweight='bold') plt.colorbar(im4, ax=ax4, fraction=0.046, pad=0.04, label='ピアソン相関係数') ax4.set_title( '地方創生6サブ指数の相関行列(2022年度 47都道府県)\n' '(出典:SSDSE-B-2026 実データ)', fontsize=11, fontweight='bold', pad=12, ) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2023_H4_fig4_corr_heatmap.png'), bbox_inches='tight', dpi=150) plt.close(fig4) print(" -> 2023_H4_fig4_corr_heatmap.png 保存完了") |
■ 図4: 6構成指標の相関ヒートマップ -> 2023_H4_fig4_corr_heatmap.png 保存完了
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 | print("\n" + "=" * 65) print("完了: 全図の生成完了(4枚)") print("=" * 65) print(f"\n保存先: {os.path.abspath(FIG_DIR)}") print(" 2023_H4_fig1_ranking.png - 47都道府県の創生指数ランキング") print(" 2023_H4_fig2_radar.png - 兵庫県 vs 全国平均 vs Top5 レーダー") print(" 2023_H4_fig3_pca_biplot.png - PCA バイプロット(PC1 vs PC2)") print(" 2023_H4_fig4_corr_heatmap.png - 6サブ指数の相関ヒートマップ") print() print("使用データ: SSDSE-B-2026.csv(社会・人口統計体系 2022年度 47都道府県)") print("合成データ: なし(np.random 未使用)") print() # 兵庫県詳細レポート print("=" * 65) print("■ 兵庫県 創生指数詳細") print("=" * 65) print(f" 総合創生指数: {hyogo_row['創生指数']:.4f} (全国{hyogo_rank}位)") for s in SUB_INDICES: nat_avg = df[s].mean() pref_rank = int(df[s].rank(ascending=False)[hyogo_row.name]) print(f" {SUB_LABELS[s]:<10}: {hyogo_row[s]:+.4f} 全国平均 {nat_avg:+.4f} ({pref_rank}位)") |
================================================================= 完了: 全図の生成完了(4枚) ================================================================= 保存先: /Users/shimpei/Dropbox/Works_Researches/2026 統計・データ解析コンペ/html/figures 2023_H4_fig1_ranking.png - 47都道府県の創生指数ランキング 2023_H4_fig2_radar.png - 兵庫県 vs 全国平均 vs Top5 レーダー 2023_H4_fig3_pca_biplot.png - PCA バイプロット(PC1 vs PC2) 2023_H4_fig4_corr_heatmap.png - 6サブ指数の相関ヒートマップ 使用データ: SSDSE-B-2026.csv(社会・人口統計体系 2022年度 47都道府県) 合成データ: なし(np.random 未使用) ================================================================= ■ 兵庫県 創生指数詳細 ================================================================= 総合創生指数: -0.2575 (全国38位) 経済活力 : -0.5169 全国平均 -0.0000 (36位) 人口定着 : -0.1060 全国平均 -0.0000 (27位) 子育て環境 : -1.2033 全国平均 +0.0000 (47位) 教育・人材 : +1.4862 全国平均 +0.0000 (5位) 医療・福祉 : -0.3912 全国平均 +0.0000 (26位) 観光・交流 : -0.8140 全国平均 +0.0000 (42位)
{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。SSDSE-B 2022年度データを用いた地方創生複合指標分析の結果、以下の事実が明らかになった:
| データ | 出典 | 備考 |
|---|---|---|
| SSDSE-B-2026 | 統計数理研究所 SSDSE(社会・人口統計体系) | 2022年度 47都道府県 実データ |
本教育用コードは SSDSE-B 実データのみを使用。合成データ(np.random等)は一切使用していない。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。