このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
インターネット利用率やICT(情報通信技術)環境の整備は、現代社会における経済成長の重要な基盤とされている。日本では2000年代以降「IT立国」政策が推進され、ブロードバンド普及、スマートフォン利用、そしてDX(デジタルトランスフォーメーション)へとデジタル化の波が続いてきた。
まず「インターネット利用率・ICT環境と地域経済指標の関係分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
しかし、都市部と地方でのICT普及には依然として格差があり、これが地域経済格差の一因とも考えられる。本研究では、47都道府県の断面データを用いて、ICT環境(教育・情報通信への投資の代理変数)と経済水準の関係を統計的に分析する。
SSDSE-B 相関分析 主成分分析(PCA) 重回帰分析 地域分類
統計数理研究所が公開する SSDSE-B(社会・人口統計体系データセット B)から、2022年度の47都道府県断面データを使用。地域コードがR\d{5}(都道府県レベル)の行を抽出した。
SSDSE-Bにはインターネット利用率そのものは収録されていないため、ICT環境を反映すると考えられる変数を構築した。
| プロキシ変数 | 元データ(SSDSE-B) | ICTとの関係 |
|---|---|---|
| 大学進学率 | 高校卒業者のうち進学者数 / 高校卒業者数 | 高等教育参加率が高い地域ほどデジタルリテラシーが高い傾向 |
| 大学数(per万人) | 大学数 / 総人口 × 10,000 | 高等教育機関の集積がICT人材供給の基盤 |
| 大学生比率 | 大学学生数 / 総人口 | 若年・高学歴層の比率 → ICT活用促進 |
| 通信費比率 | 交通・通信費 / 消費支出合計 | 情報通信への家計支出割合(ICT消費の直接代理) |
| 教育文化費比率 | (教育費 + 教養娯楽費)/ 消費支出合計 | 教育・文化的投資の大きさ → 知識集約的経済活動 |
| 変数 | 意味 |
|---|---|
| 消費支出(二人以上の世帯) | 家計の購買力・豊かさの総合代理指標(円/月) |
5つのICTプロキシ変数と経済指標(消費支出・教育費・教養娯楽費)の間のPearson相関係数行列を算出した。
| 説明変数 | 消費支出との相関 r | p値 | 有意性 |
|---|---|---|---|
| 大学進学率 | +0.446 | 0.0017 | ** |
| 大学数(per万人) | +0.201 | 0.1749 | ns |
| 大学生比率 | +0.287 | 0.050付近 | * |
| 通信費比率 | -0.091 | 0.5443 | ns |
| 教育文化費比率 | +0.638 | <0.001 | *** |
N=47の小サンプルでは、|r|>=0.29程度でp<0.05となる。しかし統計的有意性と実質的意義(効果量)は別物。Cohen(1988)の基準では r=0.1(小), 0.3(中), 0.5(大)を目安にする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import os import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import statsmodels.api as sm from scipy import stats from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 FIG_DIR = 'html/figures' DATA_B = 'data/raw/SSDSE-B-2026.csv' os.makedirs(FIG_DIR, exist_ok=True) |
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} のように書式も指定できます。19 20 21 22 23 24 25 26 | # ── データ読み込み ──────────────────────────────────────────────────────────── df_b = pd.read_csv(DATA_B, encoding='cp932', header=1) df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}', na=False)].copy() df_b['年度'] = df_b['年度'].astype(int) # 2022年断面データ df = df_b[df_b['年度'] == 2022].copy().reset_index(drop=True) assert len(df) == 47, f"47都道府県を期待したが {len(df)} 行" |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.astype(int) — 列を整数に変換(年度などを数値比較するため)。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | # ── 地域マップ ──────────────────────────────────────────────────────────────── region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12' } df['地域'] = df['都道府県'].map(region_map) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。49 50 51 52 53 54 | # ── ICT関連プロキシ変数の構築 ───────────────────────────────────────────────── # 大学進学率 = 高校卒業者のうち進学者 / 高校卒業者数 df['大学進学率'] = df['高等学校卒業者のうち進学者数'] / df['高等学校卒業者数'] # 大学数per万人(高等教育集積度) df['大学数per万人'] = df['大学数'] / df['総人口'] * 10000 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。55 56 57 58 59 60 61 62 63 64 | # 大学生比率(高等教育在学率) df['大学生比率'] = df['大学学生数'] / df['総人口'] # 通信費支出割合(ICT消費の代理) df['通信費比率'] = df['交通・通信費(二人以上の世帯)'] / df['消費支出(二人以上の世帯)'] # 教育文化費比率(教育・文化投資の代理) df['教育文化費比率'] = ( df['教育費(二人以上の世帯)'] + df['教養娯楽費(二人以上の世帯)'] ) / df['消費支出(二人以上の世帯)'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。65 66 67 68 69 70 71 72 73 74 | # 経済指標(目的変数候補) df['消費水準'] = df['消費支出(二人以上の世帯)'] # 万円換算 df['通信費絶対額'] = df['交通・通信費(二人以上の世帯)'] # ICT分析に使う変数群 ict_vars = ['大学進学率', '大学数per万人', '大学生比率', '通信費比率', '教育文化費比率'] ict_labels = ['大学進学率', '大学数\n(per万人)', '大学生比率', '通信費比率', '教育文化費比率'] eco_vars = ['消費支出(二人以上の世帯)', '教育費(二人以上の世帯)', '教養娯楽費(二人以上の世帯)'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。75 76 77 78 79 80 81 82 83 | # ── PCA(ICT活用指数の構築) ───────────────────────────────────────────────── X_ict = df[ict_vars].values scaler = StandardScaler() X_scaled = scaler.fit_transform(X_ict) pca = PCA(n_components=2) pca_scores = pca.fit_transform(X_scaled) df['PC1'] = pca_scores[:, 0] df['PC2'] = pca_scores[:, 1] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。StandardScaler().fit_transform(X) — 各列を「平均0・分散1」に標準化。単位が違う変数のβを比較可能に。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。84 85 86 87 88 89 90 | # ICT活用指数 = PC1(第一主成分、ICT集積度を主に反映) # PC1が大きいほどICT先進 df['ICT指数'] = df['PC1'] # PC1の符号を確認(大学進学率などと同方向になるよう調整) if pca.components_[0][0] < 0: # 大学進学率の係数が負なら反転 df['ICT指数'] = -df['ICT指数'] pca_scores[:, 0] = -pca_scores[:, 0] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。91 92 93 94 95 96 97 98 | # 都道府県分類 q33 = df['ICT指数'].quantile(0.67) q33_lo = df['ICT指数'].quantile(0.33) df['ICT分類'] = pd.cut( df['ICT指数'], bins=[-np.inf, q33_lo, q33, np.inf], labels=['ICT後発県', '標準県', 'ICT先進県'] ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | # ── 重回帰分析 ─────────────────────────────────────────────────────────────── # 目的変数: 消費水準(豊かさの代理) # 説明変数: ICT関連5変数(標準化) X_reg = X_scaled.copy() y_reg = df['消費支出(二人以上の世帯)'].values X_reg_const = sm.add_constant(X_reg) ols_model = sm.OLS(y_reg, X_reg_const).fit() print("=" * 60) print("重回帰分析結果 (目的変数: 消費支出)") print("=" * 60) print(ols_model.summary()) coef_vals = ols_model.params[1:] # 定数項除く _ci_raw = ols_model.conf_int() conf_int = (_ci_raw.values if hasattr(_ci_raw, 'values') else _ci_raw)[1:] # ndarray (n_vars, 2) pvals = ols_model.pvalues[1:] r2 = ols_model.rsquared adj_r2 = ols_model.rsquared_adj print(f"\nR² = {r2:.4f}, Adj-R² = {adj_r2:.4f}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | # ── 相関分析 ───────────────────────────────────────────────────────────────── corr_cols = ict_vars + ['消費支出(二人以上の世帯)', '教育費(二人以上の世帯)', '教養娯楽費(二人以上の世帯)'] corr_labels = ['大学進学率', '大学数\nper万人', '大学生\n比率', '通信費\n比率', '教育文化\n費比率', '消費支出', '教育費', '教養娯\n楽費'] corr_matrix = df[corr_cols].corr(method='pearson') # ── 上位・下位ランキング ────────────────────────────────────────────────────── df_rank = df[['都道府県', 'ICT指数', 'ICT分類', '地域']].copy() df_rank = df_rank.sort_values('ICT指数', ascending=False).reset_index(drop=True) top10 = df_rank.head(10) bot10 = df_rank.tail(10) print("\nICT先進県 TOP10:") print(top10[['都道府県', 'ICT指数']].to_string(index=False)) print("\nICT後発県 BOTTOM10:") print(bot10[['都道府県', 'ICT指数']].to_string(index=False)) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | # PCAの寄与率 var_expl = pca.explained_variance_ratio_ print(f"\nPC1寄与率: {var_expl[0]:.3f}, PC2寄与率: {var_expl[1]:.3f}") print(f"累積寄与率: {sum(var_expl):.3f}") fig1, ax1 = plt.subplots(figsize=(9, 7)) cmap = plt.get_cmap('RdBu_r') im = ax1.imshow(corr_matrix.values, cmap=cmap, vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax1, label='Pearson相関係数') n = len(corr_labels) ax1.set_xticks(range(n)) ax1.set_yticks(range(n)) ax1.set_xticklabels(corr_labels, fontsize=10) ax1.set_yticklabels(corr_labels, fontsize=10) ax1.tick_params(axis='x', rotation=0) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。.dropna() は欠損行を除去、.copy() は独立したコピーを作る。pandasで警告を防ぐ定石。154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | # 相関係数の数値を表示 for i in range(n): for j in range(n): val = corr_matrix.values[i, j] color = 'white' if abs(val) > 0.6 else 'black' ax1.text(j, i, f'{val:.2f}', ha='center', va='center', fontsize=9, color=color, fontweight='bold') ax1.set_title('図1: ICT関連変数と経済指標の相関行列(2022年・47都道府県)\nPearson相関係数', fontsize=13, pad=14) ax1.set_xlim(-0.5, n - 0.5) ax1.set_ylim(n - 0.5, -0.5) fig1.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2021_U5_4_fig1.png'), bbox_inches='tight') plt.close(fig1) print("図1 保存完了") |
============================================================
重回帰分析結果 (目的変数: 消費支出)
============================================================
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.467
Model: OLS Adj. R-squared: 0.402
Method: Least Squares F-statistic: 7.191
Date: Mon, 18 May 2026 Prob (F-statistic): 6.53e-05
Time: 11:23:59 Log-Likelihood: -514.90
No. Observations: 47 AIC: 1042.
Df Residuals: 41 BIC: 1053.
Df Model: 5
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 2.896e+05 2163.773 133.854 0.000 2.85e+05 2.94e+05
x1 309.8879 3670.281 0.084 0.933 -7102.395 7722.171
x2 3058.9838 3045.014 1.005 0.321 -3090.546 9208.514
x3 2699.8325 4211.134 0.641 0.525 -5804.726 1.12e+04
x4 6221.5340 2821.585 2.205 0.033 523.228 1.19e+04
x5 1.285e+04 2986.202 4.304 0.000 6820.469 1.89e+04
==============================================================================
Omnibus: 2.326 Durbin-Watson: 1.943
Prob(Omnibus): 0.313 Jarque-Bera (JB): 1.395
Skew: -0.356 Prob(JB): 0.498
Kurtosis: 3.454 Cond. No. 4.09
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
R² = 0.4672, Adj-R² = 0.4023
ICT先進県 TOP10:
都道府県 ICT指数
京都府 5.649096
東京都 5.371041
大阪府 2.220721
埼玉県 2.120635
神奈川県 2.085164
石川県 2.003690
広島県 1.836253
兵庫県 1.666466
滋賀県 1.444140
奈良県 1.371481
ICT後発県 BOTTOM10:
都道府県 ICT指数
福島県 -1.417980
秋田県 -1.437403
沖縄県 -1.446206
和歌山県 -1.505918
鳥取県 -1.610691
鹿児島県 -1.674313
山口県 -1.800952
茨城県 -1.817075
島根県 -1.909723
佐賀県 -2.371463
PC1寄与率: 0.574, PC2寄与率: 0.216
累積寄与率: 0.790
図1 保存完了f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。5つのICTプロキシ変数を標準化(StandardScaler)したうえで、主成分分析(PCA)を実施した。第1主成分(PC1)をICT活用指数として解釈する。
| 位置 | 特徴 | 代表的な都道府県 |
|---|---|---|
| PC1(右)大 | 大学集積・進学率高・教育文化費高 → ICT先進型 | 京都府、東京都、大阪府 |
| PC1(左)小 | 大学集積低・進学率低・農業比率高 | 佐賀県、島根県、茨城県 |
PCAは多変数を少数の主成分に圧縮する手法。第1主成分(PC1)は「最も分散を説明する方向」であり、複数指標を合成した総合スコアとして解釈できる。ただしPC1の意味は変数群によって変わり、常に明確な解釈が得られるとは限らない。
171 172 173 174 175 176 177 178 | fig2, ax2 = plt.subplots(figsize=(11, 9)) for region, color in region_colors.items(): mask = df['地域'] == region ax2.scatter( pca_scores[mask, 0], pca_scores[mask, 1], c=color, label=region, s=70, zorder=3, edgecolors='white', linewidths=0.5 ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。179 180 181 182 183 184 185 186 | # 都道府県ラベル for i, row in df.iterrows(): ax2.annotate( row['都道府県'].replace('県', '').replace('府', '').replace('都', '').replace('道', ''), (pca_scores[i, 0], pca_scores[i, 1]), fontsize=7.5, ha='center', va='bottom', xytext=(0, 5), textcoords='offset points', color='#222' ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。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 | # 変数ベクトル(バイプロット) components = pca.components_ # shape (2, n_vars) scale = 3.0 # ベクトルスケール for k, label in enumerate(ict_vars): vx = components[0, k] * scale vy = components[1, k] * scale ax2.annotate( '', xy=(vx, vy), xytext=(0, 0), arrowprops=dict(arrowstyle='->', color='#333', lw=1.8) ) ax2.text(vx * 1.12, vy * 1.12, ict_labels[k], fontsize=9, color='#333', ha='center', va='center', bbox=dict(boxstyle='round,pad=0.2', fc='#ffffcc', ec='#999', alpha=0.85)) ax2.axhline(0, color='#bbb', lw=0.8, ls='--') ax2.axvline(0, color='#bbb', lw=0.8, ls='--') ax2.set_xlabel(f'PC1(寄与率 {var_expl[0]*100:.1f}%) ← ICT集積度', fontsize=12) ax2.set_ylabel(f'PC2(寄与率 {var_expl[1]*100:.1f}%)', fontsize=12) ax2.set_title(f'図2: PCAバイプロット(47都道府県・2022年)\n累積寄与率 {sum(var_expl)*100:.1f}%', fontsize=13, pad=12) ax2.legend(loc='lower right', fontsize=10, framealpha=0.85) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2021_U5_4_fig2.png'), bbox_inches='tight') plt.close(fig2) print("図2 保存完了") |
図2 保存完了
ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。標準化した5つのICTプロキシ変数を説明変数、消費支出を目的変数として重回帰分析(OLS)を実施した。標準化係数で各変数の「相対的な重要性」を比較できる。
| 変数 | 標準化係数 β | p値 | 有意性 | 解釈 |
|---|---|---|---|---|
| 大学進学率 | +0.084 | 0.933 | ns | 他変数と共線性あり、単独では非有意 |
| 大学数(per万人) | +0.833 | 0.321 | ns | 非有意。大学数は地方でも相対的に大きい |
| 大学生比率 | +0.641 | 0.525 | ns | 非有意。大学進学率と相関し多重共線性の影響 |
| 通信費比率 | +2.205 | 0.033 | * | 通信費への支出比率が高い地域は消費水準も高い |
| 教育文化費比率 | +4.304 | <0.001 | *** | 最も強い正の効果。教育・文化投資と経済水準の関係 |
説明変数間の相関が高い場合(多重共線性)、係数の推定が不安定になる。VIF(分散拡大係数)で診断し、VIF>10は問題あり、VIF>5は注意が必要とされる。
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | fig3, ax3 = plt.subplots(figsize=(8, 5)) colors_coef = ['#e05c5c' if p < 0.05 else '#aaa' for p in pvals] y_pos = range(len(ict_labels)) for i, (coef, ci, color, label) in enumerate(zip(coef_vals, conf_int, colors_coef, ict_labels)): ax3.barh(i, coef, color=color, height=0.5, zorder=3) ax3.plot([ci[0], ci[1]], [i, i], 'k-', lw=2, zorder=4) ax3.plot([ci[0]], [i], 'k|', markersize=8, lw=2) ax3.plot([ci[1]], [i], 'k|', markersize=8, lw=2) ax3.set_yticks(list(y_pos)) ax3.set_yticklabels([l.replace('\n', '') for l in ict_labels], fontsize=11) ax3.axvline(0, color='black', lw=1.2) ax3.set_xlabel('標準化偏回帰係数', fontsize=11) ax3.set_title(f'図3: ICT指標が消費水準に与える影響\n標準化偏回帰係数と95%信頼区間 (R²={r2:.3f})', fontsize=12) ax3.set_xlim(min(conf_int[:, 0]) * 1.3, max(conf_int[:, 1]) * 1.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。230 231 232 233 234 235 236 237 238 239 240 241 | # 有意性注記 from matplotlib.patches import Patch legend_elements = [ Patch(facecolor='#e05c5c', label='p < 0.05(有意)'), Patch(facecolor='#aaa', label='p ≥ 0.05(非有意)') ] ax3.legend(handles=legend_elements, fontsize=9, loc='lower right') ax3.grid(axis='x', alpha=0.3, zorder=0) fig3.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2021_U5_4_fig3.png'), bbox_inches='tight') plt.close(fig3) print("図3 保存完了") |
図3 保存完了
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。PCAで得られたICT活用指数(PC1スコア)の上位1/3を「ICT先進県」、下位1/3を「ICT後発県」、中間を「標準県」として分類した。
| 順位 | 都道府県 | ICT指数 | 地域 | 特徴 |
|---|---|---|---|---|
| 1 | 京都府 | +5.65 | 近畿 | 大学数・学生数が人口比で最大級。学術都市 |
| 2 | 東京都 | +5.37 | 関東 | 大学集積・高進学率・教育文化費全国最高水準 |
| 3 | 大阪府 | +2.22 | 近畿 | 大都市圏の高等教育集積 |
| 4 | 埼玉県 | +2.12 | 関東 | 首都圏での大学進学率の高さ |
| 5 | 神奈川県 | +2.09 | 関東 | 大学数多く、文化娯楽費も高水準 |
| 順位 | 都道府県 | ICT指数 | 地域 | 特徴 |
|---|---|---|---|---|
| 47位 | 佐賀県 | -2.37 | 九州・沖縄 | 進学率・大学数とも低水準 |
| 46位 | 島根県 | -1.91 | 中国・四国 | 人口規模小・大学集積低い |
| 45位 | 茨城県 | -1.82 | 関東 | 製造業比率高く進学より就職が多い傾向 |
| 44位 | 山口県 | -1.80 | 中国・四国 | 工業県。ICT以外の産業基盤が中心 |
| 43位 | 鹿児島県 | -1.67 | 九州・沖縄 | 農業・観光が主要産業 |
三分位での「ICT先進/標準/後発」分類は単純だが恣意的でもある。機械的な閾値ではなくk-means法やウォード法による階層クラスタリングを併用すると、データ駆動で自然なグループを発見できる。また「後発」というラベルが価値判断を含むことに注意。
243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | top10_sorted = top10.sort_values('ICT指数', ascending=True) bot10_sorted = bot10.sort_values('ICT指数', ascending=True) fig4, axes = plt.subplots(1, 2, figsize=(13, 6), sharey=False) # 上位10(赤系) ax_top = axes[0] colors_top = [region_colors[r] for r in top10_sorted['地域']] bars = ax_top.barh(top10_sorted['都道府県'], top10_sorted['ICT指数'], color=colors_top, edgecolor='white', height=0.7) ax_top.axvline(0, color='black', lw=0.8) ax_top.set_xlabel('ICT指数(PC1スコア)', fontsize=10) ax_top.set_title('ICT先進県 上位10', fontsize=12, color='#c0392b', fontweight='bold') for bar, val in zip(bars, top10_sorted['ICT指数']): ax_top.text(val + 0.05, bar.get_y() + bar.get_height() / 2, f'{val:.2f}', va='center', fontsize=9) ax_top.tick_params(axis='y', labelsize=10) ax_top.grid(axis='x', alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | # 下位10(青系) ax_bot = axes[1] bot10_rev = bot10.sort_values('ICT指数', ascending=False) colors_bot = [region_colors[r] for r in bot10_rev['地域']] bars2 = ax_bot.barh(bot10_rev['都道府県'], bot10_rev['ICT指数'], color=colors_bot, edgecolor='white', height=0.7) ax_bot.axvline(0, color='black', lw=0.8) ax_bot.set_xlabel('ICT指数(PC1スコア)', fontsize=10) ax_bot.set_title('ICT後発県 下位10', fontsize=12, color='#2980b9', fontweight='bold') for bar, val in zip(bars2, bot10_rev['ICT指数']): offset = 0.05 if val >= 0 else -0.05 ha = 'left' if val >= 0 else 'right' ax_bot.text(val + offset, bar.get_y() + bar.get_height() / 2, f'{val:.2f}', va='center', fontsize=9, ha=ha) ax_bot.tick_params(axis='y', labelsize=10) ax_bot.grid(axis='x', alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。277 278 279 280 281 282 283 284 285 286 287 | # 凡例 from matplotlib.patches import Patch as MPatch handles = [MPatch(facecolor=c, label=r) for r, c in region_colors.items()] fig4.legend(handles=handles, loc='lower center', ncol=3, fontsize=9, bbox_to_anchor=(0.5, -0.04), framealpha=0.9) fig4.suptitle('図4: ICT活用指数スコア ランキング(2022年・47都道府県)', fontsize=13, y=1.01) fig4.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2021_U5_4_fig4.png'), bbox_inches='tight') plt.close(fig4) print("図4 保存完了") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 | # ── 最終サマリー出力 ───────────────────────────────────────────────────────── print("\n" + "=" * 60) print("最終統計サマリー(HTMLへの埋め込み用)") print("=" * 60) print(f"分析対象: 47都道府県(2022年断面)") print(f"PC1寄与率: {var_expl[0]*100:.1f}%") print(f"PC2寄与率: {var_expl[1]*100:.1f}%") print(f"累積寄与率 (PC1+PC2): {sum(var_expl)*100:.1f}%") print(f"重回帰 R²: {r2:.3f}") print(f"重回帰 Adj-R²: {adj_r2:.3f}") for i, (var, coef, pval) in enumerate(zip(ict_vars, coef_vals, pvals)): sig = '***' if pval < 0.001 else '**' if pval < 0.01 else '*' if pval < 0.05 else 'ns' print(f" {var}: β={coef:.4f}, p={pval:.4f} {sig}") print(f"\nICT先進県 TOP5: {', '.join(top10['都道府県'].head(5))}") print(f"ICT後発県 BOT5: {', '.join(bot10['都道府県'].tail(5).tolist()[::-1])}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。305 306 307 308 309 310 311 312 313 314 315 316 317 | # 相関係数(代表的なもの) r_prog_cons, p_prog_cons = stats.pearsonr(df['大学進学率'], df['消費支出(二人以上の世帯)']) r_univ_cons, p_univ_cons = stats.pearsonr(df['大学数per万人'], df['消費支出(二人以上の世帯)']) r_comm_cons, p_comm_cons = stats.pearsonr(df['通信費比率'], df['消費支出(二人以上の世帯)']) print(f"\n主要相関係数:") print(f" 大学進学率 × 消費支出: r={r_prog_cons:.3f}, p={p_prog_cons:.4f}") print(f" 大学数per万人 × 消費支出: r={r_univ_cons:.3f}, p={p_univ_cons:.4f}") print(f" 通信費比率 × 消費支出: r={r_comm_cons:.3f}, p={p_comm_cons:.4f}") print("\n全図の保存完了:") for i in range(1, 5): path = os.path.join(FIG_DIR, f'2021_U5_4_fig{i}.png') print(f" fig{i}: {os.path.exists(path)} → {path}") |
図4 保存完了 ============================================================ 最終統計サマリー(HTMLへの埋め込み用) ============================================================ 分析対象: 47都道府県(2022年断面) PC1寄与率: 57.4% PC2寄与率: 21.6% 累積寄与率 (PC1+PC2): 79.0% 重回帰 R²: 0.467 重回帰 Adj-R²: 0.402 大学進学率: β=309.8879, p=0.9331 ns 大学数per万人: β=3058.9838, p=0.3210 ns 大学生比率: β=2699.8325, p=0.5250 ns 通信費比率: β=6221.5340, p=0.0331 * 教育文化費比率: β=12851.2254, p=0.0001 *** ICT先進県 TOP5: 京都府, 東京都, 大阪府, 埼玉県, 神奈川県 ICT後発県 BOT5: 佐賀県, 島根県, 茨城県, 山口県, 鹿児島県 主要相関係数: 大学進学率 × 消費支出: r=0.446, p=0.0017 大学数per万人 × 消費支出: r=0.201, p=0.1749 通信費比率 × 消費支出: r=-0.091, p=0.5443 全図の保存完了: fig1: True → html/figures/2021_U5_4_fig1.png fig2: True → html/figures/2021_U5_4_fig2.png fig3: True → html/figures/2021_U5_4_fig3.png fig4: True → html/figures/2021_U5_4_fig4.png
stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。SSDSE-B(47都道府県・2022年断面)を用いた主成分分析・重回帰分析の結果:
| データ | 出典 |
|---|---|
| SSDSE-B-2026.csv(都道府県別データ) | 統計数理研究所 SSDSE(社会・人口統計体系)2026年版 |
| 大学数・学生数・高校卒業者等 | 文部科学省 学校基本調査(SSDSE-B収録) |
| 消費支出・教育費・教養娯楽費等 | 総務省 家計調査(SSDSE-B収録) |
本スクリプトは SSDSE-B-2026.csv の実データを使用(合成データは一切使用していません)。2022年断面・47都道府県。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。