目的
今年(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()
郡山、福島の上昇率も僅差で高いが、小名浜の上昇率は低い。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()
若松、小名浜の上昇率も僅差で高いが、郡山の上昇率は低い。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()
福島と若松の猛暑日は、昔からそこそこあったようだが、近年はすさまじい勢いで増加している。(僅差で若松がリードし第一位)
郡山と小名浜は昔から猛暑日はなく、近年もそれほど増えていない。
真夏日:最高気温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()
福島と若松は、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()
これも真夏日同様、他の市は、猛暑日、真夏日が多くなっているため、相対的に小名浜の増加率が高くなっている。
熱帯夜:最低気温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()
昔は、熱帯夜は福島が突出して多かったようだが、近年は小名浜の熱帯夜が増加し、特に今年(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()
昔、真冬日の多かった若松も、温暖化の影響で、真冬日が減少している。
小名浜はもともと真冬日が少ないので、これ以上減りようがなく、上昇率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()
郡山の最低気温の上昇率が低かったが、冬日の日数についても、減少の幅が小さい。(冬は寒いまま。)
温暖化は、気温だけでなく、降雪量にも影響するはずなので、降雪量の変化も見てみる。
降雪量
各市の降雪量をダウンロードし、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()
同じ県の主要都市とは思えないほど、降雪量には差があり、もともと降雪量の多かった若松が変化率(影響)としては最大になるのだろう。
郡山のデータがないのが残念だが、データがあったとしても、若松第一位は変わらないと思う。
若松では年間3cmほど降雪量が減少しているので、このままのペースで降雪が減少すると、約100年で降雪量が0になってしまうことになる。
これを見ただけでも、やはり、温暖化は深刻だ。
結果まとめ
以上より、温暖化率総合第一位は、四冠を獲得した若松(おめでとうございます?)
夏暑いのは大変だが、その分冬が過ごしやすくなっているとのことです。(真冬日も降雪量も減少している。)
温暖化率総合第二位は、三冠の小名浜
連日猛暑日が続くような状況の中で夏日が増えても、温暖化の深刻さ・辛さは感じられないが、熱帯夜が増えたのは気の毒。
しかも今年は突出して増えているので、今年限りの突発的な状況か、来年以降も継続するのか、注視していきたい。
福島と郡山がそれぞれ一冠。
福島はもともと暑かったので、上昇率は伸びず一冠にとどまったのではないだろうか。
郡山は夏は暑くなるが、冬は寒いままという気の毒な状況で、一冠にとどまったのだろう。
項目 | 第一位 |
---|---|
年間最高気温 | 若松 |
年間最低気温 | 福島 |
猛暑日の日数 | 若松 |
真夏日の日数 | 郡山 |
夏日の日数 | 小名浜 |
熱帯夜の日数 | 小名浜 |
真冬日の日数 | 若松 |
冬日の日数 | 小名浜 |
降雪量 | 若松 |
総合 | 若松 |
まとめ
体感として温暖化しているのではと感じられるが、データを見ても、確実に温暖化していることがわかった。
みなさんのお住まいの都道府県でも、温暖化具合をみてみてはいかがでしょうか?
温暖化が、よりリアルに感じられると思います。