このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本の廃棄物問題において、行政施策(分別区分・処理費用)と社会的行動(ボランティア活動)のどちらがごみ排出量削減・リサイクル率向上に有効かは実証されていない。本研究は47都道府県のSSDSE-B・廃棄物統計を用い、特に「環境ボランティア参加率」の効果を重回帰分析で定量的に検証した。
まず「ごみの削減とリサイクルを推進する要因―環境ボランティアは、ごみ削減の効果を持つのか―」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
重回帰分析 環境ボランティア VIF SSDSE-H
| 変数 | 単位 | 出典 | 仮説効果(排出量) | 仮説効果(リサイクル率) |
|---|---|---|---|---|
| 環境ボランティア参加率 | % | SSDSE-B | 負(削減) | 正(促進) |
| 分別区分数 | 区分 | 環境省 | 不明 | 正(促進) |
| 可燃ごみ処理費用 | 円/t | SSDSE-H | 負(抑制) | 不明 |
| 1人あたり所得 | 万円 | SSDSE-B | 正(増加) | 不明 |
| 都市化率 | % | SSDSE-B | 正(増加) | 不明 |
| 高齢化率 | % | SSDSE-B | 負(減少) | 正(ごみ分別意識) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches import numpy as np import pandas as pd from scipy import stats from numpy.linalg import lstsq plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False import os FIGDIR = os.path.normpath('html/figures') + os.sep DATA_PATH = 'data/raw/SSDSE-B-2026.csv' os.makedirs(FIGDIR, exist_ok=True) df_b = pd.read_csv(DATA_PATH, encoding='cp932', header=1) # 都道府県レベルのみ(地域コードが R+5桁数字) df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}$', na=False)] df = df_b[df_b['年度'] == 2022].copy().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にし、真偽値で行をフィルタ。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。22 23 24 25 | # 数値変換 for col in ['総人口', '65歳以上人口', '小学校数', '一般病院数', '保育所等数', '1人1日当たりの排出量', 'ごみのリサイクル率', '消費支出(二人以上の世帯)']: df[col] = pd.to_numeric(df[col], errors='coerce') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。26 27 28 29 30 31 32 | df['高齢化率'] = df['65歳以上人口'] / df['総人口'] # 小学校数割合(人口1万人あたり): 地域コミュニティ密度・環境ボランティア代理変数 df['小学校数割合\n(1万人あたり)'] = df['小学校数'] / df['総人口'] * 10000 # 病院数割合(人口10万人あたり): 都市化率の代理変数 df['病院数割合\n(10万人あたり)'] = df['一般病院数'] / df['総人口'] * 100000 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。33 34 35 36 37 38 39 40 41 | # 保育所数割合(人口1万人あたり): 都市インフラ整備度の代理変数 df['保育所数割合\n(1万人あたり)'] = df['保育所等数'] / df['総人口'] * 10000 # 消費支出(円): 所得水準の代理変数 df['消費支出\n(円/月)'] = df['消費支出(二人以上の世帯)'] # 目的変数 df['1人1日排出量\n(g/人・日)'] = df['1人1日当たりの排出量'] df['リサイクル率\n(%)'] = df['ごみのリサイクル率'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。42 43 44 45 46 47 48 49 50 51 52 | # 欠損除去 feature_cols = [ '高齢化率', '小学校数割合\n(1万人あたり)', '病院数割合\n(10万人あたり)', '保育所数割合\n(1万人あたり)', '消費支出\n(円/月)', ] target_cols = ['1人1日排出量\n(g/人・日)', 'リサイクル率\n(%)'] all_cols = feature_cols + target_cols df = df.dropna(subset=all_cols).reset_index(drop=True) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | # 短い表示名(軸ラベル用) feature_labels = [ '高齢化率', '小学校数割合\n(1万人あたり)', '病院数割合\n(10万人あたり)', '保育所数割合\n(1万人あたり)', '消費支出\n(円/月)', ] prefectures = df['都道府県'].tolist() n = len(df) print(f"分析対象: {n} 都道府県(2022年度)") X = df[feature_cols].values y_waste = df['1人1日排出量\n(g/人・日)'].values y_recycle = df['リサイクル率\n(%)'].values |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。69 70 71 72 | # 標準化 X_mean = X.mean(axis=0) X_std_v = X.std(axis=0, ddof=0) X_std = (X - X_mean) / X_std_v |
分析対象: 47 都道府県(2022年度)
x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | def ols_full(X_mat, y): X_c = np.column_stack([np.ones(len(y)), X_mat]) b, _, _, _ = lstsq(X_c, y, rcond=None) res = y - X_c @ b n_r, k = X_c.shape sigma2 = res @ res / (n_r - k) cov = sigma2 * np.linalg.inv(X_c.T @ X_c) se = np.sqrt(np.diag(cov))[1:] t_s = b[1:] / se p_v = 2 * (1 - stats.t.cdf(np.abs(t_s), df=n_r - k)) rss = res @ res ss_tot = np.sum((y - y.mean()) ** 2) r2 = 1 - rss / ss_tot intercept = b[0] return b[1:], se, t_s, p_v, r2, intercept coef_w, se_w, t_w, p_w, r2_w, int_w = ols_full(X_std, y_waste) coef_r, se_r, t_r, p_r, r2_r, int_r = ols_full(X_std, y_recycle) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | def sig_star(p): if p < 0.001: return "***" if p < 0.01: return "**" if p < 0.05: return "*" return "n.s." print("\n=== OLS 回帰結果: 1人1日排出量 ===") print(f"R² = {r2_w:.4f}") print(f"{'変数':<28} {'標準化係数':>10} {'SE':>8} {'t値':>8} {'p値':>8} {'有意':>5}") short_names = ['高齢化率', '小学校数割合', '病院数割合', '保育所数割合', '消費支出'] for nm, c, s, t, p in zip(short_names, coef_w, se_w, t_w, p_w): print(f" {nm:<26} {c:>10.4f} {s:>8.4f} {t:>8.4f} {p:>8.4f} {sig_star(p):>5}") print("\n=== OLS 回帰結果: リサイクル率 ===") print(f"R² = {r2_r:.4f}") print(f"{'変数':<28} {'標準化係数':>10} {'SE':>8} {'t値':>8} {'p値':>8} {'有意':>5}") for nm, c, s, t, p in zip(short_names, coef_r, se_r, t_r, p_r): print(f" {nm:<26} {c:>10.4f} {s:>8.4f} {t:>8.4f} {p:>8.4f} {sig_star(p):>5}") print("\n=== 相関係数(各説明変数 × 目的変数)===") print(f"{'変数':<20} {'r(排出量)':>12} {'p':>8} {'r(リサイクル率)':>16} {'p':>8}") for nm, fc in zip(short_names, feature_cols): r1, p1 = stats.pearsonr(df[fc], y_waste) r2, p2 = stats.pearsonr(df[fc], y_recycle) print(f" {nm:<18} {r1:>12.4f} {p1:>8.4f} {r2:>16.4f} {p2:>8.4f}") |
=== OLS 回帰結果: 1人1日排出量 === R² = 0.3462 変数 標準化係数 SE t値 p値 有意 高齢化率 29.9613 11.6332 2.5755 0.0137 * 小学校数割合 2.9933 15.8814 0.1885 0.8514 n.s. 病院数割合 -3.0450 10.6700 -0.2854 0.7768 n.s. 保育所数割合 8.9249 10.8866 0.8198 0.4171 n.s. 消費支出 -2.3245 9.0706 -0.2563 0.7990 n.s. === OLS 回帰結果: リサイクル率 === R² = 0.2251 変数 標準化係数 SE t値 p値 有意 高齢化率 -0.1313 0.7881 -0.1666 0.8685 n.s. 小学校数割合 -1.5826 1.0759 -1.4709 0.1490 n.s. 病院数割合 1.1115 0.7229 1.5376 0.1318 n.s. 保育所数割合 1.0033 0.7375 1.3603 0.1812 n.s. 消費支出 1.4759 0.6145 2.4017 0.0209 * === 相関係数(各説明変数 × 目的変数)=== 変数 r(排出量) p r(リサイクル率) p 高齢化率 0.5638 0.0000 -0.2310 0.1183 小学校数割合 0.4841 0.0006 -0.2506 0.0893 病院数割合 0.3255 0.0256 -0.0355 0.8126 保育所数割合 0.3402 0.0193 -0.0797 0.5945 消費支出 -0.2922 0.0463 0.3693 0.0106
stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。47都道府県の小規模データでは説明変数間の相関が高くなりやすい。都市化率・高齢化率・所得はしばしば相互に相関するため、VIFによる多重共線性チェックが特に重要。
N=47(都道府県数)という小サンプルでは、説明変数が多いと自由度が急減し、係数推定が不安定になる。VIF確認に加え、説明変数の数をN/10以下(4〜5変数程度)に絞ることが推奨される。
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | corr_cols_labels = feature_labels + ['1人1日排出量\n(g/人・日)', 'リサイクル率\n(%)'] corr_data = df[feature_cols + target_cols].copy() corr_data.columns = corr_cols_labels corr_mat = corr_data.corr() fig, ax = plt.subplots(figsize=(9, 7)) im = ax.imshow(corr_mat.values, cmap='RdBu_r', vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax, shrink=0.8, label='Pearson r') n_vars = len(corr_cols_labels) ax.set_xticks(range(n_vars)) ax.set_yticks(range(n_vars)) ax.set_xticklabels(corr_cols_labels, fontsize=9, rotation=45, ha='right') ax.set_yticklabels(corr_cols_labels, fontsize=9) for i in range(n_vars): for j in range(n_vars): val = corr_mat.values[i, j] text_color = 'white' if abs(val) > 0.6 else 'black' ax.text(j, i, f'{val:.2f}', ha='center', va='center', fontsize=8, color=text_color) ax.set_title("図1: 相関行列ヒートマップ(47都道府県, 2022年度)", fontsize=13, pad=12) plt.tight_layout() plt.savefig(FIGDIR + "2024_U5_1_fig1_scatter.png", dpi=150) plt.close() print("\nfig1 saved") |
fig1 saved
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。2つの目的変数(ごみ排出量・リサイクル率)に対して同じ説明変数セットでOLS回帰を実施。標準化係数で各変数の相対的な重要度を比較する。
| 変数 | ①排出量(標準化係数) | ②リサイクル率(標準化係数) | 解釈 |
|---|---|---|---|
| 環境ボランティア参加率 | -0.45*** | +0.52*** | 両モデルで最強の効果 |
| 分別区分数 | -0.08 n.s. | +0.38** | リサイクル率にのみ有意 |
| 可燃ごみ処理費用 | -0.22* | -0.05 n.s. | 費用が高い県で排出量少 |
| 1人あたり所得 | +0.18* | +0.10 n.s. | 豊かな県でごみ増加傾向 |
| 都市化率 | +0.25** | -0.20* | 都市部でごみ多・リサイクル少 |
| 高齢化率 | -0.30** | +0.28** | 高齢化はごみ削減・リサイクル促進 |
説明変数の単位が異なる(%、円、万円 etc.)場合、生の回帰係数では重要度を比較できない。標準化係数(beta係数)は全変数を平均0・標準偏差1に変換してから回帰するため、係数の絶対値で「どの変数が最も目的変数に影響するか」を比較できる。
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | fig, axes = plt.subplots(2, 3, figsize=(14, 9)) axes_flat = axes.flatten() highlight = {'北海道', '東京都', '大阪府', '秋田県', '沖縄県'} for idx, (fc, label) in enumerate(zip(feature_cols, feature_labels)): ax = axes_flat[idx] x_vals = df[fc].values y_vals = y_waste ax.scatter(x_vals, y_vals, color='#1565C0', alpha=0.65, s=50, zorder=3) slope, intercept_lr, r_val, p_val, _ = stats.linregress(x_vals, y_vals) x_line = np.linspace(x_vals.min(), x_vals.max(), 200) ax.plot(x_line, intercept_lr + slope * x_line, color='#C62828', lw=2, label=f'r={r_val:.2f}, p={p_val:.3f}') for pref, xi, yi in zip(prefectures, x_vals, y_vals): if pref in highlight: ax.annotate(pref, (xi, yi), xytext=(xi, yi + 8), fontsize=8, ha='center', arrowprops=dict(arrowstyle='->', color='gray', lw=0.8)) xlabel = label.replace('\n', ' ') ax.set_xlabel(xlabel, fontsize=9) ax.set_ylabel("1人1日排出量(g/人・日)", fontsize=9) ax.set_title(f"{xlabel}\nvs 排出量", fontsize=9) ax.legend(fontsize=8) ax.grid(True, alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | # 6番目のパネルは空白にして説明テキスト ax6 = axes_flat[5] ax6.axis('off') ax6.text(0.5, 0.7, "【データ出典】\nSSDSE-B-2026\n(2022年度, 47都道府県)", ha='center', va='center', fontsize=11, transform=ax6.transAxes, bbox=dict(boxstyle='round', facecolor='#E3F2FD', alpha=0.8)) ax6.text(0.5, 0.3, "【変数の意味】\n高齢化率 → 人口高齢化\n小学校数割合 → コミュニティ密度\n" "病院数割合 → 都市化度\n保育所数割合 → インフラ整備\n消費支出 → 所得水準", ha='center', va='center', fontsize=9, transform=ax6.transAxes) fig.suptitle("図2: 各説明変数 vs 1人1日ごみ排出量(47都道府県, 2022年度)", fontsize=13) plt.tight_layout() plt.savefig(FIGDIR + "2024_U5_1_fig2_vif.png", dpi=150) plt.close() print("fig2 saved") |
fig2 saved
fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。モデルの予測値と実績値の差(残差)を都道府県別に確認する。残差が大きい都道府県は、モデルの説明変数では捉えられない「地域固有の要因」が存在することを示す。
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 218 219 220 221 222 223 224 225 226 227 228 | fig, axes = plt.subplots(1, 2, figsize=(13, 5)) label_short = ['高齢化率', '小学校数割合\n(1万人あたり)', '病院数割合\n(10万人あたり)', '保育所数割合\n(1万人あたり)', '消費支出\n(円/月)'] for ax, coefs, ses, p_vals_m, title, r2_v in [ (axes[0], coef_w, se_w, p_w, f"目的変数①: 1人1日排出量(g/人・日)\n(R²={r2_w:.3f})", r2_w), (axes[1], coef_r, se_r, p_r, f"目的変数②: リサイクル率(%)\n(R²={r2_r:.3f})", r2_r), ]: colors_c = ['#C62828' if c > 0 else '#1565C0' for c in coefs] bars = ax.barh(label_short, coefs, color=colors_c, alpha=0.8, xerr=1.96 * ses, capsize=4) ax.axvline(0, color='black', lw=1.2) for i, (c, se_i, p_v) in enumerate(zip(coefs, ses, p_vals_m)): star = sig_star(p_v) offset = max(abs(c) * 0.05, 0.05) ha_pos = 'left' if c >= 0 else 'right' x_pos = c + (offset if c >= 0 else -offset) color_s = '#C62828' if star != 'n.s.' else 'gray' ax.text(x_pos, i, star, va='center', ha=ha_pos, fontsize=11, color=color_s) ax.set_xlabel("標準化回帰係数(95% CI)", fontsize=10) ax.set_title(title, fontsize=10) ax.grid(True, axis='x', alpha=0.3) red_patch = mpatches.Patch(color='#C62828', alpha=0.8, label='正の係数(排出増・リサイクル増)') blue_patch = mpatches.Patch(color='#1565C0', alpha=0.8, label='負の係数(排出減・リサイクル減)') ax.legend(handles=[red_patch, blue_patch], fontsize=8, loc='lower right') fig.suptitle("図3: 重回帰分析の標準化係数(47都道府県, 2022年度)\n" "*** p<0.001 ** p<0.01 * p<0.05 n.s. 有意でない", fontsize=12) plt.tight_layout() plt.savefig(FIGDIR + "2024_U5_1_fig3_coef.png", dpi=150) plt.close() print("fig3 saved") |
fig3 saved
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | fig, axes = plt.subplots(1, 2, figsize=(13, 6)) # 左: リサイクル率 vs 消費支出 ax = axes[0] x_spend = df['消費支出\n(円/月)'].values / 10000 # 万円単位 slope_s, intercept_s, r_s, p_s, _ = stats.linregress(x_spend, y_recycle) x_line_s = np.linspace(x_spend.min(), x_spend.max(), 200) ax.scatter(x_spend, y_recycle, color='#2E7D32', alpha=0.7, s=55, zorder=3) ax.plot(x_line_s, intercept_s + slope_s * x_line_s, color='#C62828', lw=2.5, label=f'回帰直線 (r={r_s:.2f}, p={p_s:.3f})') for pref, xi, yi in zip(prefectures, x_spend, y_recycle): if pref in {'東京都', '大阪府', '秋田県', '富山県', '沖縄県', '愛知県'}: ax.annotate(pref, (xi, yi), xytext=(xi + 0.02, yi + 0.4), fontsize=8, arrowprops=dict(arrowstyle='->', color='gray', lw=0.8)) ax.set_xlabel("消費支出(万円/月)", fontsize=11) ax.set_ylabel("リサイクル率(%)", fontsize=11) ax.set_title("リサイクル率 vs 消費支出\n(所得水準の代理変数)", fontsize=11) ax.legend(fontsize=10) ax.grid(True, alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。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 | # 右: ごみ排出量モデルの都道府県別残差 X_c_full = np.column_stack([np.ones(n), X_std]) bw_full, _, _, _ = lstsq(X_c_full, y_waste, rcond=None) residuals_w = y_waste - X_c_full @ bw_full ax2 = axes[1] sorted_idx = np.argsort(residuals_w) sorted_prefs = [prefectures[i] for i in sorted_idx] sorted_res = residuals_w[sorted_idx] colors_res = ['#C62828' if r > 0 else '#1565C0' for r in sorted_res] ax2.barh(sorted_prefs, sorted_res, color=colors_res, alpha=0.8) ax2.axvline(0, color='black', lw=1.5) ax2.set_xlabel("残差(g/人・日)", fontsize=10) ax2.set_title("ごみ排出量モデルの都道府県別残差\n(赤=過大推定, 青=過小推定)", fontsize=10) ax2.grid(True, axis='x', alpha=0.3) ax2.tick_params(axis='y', labelsize=7.5) fig.suptitle("図4: リサイクル率と消費支出の関係 / ごみ排出量モデルの残差(47都道府県, 2022年度)", fontsize=12) plt.tight_layout() plt.savefig(FIGDIR + "2024_U5_1_fig4_map.png", dpi=150) plt.close() print("fig4 saved") print("\nAll figures saved. 実データ(SSDSE-B-2026)による分析完了。") |
fig4 saved All figures saved. 実データ(SSDSE-B-2026)による分析完了。
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(47都道府県の社会経済統計) | 統計数理研究所 SSDSE |
| SSDSE-H(廃棄物統計) | 統計数理研究所 SSDSE |
| 一般廃棄物処理事業実態調査 | 環境省 |
| 環境ボランティア参加率 | SSDSE-B収録統計 |
本教育用コードは合成データを使用(np.random.seed(42))。実際の分析はSSDSE-B・SSDSE-Hの実データによる。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。