1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

福島県の主要4市で、温暖化の影響(深刻さ)を調べてみた

Last updated at Posted at 2023-10-21

目的

今年(2023年)の夏も暑かった。毎年暑いとはいいながら、今年の暑さは異常ではないか、と毎年思ってしまう。
気象庁が温度データを公開しているので、福島県の主要4市の気温データを使って、平年と違うのか、昔と比べて温暖化しているのか、を分析してみる。
また、主要4市でどの市が最も温暖化の影響を受けているのかもみてみたい。

気温データ

10年単位で、各市の最高気温/最低気温をダウンロードし、Dataディレクトリ以下に保存する。
ファイル名は、年代_市名.csv
例:./Data/1980_福島.csv

一括でダウンロードしたかったのだが、サイズが大きくなるとダウンロードできないので(気象庁のサイトの仕様)、20ファイル(4市×5年代)に分けてダウンロードした。
これを読み込んで、データフレームとして結合してから処理する。

気温データを読み込み、データフレーム化する関数を作る。

import pandas as pd

# 気温データの読み込み関数
def read_tempreture_file(year,city):
  filename = './Data/' + str(year) + '_' + city + '.csv'
  df_temp = pd.read_csv(filename, encoding='shift_jis', header=None, skiprows=7,usecols=[0,1,4] )
  df_temp = df_temp.rename(columns={0: 'date', 1: city+'max',4: city+'min'})
  df_temp['date'] = pd.to_datetime(df_temp['date'])
  df_temp = df_temp.set_index('date')
  return df_temp

読み込み関数を使って、20ファイルを読み込み、データフレームをconcat で結合する。
同じ年の各市のデータは列方向(axis=1)に、各年代のデータは行方向(axis=0)に結合する。

# 市の定義
city_list = ['福島','郡山','小名浜','若松']
# 年代の定義
year_list =[1980,1990,2000,2010,2020]
# 気温データのデータフレーム(まずは空で定義しておく)
df_tempreture = pd.DataFrame()
# 年代のループ
for year in year_list:
  # 年代でまとめたデータフレーム(まずは空で定義しておく)
  df_year = pd.DataFrame()
  # 市のループ
  for city in city_list:
    # 気温データの読み込み
    df_temp = read_tempreture_file(year,city)
    # 年代データフレームにまとめる
    df_year = pd.concat( [df_year, df_temp], axis=1)
  # 全体のデータフレームにまとめる
  df_tempreture = pd.concat( [df_tempreture, df_year], axis=0)

# 先頭と末尾を見てみる
print(df_tempreture.head())
print(df_tempreture.tail())

先頭と末尾を見てみると、1980年から、2023年までのデータが取得できていることがわかる。

            福島max  福島min  郡山max  郡山min  小名浜max  小名浜min  若松max  若松min
date                                                                
1980-01-01    5.0    1.5    2.5    0.1     7.2     1.9    3.7   -1.9
1980-01-02    7.4   -3.0    6.0   -4.0     8.0    -1.2    7.4   -5.3
1980-01-03    5.7    0.4    6.8   -0.1    11.7     4.3   11.9    1.7
1980-01-04   12.4    1.4   12.5    0.4    15.8     5.2    9.4    0.8
1980-01-05    4.0   -1.5    2.7   -1.8     6.9    -0.4    2.9   -3.9
            福島max  福島min  郡山max  郡山min  小名浜max  小名浜min  若松max  若松min
date                                                                
2023-10-12   22.6    8.6   20.5    5.2    21.8    11.2   21.4    6.1
2023-10-13   23.0    8.5   20.5    5.1    23.2    10.7   21.5    6.5
2023-10-14   23.6   10.2   22.7    4.5    22.8    11.3   21.6    6.5
2023-10-15   13.8   12.0   16.4   10.5    17.3    13.4   13.8   10.7
2023-10-16   23.8   12.1   21.7   14.7    25.1    11.9   22.5   10.7

次に、年毎に集計するので、年の列を追加する。

# 年を追加
df_tempreture['year'] = (df_tempreture.index).map(lambda x: int(x.year) )

温暖化の影響がわかるように、グラフで可視化するための関数を用意する。
同時に、numpy の polyfit で最小二乗法により、直線近似し、その傾きから、年毎の上昇率(下降率)も可視化するようにする。凡例の市名後ろの括弧数字は上昇率(下降率)を示す。
この上昇率をもとに、温暖化率の順位付けをしてみる。

import matplotlib.pyplot as plt
import japanize_matplotlib
import numpy as np

# 色のリスト
color_list = {'福島':'red', '郡山':'orange', '小名浜':'green', '若松':'blue'}
# 直線近似の最初と最後の年
year_start_end = np.array([1980,2023])

