アメダスのデータから避暑地を探す

気温の高い夏の期間はどこか涼しい場所に行きたいと思いませんか? この記事では気象庁が提供しているアメダスのデータセットから避暑地を探してみます
2021.07.08

避暑地とは

Wikipediaによれば避暑地とは以下のような場所らしいです。

避暑地(ひしょち)とは、避暑のために訪れる土地。夏でも冷涼な気候であることが求められるため、標高の高い地域や、緯度の高い地域が選ばれることが多い。

同様にWikipediaによれば以下の場所が避暑地として挙げられるようです。

  • 北海道:釧路、阿寒
  • 青森県:十和田湖、酸ヶ湯
  • 秋田県:田沢湖
  • 岩手県:八幡平
  • 宮城県:蔵王町
  • 福島県:磐梯高原、会津高原
  • 栃木県:那須高原、奥日光
  • 群馬県:草津、嬬恋
  • 埼玉県:秩父郡
  • 新潟県:越後湯沢、苗場
  • 東京都︰高尾山
  • 神奈川県:箱根、大磯
  • 山梨県:富士五湖、清里高原(八ヶ岳山麓)
  • 静岡県:御殿場
  • 長野県:軽井沢、野辺山・蓼科高原(八ヶ岳山麓)、安曇野、上高地、志賀高原、開田高原
  • 岐阜県:奥飛騨温泉郷、根の上高原
  • 兵庫県:六甲山
  • 和歌山県:高野山
  • 鳥取県︰大山
  • 熊本県︰阿蘇地方・阿蘇山

今回使用するデータセット

今回は気象庁から配布されている1991年から2020年までの平年値のデータを利用します。 より具体的には7月下旬の最高気温の平均値を利用します。 旬別のデータでは1月をおよそ10日ごとに分割し一年で36(12x3)の期間の平均値が利用できます。 この平均値というのは過去30年分のその期間の平均値の平均値です。

この記事での避暑地の定義

この記事では避暑地とは最高気温の平均値が26度を超えないような場所とします。 一日の平均ではなく最高気温を利用する理由としては、日中の暑さを回避するためです。 夜の方が基本的に気温は低いはずなので、一日の平均だと昼は思ったよりも暑いという事態になりかねません。 26度という数字は自分のクーラーの設定温度です。 湿度との兼ね合いもあるでしょうが、概ねこれくらいの気温なら快適な気がします。

分析

データの前処理

分析しやすいようにデータを整理します。 見やすくするために列をいくつか省いていますが、最終的には以下のような形式のデータになります

月旬 観測所名(漢字) 観測値 高度(m) 緯度 経度
2 7月下旬 えりも岬 18.9 63 41.925 143.243
3 7月下旬 納沙布 19.2 12 43.3933 145.758
4 7月下旬 知方学 19.3 149 42.9383 144.735
5 7月下旬 羅臼 19.8 15 44.0233 145.187
6 7月下旬 榊町 20.1 2 43.12 145.11

元々1200件ほどの観測所のデータがありましたが、異常値を含むものを除外すると900件くらいになってしまいました。

ランキングを作ってみる

涼しい場所のランキングを作ってみましょう。

順位 観測所名(漢字) 観測値
1 富士山 9.2
2 えりも岬 18.9
3 納沙布 19.2
4 知方学 19.3
5 羅臼 19.8
6 榊町 20.1
7 根室 20.2
8 宗谷岬 20.5
9 浜鬼志別 20.7
10 大津 20.7
11 標津 20.8
12 釧路 20.8
13 稚内 21.3
14 厚床 21.3
15 白糠 21.3
16 北見枝幸 21.4
17 太田 21.4
18 鶴丘 21.5
19 礼文 21.7
20 広尾 21.7

涼しい場所としては山の上である富士山や北海道が多いです。 やはり標高や緯度に関係がありそうです。

見やすくするために地図上にプロットしてみましょう。 今回は地図データとして地図蔵さんが配布しているGeojsonファイルを使いました。

プロットしてみると以下のような感じです。

北に行くに従って気温が下がっていることが確認できます。

地域別にみてみる

地域別に見てみましょう。 今回は地図上にプロットした際に見やすい大きさで都道府県を分類しました。

26度未満の場所をXでそれ以上を●で表しています。

北海道

数が多いので表は上位20箇所に限定しました。

