この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
| 原論文が使ったデータ | e-stat・SSDSE-B 分析単位:都道府県 中核手法:相関分析 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | ごみの排出量と人口構成比に関する定量分析 特別賞/杉本 歩優(お茶の水女子大学附属高等学校) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2021_H5_2_shorei.py(227 行)そのものです。
このページの人口構成比の計算は、以下の手順で自分で再現できます。コードの編集は不要です。(なお、ごみ排出量そのものは e-Stat「一般廃棄物処理事業実態調査」由来で SSDSE には未収録のため、ごみとの相関係数は原論文の報告値を用います。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
ごみ処理場の不足や処理コストの増大など、ごみに関する問題は多い。著者は「都道府県別 1人1日当たりのごみ排出量 少なさランキング」を目にして、1位が長野県(811 g/人日)、47位が富山県(1045 g/人日)で、隣接する2県なのに大きな差があることに興味を抱いた。
上位県では、6年連続1位の長野県による「食べ残しを減らそう県民運動〜e-プロジェクト〜」「信州プラスチックスマート運動」など、ごみを減らす取り組みが県民の意識を高めているという。 しかしそうした取り組みとは別に、潜在的にごみ排出量と相関を持つものはないか──という問いから、「人口構成」という新しい観点でごみ問題をとらえ直すのが本研究の目的である。
高校生の部 SSDSE-B e-Stat 一般廃棄物処理事業実態調査 相関分析 偏相関分析
| 分類 | 項目 | 出典 | 年度 |
|---|---|---|---|
| ごみの排出量 | 1人1日当たりの ①合計 ②生活系 ③事業系 ごみ排出量 | e-Stat「一般廃棄物処理事業実態調査」 | 2018 |
| 人口 | 総人口/総人口(男)/総人口(女)/日本人人口/15歳未満人口/15〜64歳人口/65歳以上人口 | SSDSE-B-2021 | 2018 |
| 求めた指標 | 計算方法 |
|---|---|
| 総人口に占める男性の割合 | 総人口(男)÷ 総人口 |
| 外国人人口 | 総人口 − 日本人人口 |
| 総人口に占める外国人人口の割合 | 外国人人口 ÷ 総人口 |
| 総人口に占める15歳未満人口の割合 | 15歳未満人口 ÷ 総人口 |
| 総人口に占める15〜64歳人口の割合 | 15〜64歳人口 ÷ 総人口 |
| 総人口に占める65歳以上人口の割合 | 65歳以上人口 ÷ 総人口 |
まず、原論文の「表2 加工したデータ」を SSDSE-B から実際に計算してみる。ここは実データによる再現である。
header=1 で読み込む。d に、続けて表2の人口構成比を追加していく。29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import os import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from scipy import stats 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' YEAR = 2018 # 原論文が用いた年度(SSDSE-B-2021 収録の 2018 年度データ) os.makedirs(FIG_DIR, exist_ok=True) # ── データ読み込み(cp932・2行目に日本語列名 → skiprows=1 で日本語見出しを採用)── 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) # ── 2018年断面(47都道府県)を抽出 ────────────────────────────── d = df_b[df_b['年度'] == YEAR].copy() |
地域コード が R+5桁の行だけを残すことで、全国計や地方ブロック計を除いた47都道府県に絞れている。55 56 57 58 59 60 61 62 | d['男性割合'] = d['総人口(男)'] / d['総人口'] d['女性割合'] = d['総人口(女)'] / d['総人口'] d['外国人割合'] = (d['総人口'] - d['日本人人口']) / d['総人口'] d['15歳未満割合'] = d['15歳未満人口'] / d['総人口'] d['1564歳割合'] = d['15~64歳人口'] / d['総人口'] d['65歳以上割合'] = d['65歳以上人口'] / d['総人口'] RATIOS = ['男性割合', '外国人割合', '15歳未満割合', '1564歳割合', '65歳以上割合'] |
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | fig1, axes = plt.subplots(2, 3, figsize=(12, 7)) titles = {'男性割合': '総人口に占める男性の割合', '外国人割合': '総人口に占める外国人人口の割合', '15歳未満割合': '15歳未満人口の割合', '1564歳割合': '15〜64歳人口の割合', '65歳以上割合': '65歳以上人口の割合'} for ax, col in zip(axes.ravel(), RATIOS): ax.hist(d[col], bins=12, color='#4e79c5', edgecolor='white', alpha=0.9) ax.axvline(d[col].mean(), color='#c0392b', linestyle='--', linewidth=1.4, label=f'平均 {d[col].mean():.3f}') ax.set_title(titles[col], fontsize=11) ax.set_xlabel('割合', fontsize=9) ax.set_ylabel('都道府県数', fontsize=9) ax.legend(fontsize=9) ax.grid(axis='y', alpha=0.3) axes.ravel()[-1].axis('off') axes.ravel()[-1].text(0.05, 0.5, '【実再現】\nSSDSE-B-2026.csv の人口列から\n表2の計算式で算出\n(2018年度・47都道府県)', fontsize=12, va='center', color='#333') fig1.suptitle('図1:人口構成比の分布(実再現・SSDSE-B 2018年)', fontsize=14, fontweight='bold') fig1.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig1.png')) plt.close(fig1) |
fig1 saved
原論文の核心は「女性割合」と「高齢者割合」がどちらもごみと相関して見えること。ところがこの2つの人口比自体が強く連動しているため、片方の見かけの相関がもう片方の影響かもしれない。まずその連動を実データで確かめる。
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | x = d['女性割合'].values y = d['65歳以上割合'].values slope, intercept, r_val, p_val, _ = stats.linregress(x, y) fig2, ax2 = plt.subplots(figsize=(9, 7)) ax2.scatter(x, y, s=60, color='#4e79c5', alpha=0.85, zorder=3) for _, row in d.iterrows(): pref = row['都道府県'].replace('県', '').replace('府', '').replace('都', '').replace('道', '') ax2.annotate(pref, (row['女性割合'], row['65歳以上割合']), fontsize=7.5, xytext=(2, 2), textcoords='offset points', color='#555') xr = np.linspace(x.min(), x.max(), 100) ax2.plot(xr, intercept + slope * xr, color='#c0392b', linewidth=1.8, label=f'回帰線(r={r_val:.3f}, p<0.001)') ax2.set_xlabel('総人口に占める女性の割合', fontsize=12) ax2.set_ylabel('総人口に占める65歳以上人口の割合', fontsize=12) ax2.set_title('図2:女性の割合と高齢者割合の関係(実再現・2018年、N=47)\n' '原論文の報告値 r=0.643 を再現 → 偏相関分析が必要な理由', fontsize=12, fontweight='bold') ax2.legend(fontsize=11, loc='upper left') ax2.grid(alpha=0.25) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig2.png')) |
fig2 saved
相関係数 r = 0.645(原論文の報告値 0.643 とほぼ一致) p = 1.00e-06)。女性割合が高い県ほど高齢者割合も高い。女性の平均寿命が長いことが背景にある。
原論文は、人口5観点 × ごみ3観点=15通りの相関係数を求め、絶対値が0.3以上を「弱い相関あり(○)」、0.3未満を「相関ほぼなし(×)」と判定した。
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | POP_VIEWS = ['男性の割合', '外国人人口割合', '15歳未満人口割合', '15〜64歳人口割合', '65歳以上人口割合'] WASTE_KIND = ['ごみ合計', '生活系ごみ', '事業系ごみ'] REPORTED_R = np.array([ [-0.218082407, 0.138296204, -0.397686082], # 男性の割合 [-0.356373954, -0.028430004, -0.383354428], # 外国人人口割合 [-0.311385645, -0.393769041, 0.051500657], # 15歳未満人口割合 [-0.384795539, -0.131424138, -0.308414087], # 15〜64歳人口割合 [ 0.443669497, 0.250275895, 0.252165197], # 65歳以上人口割合 ]) # 5-2 偏相関係数:単純相関 → 交絡変数を除いた偏相関(女性の割合ベースで報告) PARTIAL = [ # (ラベル, 単純相関, 除いた変数, 偏相関) ('生活系ごみ × 女性の割合', -0.148, '65歳以上人口割合', -0.416), ('生活系ごみ × 65歳以上割合', 0.250, '女性の人口割合', 0.456), ('事業系ごみ × 女性の割合', 0.413, '65歳以上人口割合', 0.339), ('事業系ごみ × 65歳以上割合', 0.252, '女性の人口割合', -0.019), ] |
| 人口の観点\ごみ | 合計 | 生活系 | 事業系 |
|---|---|---|---|
| 男性の割合 | −0.218 × | 0.138 × | −0.398 ○ |
| 外国人人口割合 | −0.356 ○ | −0.028 × | −0.383 ○ |
| 15歳未満人口割合 | −0.311 ○ | −0.394 ○ | 0.052 × |
| 15〜64歳人口割合 | −0.385 ○ | −0.131 × | −0.308 ○ |
| 65歳以上人口割合 | 0.444 ○ | 0.250 × | 0.252 × |
○=|r|≧0.3(弱い相関あり)/×=|r|<0.3(相関ほぼなし)。数値は原論文の報告値。実行結果(実出力)は下記のとおり。
--- 表3 相関係数【原論文の報告値/再計算ではない】--- 人口の観点 ごみ合計 生活系 事業系 男性の割合 -0.218 0.138 -0.398 外国人人口割合 -0.356 -0.028 -0.383 15歳未満人口割合 -0.311 -0.394 0.052 15〜64歳人口割合 -0.385 -0.131 -0.308 65歳以上人口割合 0.444 0.250 0.252
| 正の相関 | 負の相関 | |
|---|---|---|
| 総ごみの排出量 | 65歳以上人口割合 | 外国人人口割合、15歳未満人口割合、15〜64歳人口割合 |
| 事業系ごみの排出量 | (該当なし) | 男性の割合、外国人人口割合、15〜64歳人口割合 |
図2で見たとおり、女性割合と高齢者割合は r=0.643 で連動している。そこで互いの影響を取り除いた偏相関係数を使い、「本当はどちらがごみと関係しているか」を切り分ける。
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | fig4, ax4 = plt.subplots(figsize=(10, 6)) ypos = np.arange(len(labels)) h = 0.36 ax4.barh(ypos + h/2, simple_r, height=h, color='#b0bec5', label='単純相関係数') ax4.barh(ypos - h/2, partial_r, height=h, color='#e05c5c', label='偏相関係数') for i, (s, p) in enumerate(zip(simple_r, partial_r)): ax4.text(s + (0.01 if s >= 0 else -0.01), i + h/2, f'{s:.3f}', va='center', ha='left' if s >= 0 else 'right', fontsize=10, color='#455a64') ax4.text(p + (0.01 if p >= 0 else -0.01), i - h/2, f'{p:.3f}', va='center', ha='left' if p >= 0 else 'right', fontsize=10, color='#c0392b') ax4.axvline(0, color='black', linewidth=0.8) for thr in (0.3, -0.3): ax4.axvline(thr, color='#888', linestyle=':', linewidth=1) ax4.set_yticks(ypos) ax4.set_yticklabels(labels, fontsize=11) ax4.set_xlabel('相関係数(原論文の報告値)', fontsize=12) ax4.set_title('図4:単純相関 → 偏相関で見え方が変わる【原論文の報告値】\n' '点線は |r|=0.3(相関の有無の目安)', fontsize=12, fontweight='bold') ax4.legend(fontsize=11, loc='lower right') ax4.grid(axis='x', alpha=0.25) fig4.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig4.png')) |
--- 5-2 偏相関係数【原論文の報告値】--- 生活系ごみ × 女性の割合 : 単純 -0.148 → 「65歳以上人口割合」を除いた偏相関 -0.416 生活系ごみ × 65歳以上割合 : 単純 +0.250 → 「女性の人口割合」を除いた偏相関 +0.456 事業系ごみ × 女性の割合 : 単純 +0.413 → 「65歳以上人口割合」を除いた偏相関 +0.339 事業系ごみ × 65歳以上割合 : 単純 +0.252 → 「女性の人口割合」を除いた偏相関 -0.019
原論文は、相関の「向き」がなぜ生じたのかを、外部資料(円グラフ・棒グラフ)を引用して考察している。これらの図はごみ組成や就業構造の資料であり、本ページでは数値の再計算はできない。要点のみ紹介する(グラフは原論文参照)。
原論文の図6(生活系ごみの内訳:紙28%・生ごみ27%・プラスチック12%…/環境リサイクル学習HPより)と図7(事業系ごみの内訳:製造業29%・電気ガス等26%…/環境省 環境統計集より)を引用。男性割合が高いほど生活系ごみが多い背景として、惣菜等の過剰包装、男性の残業時間の長さ、ペットボトル・ビン・缶(飲酒習慣は男性33%・女性8.6%)を挙げている。女性割合が高いほど事業系ごみが多い要因は特定できなかった。
原論文の図8(外国人就業者と日本人就業者の産業別比較/nippon.com・総務省統計局より)を引用。「外国人は製造業に多いので事業系ごみも多いはず」という予想と逆に、外国人割合が高いほど事業系ごみは少なかった。要因ははっきりしなかった。
原論文の図9(おもな産業別 高齢者就業者数・割合/総務省統計局「労働力調査」より)を引用。農林業は就業者の約半分が高齢者であり、農林業は事業系ごみ排出量の上位に入るため、高齢者割合が高いほどごみが多い一因と考察している。
ごみ排出量の多寡と人口構成の間には相関関係があることが示された。著者は「男性の方がごみを排出している」「外国人労働者が多いと事業系ごみも多い」という先入観を持っていたが、いずれも誤りだったとわかった。
偏相関分析により、事業系ごみには女性割合、生活系ごみには高齢者割合がそれぞれ関係している、という切り分けができた。ただし本研究は相関の発見にとどまり、「なぜ女性は事業系ごみ、高齢者は生活系ごみの排出量が多くなるのか」という要因の解明は今後の課題としている。
このページの人口構成比の計算・作図は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ ごみ排出量そのものは e-Stat「一般廃棄物処理事業実態調査」から取得します(SSDSE 未収録)。ごみとの相関係数・偏相関係数は原論文の報告値です。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究で使われている手法を、手を動かす順に説明する。
この研究の「相関は見つけたが要因は不明」という結論は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
YEAR = 2018 を 2013 や 2022 に変えて、高齢者割合の分布がどう動くか比べてみよう。男性割合 と 65歳以上割合 の相関係数を求めよう。女性割合のとき(+0.645)と符号がどうなるか予想してから確かめる。d.nlargest(10, '65歳以上割合') で上位10県を出し、ごみ排出量の多い県と重なるか調べよう。pingouin.partial_corr などで生活系ごみ×女性割合(高齢者割合を統制)を計算し、報告値 −0.416 と比べよう。相関・偏相関で「見かけの関係」と「本当の関係」を切り分ける発想は、現場でも広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2021_H5_2_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。