# グラフを表示(直線近似した直線も表示する)
def my_plot(df_temp,city):
  # 最小二乗法で傾き、切片を求める
  a,b=np.polyfit(df_temp.index,df_temp,1)
  # グラフを表示
  plt.plot(df_temp, label=f'{city}({a:.4f})', c=color_list[city] )
  # 直線近似の最初と最後のyを求める
  y = a * year_start_end + b
  # 直線近似を表示
  plt.plot(year_start_end, y, '-.', linewidth=1, c=color_list[city] )

年間最高気温

まず、年間の最高気温を可視化する。
groupby で、year 毎にまとめたうえで、max で最大(最高)を求める。

# 年間最高気温
df_max = df_tempreture.groupby('year').max()
for city in city_list:
  column_name = city+'max'
  df_temp = df_max[column_name]
  my_plot(df_temp,city)

plt.title('年間最高気温')
plt.xlabel('')
plt.ylabel('')
plt.legend()
plt.show()

output1.png
年間最高気温での温暖化率第一位は、若松

郡山、福島の上昇率も僅差で高いが、小名浜の上昇率は低い。1980年代は、郡山と小名浜での差がなかったのが、近年、差が開いているように見える。

最高気温が毎年上昇しているなら、最低気温も上昇しているはずなので、最低気温も見てみる。

年間最低気温

# 年間最低気温
df_min = df_tempreture.groupby('year').min()
for city in city_list:
  column_name = city+'min'
  df_temp = df_min[column_name]
  my_plot(df_temp,city)

plt.title('年間最低気温')
plt.xlabel('')
plt.ylabel('')
plt.legend()
plt.show()

output2.png
年間最低気温での温暖化率第一位は、福島

若松、小名浜の上昇率も僅差で高いが、郡山の上昇率は低い。1980年代は、郡山と若松での差があったのが、近年、差がなくなっているように見える。
郡山は夏暑くなっているにもかかわらず、冬は寒いまま、ということか、、、

最高気温、最低気温は瞬間的な温度なので、暑い日がどれだけ継続していたかを猛暑日などの日数で見てみる。

猛暑日:最高気温35℃以上の日

df_temp[column_name]>=35 で、35度以上のみを抽出した上で、groupby で、year 毎にまとめ、count で数(カウント)を求める。

# 猛暑日の日数
for city in city_list:
  column_name = city+'max'
  df_temp = df_tempreture.loc[:,[column_name,'year']]
  df_temp = df_temp[df_temp[column_name]>=35]
  df_temp = df_temp.groupby('year').count()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)

plt.title('猛暑日の日数')
plt.xlabel('')
plt.ylabel('日数')
plt.legend()
plt.show()

output3.png
猛暑日の日数での温暖化率第一位は、若松

福島と若松の猛暑日は、昔からそこそこあったようだが、近年はすさまじい勢いで増加している。(僅差で若松がリードし第一位)
郡山と小名浜は昔から猛暑日はなく、近年もそれほど増えていない。

真夏日:最高気温30℃以上(35℃未満)の日

# 真夏日の日数
for city in city_list:
  column_name = city+'max'
  df_temp = df_tempreture.loc[:,[column_name,'year']]
  df_temp = df_temp[df_temp[column_name]<35]
  df_temp = df_temp[df_temp[column_name]>=30]
  df_temp = df_temp.groupby('year').count()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)

plt.title('真夏日の日数')
plt.xlabel('')
plt.ylabel('日数')
plt.legend()
plt.show()

output4.png
真夏日の日数での温暖化率第一位は、郡山

福島と若松は、30度以上の日数は増えているが、35度以上は猛暑日としてカウントされるので、真夏日としての増加率は抑えられている。

夏日:最高気温25℃以上(30℃未満)の日

# 夏日の日数
for city in city_list:
  column_name = city+'max'
  df_temp = df_tempreture.loc[:,[column_name,'year']]
  df_temp = df_temp[df_temp[column_name]<30]
  df_temp = df_temp[df_temp[column_name]>=25]
  df_temp = df_temp.groupby('year').count()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)
plt.title('夏日の日数')
plt.xlabel('')
plt.ylabel('日数')
plt.legend()
plt.show()

output5.png
夏日の日数での温暖化率第一位は、小名浜

これも真夏日同様、他の市は、猛暑日、真夏日が多くなっているため、相対的に小名浜の増加率が高くなっている。

熱帯夜:最低気温25℃以上の日

# 熱帯夜の日数
for city in city_list:
  column_name = city+'min'
  df_temp = df_tempreture.loc[:,[column_name,'year']]
  df_temp = df_temp[df_temp[column_name]>=25]
  df_temp = df_temp.groupby('year').count()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)

plt.title('熱帯夜の日数')
plt.xlabel('')
plt.ylabel('日数')
plt.legend()
plt.show()

output6.png
熱帯夜の日数での温暖化率第一位は、小名浜

昔は、熱帯夜は福島が突出して多かったようだが、近年は小名浜の熱帯夜が増加し、特に今年(2023年)は福島を抜き去り、最も多くなっている。
一般的に、小名浜は海風が入るので、昼暑くとも、夜は涼しくなる、と言われているが、海面温度上昇の影響か?