順位 観測所名(漢字) 観測値
2 えりも岬 18.9
3 納沙布 19.2
4 知方学 19.3
5 羅臼 19.8
6 榊町 20.1
7 根室 20.2
8 宗谷岬 20.5
9 浜鬼志別 20.7
10 大津 20.7
11 標津 20.8
12 釧路 20.8
13 稚内 21.3
14 厚床 21.3
15 白糠 21.3
16 北見枝幸 21.4
17 太田 21.4
18 鶴丘 21.5
19 礼文 21.7
20 広尾 21.7
21 雄武 21.8

東北

数が多いので表は上位20箇所に限定しました。

順位 観測所名(漢字) 観測値
22 鷲倉 21.9
33 酸ケ湯 22.5
66 大間 23.8
68 小田野沢 23.8
84 区界 24.4
93 薮川 24.6
116 駒ノ湯 25
118 脇野沢 25.1
119 休屋 25.1
120 江ノ島 25.1
121 六ケ所 25.1
122 種市 25.1
123 八幡平 25.2
124 蟹田 25.2
139 野辺地 25.4
146 今別 25.5
152 桧原 25.6
154 むつ 25.6
161 久慈 25.8
162 小本 25.8

関東

小笠原諸島などが入ると地図が小さくなってしまうため今回は除外しました。

順位 観測所名(漢字) 観測値
44 奥日光 23
91 草津 24.5
97 田代 24.7
140 那須高原 25.4

中部

順位 観測所名(漢字) 観測値
1 富士山 9.2
103 野辺山 24.8
106 菅平 24.8

関西

該当する観測所はありませんでした。

中国

該当する観測所はありませんでした。

四国

該当する観測所はありませんでした。

九州

該当する観測所はありませんでした。

沖縄

該当する観測所はありませんでした。

気温と標高・緯度の関係

気温と標高・緯度の関係性についてもう少し詳しく分析してみましょう。 図が見辛くなるので富士山のデータは一旦除外します。

まずは散布図を見てみましょう。

縦軸が気温、横軸が高度(標高)、色で緯度を表しています。 同じくらいの緯度の場合標高が高くなるほど気温が減少傾向にあることが確認できます。

気温と緯度だけに絞って関係を見てみます。

概ね緯度が上がる(北に行く)ほど気温が下がることが確認できます。

標高と気温の関係については高度が上がるに従って気温が下がっていくという現象があり、これは気温減率という割合に従って下がっていきます。 標高が100m高くなると気温は0.65℃下がると言われています。

また、緯度と気温の関係についても高緯度な場所では面積あたりの太陽光の量が減る影響が大きいと考えられます

感想

涼しい地域を探す手段が整理できたと思います。 冒頭でも述べたように標高が高い場所か緯度が高い地域を探せば良いということがわかりました。 今回はアメダスの観測地に絞って探しましたが、気温と標高・緯度との関係がうまくモデリングできれば位置情報から避暑地を予測できるかもしれません。

付録

付録として気温が高い場所20箇所と今回使用したコードを載せておきます。

暑い場所

涼しい場所ランキングの下から20箇所です。

順位 観測所名(漢字) 観測値
897 滝宮 33
898 鹿児島 33
899 喜入 33.1
900 岱明 33.2
901 福崎 33.2
902 高梁 33.2
903 京田辺 33.3
904 大阪 33.3
905 朝倉 33.3
906 佐賀 33.3
907 岡山 33.3
908 大洲 33.4
909 豊中 33.4
910 熊本 33.4
911 33.4
912 久留米 33.4
913 枚方 33.5
914 京都 33.6
915 多治見 33.7
916 日田 33.8

データの整形

データの整形

from pathlib import Path
import pandas as pd

columns = [
    '観測所番号',
    '観測所名(漢字)',
    '観測所名(カナ)',
    '観測所名(ローマ字)',
    '緯度(度)',
    '緯度(分)', 
    '経度(度)',
    '経度(分)',
    '高度(m)',
    '風向風速計の高さ(m)',
    '降水量観測フラグ',
    '風観測フラグ',
    '気温観測フラグ',
    '日照時間観測フラグ',
    '積雪の深さ観測フラグ',
]
station = pd.read_csv('./jma/amedas_station_index.csv', encoding="SHIFT-JIS", names=columns, header=None, skiprows=2)

