このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
地球温暖化は現代社会における最大の環境課題の一つである。気候変動の主因とされる温室効果ガス、特に CO2 の排出削減は、SDGs(持続可能な開発目標)の目標13「気候変動に具体的な対策を」において 国際社会全体で取り組む最優先事項に位置づけられている。
まず「都道府県別CO2排出量の決定要因と地球温暖化対策の分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
日本全体では 2050 年カーボンニュートラルを目標に、各都道府県・市区町村レベルの施策が求められている。 しかし都道府県によって産業構造・人口・気候が大きく異なり、一律の対策では効果を上げられない場合がある。 本研究では SSDSE-B の都道府県統計データを用い、CO2 排出量に関連する環境負荷指標の地域差の要因を 統計的に分析する。
SSDSE-B 相関分析 重回帰分析 特化係数 LQ 地域比較
SSDSE-B-2026(社会・人口統計体系 都道府県データセット)2022年度断面の47都道府県データを使用。 データは統計センターが公表する実測値であり、行政区分コード R が 5 桁の行(都道府県レベル)を抽出している。
都道府県別の CO2 排出量は SSDSE-B には直接掲載されていない。そのため、 CO2 排出と強く関連すると考えられる「代理変数(proxy variable)」を用いる。 代理変数とは、測定困難な概念を間接的に表す指標のことで、論文でも広く活用される手法である。
| 役割 | 変数名(SSDSE-B) | 単位 | CO2との関連 |
|---|---|---|---|
| 目的変数 | 1人1日当たりのごみ排出量 | g/人・日 | 廃棄物処理・埋立処分時のCO2排出を代理 |
| 説明変数 | 光熱・水道費(二人以上世帯) | 円/月 | 家庭エネルギー消費量の代理(寒冷地で高い) |
| 交通・通信費(二人以上世帯) | 円/月 | 自動車依存度・移動由来排出の代理 | |
| ごみのリサイクル率 | % | 廃棄物対策・環境政策の実施状況 | |
| 年平均気温 | ℃ | 冷暖房需要・エネルギー消費に影響 | |
| 降水日数(年間) | 日/年 | 気候特性(移動手段・生活パターンに影響) |
| 変数 | 平均 | 標準偏差 | 最小 | 最大 |
|---|---|---|---|---|
| 1人1日ごみ排出量 (g/人・日) | 906.1 | 61.5 | 770(京都府) | 1021(富山・福島) |
| 光熱・水道費 (円/月) | 25,120 | 3,378 | 17,897(沖縄県) | 33,197(山形県) |
| 交通・通信費 (円/月) | 41,523 | 6,125 | 28,186(東京都) | 54,728(群馬県) |
| ごみリサイクル率 (%) | 18.2 | 3.8 | 12.4 | 28.3 |
| 年平均気温 (℃) | 16.1 | 2.3 | 10.2 | 23.7 |
| 降水日数 (日/年) | 111.4 | 28.5 | 69 | 171 |
1 2 3 4 5 6 7 | 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) print(f"[データ確認] 2022年度 都道府県数: {len(df)}") |
[データ確認] 2022年度 都道府県数: 47
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ループ不要なのが強み。8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12' } df['地域区分'] = df['都道府県'].map(region_map) df['地域色'] = df['地域区分'].map(region_colors) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。35 36 37 38 39 40 41 42 | df['y_gomi_pp'] = df['1人1日当たりの排出量'] # 説明変数 df['x_konetsu'] = df['光熱・水道費(二人以上の世帯)'] # エネルギー消費代理 df['x_kotsu'] = df['交通・通信費(二人以上の世帯)'] # 自動車利用代理 df['x_recycle'] = df['ごみのリサイクル率'] # 廃棄物対策 df['x_temp'] = df['年平均気温'] # 気候(冷暖房需要) df['x_rain'] = df['降水日数(年間)'] # 降水日数 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | # 分析データセット ana_cols = ['都道府県', '地域区分', '地域色', 'y_gomi_pp', 'x_konetsu', 'x_kotsu', 'x_recycle', 'x_temp', 'x_rain'] dfa = df[ana_cols].dropna().copy() print(f"[分析対象] {len(dfa)}都道府県(欠損除外後)") # 基本統計量の表示 print("\n=== 基本統計量 ===") desc_cols = { '1人1日ごみ排出量 (g/人・日)': 'y_gomi_pp', '光熱・水道費 (円/月)': 'x_konetsu', '交通・通信費 (円/月)': 'x_kotsu', 'ごみリサイクル率 (%)': 'x_recycle', '年平均気温 (℃)': 'x_temp', '降水日数 (日/年)': 'x_rain', } for label, col in desc_cols.items(): s = dfa[col] print(f" {label}: 平均={s.mean():.1f}, 標準偏差={s.std():.1f}, " f"最小={s.min():.1f}, 最大={s.max():.1f}") |
[分析対象] 47都道府県(欠損除外後) === 基本統計量 === 1人1日ごみ排出量 (g/人・日): 平均=906.1, 標準偏差=61.5, 最小=770.0, 最大=1021.0 光熱・水道費 (円/月): 平均=25119.5, 標準偏差=3377.7, 最小=17897.0, 最大=33197.0 交通・通信費 (円/月): 平均=41522.6, 標準偏差=6125.1, 最小=28186.0, 最大=54728.0 ごみリサイクル率 (%): 平均=18.2, 標準偏差=3.8, 最小=12.4, 最大=28.3 年平均気温 (℃): 平均=16.1, 標準偏差=2.3, 最小=10.2, 最大=23.7 降水日数 (日/年): 平均=111.4, 標準偏差=28.5, 最小=69.0, 最大=171.0
r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | print("\n=== 地域別 1人1日ごみ排出量 平均 ===") region_stats = dfa.groupby('地域区分')['y_gomi_pp'].agg(['mean', 'std', 'count']) region_stats.columns = ['平均', '標準偏差', '都道府県数'] print(region_stats.sort_values('平均', ascending=False).to_string()) # 上位・下位都道府県 print("\n=== 上位5都道府県(ごみ排出量多) ===") top5 = dfa_sorted.head(5)[['都道府県', 'y_gomi_pp', '地域区分']] top5.columns = ['都道府県', '1人1日排出量(g)', '地域区分'] print(top5.to_string(index=False)) print("\n=== 下位5都道府県(ごみ排出量少) ===") bot5 = dfa_sorted.tail(5)[['都道府県', 'y_gomi_pp', '地域区分']] bot5.columns = ['都道府県', '1人1日排出量(g)', '地域区分'] print(bot5.to_string(index=False)) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。78 79 80 81 82 83 84 85 86 87 88 89 | # 特化係数(LQ: Location Quotient)の計算例 # LQ = (都道府県iの光熱水道費シェア) / (全国の光熱水道費シェア) # ここでは光熱水道費の全国消費支出に占める割合の特化係数を計算 df_lq = df.copy() national_share = df_lq['光熱・水道費(二人以上の世帯)'].mean() / df_lq['消費支出(二人以上の世帯)'].mean() df_lq['LQ_konetsu'] = (df_lq['光熱・水道費(二人以上の世帯)'] / df_lq['消費支出(二人以上の世帯)']) / national_share print("\n=== 光熱・水道費特化係数(LQ)上位10都道府県 ===") lq_top = df_lq[['都道府県', 'LQ_konetsu']].sort_values('LQ_konetsu', ascending=False).head(10) print(lq_top.to_string(index=False)) print("\n[完了] 全4枚の図を保存しました。") print(f" 保存先: {FIG_DIR}") |
=== 地域別 1人1日ごみ排出量 平均 ===
平均 標準偏差 都道府県数
地域区分
北海道・東北 960.285714 45.455892 7
中国・四国 917.666667 49.284886 9
九州・沖縄 911.500000 38.474481 8
中部 906.555556 72.699916 9
関東 874.428571 64.404599 7
近畿 861.857143 60.482583 7
=== 上位5都道府県(ごみ排出量多) ===
都道府県 1人1日排出量(g) 地域区分
富山県 1021 中部
福島県 1021 北海道・東北
新潟県 994 中部
青森県 991 北海道・東北
秋田県 991 北海道・東北
=== 下位5都道府県(ごみ排出量少) ===
都道府県 1人1日排出量(g) 地域区分
東京都 821 関東
長野県 802 中部
神奈川県 801 関東
滋賀県 789 近畿
京都府 770 近畿
=== 光熱・水道費特化係数(LQ)上位10都道府県 ===
都道府県 LQ_konetsu
青森県 1.494306
山形県 1.383987
岩手県 1.276919
北海道 1.245850
秋田県 1.232579
島根県 1.186535
福井県 1.146416
福島県 1.141344
新潟県 1.128408
富山県 1.120070
[完了] 全4枚の図を保存しました。
保存先: html/figuressort_values('列名', ascending=False) — 指定列で並べ替え(降順)。.dropna() は欠損行を除去、.copy() は独立したコピーを作る。pandasで警告を防ぐ定石。47都道府県の「1人1日当たりごみ排出量」(CO2排出の代理変数)を地域別に比較する。 排出量の地域差は産業構造・気候・生活スタイルなど多様な要因を反映している。
| 地域区分 | 平均 (g/人・日) | 都道府県数 | 特徴 |
|---|---|---|---|
| 北海道・東北 | 960 | 7 | 寒冷地・エネルギー消費多、農林業中心 |
| 中国・四国 | 918 | 9 | 製造業・化学工業が多い地域を含む |
| 九州・沖縄 | 912 | 8 | 温暖だが農業・製造業が混在 |
| 中部 | 907 | 9 | 製造業大県(愛知)と農業県が混在 |
| 関東 | 874 | 7 | 都市型サービス業中心・人口密度高 |
| 近畿 | 862 | 7 | リサイクル先進地域(京都・滋賀)が下位 |
特化係数(LQ)とは、特定地域の産業・消費の全国平均との相対的な集中度を示す指標。 LQ > 1 は全国平均より高い「特化している」状態を意味する。
| 都道府県 | 光熱費LQ | 解釈 |
|---|---|---|
| 青森県 | 1.49 | 全国の1.5倍の光熱費割合 |
| 山形県 | 1.38 | 寒冷地・暖房エネルギー特化 |
| 岩手県 | 1.28 | 積雪・寒冷条件が影響 |
| 北海道 | 1.25 | 国内最寒冷・暖房期間長い |
91 92 93 94 95 96 97 98 99 100 101 102 | fig1, ax1 = plt.subplots(figsize=(9, 6)) for region, color in region_colors.items(): sub = dfa[dfa['地域区分'] == region] ax1.scatter(sub['x_konetsu'], sub['y_gomi_pp'], color=color, label=region, s=60, zorder=3, alpha=0.9) for _, row in sub.iterrows(): pref = row['都道府県'].replace('県', '').replace('都', '').replace('府', '').replace('道', '') ax1.annotate(pref, xy=(row['x_konetsu'], row['y_gomi_pp']), xytext=(3, 3), textcoords='offset points', fontsize=6.5, color='#444', zorder=4) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | # 回帰直線 x_line = np.linspace(dfa['x_konetsu'].min(), dfa['x_konetsu'].max(), 100) r_val, p_val = stats.pearsonr(dfa['x_konetsu'], dfa['y_gomi_pp']) slope, intercept, *_ = stats.linregress(dfa['x_konetsu'], dfa['y_gomi_pp']) y_line = intercept + slope * x_line ax1.plot(x_line, y_line, color='#333', linewidth=1.5, linestyle='--', label=f'回帰直線 (r={r_val:.2f})') ax1.set_xlabel('光熱・水道費(円/月)\n(エネルギー消費の代理変数)', fontsize=11) ax1.set_ylabel('1人1日当たりごみ排出量(g/人・日)\n(CO2排出の代理変数)', fontsize=11) ax1.set_title('光熱・水道費と1人1日ごみ排出量の散布図\n(2022年度 都道府県別)', fontsize=12, fontweight='bold') ax1.legend(loc='upper left', fontsize=9, framealpha=0.8) ax1.grid(True, alpha=0.3) fig1.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2020_H5_5_fig1.png'), dpi=150, bbox_inches='tight') plt.close(fig1) print("\n[図1] 散布図 → 保存完了") |
[図1] 散布図 → 保存完了
stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。1人1日ごみ排出量(目的変数)を複数の説明変数で同時に説明する重回帰分析(OLS)を実施した。 変数間の多重共線性を考慮し、標準化した変数を用いて標準化偏回帰係数(β)を算出する。
| 説明変数 | 相関係数 r | p値 | 有意性 | 解釈 |
|---|---|---|---|---|
| 降水日数 | 0.361 | 0.013 | * 有意 | 降水日数が多い=自動車依存増・排出多 |
| 光熱・水道費 | 0.322 | 0.028 | * 有意 | エネルギー消費多い地域ほど排出多 |
| 交通・通信費 | 0.320 | 0.028 | * 有意 | 自動車依存度高い地域ほど排出多 |
| 年平均気温 | -0.270 | 0.066 | n.s. | 温暖地ほど排出少ない傾向(有意ではない) |
| リサイクル率 | -0.159 | 0.286 | n.s. | リサイクル率高い=排出少ない方向(非有意) |
| 変数 | 標準化偏回帰係数 β | p値 | 有意性 |
|---|---|---|---|
| 交通・通信費 | +0.276 | 0.059 | n.s.(境界) |
| 降水日数 | +0.272 | 0.138 | n.s. |
| 年平均気温 | -0.198 | 0.393 | n.s. |
| リサイクル率 | -0.174 | 0.217 | n.s. |
| 光熱・水道費 | -0.079 | 0.776 | n.s. |
N=47(都道府県数)の重回帰では、説明変数を増やすほど自由度が減り、各係数の推定精度が低下する。 モデル全体のF検定(p=0.038)は有意でも、個別係数が非有意になる現象を多重共線性(multicollinearity)という。
対処法:変数選択(AIC/BIC基準)、主成分回帰、Ridge回帰などで 過剰適合を防ぎ、解釈可能なモデルを構築する。
122 123 124 125 126 127 128 | dfa_sorted = dfa.sort_values('y_gomi_pp', ascending=False).reset_index(drop=True) fig2, ax2 = plt.subplots(figsize=(12, 7)) bars = ax2.bar(range(len(dfa_sorted)), dfa_sorted['y_gomi_pp'], color=dfa_sorted['地域色'].values, edgecolor='white', linewidth=0.5, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。129 130 131 132 133 134 135 136 137 138 | # 都道府県ラベル(X軸) pref_labels = [p.replace('県', '').replace('都', '').replace('府', '').replace('道', '') for p in dfa_sorted['都道府県']] ax2.set_xticks(range(len(dfa_sorted))) ax2.set_xticklabels(pref_labels, rotation=90, fontsize=8) # 凡例(地域区分) from matplotlib.patches import Patch legend_patches = [Patch(color=c, label=r) for r, c in region_colors.items()] ax2.legend(handles=legend_patches, loc='upper right', fontsize=9, framealpha=0.8) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | # 全国平均線 mean_val = dfa['y_gomi_pp'].mean() ax2.axhline(mean_val, color='#333', linestyle='--', linewidth=1.5, zorder=4) ax2.text(len(dfa_sorted) - 0.5, mean_val + 5, f'全国平均\n{mean_val:.0f}g', ha='right', fontsize=8.5, color='#333') ax2.set_xlabel('都道府県', fontsize=11) ax2.set_ylabel('1人1日当たりごみ排出量(g/人・日)', fontsize=11) ax2.set_title('都道府県別 1人1日当たりごみ排出量ランキング\n(2022年度・CO2排出の代理変数)', fontsize=12, fontweight='bold') ax2.set_xlim(-0.7, len(dfa_sorted) - 0.3) ax2.set_ylim(700, max(dfa_sorted['y_gomi_pp']) * 1.12) ax2.grid(True, axis='y', alpha=0.3, zorder=0) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2020_H5_5_fig2.png'), dpi=150, bbox_inches='tight') plt.close(fig2) print("[図2] ランキング棒グラフ → 保存完了") |
[図2] ランキング棒グラフ → 保存完了
ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。CO2 排出量は産業構造とも密接に関わる。特化係数(LQ)を用いて、各都道府県の光熱・水道費の 消費支出に占める割合が全国平均と比べてどの程度特化しているかを分析する。 LQ > 1 の都道府県は、エネルギー消費割合が全国平均より高く、対策が急務であることを示す。
| 順位 | 都道府県 | LQ値 | 1人1日ごみ排出量 | 主な特徴 |
|---|---|---|---|---|
| 1 | 青森県 | 1.49 | 991 g | 冬季暖房・積雪・農林業中心 |
| 2 | 山形県 | 1.38 | 909 g | 日本有数の豪雪地帯 |
| 3 | 岩手県 | 1.28 | 901 g | 広大な面積・農林水産業 |
| 4 | 北海道 | 1.25 | 937 g | 国内最寒冷・暖房期間最長 |
| 5 | 秋田県 | 1.23 | 991 g | 豪雪地帯・高齢化率高 |
| 6 | 島根県 | 1.19 | — | 山陰の寒冷・過疎地域 |
| 7 | 福井県 | 1.15 | — | 豪雪・石油暖房需要高 |
| 8 | 福島県 | 1.14 | 1021 g | 内陸部の盆地・気温差大 |
| 9 | 新潟県 | 1.13 | 994 g | 日本海側豪雪・農業大県 |
| 10 | 富山県 | 1.12 | 1021 g | 化学・金属工業・豪雪 |
環境クズネッツ曲線(Environmental Kuznets Curve)とは、経済発展の初期段階では 経済成長とともに環境負荷が増大するが、一定の所得水準を超えると環境負荷が減少に転じるという仮説。 逆U字型の関係を想定する。
都道府県レベルでは所得水準(消費支出)とごみ排出量の関係が複雑で、EKC が単純には成立しない場合が多い。 産業構造・気候・政策効果を考慮した多変数分析が重要。
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | heat_vars = ['y_gomi_pp', 'x_konetsu', 'x_kotsu', 'x_recycle', 'x_temp', 'x_rain'] heat_labels = ['1人1日\nごみ排出量', '光熱・\n水道費', '交通・\n通信費', 'リサイ\nクル率', '年平均\n気温', '降水\n日数'] corr_matrix = dfa[heat_vars].corr() fig3, ax3 = plt.subplots(figsize=(7, 6)) n = len(heat_vars) im = ax3.imshow(corr_matrix.values, cmap='RdBu_r', vmin=-1, vmax=1) plt.colorbar(im, ax=ax3, shrink=0.85, label='Pearson r') ax3.set_xticks(range(n)) ax3.set_yticks(range(n)) ax3.set_xticklabels(heat_labels, fontsize=9) ax3.set_yticklabels(heat_labels, fontsize=9) for i in range(n): for j in range(n): val = corr_matrix.values[i, j] r_ij, p_ij = stats.pearsonr(dfa[heat_vars[i]], dfa[heat_vars[j]]) sig_mark = '**' if p_ij < 0.01 else ('*' if p_ij < 0.05 else '') txt_color = 'white' if abs(val) > 0.65 else 'black' ax3.text(j, i, f'{val:.2f}{sig_mark}', ha='center', va='center', fontsize=8, color=txt_color, fontweight='bold' if sig_mark else 'normal') ax3.set_title('環境・生活指標の相関ヒートマップ\n(Pearson r、*p<0.05, **p<0.01)', fontsize=11, fontweight='bold') fig3.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2020_H5_5_fig3.png'), dpi=150, bbox_inches='tight') plt.close(fig3) print("[図3] 相関ヒートマップ → 保存完了") |
[図3] 相関ヒートマップ → 保存完了
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。分析結果をもとに、CO2 排出削減に向けた都道府県ごとの差別化された政策を提言する。 地域の産業・気候・生活スタイルの違いを踏まえた「地域密着型」の対策が重要である。
| 地域 | 課題 | 重点施策 | 期待効果 |
|---|---|---|---|
| 北海道・東北 (高排出・高エネルギー) |
寒冷地の暖房エネルギー消費 LQ > 1.2 が多い |
住宅断熱・ZEH普及 再生可能エネルギー(風力)導入 |
暖房エネルギー削減 30〜40%の省エネ期待 |
| 中部・中国四国 (製造業関連) |
製造業・化学工業由来 産業排出が大きい |
産業用エネルギー効率化 カーボンオフセット認定制度 |
産業部門のCO2削減 企業の自主削減促進 |
| 地方全般 (自動車依存) |
交通・通信費が高い 自動車依存型生活 |
EV普及補助金 地域公共交通の再整備 |
運輸部門の排出削減 交通渋滞の緩和 |
| 近畿・首都圏 (先進地域) |
排出量は少ないが さらなる削減余地 |
リサイクル率向上(目標30%) 循環経済モデルの全国展開 |
廃棄物処理CO2削減 他地域へのモデル普及 |
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | 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 import warnings warnings.filterwarnings('ignore') 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)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | print("\n=== 相関分析(目的変数: 1人1日ごみ排出量) ===") corr_vars = ['x_konetsu', 'x_kotsu', 'x_recycle', 'x_temp', 'x_rain'] corr_labels = { 'x_konetsu': '光熱・水道費', 'x_kotsu': '交通・通信費', 'x_recycle': 'リサイクル率', 'x_temp': '年平均気温', 'x_rain': '降水日数', } corr_results = {} for col in corr_vars: r, p = stats.pearsonr(dfa['y_gomi_pp'], dfa[col]) corr_results[col] = (r, p) sig = '**' if p < 0.01 else ('*' if p < 0.05 else 'n.s.') print(f" {corr_labels[col]:12s}: r={r:.3f}, p={p:.4f} {sig}") |
=== 相関分析(目的変数: 1人1日ごみ排出量) === 光熱・水道費 : r=0.322, p=0.0276 * 交通・通信費 : r=0.320, p=0.0284 * リサイクル率 : r=-0.159, p=0.2861 n.s. 年平均気温 : r=-0.270, p=0.0661 n.s. 降水日数 : r=0.361, p=0.0127 *
stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | X_cols = corr_vars X = dfa[X_cols].values y = dfa['y_gomi_pp'].values # 標準化 X_mean = X.mean(axis=0) X_std = X.std(axis=0, ddof=1) y_mean = y.mean() y_std = y.std(ddof=1) X_std_arr = (X - X_mean) / X_std y_std_arr = (y - y_mean) / y_std X_with_const = sm.add_constant(X_std_arr) model = sm.OLS(y_std_arr, X_with_const).fit() print("\n=== 重回帰分析結果 (標準化係数) ===") print(f" R² = {model.rsquared:.4f}, 調整済みR² = {model.rsquared_adj:.4f}") print(f" F値 = {model.fvalue:.3f}, p値 = {model.f_pvalue:.6f}") print() coef_labels = ['定数項'] + [corr_labels[c] for c in X_cols] for i, (label, coef, pval) in enumerate(zip(coef_labels, model.params, model.pvalues)): sig = '**' if pval < 0.01 else ('*' if pval < 0.05 else 'n.s.') print(f" {label:14s}: β={coef:+.4f}, p={pval:.4f} {sig}") |
=== 重回帰分析結果 (標準化係数) === R² = 0.2422, 調整済みR² = 0.1498 F値 = 2.620, p値 = 0.038076 定数項 : β=-0.0000, p=1.0000 n.s. 光熱・水道費 : β=-0.0786, p=0.7764 n.s. 交通・通信費 : β=+0.2760, p=0.0590 n.s. リサイクル率 : β=-0.1736, p=0.2168 n.s. 年平均気温 : β=-0.1977, p=0.3931 n.s. 降水日数 : β=+0.2719, p=0.1378 n.s.
sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | coef_names = [corr_labels[c] for c in X_cols] coef_vals = model.params[1:] # 定数項除く pvals_vals = model.pvalues[1:] conf_int = np.array(model.conf_int())[1:] # 信頼区間 # 係数の絶対値で降順ソート order = np.argsort(np.abs(coef_vals))[::-1] coef_vals_s = coef_vals[order] pvals_vals_s = pvals_vals[order] names_s = [coef_names[i] for i in order] ci_s = conf_int[order] colors_bar = ['#e05c5c' if p < 0.05 else '#aaa' for p in pvals_vals_s] fig4, ax4 = plt.subplots(figsize=(7, 5)) y_pos = range(len(names_s)) ax4.barh(y_pos, coef_vals_s, color=colors_bar, edgecolor='white', height=0.6, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。263 264 265 266 267 268 269 270 271 272 | # 信頼区間(95%CI) for i, (ci_l, ci_u) in enumerate(ci_s): ax4.plot([ci_l, ci_u], [i, i], color='#333', linewidth=1.5, zorder=4) ax4.set_yticks(list(y_pos)) ax4.set_yticklabels(names_s, fontsize=11) ax4.axvline(0, color='black', linewidth=0.8) ax4.set_xlabel('標準化偏回帰係数 β', fontsize=11) ax4.set_title('重回帰分析:標準化偏回帰係数\n(赤:p<0.05有意、灰色:非有意)', fontsize=11, fontweight='bold') ax4.grid(True, axis='x', alpha=0.3, zorder=0) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。273 274 275 276 277 278 | # p値ラベル for i, (coef, pval) in enumerate(zip(coef_vals_s, pvals_vals_s)): sig = '**' if pval < 0.01 else ('*' if pval < 0.05 else 'n.s.') xpos = coef + (0.02 if coef >= 0 else -0.02) ha = 'left' if coef >= 0 else 'right' ax4.text(xpos, i, sig, va='center', ha=ha, fontsize=9, color='#333') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.dropna() は欠損行を除去、.copy() は独立したコピーを作る。pandasで警告を防ぐ定石。279 280 281 282 283 284 285 286 287 288 289 | # 凡例 from matplotlib.patches import Patch ax4.legend(handles=[ Patch(color='#e05c5c', label='有意 (p<0.05)'), Patch(color='#aaa', label='非有意') ], loc='lower right', fontsize=9) fig4.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2020_H5_5_fig4.png'), dpi=150, bbox_inches='tight') plt.close(fig4) print("[図4] 標準化偏回帰係数プロット → 保存完了") |
[図4] 標準化偏回帰係数プロット → 保存完了
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。本研究では SSDSE-B の都道府県データを用い、CO2 排出量の代理変数として 「1人1日当たりのごみ排出量」を設定し、その決定要因を統計的に分析した。
| 学習ポイント | 内容 |
|---|---|
| 代理変数 | 直接測れない概念を間接指標で代替する手法。限界と注意点の理解が重要 |
| 特化係数(LQ) | 地域の産業・消費の「集中度」を全国比で数値化。政策立案に有用 |
| 多重共線性 | 説明変数間の相関が個別係数推定を不安定にする問題。VIFで診断 |
| EKC仮説 | 所得と環境負荷の逆U字関係。実証研究では変数・地域選択が結論に影響 |
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。