このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本では都道府県間の経済格差・生産性格差が長年の政策課題となっている。東京一極集中が進む一方、地方では人口減少と産業空洞化が同時進行している。このような地域間格差を定量的に把握し、その決定要因を明らかにすることは、地域政策立案の観点から重要な研究課題である。
まず「都道府県別労働生産性の決定要因主成分分析とクラスタリングによる地域類型化」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
本研究では、SSDSE-B(都道府県統計)のデータを用い、47都道府県の労働生産性の代理指標を構築した上で、主成分分析(PCA)による多変量の次元圧縮、Ward法クラスタリングによる地域類型化、そして重回帰分析による決定要因の特定を試みた。
主成分分析(PCA) Ward法クラスタリング 重回帰分析 標準化係数 SSDSE-B
SSDSE(社会・人口統計体系)-B(2026年版)の都道府県データを使用した。2023年時点の47都道府県の横断面データを分析の基礎とした。
| データセット | 対象 | 年度 | 観測数 |
|---|---|---|---|
| SSDSE-B-2026.csv | 47都道府県 | 2023年断面 | N = 47 |
SSDSE-Bには直接の「県内総生産」や「労働生産性」の列はないため、経済学的に妥当な代理変数を複数の統計指標から構築した。
| 役割 | 構築変数 | 計算方法 | 経済的解釈 |
|---|---|---|---|
| 目的変数 (労働生産性 代理指標) |
消費支出(万円) | 消費支出(二人以上の世帯)÷ 10,000 | 所得水準・生活水準の代理 |
| 有効求人倍率 | 月間有効求人数 ÷ 月間有効求職者数 | 労働需要の強さ(高生産性地域は労働需要大) | |
| 教育水準 | 大学進学率(%) | 高校卒業者のうち進学者数 ÷ 高校卒業者数 × 100 | 人的資本・知識資本の蓄積度 |
| 大学学生割合(%) | 大学学生数 ÷ 総人口 × 100 | 知識集積の密度(高等教育産業の集積) | |
| 人口構造 | 高齢化率(%) | 65歳以上人口 ÷ 総人口 × 100 | 生産年齢人口比率の逆数(高→生産力縮小) |
| 人口移動 | 転入超過率(‰) | (転入者数 − 転出者数)÷ 総人口 × 1,000 | 経済的魅力・人口集積効果 |
| 生産年齢人口 | 生産年齢率(%) | 15〜64歳人口 ÷ 総人口 × 100 | 働き手の比率(PCA変数として投入) |
| 観光・サービス | 旅館密度(施設/万人) | 旅館・ホテル数 ÷ 総人口 × 10,000 | 観光産業・第三次産業の発展度 |
| 手法 | 目的 | 主要パラメータ |
|---|---|---|
| 主成分分析(PCA) | 6変数の次元削減・バイプロット作成 | 2成分、StandardScaler標準化 |
| Ward法クラスタリング | 47都道府県の地域類型化 | k=5クラスター |
| 重回帰分析(OLS) | 消費支出の決定要因特定 | 標準化係数(β)、N=47 |
1 2 3 4 5 6 7 8 9 10 | df['消費支出_万'] = df['消費支出(二人以上の世帯)'] / 10000 # 万円単位 df['求人倍率'] = df['月間有効求人数(一般)'] / df['月間有効求職者数(一般)'] # 【説明変数①】教育水準 # 高校卒業後の大学進学率(知識資本の代理) df['大学進学率'] = ( df['高等学校卒業者のうち進学者数'] / df['高等学校卒業者数'] * 100 ) # 人口100人当たり大学学生数(知識集積の指標) df['大学学生割合'] = df['大学学生数'] / df['総人口'] * 100 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。11 12 13 14 15 16 17 18 19 20 21 22 | # 【説明変数②】人口構造 # 高齢化率(生産年齢人口の縮小→生産性低下要因) df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100 # 生産年齢人口比率(15〜64歳) df['生産年齢率'] = df['15~64歳人口'] / df['総人口'] * 100 # 【説明変数③】人口移動(経済的魅力の指標) # 転入超過率(人が集まる地域は経済的に活発) df['転入超過率'] = ( (df['転入者数(日本人移動者)'] - df['転出者数(日本人移動者)']) / df['総人口'] * 1000 ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # 【説明変数④】観光・サービス経済 # 人口100人当たり旅館宿泊施設数(観光産業の代理) df['旅館密度'] = df['旅館営業施設数(ホテルを含む)'] / df['総人口'] * 10000 # 地域区分マップ region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12' } df['地域区分'] = df['都道府県'].map(region_map) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。49 50 51 52 53 54 55 56 | z_cons = stats.zscore(df['消費支出_万'].values) z_kyu = stats.zscore(df['求人倍率'].values) df['生産性スコア'] = (z_cons + z_kyu) / 2.0 print("\n=== 生産性スコア(上位5・下位5都道府県)===") df_sorted = df.sort_values('生産性スコア', ascending=False) print("上位5:", df_sorted.head(5)[['都道府県', '生産性スコア', '消費支出_万', '求人倍率']].to_string(index=False)) print("下位5:", df_sorted.tail(5)[['都道府県', '生産性スコア', '消費支出_万', '求人倍率']].to_string(index=False)) |
=== 生産性スコア(上位5・下位5都道府県)=== 上位5: 都道府県 生産性スコア 消費支出_万 求人倍率 東京都 1.448851 34.1320 1.564392 富山県 1.209164 32.7503 1.585892 岐阜県 1.142145 32.0779 1.617888 新潟県 1.000697 30.1215 1.734223 島根県 0.820676 29.4837 1.714040 下位5: 都道府県 生産性スコア 消費支出_万 求人倍率 青森県 -1.045861 26.3371 1.189889 兵庫県 -1.107193 27.9880 1.013308 愛媛県 -1.187850 22.3423 1.491153 和歌山県 -1.431596 25.9437 1.058235 沖縄県 -1.460348 25.1222 1.120382
sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。57 58 59 60 61 62 63 64 65 66 | Z_linkage = linkage(X_scaled, method='ward') clusters = fcluster(Z_linkage, t=5, criterion='maxclust') df['cluster'] = clusters print("\n=== Ward法クラスタ(k=5)===") cluster_labels = {} for c in sorted(df['cluster'].unique()): prefs = df[df['cluster'] == c]['都道府県'].tolist() print(f" クラスタ{c}: {prefs}") cluster_labels[c] = f'C{c}' |
=== Ward法クラスタ(k=5)=== クラスタ1: ['宮城県', '埼玉県', '千葉県', '神奈川県', '愛知県', '滋賀県', '大阪府', '福岡県'] クラスタ2: ['東京都', '京都府'] クラスタ3: ['北海道', '青森県', '岩手県', '秋田県', '山形県', '福島県', '新潟県', '富山県', '和歌山県', '鳥取県', '島根県', '山口県', '徳島県', '香川県', '愛媛県', '高知県', '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県', '鹿児島県'] クラスタ4: ['茨城県', '栃木県', '群馬県', '石川県', '岐阜県', '静岡県', '三重県', '兵庫県', '奈良県', '岡山県', '広島県'] クラスタ5: ['福井県', '山梨県', '長野県', '沖縄県']
r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | print("\n====== 分析結果サマリー ======") print(f"データ: SSDSE-B-2026.csv 2023年断面, N=47都道府県") print(f"\nPCA 説明分散比:") print(f" PC1: {explained_var[0]*100:.1f}% PC2: {explained_var[1]*100:.1f}% 累積: {sum(explained_var)*100:.1f}%") print(f"\nPCA 負荷量(PC1):") for col, load in zip(feature_cols, loadings[0]): print(f" {col}: {load:.4f}") print(f"\nクラスター(k=5)構成:") for c in sorted(df['cluster'].unique()): prefs = df[df['cluster'] == c]['都道府県'].tolist() print(f" C{c}: {prefs}") print(f"\n重回帰 R²={model_std.rsquared:.4f} adj.R²={model_std.rsquared_adj:.4f}") print(f"標準化係数:") for label, b, p in zip(reg_labels, beta_coefs, beta_pvals): print(f" {label}: β={b:.4f} {sig_stars(p)}") print("\nDONE: 2019_U5_1_shorei") |
====== 分析結果サマリー ====== データ: SSDSE-B-2026.csv 2023年断面, N=47都道府県 PCA 説明分散比: PC1: 63.4% PC2: 17.5% 累積: 80.9% PCA 負荷量(PC1): 大学進学率: 0.4314 大学学生割合: 0.3838 高齢化率: -0.4546 生産年齢率: 0.4876 転入超過率: 0.4387 旅館密度: -0.1723 クラスター(k=5)構成: C1: ['宮城県', '埼玉県', '千葉県', '神奈川県', '愛知県', '滋賀県', '大阪府', '福岡県'] C2: ['東京都', '京都府'] C3: ['北海道', '青森県', '岩手県', '秋田県', '山形県', '福島県', '新潟県', '富山県', '和歌山県', '鳥取県', '島根県', '山口県', '徳島県', '香川県', '愛媛県', '高知県', '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県', '鹿児島県'] C4: ['茨城県', '栃木県', '群馬県', '石川県', '岐阜県', '静岡県', '三重県', '兵庫県', '奈良県', '岡山県', '広島県'] C5: ['福井県', '山梨県', '長野県', '沖縄県'] 重回帰 R²=0.2160 adj.R²=0.1413 標準化係数: 大学進学率: β=0.3129 n.s. 高齢化率: β=0.0747 n.s. 転入超過率: β=0.3133 n.s. 求人倍率: β=0.1831 n.s. DONE: 2019_U5_1_shorei
plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。消費支出と求人倍率を標準化合成した「労働生産性スコア」により、47都道府県の経済的格差を可視化した。東京都が最上位に位置する一方、沖縄県・和歌山県・愛媛県が下位に並んだ。
6変数(大学進学率、大学学生割合、高齢化率、生産年齢率、転入超過率、旅館密度)を投入したPCAの結果、第1主成分が63.4%、第2主成分が17.5%を説明し、累積寄与率80.9%を達成した。
| 主成分 | 寄与率 | 累積寄与率 | 主要な意味 |
|---|---|---|---|
| PC1 | 63.4% | 63.4% | 都市化・若年集積・教育資本(大学進学率↑、高齢化率↓) |
| PC2 | 17.5% | 80.9% | 観光・地域特性(旅館密度の分散) |
PCAの6変数を標準化してWard法によって47都道府県を5クラスターに分類した。デンドログラムの赤破線(k=5のカット位置)で5グループが明確に分離している。
東京都・京都府
高大学集積・高転入超過・高観光
宮城・埼玉・千葉・神奈川・愛知・滋賀・大阪・福岡
高転入超過・高生産年齢率
茨城・栃木・群馬・石川・岐阜・静岡・三重・兵庫・奈良・岡山・広島
安定した製造業基盤
福井・山梨・長野・沖縄
観光資源・固有産業が特徴的
北海道・青森・岩手・秋田・山形・福島・新潟・富山・和歌山・鳥取・島根・山口・徳島・香川・愛媛・高知・佐賀・長崎・熊本・大分・宮崎・鹿児島
高齢化率高・転入超過率低・農林水産業の比重大
消費支出(経済的豊かさの直接指標)を目的変数とし、大学進学率・高齢化率・転入超過率・求人倍率を説明変数とした重回帰分析を実施した(N=47)。
| 説明変数 | β係数 | 単変量相関(r) | 解釈 |
|---|---|---|---|
| 大学進学率 | +0.31 | +0.40 | 知識資本↑ → 消費支出↑(最大係数) |
| 転入超過率 | +0.31 | +0.37 | 経済的魅力↑ → 集積効果 → 消費↑ |
| 求人倍率 | +0.18 | ≈0.00 | 労働需要↑ → 賃金圧力 → 消費↑ |
| 高齢化率 | +0.07 | −0.31 | 単変量では負だが、転入超過率等との交絡あり |
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | df_plot = df.sort_values('生産性スコア').copy() # 色分け(地域区分) bar_colors = [region_colors[r] for r in df_plot['地域区分']] fig, ax = plt.subplots(figsize=(9, 11)) bars = ax.barh( df_plot['都道府県'], df_plot['生産性スコア'], color=bar_colors, edgecolor='white', linewidth=0.5, alpha=0.88 ) ax.axvline(0, color='black', lw=0.8, ls='--', alpha=0.6) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | # 凡例(地域区分) from matplotlib.patches import Patch legend_elements = [Patch(facecolor=c, label=r, alpha=0.88) for r, c in region_colors.items()] ax.legend(handles=legend_elements, loc='lower right', fontsize=8, title='地域区分', title_fontsize=8, framealpha=0.9) ax.set_xlabel('労働生産性スコア(標準化合成指標)', fontsize=11) ax.set_title('図1:都道府県別 労働生産性スコア(2023年)\n(消費支出・求人倍率の標準化合成、地域色分け)', fontsize=12, fontweight='bold') ax.grid(axis='x', alpha=0.3) ax.tick_params(axis='y', labelsize=8) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2019_U5_1_fig1.png'), dpi=150, bbox_inches='tight') plt.close(fig) print("\n[保存] 図1: 都道府県別労働生産性スコア") |
[保存] 図1: 都道府県別労働生産性スコア
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。主成分分析は、多変量データを少数の「主成分」に次元圧縮する手法。各主成分は元の変数の線形結合で、互いに無相関(直交)になるよう構成される。第1主成分は分散が最大になる方向、第2主成分は第1主成分と直交しつつ分散が最大になる方向となる。
データ行列 X(N×p)に対して、固有値分解 X'X = VΛV' を行う。固有ベクトル(V の列)が主成分の方向(負荷量ベクトル)、固有値が各主成分の説明分散量に対応する。
Ward法は「クラスター内変動(Ward距離)を最小化」するよう段階的に都道府県を統合する階層型クラスタリング。2クラスターを統合したときの「分散の増加量」が最小になるペアを選択して結合する。
Ward距離の定義: d(A, B) = (n_A × n_B)/(n_A + n_B) × ||μ_A - μ_B||²
(μ はクラスター重心、n はクラスターサイズ)
通常の回帰係数は変数の単位に依存するため、単位の異なる変数間で係数の大きさを直接比較できない。標準化偏回帰係数(β係数)は目的変数と説明変数をどちらも標準化(z-score変換)してから回帰した係数で、単位によらず相対的影響力を比較できる。
β=0.31(大学進学率): 大学進学率が1SD高い都道府県では、消費支出が0.31SD高い傾向にある。
PCAのバイプロット(図2)では、点(観測)と矢印(変数)が同一平面上に描かれる。
| 要素 | 意味 | 解釈方法 |
|---|---|---|
| 点の位置 | 主成分スコア | 近い点は多変量的に類似した都道府県 |
| 矢印の方向 | 変数の負荷量ベクトル | 矢印の向きが似た変数は正相関 |
| 矢印の長さ | 変数の情報量 | 長い矢印ほどPCに強く寄与 |
| 点と矢印の関係 | 変数の高低 | 矢印方向にある点はその変数値が高い |
117 118 119 120 121 122 123 124 | fig, ax = plt.subplots(figsize=(10, 7.5)) for region, color in region_colors.items(): mask = df['地域区分'] == region ax.scatter( scores[mask, 0], scores[mask, 1], c=color, label=region, s=60, zorder=3, alpha=0.85 ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。125 126 127 128 129 130 131 132 133 | # 都道府県ラベル for i, row in df.iterrows(): ax.annotate( row['都道府県'], (scores[i, 0], scores[i, 1]), fontsize=6.5, ha='center', va='bottom', xytext=(0, 4), textcoords='offset points', color='#333333' ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。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 161 162 163 | # 変数負荷量ベクトル scale = 2.8 for j, vl in enumerate(var_labels): lx = loadings[0, j] * scale ly = loadings[1, j] * scale ax.annotate( '', xy=(lx, ly), xytext=(0, 0), arrowprops=dict(arrowstyle='->', color='#C62828', lw=1.8) ) ax.text( lx * 1.12, ly * 1.12, vl, fontsize=8.5, color='#C62828', ha='center', va='center', fontweight='bold' ) ax.axhline(0, color='gray', lw=0.6, ls='--', alpha=0.5) ax.axvline(0, color='gray', lw=0.6, ls='--', alpha=0.5) ax.set_xlabel(f'第1主成分(寄与率 {explained_var[0]*100:.1f}%)', fontsize=12) ax.set_ylabel(f'第2主成分(寄与率 {explained_var[1]*100:.1f}%)', fontsize=12) ax.set_title( '図2:PCA バイプロット(47都道府県、2023年)\n第1・第2主成分スコアと変数負荷量', fontsize=12, fontweight='bold' ) ax.legend(title='地域区分', loc='lower right', fontsize=9, title_fontsize=9) ax.grid(True, alpha=0.3) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2019_U5_1_fig2.png'), dpi=150, bbox_inches='tight') plt.close(fig) print("[保存] 図2: PCA バイプロット") |
[保存] 図2: PCA バイプロット
ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。Ward法では何クラスターに分割するかを事前に決める必要がある。デンドログラムを見て「落差が大きい統合ステップ」の直前でカットするのが基本方針だが、以下の指標も参考になる。
主成分の数(次元数)は「説明したい情報量」と「次元削減の程度」のトレードオフで決める。一般的な基準として「累積寄与率70〜80%以上」が目安。
47都道府県という小サンプルは地域間分析では避けられない制約だが、以下の対応が考えられる。
| 課題 | 内容 | 対策 |
|---|---|---|
| 検定力不足 | N=47では小〜中程度の効果量でも有意にならない | 効果量(r, β)の絶対値と方向性で判断 |
| 過学習リスク | 説明変数が多いとR²が見かけ上高くなる | 調整済みR²(adj.R²)で評価 |
| 外れ値影響 | 東京都・沖縄県等の特殊都道府県が大きく影響 | 影響力診断(Cook's D)・ロバスト回帰 |
| 多重共線性 | 高齢化率と生産年齢率は近似線形従属(r≈−0.97) | VIF確認・主成分回帰(PCR)の検討 |
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 | fig, ax = plt.subplots(figsize=(14, 6)) sorted_z = np.sort(Z_linkage[:, 2]) # k=5 のカット高さ: k個のクラスターを得るには最後から k-1 番目の結合の間でカット cut_height = (sorted_z[-4] + sorted_z[-5]) / 2.0 # 5クラスターの境界 dendrogram( Z_linkage, labels=list(df['都道府県']), ax=ax, leaf_rotation=90, leaf_font_size=8.5, color_threshold=cut_height ) ax.axhline( cut_height, color='red', ls='--', lw=1.8, label=f'k=5 カット(高さ≈{cut_height:.2f})' ) ax.set_title( '図3:Ward法クラスタリング デンドログラム(47都道府県、2023年)\n赤破線でk=5クラスターに分割', fontsize=12, fontweight='bold' ) ax.set_xlabel('都道府県', fontsize=10) ax.set_ylabel('Ward距離', fontsize=10) ax.legend(fontsize=10) ax.tick_params(axis='x', labelsize=8) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2019_U5_1_fig3.png'), dpi=150, bbox_inches='tight') plt.close(fig) print("[保存] 図3: Ward法デンドログラム") |
[保存] 図3: Ward法デンドログラム
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。SSDSE-B(2023年、47都道府県)を用いた多変量分析の結果、以下の知見が得られた:
| ファイル | 内容 | 出典 |
|---|---|---|
| SSDSE-B-2026.csv | 47都道府県統計データ | 統計数理研究所 SSDSE(社会・人口統計体系) |
| 2019_U5_1_fig1.png | 都道府県別労働生産性スコア | 本スクリプト生成(SSDSE-B実データ) |
| 2019_U5_1_fig2.png | PCA バイプロット | 本スクリプト生成(SSDSE-B実データ) |
| 2019_U5_1_fig3.png | Ward法デンドログラム | 本スクリプト生成(SSDSE-B実データ) |
| 2019_U5_1_fig4.png | 標準化係数棒グラフ | 本スクリプト生成(SSDSE-B実データ) |
本教育用コードはSSDS-B-2026.csvの実データのみを使用。合成データは一切使用していない。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。