def to_tidy(data):
    remark = data.drop(columns=)
    remark = remark.rename(columns={c: c.strip('RMK') for c in columns})
    measure = data.drop(columns=)

    remark = pd.melt(remark, id_vars=, var_name='月旬', value_name='RMK')
    measure = pd.melt(measure, id_vars=, var_name='月旬', value_name='観測値')
    data = pd.merge(remark, measure)
    data = pd.merge(data, station)
    
    return data

columns = ['平年値種別22(固定)', '観測所番号' , '要素番号', '資料年数', '統計開始年', '統計終了年']
columns += [f'{i}月{j}旬{k}'for i in range(1, 13) for j in ['上', '中', '下'] for k in ['', 'RMK']]
dfs = map(lambda p: pd.read_csv(p, names=columns, header=None), Path('./jma/month_basis_10day/').glob('*/*.csv'))
dfs = map(to_tidy, dfs)
df = pd.concat(dfs, ignore_index=True)
df['緯度'] = df['緯度(度)'] + (df['緯度(分)'] / 60)
df['経度'] = df['経度(度)'] + (df['経度(分)'] / 60)

ランキングの作成

ランキングの作成

ranking = df[(df['要素番号'] == 600) & (df['RMK'] == 8) & (df['月旬'] == '7月下旬')].sort_values('観測値').reset_index(drop=True)
ranking.index = ranking.index + 1
ranking['観測値'] = ranking['観測値'].map(lambda x: x * 0.1)

地図にプロットする

地図にプロット

import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from shapely.geometry import Polygon
from matplotlib import rcParams

rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'VL PGothic', 'Noto Sans CJK JP']

df = ranking
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['経度'], df['緯度'], crs='EPSG:4326'))
japan = gpd.read_file('prefectures.geojson')
region_table = {
    '北海道': ['北海道'],
    '東北': ['青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県'],
    '関東': ['東京都', '茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '神奈川県'],
    '中部': ['新潟県', '富山県', '石川県', '福井県', '山梨県', '長野県', '岐阜県', '静岡県', '愛知県'],
    '関西': ['京都府', '大阪府', '三重県', '滋賀県', '兵庫県', '奈良県', '和歌山県'],
    '中国': ['鳥取県', '島根県', '岡山県', '広島県', '山口県'],
    '四国': ['徳島県', '香川県', '愛媛県', '高知県',],
    '九州': ['福岡県', '佐賀県', '長崎県', '大分県', '熊本県', '宮崎県', '鹿児島県'],
    '沖縄': ['沖縄県']
}
pref_to_region = {
    e: k
    for k, v in region_table.items()
    for e in v
}
japan['region'] = japan['name'].map(lambda x: pref_to_region[x])

## 日本地図
ax = japan.plot(figsize=(30, 10), edgecolor='#444', facecolor='white', linewidth = 0.8)
gdf.plot(column='観測値', ax=ax, cmap = 'rainbow', legend=True, markersize=10, norm=Normalize(vmin=5, vmax=35))

## 地域別
for r in region_table.keys():
    region = japan[japan['region'] == r]
    if r == '関東':
        region = gpd.clip(region, Polygon([(138, 37.5), (138, 34), (141, 34), (141, 37.5), (138, 37.5)]))
    ax = region.plot(figsize=(30, 10), edgecolor='#444', facecolor='white', linewidth = 0.8)
    cliped = gpd.clip(gdf, region)
    cool = cliped[cliped['観測値'] < 26 ]
    not_cool = cliped[cliped['観測値'] >= 26 ]
    cool.plot(column='観測値', ax=ax, cmap = 'rainbow', markersize=120, norm=Normalize(vmin=5, vmax=35), marker='x')
    not_cool.plot(column='観測値', ax=ax, cmap = 'rainbow', legend=True, markersize=70, norm=Normalize(vmin=5, vmax=35))
    cb = ax.figure.axes[1]
    ax.tick_params(labelsize=20)
    cb.tick_params(labelsize=20)
    print(cool[['観測所名(漢字)', '観測値']])

散布図

散布図の作成

df = df.drop(index=[1]) # 富士山を除外
df.plot.scatter(figsize=(20, 10), y='観測値', x='高度(m)', c='緯度', cmap='brg')
df.plot.scatter(figsize=(20, 10), y='観測値', x='緯度')