福島県の主要４市で、温暖化の影響（深刻さ）を調べてみた 

# 目的

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

# 気温データ

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

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

気温データを読み込み、データフレーム化する関数を作る。
```python
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）に結合する。
```python
# 市の定義
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年までのデータが取得できていることがわかる。
```python
            福島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
```
次に、年毎に集計するので、年の列を追加する。
```python
# 年を追加
df_tempreture['year'] = (df_tempreture.index).map(lambda x: int(x.year) )
```
温暖化の影響がわかるように、グラフで可視化するための関数を用意する。
同時に、numpy の polyfit で最小二乗法により、直線近似し、その傾きから、年毎の上昇率（下降率）も可視化するようにする。凡例の市名後ろの括弧数字は上昇率（下降率）を示す。
この上昇率をもとに、温暖化率の順位付けをしてみる。
```python
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 で最大（最高）を求める。  
```python
# 年間最高気温
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/eea20f8f-46e1-7908-c218-faec57543ea8.png)
年間最高気温での温暖化率第一位は、**若松**  

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

最高気温が毎年上昇しているなら、最低気温も上昇しているはずなので、最低気温も見てみる。
## 年間最低気温
```python
# 年間最低気温
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/a4fd7bae-97e3-9338-03e3-af2fb15ca73c.png)
年間最低気温での温暖化率第一位は、**福島**

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

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

## 猛暑日：最高気温３５℃以上の日  
df_temp[column_name]>=35 で、３５度以上のみを抽出した上で、groupby で、year 毎にまとめ、count で数（カウント）を求める。  
```python
# 猛暑日の日数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/c2792eb6-dd80-1a8d-bee8-1871de546a08.png)
猛暑日の日数での温暖化率第一位は、**若松**

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

## 真夏日：最高気温３０℃以上（３５℃未満）の日  
```python
# 真夏日の日数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/04017752-7f42-ef9d-eb0e-8eb6282d656a.png)
真夏日の日数での温暖化率第一位は、**郡山**

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

## 夏日：最高気温２５℃以上（３０℃未満）の日  
```python
# 夏日の日数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/c60b28c7-e699-7277-2927-37cbc9511ac5.png)
夏日の日数での温暖化率第一位は、**小名浜**  

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

## 熱帯夜：最低気温２５℃以上の日
```python
# 熱帯夜の日数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/a5046b93-ee69-fb0c-0431-a38c88993a20.png)
熱帯夜の日数での温暖化率第一位は、**小名浜**

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

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

## 真冬日：最高気温０℃未満の日  
```python
# 真冬日の日数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/95f85efb-d61f-0f9d-3436-bb52f4c27968.png)
真冬日の日数での温暖化率第一位は、**若松**

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

## 冬日：最低気温０℃未満の日  
```python
# 冬日の日数
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/aa2eb3df-c825-8b8b-b033-30fdebe2c64f.png)
冬日の日数での温暖化率第一位は、**小名浜**

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

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

# 降雪量
各市の降雪量をダウンロードし、Dataディレクトリ以下に保存する。  
データ量が小さいので１ファイル （降雪量.csv）でダウンロードできた。  
なお、郡山の降雪量データはない。
```python
# 降雪量
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()
```
```python
	福島	若松	小名浜	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
```
```python
# 郡山の積雪量データがないので削除
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570565/16ca782f-1260-d209-c9f6-d49882b35df1.png)
降雪量での温暖化率第一位は、**若松**  

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

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

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

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

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

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

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