このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
「デジタルデバイド(digital divide)」とは、インターネットやデジタル技術にアクセスできる人とできない人の間に生じる格差のことである。日本では地域間・年齢間・経済力間の格差が複合的に絡み合い、情報格差が社会的不平等を拡大させることが懸念されている。
まず「デジタルデバイドの地域格差交通・通信費を指標とした情報格差の分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
しかし、デジタルデバイドを直接測定できる統計は限られている。本研究では、SSDSE-B(都道府県別パネルデータ)の「交通・通信費(二人以上の世帯)」を 情報インフラへの支出の代理変数(proxy variable) として活用し、地域別・時系列的な情報格差の構造を解析する。
SSDSE-B パネルデータ OLS回帰 主成分分析(PCA) Ward法クラスタリング デジタルデバイド
SSDSE-B-2026(社会・人口統計体系 都道府県データ)を使用。全47都道府県を対象に2012〜2023年の12年分のパネルデータを構築した。
| 変数名 | 内容 | 単位 | 役割 |
|---|---|---|---|
| 交通・通信費(二人以上の世帯) | 月額家計支出のうち交通・通信費カテゴリ | 円/月 | デジタルデバイドの代理指標 |
| 変数名 | 計算式 | 仮説(符号予測) |
|---|---|---|
| 高齢化率 | 65歳以上人口 / 総人口 × 100 | 負(高齢↑ → IT利用↓) |
| 大学数 | 都道府県内大学数(実数) | 正(高等教育機関 → IT親和性↑) |
| 消費支出_log | log(消費支出(二人以上の世帯)) | 正(所得水準代理 → 通信費↑) |
| 保育所密度 | 保育所等数 / 総人口 × 10,000 | 正(若い世帯 → IT利用↑) |
| 変数 | 意味 |
|---|---|
| 通信費_千円 | 交通・通信費(千円換算) |
| 高齢化率 | 高齢化の進捗(情報格差の主因) |
| 大学数 | 高等教育機関の集積 |
| 消費支出_log | 所得水準の対数変換 |
| 教育費_千円 | 教育支出(知識投資の代理) |
| 保育所密度 | 若い世帯の比率(IT利用と正相関) |
2012〜2023年の交通・通信費の地域別平均を追うことで、情報格差がどのように変化してきたかを把握する。
「デジタルデバイド」は直接測定できない概念(潜在変数)である。統計分析では、測定困難な概念を観測可能な変数で近似する「代理変数」の技法が重要になる。
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 | import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from scipy.cluster.hierarchy import dendrogram, linkage import statsmodels.api as sm from statsmodels.stats.outliers_influence import variance_inflation_factor from scipy import stats import warnings warnings.filterwarnings('ignore') plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 import os FIG_DIR = 'html/figures' DATA_B = 'data/raw/SSDSE-B-2026.csv' os.makedirs(FIG_DIR, exist_ok=True) 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) df_b = df_b.sort_values(['都道府県', '年度']).reset_index(drop=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)。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.astype(int) — 列を整数に変換(年度などを数値比較するため)。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。StandardScaler().fit_transform(X) — 各列を「平均0・分散1」に標準化。単位が違う変数のβを比較可能に。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # 変数生成 df_b['通信費_千円'] = df_b['交通・通信費(二人以上の世帯)'] / 1000 df_b['通信費_log'] = np.log(df_b['交通・通信費(二人以上の世帯)'].clip(lower=1)) df_b['高齢化率'] = df_b['65歳以上人口'] / df_b['総人口'] * 100 df_b['消費支出_log'] = np.log(df_b['消費支出(二人以上の世帯)'].clip(lower=1)) df_b['保育所密度'] = df_b['保育所等数'] / df_b['総人口'] * 10000 df_b['教育費_千円'] = df_b['教育費(二人以上の世帯)'] / 1000 region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄', } df_b['地域'] = df_b['都道府県'].map(region_map) region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12', } fig, ax = plt.subplots(figsize=(10, 5)) yearly = df_b.groupby(['年度', '地域'])['通信費_千円'].mean().reset_index() for reg, grp in yearly.groupby('地域'): ax.plot(grp['年度'], grp['通信費_千円'], marker='o', markersize=4, label=reg, color=region_colors.get(reg, 'gray')) ax.set_xlabel('年度', fontsize=12) ax.set_ylabel('交通・通信費(千円/月)', fontsize=12) ax.set_title('地域別 交通・通信費の推移(2012〜2023年)\n(IT格差の代理指標)', fontsize=14, fontweight='bold') ax.legend(fontsize=9) ax.grid(alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_15_fig1_ts.png'), dpi=150, bbox_inches='tight') plt.close() print("Fig1 saved") |
Fig1 saved
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。2022年断面データ(N=47)を用いて、交通・通信費(対数)を目的変数とした最小二乗法(OLS)回帰を実施する。どの社会経済指標が情報格差を説明するかを特定することが目的である。
| 説明変数 | 回帰係数 | 標準誤差 | t値 | p値 | 有意性 |
|---|---|---|---|---|---|
| (定数項) | -7.671 | 3.908 | -1.963 | 0.056 | — |
| 高齢化率 | 0.008 | 0.007 | 1.150 | 0.257 | n.s. |
| 大学数 | -0.003 | 0.001 | -2.962 | 0.005 | ** |
| 消費支出_log | 1.433 | 0.306 | 4.687 | <0.001 | *** |
| 保育所密度 | 0.027 | 0.028 | 0.968 | 0.338 | n.s. |
R²=0.445, 修正R²=0.392, F統計量=8.42, p<0.001。** p<0.01, *** p<0.001
OLS回帰で「何が重要か」を特定した後、PCAで多次元指標を低次元に圧縮し、都道府県の「情報格差プロファイル」を可視化する。
PCAの核心は固有値分解(eigendecomposition)にある:
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | df_2022 = df_b[df_b['年度'] == 2022].copy() xvars = ['高齢化率', '大学数', '消費支出_log', '保育所密度'] df_reg = df_2022[['通信費_log'] + xvars].dropna() X = sm.add_constant(df_reg[xvars]) res = sm.OLS(df_reg['通信費_log'], X).fit() print(res.summary()) coefs = res.params.drop('const') ses = res.bse.drop('const') pvals = res.pvalues.drop('const') fig, ax = plt.subplots(figsize=(8, 5)) colors_c = ['#e05c5c' if p < 0.05 else '#888888' for p in pvals] ax.barh(range(len(coefs)), coefs, xerr=1.96 * ses, color=colors_c, alpha=0.8, error_kw={'elinewidth': 1.5, 'capsize': 4}) ax.set_yticks(range(len(coefs))) ax.set_yticklabels(coefs.index, fontsize=10) ax.axvline(0, color='black', linewidth=0.8) ax.set_xlabel('OLS回帰係数', fontsize=12) ax.set_title(f'交通・通信費の決定要因(OLS, N=47)\nR²={res.rsquared:.3f}(赤=p<0.05)', fontsize=12, fontweight='bold') ax.grid(axis='x', alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_15_fig2_ols.png'), dpi=150, bbox_inches='tight') plt.close() print("Fig2 saved") |
OLS Regression Results
==============================================================================
Dep. Variable: 通信費_log R-squared: 0.445
Model: OLS Adj. R-squared: 0.392
Method: Least Squares F-statistic: 8.419
Date: Mon, 18 May 2026 Prob (F-statistic): 4.42e-05
Time: 11:24:20 Log-Likelihood: 36.311
No. Observations: 47 AIC: -62.62
Df Residuals: 42 BIC: -53.37
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -7.6713 3.908 -1.963 0.056 -15.558 0.215
高齢化率 0.0080 0.007 1.150 0.257 -0.006 0.022
大学数 -0.0029 0.001 -2.962 0.005 -0.005 -0.001
消費支出_log 1.4330 0.306 4.687 0.000 0.816 2.050
保育所密度 0.0274 0.028 0.968 0.338 -0.030 0.085
==============================================================================
Omnibus: 0.446 Durbin-Watson: 2.302
Prob(Omnibus): 0.800 Jarque-Bera (JB): 0.149
Skew: 0.135 Prob(JB): 0.928
Kurtosis: 3.053 Cond. No. 8.95e+03
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 8.95e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
Fig2 savedfig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。6変数(通信費・高齢化率・大学数・消費支出・教育費・保育所密度)を用いて、47都道府県の「情報格差プロファイル」を2次元で可視化する。PCAは多次元データを少数の主成分に圧縮し、都道府県間の類似性と差異を俯瞰する手法として有効である。
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | pca_vars = ['通信費_千円', '高齢化率', '大学数', '消費支出_log', '教育費_千円', '保育所密度'] df_pca = df_2022[['都道府県', '地域'] + pca_vars].dropna() scaler = StandardScaler() X_sc = scaler.fit_transform(df_pca[pca_vars]) pca = PCA(n_components=2) scores = pca.fit_transform(X_sc) explained = pca.explained_variance_ratio_ fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # スコアプロット for reg in df_pca['地域'].unique(): mask = df_pca['地域'] == reg ax1.scatter(scores[mask, 0], scores[mask, 1], color=region_colors.get(reg, 'gray'), label=reg, s=60, alpha=0.8) for i, pref in enumerate(df_pca['都道府県']): ax1.annotate(pref[:2], (scores[i, 0], scores[i, 1]), fontsize=6, alpha=0.6, xytext=(2, 2), textcoords='offset points') ax1.set_xlabel(f'PC1 ({explained[0]*100:.1f}%)', fontsize=11) ax1.set_ylabel(f'PC2 ({explained[1]*100:.1f}%)', fontsize=11) ax1.set_title('PCAスコアプロット(2022年, N=47)', fontsize=12, fontweight='bold') ax1.legend(fontsize=8, ncol=2) ax1.grid(alpha=0.3) ax1.axhline(0, color='black', linewidth=0.5) ax1.axvline(0, color='black', linewidth=0.5) # 寄与率 ax2.bar(range(1, len(pca_vars) + 1), PCA(n_components=len(pca_vars)).fit(X_sc).explained_variance_ratio_ * 100, color='#4e9af1', alpha=0.8) ax2.set_xlabel('主成分番号', fontsize=11) ax2.set_ylabel('寄与率(%)', fontsize=11) ax2.set_title('主成分の寄与率(スクリープロット)', fontsize=12, fontweight='bold') ax2.grid(axis='y', alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_15_fig3_pca.png'), dpi=150, bbox_inches='tight') plt.close() print("Fig3 saved") |
Fig3 saved
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。StandardScaler().fit_transform(X) — 各列を「平均0・分散1」に標準化。単位が違う変数のβを比較可能に。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。PCAで次元削減した後、Ward法(階層的クラスタリング)を用いて47都道府県をデジタルデバイドの類似性に基づいてグループ分けする。デンドログラムにより、どの都道府県が近い特性を持つかを視覚的に把握できる。
Ward法は「クラスター内の分散(不均一性)の増加量を最小化するクラスターを結合する」手法。正式には「誤差平方和(ESS)最小化基準」とも呼ばれる。
| クラスター | 主な都道府県(例) | 特性 | デジタルデバイド状況 |
|---|---|---|---|
| グループA | 東京都・神奈川県・愛知県 | 高所得・高通信費・大学多数 | 格差小(情報リッチ) |
| グループB | 大阪府・兵庫県・宮城県 | 中規模都市・通信費中程度 | 格差中程度 |
| グループC | 岩手県・秋田県・鳥取県 | 低人口密度・高齢化進行 | 格差大(情報プア) |
| グループD | 沖縄県 | 特殊な人口構造・低所得 | 独自の格差構造 |
※上表は期待されるグループ構造の例示。実際のクラスター所属はデンドログラムで確認すること。
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | from scipy.cluster.hierarchy import dendrogram, linkage Z = linkage(X_sc, method='ward') fig, ax = plt.subplots(figsize=(12, 6)) dendrogram(Z, labels=df_pca['都道府県'].tolist(), ax=ax, color_threshold=Z[-3, 2], leaf_rotation=90, leaf_font_size=8) ax.set_title('Ward法クラスタリング:デジタルデバイド指標による都道府県分類(2022年)', fontsize=13, fontweight='bold') ax.set_xlabel('都道府県', fontsize=11) ax.set_ylabel('距離(Ward法)', fontsize=11) ax.grid(axis='y', alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_15_fig4_cluster.png'), dpi=150, bbox_inches='tight') plt.close() print("Fig4 saved") print("All done!") |
Fig4 saved All done!
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。統計分析が示すデジタルデバイドは、単なる「通信費の差」ではなく、社会的不平等の縮図である。
政策的処方箋:
| データ | 出典 |
|---|---|
| SSDSE-B-2026.csv(都道府県別パネルデータ) | 統計数理研究所 SSDSE(社会・人口統計体系) |
| 交通・通信費(二人以上の世帯) | 総務省 家計調査(SSDSE-B 収録) |
| 高齢化率・大学数・保育所等数 | 総務省・文部科学省・厚生労働省(SSDSE-B 収録) |
本教育用コードは SSDSE-B-2026.csv の実データのみを使用(合成データ・乱数生成なし)。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。