次は、冬(寒さ)の統計を取ってみる。まず、真冬日から。

真冬日:最高気温0℃未満の日

# 真冬日の日数
for city in city_list:
  column_name = city+'max'
  df_temp = df_tempreture.loc[:,[column_name,'year']]
  df_temp = df_temp[df_temp[column_name]<0]
  df_temp = df_temp.groupby('year').count()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)

plt.title('真冬日の日数')
plt.xlabel('')
plt.ylabel('日数')
plt.legend()
plt.show()

output7.png
真冬日の日数での温暖化率第一位は、若松

昔、真冬日の多かった若松も、温暖化の影響で、真冬日が減少している。
小名浜はもともと真冬日が少ないので、これ以上減りようがなく、上昇率0日となっている。

冬日:最低気温0℃未満の日

# 冬日の日数
for city in city_list:
  column_name = city+'min'
  df_temp = df_tempreture.loc[:,[column_name,'year']]
  df_temp = df_temp[df_temp[column_name]<0]
  df_temp = df_temp.groupby('year').count()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)

plt.title('冬日の日数')
plt.xlabel('')
plt.ylabel('日数')
plt.legend()
plt.show()

output8.png
冬日の日数での温暖化率第一位は、小名浜

郡山の最低気温の上昇率が低かったが、冬日の日数についても、減少の幅が小さい。(冬は寒いまま。)

温暖化は、気温だけでなく、降雪量にも影響するはずなので、降雪量の変化も見てみる。

降雪量

各市の降雪量をダウンロードし、Dataディレクトリ以下に保存する。
データ量が小さいので1ファイル (降雪量.csv)でダウンロードできた。
なお、郡山の降雪量データはない。

# 降雪量
df_snow = pd.read_csv('./Data/降雪量.csv', encoding='shift_jis', header=None, skiprows=6,usecols=[0,1,5,9] )
df_snow = df_snow.rename(columns={0: 'date', 1: '福島', 5: '若松', 9:'小名浜'})
df_snow['date'] = pd.to_datetime(df_snow['date'])
df_snow = df_snow.set_index('date')
# 年を追加
df_snow['year'] = (df_snow.index).map(lambda x: int(x.year) )
df_snow.head()
	福島	若松	小名浜	year
date				
1980-01-01	25	133	0.0	1980
1980-02-01	75	250	12.0	1980
1980-03-01	16	44	3.0	1980
1980-04-01	1	2	0.0	1980
1980-05-01	0	0	0.0	1980
# 郡山の積雪量データがないので削除
if '郡山' in city_list:
  del city_list[city_list.index('郡山')]

# 年毎に積算
df_snow_year = df_snow.groupby('year').sum()
for city in city_list:
  column_name = city
  df_temp = df_snow.loc[:,[column_name,'year']]
  df_temp = df_temp.groupby('year').sum()
  df_temp = df_temp[column_name]
  my_plot(df_temp,city)

plt.title('年間積雪量')
plt.xlabel('')
plt.ylabel('積雪量(cm)')
plt.legend()
plt.show()

output9.png
降雪量での温暖化率第一位は、若松

同じ県の主要都市とは思えないほど、降雪量には差があり、もともと降雪量の多かった若松が変化率(影響)としては最大になるのだろう。
郡山のデータがないのが残念だが、データがあったとしても、若松第一位は変わらないと思う。
若松では年間3cmほど降雪量が減少しているので、このままのペースで降雪が減少すると、約100年で降雪量が0になってしまうことになる。
これを見ただけでも、やはり、温暖化は深刻だ。

結果まとめ

以上より、温暖化率総合第一位は、四冠を獲得した若松(おめでとうございます?)
夏暑いのは大変だが、その分冬が過ごしやすくなっているとのことです。(真冬日も降雪量も減少している。)

温暖化率総合第二位は、三冠の小名浜
連日猛暑日が続くような状況の中で夏日が増えても、温暖化の深刻さ・辛さは感じられないが、熱帯夜が増えたのは気の毒。
しかも今年は突出して増えているので、今年限りの突発的な状況か、来年以降も継続するのか、注視していきたい。

福島と郡山がそれぞれ一冠。
福島はもともと暑かったので、上昇率は伸びず一冠にとどまったのではないだろうか。
郡山は夏は暑くなるが、冬は寒いままという気の毒な状況で、一冠にとどまったのだろう。

項目 第一位
年間最高気温 若松
年間最低気温 福島
猛暑日の日数 若松
真夏日の日数 郡山
夏日の日数 小名浜
熱帯夜の日数 小名浜
真冬日の日数 若松
冬日の日数 小名浜
降雪量 若松
総合 若松

まとめ

体感として温暖化しているのではと感じられるが、データを見ても、確実に温暖化していることがわかった。

みなさんのお住まいの都道府県でも、温暖化具合をみてみてはいかがでしょうか?
温暖化が、よりリアルに感じられると思います。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?