このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
2050年カーボンニュートラルの実現に向け、日本政府は温室効果ガスの排出量を実質ゼロにする目標を掲げている。しかし、CO2排出の地域差は大きく、一律な政策では効果が限定的になりかねない。本研究は都道府県別のCO2排出特性と地域特性(気候・人口・経済)の関係を統計的に分析し、2050年カーボンニュートラルに向けた地域差の理解を深めることを目的とした。
まず「CO2排出特性と地域特性の関係」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
SSDSE-B LQ(特化係数) 相関分析 地域分類 散布図・回帰
SSDSE-BはCO2排出量を直接収録していないため、エネルギー・産業活動に関連する家計支出統計からCO2排出強度のプロキシ変数を設計した。
| SSDSE-Bコード | 変数名 | CO2との対応 | 単位 |
|---|---|---|---|
L322103 | 光熱・水道費 | 電力・ガス・熱エネルギー消費 | 円/月・世帯 |
L3221 | 消費支出総額 | (分母:割合計算用) | 円/月・世帯 |
L322107 | 交通・通信費 | 自動車・交通機関のエネルギー消費 | 円/月・世帯 |
H5610 | 1人1日ごみ排出量 | 産業活動・消費活動の代理指標 | g/人/日 |
直接観測できない概念(CO2排出量)を、入手可能な関連データから間接的に計測する手法をプロキシ変数(proxy variable)という。公的統計を活用した実証分析でよく用いられる。
1 2 3 4 5 6 7 8 9 | df_raw = pd.read_csv(DATA_B, header=0, encoding='cp932') # 都道府県コード(R+5桁)の行のみ抽出 mask = df_raw['Code'].astype(str).str.match(r'^R\d{5}$') df_all = df_raw[mask].copy() # 2022年度データ(47都道府県) df = df_all[df_all['SSDSE-B-2026'].astype(str) == '2022'].copy() df = df.reset_index(drop=True) |
# 実行時エラーで途中まで
pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | df['energy_ratio'] = df['L322103'] / df['L3221'] * 100 # 交通・通信費割合(%) df['transport_ratio'] = df['L322107'] / df['L3221'] * 100 # CO2排出強度プロキシ = (光熱費割合 + 交通費割合) × 消費支出総額 / 100 df['co2_proxy'] = (df['energy_ratio'] + df['transport_ratio']) * df['L3221'] / 100 # 1人1日ごみ排出量(g/人/日) df['waste'] = df['H5610'] # 有効求人倍率 = 有効求職者数 / 有効求人数 df['job_ratio'] = df['F3103'] / df['F3102'] # 高齢化率(%)= 65歳以上人口 / 総人口 df['aging_rate'] = df['A1303'] / df['A1101'] * 100 # 気温(年平均, ℃) df['temp'] = df['B4101'] # 降水量(年間, mm) df['precip'] = df['B4109'] |
# 実行時エラーで途中まで
r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。32 33 34 35 36 37 38 | national_energy_ratio = df['energy_ratio'].mean() national_transport_ratio = df['transport_ratio'].mean() national_waste = df['waste'].mean() df['energy_lq'] = df['energy_ratio'] / national_energy_ratio df['transport_lq'] = df['transport_ratio'] / national_transport_ratio df['waste_lq'] = df['waste'] / national_waste |
# 実行時エラーで途中まで
x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄', } df['region'] = df['Prefecture'].map(region_map).fillna('その他') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。58 59 60 61 62 63 | # LQによる高中低分類(エネルギー強度) df['lq_class'] = pd.cut( df['energy_lq'], bins=[0, 0.9, 1.1, 99], labels=['低エネルギー強度\n(LQ<0.9)', '中エネルギー強度\n(0.9≤LQ<1.1)', '高エネルギー強度\n(LQ≥1.1)'] ) |
# 実行時エラーで途中まで
s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。64 65 66 67 68 69 70 71 | region_colors = { '北海道・東北': '#2196F3', '関東': '#F44336', '中部': '#FF9800', '近畿': '#9C27B0', '中国・四国': '#009688', '九州・沖縄': '#795548', } |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。LQ(Location Quotient;立地係数・特化係数)は、ある地域の特定指標が全国平均に対して相対的にどの程度大きいかを示す比率である。産業立地分析で広く用いられる手法を、エネルギー消費分析に応用した。
北海道・東北地方(青森・岩手・秋田・山形・福島)、北陸(新潟・富山・福井)、島根
寒冷気候による暖房費の増大が主因。冬季エネルギー需要が高い。
宮城・茨城・栃木・埼玉・石川・山梨・長野・岐阜・静岡・三重・京都・大阪・山口・徳島など
全国平均並みのエネルギー消費パターン。
群馬・千葉・東京・神奈川・愛知・滋賀・兵庫・福岡・熊本・大分・鹿児島
温暖な気候や都市型生活スタイルによりエネルギー消費相対的に低い。
LQは「自地域の構成比 ÷ 全国の構成比」で求める。LQ>1なら全国平均より特化(高い比率)、LQ<1なら全国平均より分散(低い比率)を意味する。産業立地分析、医療資源配分、観光特化度など様々な分野に応用できる。
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | fig1_vars = { 'CO2プロキシ\n(エネルギー×支出)': df['co2_proxy'], 'エネルギー費\n割合(%)': df['energy_ratio'], '交通費\n割合(%)': df['transport_ratio'], 'ごみ排出量\n(g/人/日)': df['waste'], '気温(℃)': df['temp'], '降水量(mm)': df['precip'], '高齢化率(%)': df['aging_rate'], '有効求人\n倍率': df['job_ratio'], } fig1_df = pd.DataFrame(fig1_vars) corr_matrix = fig1_df.corr() fig, ax = plt.subplots(figsize=(9, 7.5)) n = len(corr_matrix) im = ax.imshow(corr_matrix.values, cmap='RdBu_r', vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04, label='相関係数') ax.set_xticks(range(n)) ax.set_yticks(range(n)) labels = list(fig1_vars.keys()) ax.set_xticklabels(labels, fontsize=9, rotation=0) ax.set_yticklabels(labels, fontsize=9) for i in range(n): for j in range(n): val = corr_matrix.values[i, j] color = 'white' if abs(val) > 0.5 else 'black' ax.text(j, i, f'{val:.2f}', ha='center', va='center', fontsize=8, color=color, fontweight='bold') ax.set_title('図1:CO2プロキシ・気候・人口指標の相関行列\n(2022年 47都道府県 SSDSE-B)', fontsize=12, pad=14, fontweight='bold') plt.tight_layout() fig_path = os.path.join(FIG_DIR, '2023_U3_fig1_corr.png') plt.savefig(fig_path, dpi=150, bbox_inches='tight') plt.close() print(f'図1 保存: {fig_path}') |
# 実行時エラーで途中まで
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。CO2排出強度プロキシと気候・人口・経済指標の相関関係を分析した。相関行列ヒートマップにより変数間の多変量的関係を可視化する。
| 指標 | CO2プロキシとの相関係数 r | p値 | 有意性 | 解釈 |
|---|---|---|---|---|
| 年平均気温(℃) | −0.456 | 0.0013 | 有意 ** | 寒冷地ほどエネルギー消費大 |
| 高齢化率(%) | +0.377 | 0.0091 | 有意 ** | 高齢地域は地方・寒冷地と重複 |
| 有効求人倍率 | +0.408 | 0.0044 | 有意 ** | 産業活動の活発な地域でエネルギー消費増 |
| ごみ排出量(g/人/日) | +0.398 | 0.0056 | 有意 ** | 消費活動の活発さが両指標を押し上げ |
| 降水量(mm) | +0.104 | 0.4859 | 非有意 | 降水量との直接的関連は弱い |
Pearson相関係数 r は −1 〜 +1 の値をとり、2変数の線形関係の強さを示す。scipy.stats.pearsonr() で相関係数と p 値(帰無仮説「相関なし」)を同時に計算できる。
112 113 114 115 116 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 144 145 | fig, ax = plt.subplots(figsize=(9, 6.5)) for region, grp in df.groupby('region'): color = region_colors.get(region, '#607D8B') ax.scatter(grp['energy_lq'], grp['waste_lq'], color=color, label=region, s=70, alpha=0.85, edgecolors='white', linewidths=0.5, zorder=3) for _, row in grp.iterrows(): pref = row['Prefecture'].replace('県', '').replace('府', '').replace('都', '').replace('道', '') ax.annotate(pref, (row['energy_lq'], row['waste_lq']), fontsize=7, xytext=(3, 2), textcoords='offset points', alpha=0.85) ax.axhline(1.0, color='gray', linewidth=0.8, linestyle='--', alpha=0.6) ax.axvline(1.0, color='gray', linewidth=0.8, linestyle='--', alpha=0.6) ax.fill_between([1.0, ax.get_xlim()[1] if ax.get_xlim()[1] > 1 else 2], 1.0, 2.0, alpha=0.04, color='red') ax.set_xlabel('エネルギー費LQ(光熱・水道費特化係数)', fontsize=11) ax.set_ylabel('ごみ排出LQ(1人1日ごみ排出量特化係数)', fontsize=11) ax.set_title('図2:LQ散布図 ― エネルギー特化係数 vs ごみ排出特化係数\n(2022年 47都道府県 / 地域別色分け)', fontsize=12, pad=12, fontweight='bold') legend = ax.legend(title='地域', fontsize=9, title_fontsize=9, loc='upper right', framealpha=0.9) ax.text(1.02, 1.02, '両LQ>1\n(高エネルギー+高ごみ)', fontsize=8, color='red', alpha=0.7, transform=ax.transAxes, ha='right', va='bottom') ax.grid(True, alpha=0.3, linewidth=0.5) plt.tight_layout() fig_path = os.path.join(FIG_DIR, '2023_U3_fig2_lq.png') plt.savefig(fig_path, dpi=150, bbox_inches='tight') plt.close() print(f'図2 保存: {fig_path}') |
# 実行時エラーで途中まで
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。ax.fill_between(...) — 2つの曲線で囲まれた領域を塗りつぶし。Lorenz曲線の格差面積などを可視化。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。CO2排出強度プロキシによる都道府県ランキングを上位10・下位10で可視化する。地域別の色分けにより、地域的パターンを視覚的に把握できる。
147 148 149 150 151 152 153 154 155 156 157 158 159 160 | ax = axes[1] bottom10_sorted = bottom10.sort_values('co2_proxy', ascending=True) colors_bot = [region_colors.get(r, '#607D8B') for r in bottom10_sorted['region']] bars = ax.barh(range(10), bottom10_sorted['co2_proxy'].values / 1000, color=colors_bot, edgecolor='white', linewidth=0.5) ax.set_yticks(range(10)) labels_bot = bottom10_sorted['Prefecture'].str.replace('県','').str.replace('府','').str.replace('都','').str.replace('道','').tolist() ax.set_yticklabels(labels_bot, fontsize=10) ax.set_xlabel('CO2排出強度プロキシ(千円/世帯)', fontsize=10) ax.set_title('CO2プロキシ 下位10都道府県', fontsize=11, fontweight='bold') ax.grid(axis='x', alpha=0.3, linewidth=0.5) for i, (bar, val) in enumerate(zip(bars, bottom10_sorted['co2_proxy'].values)): ax.text(bar.get_width() + 0.3, i, f'{val/1000:.1f}', va='center', fontsize=8, color='#333') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。161 162 163 164 165 166 167 168 169 170 171 172 | # 地域凡例 handles = [mpatches.Patch(color=c, label=r) for r, c in region_colors.items()] fig.legend(handles=handles, title='地域', fontsize=9, title_fontsize=9, loc='lower center', ncol=3, bbox_to_anchor=(0.5, -0.05), framealpha=0.9) fig.suptitle('図3:CO2排出強度プロキシによる都道府県ランキング(2022年)', fontsize=13, fontweight='bold', y=1.02) plt.tight_layout() fig_path = os.path.join(FIG_DIR, '2023_U3_fig3_rank.png') plt.savefig(fig_path, dpi=150, bbox_inches='tight') plt.close() print(f'図3 保存: {fig_path}') |
# 実行時エラーで途中まで
fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。年平均気温とCO2排出強度プロキシの関係を散布図で可視化し、最小二乗法による単回帰直線を重ねて示す。
| 指標 | 値 | 解釈 |
|---|---|---|
| 相関係数 r | −0.456 | 中程度の負の相関 |
| p値 | 0.0013 | 1%水準で統計的に有意 |
| 決定係数 R² | 0.208 | 気温で約21%の分散を説明 |
| 回帰係数(傾き) | 負(気温↑→プロキシ↓) | 1℃上昇で約1,200円/月減少(推計) |
scipy.stats.linregress() は傾き・切片・r値・p値・標準誤差を一括計算する。回帰係数の解釈は「説明変数が1単位増加したとき目的変数が何単位変化するか」であり、因果関係ではなく相関関係を示す点に注意が必要。
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | x_val = df['temp'].values y_val = df['co2_proxy'].values / 1000 # 千円単位 # 回帰直線 slope, intercept, r_val, p_val, se = stats.linregress(x_val, y_val) x_line = np.linspace(x_val.min() - 0.5, x_val.max() + 0.5, 100) y_line = slope * x_line + intercept fig, ax = plt.subplots(figsize=(9, 6)) for region, grp in df.groupby('region'): color = region_colors.get(region, '#607D8B') gx = pd.to_numeric(grp['temp'], errors='coerce').values gy = grp['co2_proxy'].values / 1000 ax.scatter(gx, gy, color=color, label=region, s=70, alpha=0.85, edgecolors='white', linewidths=0.5, zorder=3) for _, row in grp.iterrows(): pref = row['Prefecture'].replace('県', '').replace('府', '').replace('都', '').replace('道', '') ax.annotate(pref, (row['temp'], row['co2_proxy'] / 1000), fontsize=7, xytext=(3, 2), textcoords='offset points', alpha=0.85) ax.plot(x_line, y_line, color='#D32F2F', linewidth=1.8, linestyle='--', label=f'回帰直線 (r={r_val:.3f}, p={p_val:.3f})', zorder=4) sig_str = '(統計的に有意)' if p_val < 0.05 else '(非有意)' ax.set_xlabel('年平均気温(℃)', fontsize=11) ax.set_ylabel('CO2排出強度プロキシ(千円/世帯)', fontsize=11) ax.set_title(f'図4:年平均気温 vs CO2排出強度プロキシ\nr = {r_val:.3f}, p = {p_val:.4f} {sig_str}', fontsize=12, pad=12, fontweight='bold') ax.legend(fontsize=9, loc='upper right', framealpha=0.9) ax.grid(True, alpha=0.3, linewidth=0.5) plt.tight_layout() fig_path = os.path.join(FIG_DIR, '2023_U3_fig4_temp.png') plt.savefig(fig_path, dpi=150, bbox_inches='tight') plt.close() print(f'図4 保存: {fig_path}') |
# 実行時エラーで途中まで
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。fig.savefig(..., bbox_inches='tight') — 余白を自動で詰めて保存。plt.close() でメモリ解放。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。LQ(Location Quotient;立地係数)は地域分析における基本的な指標である。元々は産業立地論で「特定地域に特定産業が全国平均より多く集積しているか」を測るために開発されたが、エネルギー・医療・観光など幅広い分野に応用できる。
LQを用いて47都道府県を「高・中・低エネルギー強度」に3分類した。この分類は政策立案において有用であり、高LQ地域(寒冷地・北日本)には断熱改修支援や再エネ導入補助、低LQ地域(都市部・温暖地)には交通電化や産業脱炭素化など、地域特性に応じた政策設計が可能となる。
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | import os import warnings import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib import rcParams from scipy import stats warnings.filterwarnings('ignore') _dir = os.path.dirname(os.path.abspath(__file__)) if '__file__' in dir() else os.getcwd() FIG_DIR = os.path.join(_dir, '..', 'html', 'figures') DATA_B = os.path.join(_dir, '..', 'data', 'raw', 'SSDSE-B-2026.csv') os.makedirs(FIG_DIR, exist_ok=True) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。230 231 232 | rcParams['font.family'] = ['Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Noto Sans CJK JP', 'DejaVu Sans'] rcParams['axes.unicode_minus'] = False |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。233 234 235 236 237 | num_cols = ['L3221', 'L322103', 'L322107', 'H5610', 'B4101', 'B4109', 'A1303', 'A1101', 'F3103', 'F3102'] for c in num_cols: df[c] = pd.to_numeric(df[c], errors='coerce') |
# 実行時エラーで途中まで
[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。238 239 240 241 242 243 244 | df_sorted = df[['Prefecture', 'co2_proxy', 'region']].sort_values('co2_proxy', ascending=False).reset_index(drop=True) pref_label = df_sorted['Prefecture'].str.replace('県', '').str.replace('府', '').str.replace('都', '').str.replace('道', '') top10 = df_sorted.head(10) bottom10 = df_sorted.tail(10) fig, axes = plt.subplots(1, 2, figsize=(13, 5)) |
# 実行時エラーで途中まで
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。245 246 247 248 249 250 251 252 253 254 255 256 257 258 | ax = axes[0] colors_top = [region_colors.get(r, '#607D8B') for r in top10['region']] bars = ax.barh(range(10), top10['co2_proxy'].values / 1000, color=colors_top, edgecolor='white', linewidth=0.5) ax.set_yticks(range(10)) labels_top = top10['Prefecture'].str.replace('県','').str.replace('府','').str.replace('都','').str.replace('道','').tolist() ax.set_yticklabels(labels_top, fontsize=10) ax.invert_yaxis() ax.set_xlabel('CO2排出強度プロキシ(千円/世帯)', fontsize=10) ax.set_title('CO2プロキシ 上位10都道府県', fontsize=11, fontweight='bold') ax.grid(axis='x', alpha=0.3, linewidth=0.5) for i, (bar, val) in enumerate(zip(bars, top10['co2_proxy'].values)): ax.text(bar.get_width() + 0.3, i, f'{val/1000:.1f}', va='center', fontsize=8, color='#333') |
# 実行時エラーで途中まで
.dropna() は欠損行を除去、.copy() は独立したコピーを作る。pandasで警告を防ぐ定石。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 | print('\n===== 相関分析結果(CO2プロキシ vs 各指標) =====') targets = { '気温(B4101)': df['temp'], '降水量(B4109)': df['precip'], '高齢化率': df['aging_rate'], '有効求人倍率': df['job_ratio'], 'ごみ排出量': df['waste'], } for name, series in targets.items(): x_ = df['co2_proxy'].values y_ = series.values mask2 = ~(np.isnan(x_) | np.isnan(y_)) if mask2.sum() > 5: r_, p_ = stats.pearsonr(x_[mask2], y_[mask2]) sig = '*' if p_ < 0.05 else '' print(f' {name:15s}: r={r_:+.3f}, p={p_:.4f} {sig}') print('\n===== LQ分類(エネルギー強度) =====') print(df.groupby('lq_class', observed=True)['Prefecture'].apply( lambda x: ', '.join(x.str.replace('県','').str.replace('府','').str.replace('都','').str.replace('道','')) ).to_string()) print('\n===== CO2プロキシ 上位5 / 下位5 =====') print('上位5:', df.nlargest(5, 'co2_proxy')[['Prefecture', 'co2_proxy']].to_string(index=False)) print('下位5:', df.nsmallest(5, 'co2_proxy')[['Prefecture', 'co2_proxy']].to_string(index=False)) print('\n全図の生成が完了しました。') |
===== 相関分析結果(CO2プロキシ vs 各指標) ===== # 実行時エラーで途中まで
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。| データ・資料 | 出典 |
|---|---|
| SSDSE-B 都道府県データ(2022年度) | 統計数理研究所 SSDSE(社会・人口統計体系) |
| 光熱・水道費・消費支出データ | SSDSE-B: L3221*, L322103, L322107 |
| 1人1日ごみ排出量 | SSDSE-B: H5610(環境省 一般廃棄物処理実態調査) |
| 気象データ(年平均気温・降水量) | SSDSE-B: B4101, B4109(気象庁) |
| 有効求人倍率 | SSDSE-B: F3103/F3102(厚生労働省 職業安定業務統計) |
分析コードは実公的統計データ(SSDSE-B-2026.csv)のみを使用。np.random等の合成データは一切使用していない。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。