0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

気象庁の40年分データで「暖冬 × 大雪の矛盾」を検証した。
結論は2つ同時に成立する:平均的な雪は減っているそれでも大雪の印象は強くなっている


はじめに

「最近は暖冬になったよね。でも毎年どこかでドカ雪のニュースを見る気がする」

この違和感を持っている人は多いと思う。実際どうなのか、気象庁の日次観測データ(47都道府県・1981〜2024年)で検証してみた。

答えは3つのQに分けると整理しやすい。

  • Q1. 暖冬になっているのか? → YES(データで明確)
  • Q2. 雪は増えているのか? → NO(むしろ大幅に減少)
  • Q3. なぜ大雪の印象が強いのか? → ここが一番面白かった

この記事は気象データ分析シリーズの冬版です。


データと分析手法

使用データは3種類。

① 冬日・真冬日数(日次データから集計)
気象庁 daily_s1.php から冬季(12〜2月)の日次気温を取得。

  • 冬日:日最低気温 < 0℃
  • 真冬日:日最高気温 < 0℃(終日氷点下)

② 年間降雪合計・最深積雪(年次統計)
気象庁 annually_s.php から取得。

  • 年間降雪合計(cm):その冬に降った雪の総量
  • 最深積雪(cm):その年の最大積雪深。交通マヒの代理指標。

③ 地域分類

  • 日本海側:新潟・富山・石川・福井・秋田・山形・北海道など13県
  • 太平洋側:東京・宮城・静岡・高知など
  • 内陸積雪:長野・群馬・山梨・岐阜・栃木
import requests, pandas as pd
from io import StringIO

def fetch_snow(prec_no, block_no):
    """annually_s.php から降雪データを取得(修正版)"""
    url = (f"https://www.data.jma.go.jp/stats/etrn/view/annually_s.php"
           f"?prec_no={prec_no}&block_no={block_no}&year=&month=&view=p1")
    r = requests.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
    html = r.content.decode("shift-jis", errors="replace")
    t = pd.read_html(StringIO(html))[0]
    t.columns = [f"c{i:02d}" for i in range(t.shape[1])]
    return pd.DataFrame({
        "year":        pd.to_numeric(
            t["c00"].astype(str).str.extract(r"(\d{4})", expand=False),  # expand=False が重要
            errors="coerce"),
        "snow_total":  pd.to_numeric(t.iloc[:, 21].values.ravel(), errors="coerce"),
        "snow_depth":  pd.to_numeric(t.iloc[:, 23].values.ravel(), errors="coerce"),
    }).dropna(subset=["year"]).query("1981 <= year <= 2025")

expand=False が必要な理由
Series.str.extract() はデフォルトで DataFrame を返す(1列でも)。
expand=False を指定して Series にしないと、後続の数値変換でエラーになる。


Q1: 暖冬になっているのか?

全国平均 冬日数の変化

期間 冬日数(全国平均) 変化
1981〜1990年 約40日/年
2020〜2024年 約24日/年 −40%

40年で冬に氷点下になる夜が4割減った。

都道府県別では近畿が最大

fig_winter_cold_rank.png
図1:都道府県別 冬日数変化量ランキング(1981-1990 → 2020-2024)

1位の奈良(−21.8日)を筆頭に、全47都道府県で冬日数は減少している(p<0.001 ***)。

Q1の答え:YES、暖冬化は全国的に進行している。


Q2: 雪は増えているのか?

地域別 年間降雪合計の変化

地域 1981〜1990年 2015〜2024年 変化
日本海側 278cm 185cm −93cm(−33%)
太平洋側 46cm 52cm +6cm
内陸積雪 62cm 40cm −22cm

「雪の本場」の日本海側が3割以上も減少している。

最深積雪(積もった最大値)も同様の傾向だ。

地域 1981〜1990年 2015〜2024年
日本海側 55cm 42cm
内陸積雪 16cm 12cm

fig_snow_nihonkai_pacific.png
図2:年間降雪合計・最深積雪の推移(日本海側・太平洋側・内陸)

Q2の答え:NO、降雪量はむしろ大幅に減少している。


