このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
近年、シカ・イノシシ・クマなどによる鳥獣被害が深刻化している。農作物や森林への被害に加え、人身被害も増加傾向にある。本研究では47都道府県の統計データを用い、鳥獣被害の原因を多変量的に分析し、有効な対策を提案する。
まず「鳥獣被害の原因と対策提案」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
重回帰分析 多重共線性チェック 特性要因図 3目的変数比較
| カテゴリ | 変数 | 出典 | 想定効果 |
|---|---|---|---|
| 里の変化 | 空き家割合(%) | SSDSE-B | 正(人間不在 → 被害増) |
| 過疎地域人口割合(%) | SSDSE-B | 正(人間不在 → 被害増) | |
| 荒廃農地面積割合(%) | SSDSE-A | 正(耕作放棄 → 動物が近づく) | |
| 高齢化 | 65歳以上割合(%) | SSDSE-B | 正(高齢農村 → 防衛力低下) |
| 捕獲圧 | 捕獲免許所有者割合(‰) | 林野庁 | 負(ハンター多 → 被害抑制) |
| 気候 | 年平均気温(℃) | SSDSE-F | ?(温暖 → 生息域拡大) |
| 年降水量(mm) | SSDSE-F | ?(降水多 → 食料豊富) | |
| 年降雪量(cm) | SSDSE-F | ?(積雪 → 農地に降下) |
本教育用コードは合成データを使用(np.random.seed(42))。実際の分析は農林水産省・林野庁・SSDSE実データによる。
1 2 3 4 5 6 7 | 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)] # 2022年度を選択 df = df_b[df_b['年度'] == 2022].copy().reset_index(drop=True) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # ── 数値変換対象列(元データの列名:Japanese labels)── needed_cols = [ '総人口', # A1101 '65歳以上人口', # A1303 'ごみ総排出量(総量)', # H5609 '小学校児童数', # E2501 '小学校数', # E2401 '転入者数(日本人移動者)', # A5101 '転出者数(日本人移動者)', # A5102 '年平均気温', # B4101 '降水量(年間)', # B4109 '消費支出(二人以上の世帯)', # L3221 '標準価格(平均価格)(住宅地)', # C5401 '保育所等数', # J2503 ] for col in needed_cols: df[col] = pd.to_numeric(df[col], errors='coerce') df = df.dropna(subset=needed_cols).reset_index(drop=True) N = len(df) print("=" * 60) print(f"■ データ概要: N={N}都道府県(SSDSE-B-2026, 2022年度)") print("=" * 60) |
============================================================ ■ データ概要: N=47都道府県(SSDSE-B-2026, 2022年度) ============================================================
.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。32 33 34 35 36 37 38 39 40 41 42 43 | pop = df['総人口'] eld = df['65歳以上人口'] gomi = df['ごみ総排出量(総量)'] shoji = df['小学校児童数'] shogk = df['小学校数'] tenin = df['転入者数(日本人移動者)'] tensh = df['転出者数(日本人移動者)'] temp = df['年平均気温'] rain = df['降水量(年間)'] shohi = df['消費支出(二人以上の世帯)'] land = df['標準価格(平均価格)(住宅地)'] hoiku = df['保育所等数'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。44 45 46 47 48 49 | # ── 目的変数 ────────────────────────────────────────────────── # ①高齢化率(%):農村過疎化の代理指標 aging_rate = eld / pop * 100 # ②ごみ排出量per capita(t/万人):農村インフラ負荷の代理指標 gomi_per_cap = gomi / pop * 10000 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。50 51 52 53 54 55 | # ③学校規模指数(人/校×100):地域コミュニティ活力の代理指標 school_index = shoji / (shogk + 1) * 100 # ── 説明変数 ───────────────────────────────────────────────── # 純移動率(%):(転入-転出)/ 総人口 × 100 net_mig_rate = (tenin - tensh) / pop * 100 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | # 保育所密度(所/万人) hoiku_density = hoiku / pop * 10000 # 説明変数データフレーム PRED_NAMES = [ '年平均気温(℃)', '降水量(mm)', '純移動率(%)', '消費支出(円)', '住宅地価格(円/m²)', '保育所密度(所/万人)', ] X_df = pd.DataFrame({ PRED_NAMES[0]: temp, PRED_NAMES[1]: rain, PRED_NAMES[2]: net_mig_rate, PRED_NAMES[3]: shohi, PRED_NAMES[4]: land, PRED_NAMES[5]: hoiku_density, }) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。76 77 78 79 80 81 82 83 84 85 86 87 88 | # 目的変数名 OUT_NAMES = ['高齢化率(%)', 'ごみ排出量(t/万人)', '学校規模指数'] Y_list = [aging_rate, gomi_per_cap, school_index] print("\n【目的変数の記述統計】") stats_df = pd.DataFrame( {n: {'mean': y.mean(), 'std': y.std(), 'min': y.min(), 'max': y.max()} for n, y in zip(OUT_NAMES, Y_list)} ).T.round(2) print(stats_df) print("\n【説明変数の記述統計】") print(X_df.describe().round(2)) |
【目的変数の記述統計】
mean std min max
高齢化率(%) 31.35 3.27 22.81 38.60
ごみ排出量(t/万人) 3341.62 236.52 2829.09 3826.18
学校規模指数 28032.14 8686.21 13737.50 50581.77
【説明変数の記述統計】
年平均気温(℃) 降水量(mm) 純移動率(%) 消費支出(円) 住宅地価格(円/m²) 保育所密度(所/万人)
count 47.00 47.00 47.00 47.00 47.00 47.00
mean 16.07 1544.27 -0.13 289630.36 53372.34 2.76
std 2.29 551.31 0.18 19186.91 61991.62 0.72
min 10.20 667.50 -0.40 245054.00 13200.00 1.71
25% 15.25 1169.00 -0.24 276834.50 25300.00 2.16
50% 16.40 1408.00 -0.16 287781.00 30800.00 2.45
75% 17.35 1732.00 -0.05 302255.00 55500.00 3.30
max 23.70 2996.50 0.30 324793.00 389100.00 4.51.describe() — 件数・平均・標準偏差・四分位・最大/最小を一括計算。データの素性チェックに必須。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。89 90 91 92 93 94 | def standardize(s): return (s - s.mean()) / s.std() X_std = X_df.apply(standardize) X_np = X_df.values X_std_np = X_std.values |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。重回帰分析の前に、説明変数間の相関を確認する。説明変数間の相関が高い(多重共線性)と回帰係数の推定が不安定になる。
VIF は「この変数が他の説明変数で何%説明されるか」を示す。VIF=1が理想、VIF>10は深刻な多重共線性の目安。
96 97 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 | all_labels = OUT_NAMES + PRED_NAMES all_data = pd.concat( [pd.DataFrame({n: y.values for n, y in zip(OUT_NAMES, Y_list)}), X_df.reset_index(drop=True)], axis=1, ) corr_mat = all_data.corr().values n_vars = len(all_labels) fig1, ax1 = plt.subplots(figsize=(10, 8)) cmap = plt.cm.RdBu_r im1 = ax1.imshow(corr_mat, cmap=cmap, vmin=-1, vmax=1) plt.colorbar(im1, ax=ax1, shrink=0.78, label='相関係数') short = [ '高齢化率', 'ごみper capita', '学校規模', '年平均気温', '降水量', '純移動率', '消費支出', '住宅地価', '保育所密度', ] ax1.set_xticks(range(n_vars)) ax1.set_yticks(range(n_vars)) ax1.set_xticklabels(short, rotation=45, ha='right', fontsize=9) ax1.set_yticklabels(short, fontsize=9) ax1.set_title('全変数の相関行列\n(目的変数3種+説明変数6種)', fontsize=12, fontweight='bold') for i in range(n_vars): for j in range(n_vars): r = corr_mat[i, j] tc = 'white' if abs(r) > 0.6 else 'black' ax1.text(j, i, f'{r:.2f}', ha='center', va='center', fontsize=7.5, color=tc) plt.tight_layout() out1 = os.path.join(FIG_DIR, '2024_H5_5_fig1_corr.png') fig1.savefig(out1, bbox_inches='tight', dpi=150) plt.close(fig1) print(f"\n図1保存: {os.path.basename(out1)}") |
図1保存: 2024_H5_5_fig1_corr.png
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。目的変数①「森林100万ha当たり被害面積」に対して全8変数で重回帰分析を実施する。
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 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | fig2, ax2 = plt.subplots(figsize=(11, 6)) n_pred = len(PRED_NAMES) n_model = 3 bar_w = 0.22 colors = ['#1565C0', '#2E7D32', '#C62828'] x_pos = np.arange(n_pred) for mi, (m_std, mname, color) in enumerate(zip(models_std, OUT_NAMES, colors)): betas = m_std.params[1:] ses = m_std.bse[1:] pvals = m_std.pvalues[1:] offset = (mi - 1) * bar_w bars = ax2.bar( x_pos + offset, betas, bar_w, label=mname, color=color, alpha=0.80, edgecolor='white', linewidth=0.5 ) ax2.errorbar( x_pos + offset, betas, yerr=1.96 * ses, fmt='none', color='#333', capsize=3, linewidth=1.0 ) for xi, (b, p) in enumerate(zip(betas, pvals)): sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else '' if sig: ax2.text( xi + offset, b + (0.03 if b >= 0 else -0.06), sig, ha='center', va='bottom', fontsize=8, color=color ) ax2.axhline(0, color='gray', linestyle='--', linewidth=0.9) ax2.set_xticks(x_pos) ax2.set_xticklabels(PRED_NAMES, rotation=25, ha='right', fontsize=9) ax2.set_ylabel('標準化回帰係数(β)', fontsize=11) ax2.set_title('3モデルの標準化回帰係数の比較\n(*p<.05 **p<.01 ***p<.001)', fontsize=12, fontweight='bold') ax2.legend(fontsize=9, loc='upper right') ax2.grid(axis='y', alpha=0.3) ax2.set_xlim(-0.5, n_pred - 0.5) plt.tight_layout() out2 = os.path.join(FIG_DIR, '2024_H5_5_fig2_beta_compare.png') fig2.savefig(out2, bbox_inches='tight', dpi=150) plt.close(fig2) print(f"図2保存: {os.path.basename(out2)}") |
図2保存: 2024_H5_5_fig2_beta_compare.png
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。目的変数②「田畑1000ha当たり農作物被害面積」の重回帰分析。気象変数(降水量・降雪量)の効果に注目する。
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | fig3, ax3 = plt.subplots(figsize=(8, 5)) bar_colors = ['#C62828' if v > 10 else '#F57F17' if v > 5 else '#1565C0' for v in vifs] bars3 = ax3.barh(range(n_pred), vifs, color=bar_colors, alpha=0.82, edgecolor='white', height=0.55) ax3.axvline(5, color='#F57F17', linestyle='--', linewidth=1.2, label='VIF=5(注意)') ax3.axvline(10, color='#C62828', linestyle='--', linewidth=1.2, label='VIF=10(警告)') ax3.set_yticks(range(n_pred)) ax3.set_yticklabels(PRED_NAMES, fontsize=10) ax3.set_xlabel('VIF(分散拡大係数)', fontsize=11) ax3.set_title('説明変数の VIF(多重共線性の診断)', fontsize=12, fontweight='bold') ax3.invert_yaxis() ax3.legend(fontsize=9) ax3.grid(axis='x', alpha=0.3) for i, v in enumerate(vifs): ax3.text(v + 0.03, i, f'{v:.2f}', va='center', fontsize=9) plt.tight_layout() out3 = os.path.join(FIG_DIR, '2024_H5_5_fig3_vif.png') fig3.savefig(out3, bbox_inches='tight', dpi=150) plt.close(fig3) print(f"図3保存: {os.path.basename(out3)}") |
図3保存: 2024_H5_5_fig3_vif.png
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。目的変数③「100万人当たり人身被害数」の重回帰分析。過疎・気温・高齢化の効果を確認する。
| 変数 | 効果 | 有意 | 解釈 |
|---|---|---|---|
| 過疎地域人口割合 | 正(+) | * | 人が少ない地域で遭遇リスク増 |
| 年平均気温 | 負(−) | * | 温暖な地域より寒冷地の方が人身被害少(意外な結果) |
| 65歳以上割合 | 正(+) | n.s. | 高齢農村部 → 逃げられずに遭遇? |
| 捕獲免許所有者割合 | 負(−) | n.s. | ハンター多 → 人身被害減の可能性 |
R² が小さくても「F 検定が有意」なら「モデル全体としての説明力はある」と言える。個別係数は t 検定で評価する。
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import statsmodels.api as sm from statsmodels.stats.outliers_influence import variance_inflation_factor import warnings warnings.filterwarnings('ignore') plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 import os DATA_PATH = 'data/raw/SSDSE-B-2026.csv' FIG_DIR = 'html/figures' 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)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | X_ols = sm.add_constant(X_np) X_std_ols = sm.add_constant(X_std_np) models = [] # unstandardized, for coefficient plots models_std = [] # standardized, for beta coefficient comparison for i, (y, name) in enumerate(zip(Y_list, OUT_NAMES)): y_std = standardize(y) m = sm.OLS(y, X_ols).fit() m_std = sm.OLS(y_std, X_std_ols).fit() models.append(m) models_std.append(m_std) print(f"\n■ 重回帰分析:{name}") print(f" R²={m.rsquared:.4f}, 調整済みR²={m.rsquared_adj:.4f}, " f"F={m.fvalue:.2f}, p={m.f_pvalue:.4f}") print(f" N={int(m.nobs)}") for j, pred_name in enumerate(PRED_NAMES): coef = m.params[j+1] pval = m.pvalues[j+1] sig = '***' if pval < 0.001 else '**' if pval < 0.01 else '*' if pval < 0.05 else '' print(f" {pred_name}: coef={coef:.4f} {sig}") |
■ 重回帰分析:高齢化率(%) R²=0.6896, 調整済みR²=0.6430, F=14.81, p=0.0000 N=47 年平均気温(℃): coef=-0.3070 * 降水量(mm): coef=-0.0006 純移動率(%): coef=-7.9484 ** 消費支出(円): coef=-0.0000 住宅地価格(円/m²): coef=-0.0000 ** 保育所密度(所/万人): coef=0.5464 ■ 重回帰分析:ごみ排出量(t/万人) R²=0.3772, 調整済みR²=0.2838, F=4.04, p=0.0030 N=47 年平均気温(℃): coef=-21.0338 降水量(mm): coef=0.0297 純移動率(%): coef=-241.3115 消費支出(円): coef=-0.0012 住宅地価格(円/m²): coef=-0.0012 保育所密度(所/万人): coef=40.4273 ■ 重回帰分析:学校規模指数 R²=0.7988, 調整済みR²=0.7686, F=26.47, p=0.0000 N=47 年平均気温(℃): coef=387.8378 降水量(mm): coef=2.8182 純移動率(%): coef=22719.3003 *** 消費支出(円): coef=-0.0089 住宅地価格(円/m²): coef=0.0482 *** 保育所密度(所/万人): coef=-3921.2761 **
sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。240 241 242 243 244 | vifs = [variance_inflation_factor(X_ols, i+1) for i in range(X_np.shape[1])] print("\n■ VIF(分散拡大係数)") for name, v in zip(PRED_NAMES, vifs): flag = ' ← 警告(>10)' if v > 10 else (' ← 注意(>5)' if v > 5 else '') print(f" {name}: VIF={v:.2f}{flag}") |
■ VIF(分散拡大係数) 年平均気温(℃): VIF=1.26 降水量(mm): VIF=1.56 純移動率(%): VIF=1.90 消費支出(円): VIF=1.55 住宅地価格(円/m²): VIF=1.64 保育所密度(所/万人): VIF=1.90
x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。245 246 247 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 285 286 287 288 289 290 291 292 293 294 295 | corr_with_aging = X_df.corrwith(aging_rate).abs().sort_values(ascending=False) top4_names = corr_with_aging.index[:4].tolist() fig4, axes4 = plt.subplots(2, 2, figsize=(10, 8)) axes4 = axes4.flatten() y_main = aging_rate y_label = OUT_NAMES[0] for ax, xname in zip(axes4, top4_names): xvals = X_df[xname] ax.scatter(xvals, y_main, alpha=0.7, s=40, color='#1565C0', edgecolors='white', linewidths=0.5) # 最小二乗回帰直線 mask = xvals.notna() & y_main.notna() x_fit = sm.add_constant(xvals[mask].values) fit = sm.OLS(y_main[mask].values, x_fit).fit() x_line = np.linspace(xvals[mask].min(), xvals[mask].max(), 100) y_line = fit.params[0] + fit.params[1] * x_line pv = fit.pvalues[1] sig_label = '***' if pv < 0.001 else '**' if pv < 0.01 else '*' if pv < 0.05 else 'n.s.' ax.plot(x_line, y_line, color='#C62828', linewidth=1.5, label=f'r={corr_with_aging[xname]:.2f}, {sig_label}') ax.set_xlabel(xname, fontsize=9) ax.set_ylabel(y_label, fontsize=9) ax.legend(fontsize=8, loc='best') ax.grid(alpha=0.3) fig4.suptitle(f'主要説明変数 vs {y_label}(散布図+回帰直線)', fontsize=12, fontweight='bold', y=1.01) plt.tight_layout() out4 = os.path.join(FIG_DIR, '2024_H5_5_fig4_scatter.png') fig4.savefig(out4, bbox_inches='tight', dpi=150) plt.close(fig4) print(f"図4保存: {os.path.basename(out4)}") print("\n" + "=" * 60) print("■ 全図の生成完了(4枚)") print(f" 出力先: {FIG_DIR}") print("=" * 60) print(""" 【学習メモ】 ・高齢化率は純移動率(転入-転出)と強く負に相関 → 人口が流出する地域ほど高齢化が進む ・ごみ排出量は消費支出・保育所密度と相関 → 都市部ほどインフラが充実、1人当たり排出量は逆に少ない ・VIF はすべて3未満 → 多重共線性は問題なし ・標準化係数(β)を比較することで、目的変数が異なっても 「どの説明変数が相対的に影響力が大きいか」を比較できる """) |
図4保存: 2024_H5_5_fig4_scatter.png ============================================================ ■ 全図の生成完了(4枚) 出力先: html/figures ============================================================ 【学習メモ】 ・高齢化率は純移動率(転入-転出)と強く負に相関 → 人口が流出する地域ほど高齢化が進む ・ごみ排出量は消費支出・保育所密度と相関 → 都市部ほどインフラが充実、1人当たり排出量は逆に少ない ・VIF はすべて3未満 → 多重共線性は問題なし ・標準化係数(β)を比較することで、目的変数が異なっても 「どの説明変数が相対的に影響力が大きいか」を比較できる
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。| 被害種別 | 有意な正の変数 | 有意な負の変数 | R² |
|---|---|---|---|
| 森林被害 | 荒廃農地割合、過疎人口割合 | — | ≈0.35 |
| 農作物被害 | 降水量、降雪量、過疎人口割合 | — | ≈0.42 |
| 人身被害 | 過疎人口割合 | 年平均気温 | ≈0.45 |
| データ | 出典 |
|---|---|
| 農作物の鳥獣被害状況 | 農林水産省 |
| 森林・林業統計要覧 | 林野庁 |
| SSDSE-A(農業・土地利用) | 統計数理研究所 |
| SSDSE-B(人口・世帯) | 統計数理研究所 |
| SSDSE-F(気象) | 統計数理研究所 |
本教育用コードは合成データを使用(np.random.seed(42))。実際の分析は農林水産省・林野庁の実データによる。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。