この教材は原論文と同じ種類のデータで計算し直しています。ただし工程の一部は、学習しやすさのために簡略化しています(下の「できないこと」を参照)。
| 原論文が使ったデータ | SSDSE-B・過去の気象データ・日本近海の海面水温・大雨や猛暑日など(極端現象)のこれまでの変化 分析単位:その他 中核手法:相関分析 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 海水温からの降水量予測を目指して 審査員奨励賞/三島 光太郎、石井 沙英、岸本 理央、宮本 賢一郎、八木 琳太郎(兵庫県立姫路西高等学校) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2023_H5_4_shorei.py(269 行)そのものです。
このページの図2(実再現)を自分で動かすには、以下の手順でデータを準備してください。コードの編集は不要です。図1・図3・図4は海水温を使う原論文の報告値の可視化で、SSDSE の追加ファイルは要りません。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
近年、1年間の総降水量は大きく変わらない一方で、1時間に50mmを超える集中豪雨の発生回数は増加傾向にある。雨の「降り方」が変わってきている、という問題意識が本研究の出発点である。
著者らは「雲を作り雨になる水の8割以上は海から蒸発する」「気象庁は台風の発達予想に海水温を使っている」という事実に注目し、その年の降水量を左右する要因の一つが海水温ではないかと考えた。もし海水温が降水量の手がかりになるなら、従来の予報に海水温という新しい指標を加えて精度を上げられるのではないか——これが本研究の問いである。
SSDSE-B(降水量) 気象庁(海水温) 相関分析 散布図 データ加工(差・比)
| データ名 | 項目・地点・年度 | 出典 |
|---|---|---|
| SSDSE-B-2023 | 降水量(豊岡・新潟・福井・金沢・富山・秋田)2009〜20年 | 統計センター |
| 過去の気象データ | 夏・冬の3か月降水量(日本海側6市+太平洋側8地点)統計開始〜2022年 | 気象庁 |
| 過去の気象データ | 12〜3月の1か月降水量(太平洋側8地点)統計開始〜2022年 | 気象庁 |
| 日本近海の海面水温 | 年平均・季節別の平均海面水温の平年差(全海域・日本海中部・日本海南西部・四国沖・関東沖)1900〜2022年 | 気象庁 |
| 極端現象の変化 | 1時間降水量50mm/80mm/100mm以上の年間発生回数(全国アメダス)1976〜2022年 | 気象庁 |
著者らは長期トレンドの影響を取り除いて短い周期の関係を見るため、次の2つの加工を行い、加工前後で結果が変わらないかを確認している。
| 加工したデータ | 計算方法 |
|---|---|
| 海水温と過去10年平均海水温との差 | 海水温の平年差 − 前年までの過去10年の平年差の平均 |
| 集中豪雨の過去10年平均回数に対する比 | 集中豪雨の発生回数 ÷ 前年までの過去10年の平均発生回数 |
まず、全国アメダスの集中豪雨の年間回数(1時間50mm/80mm/100mm以上)と海水温の関係を、1976〜2022年について季節ごとに相関分析した。以下は原論文 表4 の報告値である。
153 154 155 156 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 | # 原論文 表4:集中豪雨(1時間降水量)の年間回数と海水温の相関係数(1976–2022, 全国アメダス) # 行 = 豪雨のしきい値, 列 = 季節。すべて «原論文の報告値» (新数値ではない)。 table4 = { '50mm以上': {'年平均': 0.598, '冬': 0.525, '春': 0.365, '夏': 0.611, '秋': 0.493}, '80mm以上': {'年平均': 0.491, '冬': 0.451, '春': 0.319, '夏': 0.479, '秋': 0.390}, '100mm以上': {'年平均': 0.383, '冬': 0.336, '春': 0.295, '夏': 0.440, '秋': 0.208}, } seasons = ['年平均', '冬', '春', '夏', '秋'] print('\n【原論文 表4 の報告値】集中豪雨回数 × 海水温の相関係数(再計算ではない)') for k, row in table4.items(): print(' ' + k.ljust(9) + ' ' + ' '.join(f'{s}={row[s]:+.3f}' for s in seasons)) print(f' → 年平均: 50mm(r={table4["50mm以上"]["年平均"]}) > 100mm(r={table4["100mm以上"]["年平均"]})') print(' 降水量が少ない豪雨ほど海水温との相関が強い、と原論文は報告。') fig, ax = plt.subplots(figsize=(9.2, 5.2)) x = np.arange(len(seasons)) w = 0.26 colors = {'50mm以上': '#1565C0', '80mm以上': '#42A5F5', '100mm以上': '#90CAF9'} for i, (k, row) in enumerate(table4.items()): ax.bar(x + (i - 1) * w, [row[s] for s in seasons], w, label=k, color=colors[k]) ax.axhline(0.2, color='gray', ls='--', lw=1) ax.text(4.35, 0.205, 'r=0.2(やや弱い相関の目安)', fontsize=8, color='gray', ha='right', va='bottom') ax.set_xticks(x) ax.set_xticklabels(seasons) ax.set_ylabel('相関係数 r(原論文の報告値)') ax.set_title('図1【原論文 表4 の報告値・再計算ではない】\n集中豪雨の年間回数 × 海水温の相関(海水温は SSDSE 未収録)', fontsize=11) ax.legend(fontsize=9) ax.grid(axis='y', alpha=0.3) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2023_H5_4_fig1_scatter2022.png'), bbox_inches='tight') plt.close(fig) print(' → 図1 保存: 2023_H5_4_fig1_scatter2022.png(報告値の可視化)') |
【原論文 表4 の報告値】集中豪雨回数 × 海水温の相関係数(再計算ではない)
50mm以上 年平均=+0.598 冬=+0.525 春=+0.365 夏=+0.611 秋=+0.493
80mm以上 年平均=+0.491 冬=+0.451 春=+0.319 夏=+0.479 秋=+0.390
100mm以上 年平均=+0.383 冬=+0.336 春=+0.295 夏=+0.440 秋=+0.208
→ 年平均: 50mm(r=0.598) > 100mm(r=0.383)
降水量が少ない豪雨ほど海水温との相関が強い、と原論文は報告。
→ 図1 保存: 2023_H5_4_fig1_scatter2022.png(報告値の可視化)
海水温は SSDSE に無いが、降水量(B4109)は SSDSE-B に収録されている。そこで、原論文が扱った日本海側・太平洋側の地点を都道府県に対応づけ、年降水量の推移を実データで再現する。海水温は含めない(含められない)ことを図タイトルと図注に明記する。
df_b が以降のすべての実再現の土台。先頭列名 SSDSE-B-2026 が年度を表す。81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | df_raw = pd.read_csv( os.path.join(DATA_DIR, 'SSDSE-B-2026.csv'), header=0, # 行0がコード名(B4101 等) encoding='cp932', # 日本語Windows由来の文字コード ) # 都道府県行だけを抽出(地域コード Code が R##### 形式) mask_pref = df_raw['Code'].astype(str).str.match(r'^R\d{5}$', na=False) df_b = df_raw[mask_pref].copy() df_b = df_b.rename(columns={'SSDSE-B-2026': '年度', 'Prefecture': '都道府県'}) # 降水量(B4109)・年平均気温(B4101)・年度を数値化 for c in ['B4101', 'B4109']: df_b[c] = pd.to_numeric(df_b[c], errors='coerce') df_b['年度'] = pd.to_numeric(df_b['年度'], errors='coerce') years = sorted(df_b['年度'].dropna().unique().astype(int)) print('=' * 62) print('■ SSDSE-B-2026 読み込み完了(都道府県データ)') print(f' 都道府県 × 年度の総行数: {len(df_b)}') print(f' 収録年度: {years[0]}〜{years[-1]}({len(years)}年分)') print(f' 2023年度の都道府県数: {(df_b["年度"] == 2023).sum()}') print(' ※ 海水温は SSDSE 未収録。降水量 B4109 のみ実再現に使用。') print('=' * 62) |
■ SSDSE-B-2026 読み込み完了(都道府県データ) 都道府県 × 年度の総行数: 564 収録年度: 2012〜2023(12年分) 2023年度の都道府県数: 47 ※ 海水温は SSDSE 未収録。降水量 B4109 のみ実再現に使用。 ==============================================================
df_b を groupby('年度') で集計。原論文は市・季節別の3か月降水量を使うが、SSDSE は都道府県・年降水量なので集計単位が異なる点を図注に明記する。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 | # 原論文の観測地点 → 対応する都道府県(SSDSE-B は都道府県単位) JPSEA_PREFS = ['秋田県', '新潟県', '富山県', '石川県', '福井県', '兵庫県'] # 豊岡=兵庫 PACIFIC_PREFS = ['千葉県', '静岡県', '愛知県', '和歌山県', '高知県', '宮崎県'] def annual_mean_precip(prefs): sub = df_b[df_b['都道府県'].isin(prefs)] return sub.groupby('年度')['B4109'].mean() jpsea = annual_mean_precip(JPSEA_PREFS) # 日本海側6県の年降水量の平均 pacif = annual_mean_precip(PACIFIC_PREFS) # 太平洋側6県の年降水量の平均 print('\n【SSDSE-B 実再現】日本海側/太平洋側の年降水量(B4109, mm)') print(f' 日本海側6県 12年平均 = {jpsea.mean():.0f} mm / 変動係数CV = {jpsea.std()/jpsea.mean():.3f}') print(f' 太平洋側6県 12年平均 = {pacif.mean():.0f} mm / 変動係数CV = {pacif.std()/pacif.mean():.3f}') fig, ax = plt.subplots(figsize=(9.2, 5.2)) ax.plot(jpsea.index, jpsea.values, 'o-', color=C_JPSEA, lw=2.2, label='日本海側6県 平均(秋田・新潟・富山・石川・福井・兵庫)') ax.plot(pacif.index, pacif.values, 's-', color=C_PACIF, lw=2.2, label='太平洋側6県 平均(千葉・静岡・愛知・和歌山・高知・宮崎)') ax.set_xlabel('年度') ax.set_ylabel('年降水量 B4109(mm)') ax.set_title('図2【SSDSE-B 実再現】都道府県別・年降水量の推移(2012–2023)\n' '※海水温は SSDSE 未収録のため本図に含まない/原論文は市・季節別3か月降水量を使用(集計単位が異なる)', fontsize=11) ax.legend(fontsize=9, loc='upper right') ax.grid(alpha=0.3) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2023_H5_4_fig2_timeseries.png'), bbox_inches='tight') plt.close(fig) print(' → 図2 保存: 2023_H5_4_fig2_timeseries.png(実再現)') |
【SSDSE-B 実再現】日本海側/太平洋側の年降水量(B4109, mm) 日本海側6県 12年平均 = 2093 mm / 変動係数CV = 0.105 太平洋側6県 12年平均 = 2130 mm / 変動係数CV = 0.089 → 図2 保存: 2023_H5_4_fig2_timeseries.png(実再現)
降水量と海水温の関係を、日本海側・太平洋側 × 夏・冬の4通りで検証したのが本研究の山場である。日本海側は夏(表6・図1相当 r=−0.129)・冬(表7・図2相当 r=−0.128)ともに正の相関なし。太平洋側の夏も全地点で負(表8・四国沖平均 r=−0.237)。ところが太平洋側の冬だけ、全8地点・2海域で正の相関(表9・四国沖平均 r=0.257)に転じた。
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 | sites = ['油津', '清水', '室戸岬', '潮岬', '伊良湖', '御前岬', '石廊岬', '館山'] # 原論文 表8(太平洋側の夏・四国沖)/表9(太平洋側の冬・四国沖)——報告値 summer_shikoku = [-0.147, -0.060, -0.289, -0.150, -0.251, -0.349, -0.379, -0.274] # 表8 四国沖 winter_shikoku = [0.360, 0.285, 0.289, 0.303, 0.322, 0.190, 0.228, 0.077] # 表9 四国沖 print('\n【原論文 表8・表9 の報告値】太平洋側 海水温×降水量の相関(四国沖・再計算ではない)') print(' 地点 夏(表8) 冬(表9)') for s, a, b in zip(sites, summer_shikoku, winter_shikoku): print(f' {s.ljust(4)} {a:+.3f} {b:+.3f}') print(f' 夏の平均 r={np.mean(summer_shikoku):+.3f}(全地点で負)/' f'冬の平均 r={np.mean(winter_shikoku):+.3f}(全地点で正・図4の四国沖 r=0.257)') fig, ax = plt.subplots(figsize=(9.4, 5.2)) x = np.arange(len(sites)) w = 0.38 ax.bar(x - w / 2, summer_shikoku, w, label='夏(表8・四国沖)', color=C_NEG, alpha=0.85) ax.bar(x + w / 2, winter_shikoku, w, label='冬(表9・四国沖)', color=C_POS, alpha=0.85) ax.axhline(0, color='black', lw=0.8) ax.set_xticks(x) ax.set_xticklabels(sites, fontsize=9) ax.set_ylabel('相関係数 r(原論文の報告値)') ax.set_title('図3【原論文 表8・表9 の報告値・再計算ではない】\n' '太平洋側:海水温(四国沖)×降水量 は 夏=負・冬=正 に反転(海水温は SSDSE 未収録)', fontsize=11) ax.legend(fontsize=9) ax.grid(axis='y', alpha=0.3) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2023_H5_4_fig3_panel_scatter.png'), bbox_inches='tight') plt.close(fig) print(' → 図3 保存: 2023_H5_4_fig3_panel_scatter.png(報告値の可視化)') |
【原論文 表8・表9 の報告値】太平洋側 海水温×降水量の相関(四国沖・再計算ではない) 地点 夏(表8) 冬(表9) 油津 -0.147 +0.360 清水 -0.060 +0.285 室戸岬 -0.289 +0.289 潮岬 -0.150 +0.303 伊良湖 -0.251 +0.322 御前岬 -0.349 +0.190 石廊岬 -0.379 +0.228 館山 -0.274 +0.077 夏の平均 r=-0.237(全地点で負)/冬の平均 r=+0.257(全地点で正・図4の四国沖 r=0.257) → 図3 保存: 2023_H5_4_fig3_panel_scatter.png(報告値の可視化)
太平洋側の冬に正の相関が出たので、冬(12〜3月)を1か月ごとに分けて、冬の四国沖の海水温との相関を調べ直した。以下は原論文 表10 の8地点平均である。
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | # 原論文 表10:8地点の平均相関(月別)——報告値 months = ['12月', '1月', '2月', '3月'] month_avg = [-0.010, 0.263, 0.193, 0.011] # 表10「平均」列 print('\n【原論文 表10 の報告値】太平洋側の冬・月別(8地点平均・再計算ではない)') for m, r in zip(months, month_avg): print(f' {m}: r={r:+.3f}') print(' → 1月(r=0.263)・2月(r=0.193)で正の相関。12月・3月はほぼ0。') print(' 原論文は「1〜2月に発達する南岸低気圧の影響」と解釈。') fig, ax = plt.subplots(figsize=(8.2, 5.0)) bar_colors = [C_POS if r >= 0.2 else '#9E9E9E' for r in month_avg] bars = ax.bar(months, month_avg, color=bar_colors, width=0.55) for b, r in zip(bars, month_avg): ax.text(b.get_x() + b.get_width() / 2, r + (0.008 if r >= 0 else -0.02), f'{r:+.3f}', ha='center', va='bottom' if r >= 0 else 'top', fontsize=10) ax.axhline(0, color='black', lw=0.8) ax.axhline(0.2, color='gray', ls='--', lw=1) ax.set_ylabel('相関係数 r(原論文の報告値・8地点平均)') ax.set_ylim(-0.1, 0.35) ax.set_title('図4【原論文 表10 の報告値・再計算ではない】\n' '太平洋側の冬・月別:1〜2月に海水温×降水量の正の相関(海水温は SSDSE 未収録)', fontsize=11) ax.grid(axis='y', alpha=0.3) fig.tight_layout() fig.savefig(os.path.join(FIG_DIR, '2023_H5_4_fig4_beta_ts.png'), bbox_inches='tight') plt.close(fig) print(' → 図4 保存: 2023_H5_4_fig4_beta_ts.png(報告値の可視化)') print('\n' + '=' * 62) print('全図の生成完了(4枚)') print(' 図1: 集中豪雨×海水温の相関(表4) … 報告値の可視化') print(' 図2: 日本海側/太平洋側の年降水量 B4109 … SSDSE-B 実再現') print(' 図3: 太平洋側 夏 vs 冬(表8・表9) … 報告値の可視化') print(' 図4: 太平洋側の冬・月別(表10) … 報告値の可視化') print(' ※ 海水温絡み(図1・図3・図4)は原論文の報告値であり再計算ではない。') print(' ※ 新たな数値の捏造は一切していない。') print('=' * 62) |
【原論文 表10 の報告値】太平洋側の冬・月別(8地点平均・再計算ではない)
12月: r=-0.010
1月: r=+0.263
2月: r=+0.193
3月: r=+0.011
→ 1月(r=0.263)・2月(r=0.193)で正の相関。12月・3月はほぼ0。
原論文は「1〜2月に発達する南岸低気圧の影響」と解釈。
→ 図4 保存: 2023_H5_4_fig4_beta_ts.png(報告値の可視化)
==============================================================
※ 図2(日本海側/太平洋側の年降水量 B4109)は SSDSE-B-2026 からの実再現です。図1・図3・図4は、中心変数の海水温が気象庁データで SSDSE 収録外のため、原論文の報告値(表4・表8・表9・表10)を数値そのまま可視化したものです(再計算ではありません)。新たな数値の捏造はしていません。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
本文で出てくる用語を初心者向けに解説します。クリックで詳しい解説ページに移動できます。
この研究の手法(相関分析・散布図・データ加工)を、目的・読み方・注意点の順に説明する。
著者自身が挙げた「今後の展望」に沿って、次の一手を考える。
再現コード(図2)を少し変えるだけで試せる課題を、易しい順に用意した。
JPSEA_PREFS・PACIFIC_PREFS の県を増減させて、平均降水量や変動係数がどう変わるか見よう。ポイント:豊岡(兵庫県)のように「県の代表地点が別の気候区」だと平均がずれる理由を考える。B4109 で降順に並べ、上位・下位を確認しよう。ポイント:日本海側・太平洋南部が上位に来るか、原論文の地理的傾向と合うかを見る。「気象・海洋の指標と結果を相関で結び、予測の手がかりを探す」発想は、防災や産業の現場で広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2023_H5_4_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。