Q3: なぜ大雪の印象が強いのか?

Q1もQ2も答えは明快だった。

  • 暖冬化している
  • 雪は減っている

ではなぜ、多くの人は「最近ドカ雪が増えた」と感じるのだろうか。

そこで北陸4県の積雪を年ごとに追ってみた。

北陸4県(新潟・富山・石川・福井)の最深積雪を年ごとに見ると

fig_snow_hokuriku_paradox.png
図3:北陸4県 平均最深積雪の年次推移と変動係数(1981〜2025年)

上パネルの棒グラフで、赤棒(80cm超え)に注目してほしい。

1980年代:1981・1984・1985・1986年が80cm超え。10年で4回。
1990〜2000年代:大雪年ゼロ。静かな20年。
2018年:北陸4県平均99.5cm。福井では147cm(交通大マヒ)。
2021年:北陸4県平均91cm。新潟・長野で関越道立ち往生。


変動係数(下パネル)に注目

変動係数(CV = 標準偏差 ÷ 平均 × 100)は「データのばらつき度」を示す。高いほど年ごとの差が大きい。

時代 平均最深積雪 変動係数 大雪年(80cm+)
1980年代 68cm 53% 4年/10年
1990年代 39cm 34% 0年/10年
2000年代 41cm 48% 0年/10年
2010年代 42cm 70% 1年/10年
2021〜24 53cm 48% 1年/4年

2010年代の変動係数70%は全時代で最高。 平均は1980年代より低いのにばらつきが最大になっている。


「ドカ雪が増えた気がする」の正体

以下のような変化が起きている。

1980年代の北陸の冬(最深積雪):
  80, 90, 100, 70, 110, 85, 95 cm ...
  → 毎年多雪。「雪国の日常」として認識。
  → 多少の大雪はニュースにならない。

2010年代の北陸の冬(最深積雪):
  20, 25, 30, 120, 18, 22, 90 cm ...
  → 平均は激減。ほとんどの年は少ない。
  → 120cmの年→交通マヒ→大ニュース
  → 90cmの年→「また来た」→大ニュース

平均が下がったことで、極端な年が「異常」として目立つようになった。

人間の記憶に残るのは平均ではなく例外的な出来事。1980年代は大雪が日常だったため記憶に残らなかったが、今は「普段は少ない」という基準が下がったため、同じレベルの大雪が強烈な印象を与える。


まとめ

3つのQへの答えを整理する。

Q1. 暖冬になっているか?
YES。冬日数は全国平均で40%減少。全47都道府県で有意な減少。

Q2. 雪は増えているか?
NO。日本海側の降雪量は−33%。最深積雪も全地域で減少傾向。

Q3. なぜ大雪の印象が強いのか?
「平均が下がったから極値が目立つ」逆説
北陸の変動係数は2010年代に70%と過去最高。ほとんどの冬は少雪だが、大雪の年が突然やってくる。少ない年が増えたぶん、大雪年のギャップが拡大し記憶に残りやすくなった。


シリーズ全体のまとめ

このシリーズで見えてきたのは「人間の直感とデータのズレ」だ。

記事 直感 データ
第1作 東京が一番暑くなったはず 香川が1位だった
第2作 温暖化はずっと進んでいた 1998〜2010に停滞期があった
第3作 暖冬なのに大雪が増えた 降雪は減ったが変動が拡大した

3作とも 「調べたら想定と違った、でもその違いが面白かった」 という構造になっている。

データ分析をしていると、「常識が間違っていた」よりも、「常識は半分正しかった」が一番面白い。

今回の「暖冬なのに大雪」も、まさにそういうケースだった。

気候変動は単純な「暑くなる・寒くなる」の話ではない。平均と極端現象、そして人間の記憶が重なることで、私たちはしばしば実際とは違う景色を見ている。


変動係数の計算

def calc_cv(series):
    """変動係数(%) = 標準偏差 / 平均 × 100"""
    return series.std() / series.mean() * 100

分析期間: 1981〜2024年 / 47都道府県代表観測所 / データ: 気象庁

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?