前回より、気象庁のWebサイトで公開されている過去の気象情報を利用して、必ず晴れる日を調べている。運動会の開催にぴったりの一日はいつだろうか。前回、必ず晴れる日を20日ほどピックアップしてみたのだが、残念ながら、季節が秋の日が見当たらなかった。そこで、さらに広い視点を持って情報を調べてみよう。
前回用意したデータを利用して秋晴れの日を調べてみよう
前回、横浜の過去10年の気象情報を用いて、必ず晴れる日を20日ほどピックアップしてみた。データの入手方法や、Jupyterノートブックの起動方法は、過去の記事を参考にして欲しい。しかし、残念なことに、季節が秋の日は見当たらなかった。
そこで、今度は、同じデータを利用しつつも、9月から11月という条件の元に、条件の良い日を調べてみよう。ここでは、降水量の合計を利用しつつ、9月から11月に限って、最も晴れる日を調べてみよう。
Jupyterノートブックに以下のプログラムを書き込んで、実行してみよう。
import pandas as pd
import re
# CSVデータを読み込む
df = pd.read_csv("data-kai.csv", encoding="SHIFT_JIS")
# 10年分のデータを集計
sumd = {} # 辞書型を初期化
for row in df.iterrows():
ymd = row[1]["年月日"]
kousui = row[1]["降水量の合計"]
mo = re.match('\d+/(\d+)/(\d+)', ymd)
m = int(mo.group(1)) # 月
d = int(mo.group(2)) # 日
# 9月から11月のデータだけを利用する
if not(9 <= m <= 11): continue
md = str(m) + "/" + str(d)
if not (md in sumd): sumd[md] = 0
sumd[md] += kousui
# 集計結果を並び替え
result = sorted(sumd.items(), key=lambda n: n[1])
# 上位20件を表示
top20 = result[0:20]
pd.DataFrame(top20, columns=['日付', '降水量'])
このプログラムは、前回とほとんどものになっている。ただし、9月から11月までの日付だけを処理し、それ意外の日付を処理しないようにスキップする処理を加えている。
プログラムを実行してみると、以下のような、興味深い結果が表示された。
何が興味深いのかと言うと、この10年で最も降水量の少ない日が、11月3日だったことだ。11月3日と言えば、文化の日で祝日だ。試しに「11月3日 運動会」でGoogle検索してみると、多くの地域で運動会が行われていることが分かった。加えて、11月3日というのは「特異日」と呼ばれており、雨が降らないことで有名な日一日であることも分かった。なんと、Pythonで書いた20行ほどのプログラムで、特異日を見つけることができたのだ。
特定日に雨の降りにくい場所を調べよう
つまり、秋に会社の運動会を開くなら、祝日で業務も休みである11月3日を選ぶべきであることが分かった。しかし、11月3日が晴れることは、特異日という名前がついていることからも分かるとおり有名であることを考えると、会場の予約を取るのは非常に難しそうだ。
そこで、もう少し考え方を広げてみて、横浜だけでなく、いくつかの都市を対象にして、雨の降りにくい日を調べることで、11月3日以外の日付を調べてみよう。
と言うのも、もし、会社が横浜にある場合でも、車で2時間も走れば、千葉県木更津市や、箱根や御殿場など、近隣の都市に行くことができる。参加人数が多ければ、バスを貸し切って会場まで移動するのも楽しいことだろう。
そこで、改めて、気象庁のWebサイトから、各都市のデータを含んだCSVデータをダウンロードしよう。ここでは、以下の条件を指定してファイルをダウンロードした。
地点1:神奈川県 > 横浜
地点2:神奈川県 > 箱根
地点3:千葉県 > 木更津
地点4:静岡県 > 御殿場
項目 : 降水 > 降水量の日合計
期間 : 特定の期間を複数年分表示する、9月1日から11月31日まで 、2000年から2016年まで
今回は、複数都市を対象にしつつも、秋の期間だけの降水量データをダウンロードするようにした。秋だけにデータを絞ったので、もう少し調査年数を増やして、16年分のデータのダウンロードが可能となった。
上記の条件でダウンロードすると、次のようなCSVファイルが得られる。これは、ExcelでCSVファイルを開いたところだ。
これを見ると、やはり不要なデータが多く含まれているので、不要な行や列を削除して、扱いやすくなるように整形しよう。ここでは、以下の画像のように整形し、「cities-data.csv」(cities-data.lzh)という名前で保存した。
整形したCSVファイルをJupyterノートブックで表示してみよう。以下は、Pandasのread_csv()メソッドを使って表示する。
import pandas as pd
pd.read_csv("cities-data.csv", encoding="SHIFT_JIS")
それでは、さっそく降水量の少ない日を都市ごとに表示してみよう。ただし、どの都市を中心にして順位を出すかがポイントとなる。今回は、木更津をキーにして降水量の少ない順に10日間を出してみよう。
import pandas as pd
import re
# CSVデータを読み込む
df = pd.read_csv("cities-data.csv", encoding="SHIFT_JIS")
# データを集計
sumd = {} # 辞書型を初期化
for row in df.iterrows():
ymd = row[1]["年月日"]
md = re.sub('^\d+/', '', ymd)
if not (md in sumd) : sumd[md] = [0, 0, 0, 0]
# 各都市の降水量を加算する --- (*1)
for i in range(1, 5):
sumd[md][i - 1] += row[1][i]
# 表として出力するための処理 --- (*2)
df = pd.DataFrame.from_dict(sumd).T
df.columns = ("横浜","箱根","木更津","御殿場")
# 並び替えて先頭の10件を表示 --- (*3)
df.sort_values(by="木更津", ascending=True)[0:10]
プログラムを見てみよう。CSVファイルを読み出して、各行を一つずつ処理していく。前回のプログラムと異なるのは、(*1)の部分で、ここでは、四都市の降水量を順に加算するようにした。また、(*2)の部分では、集計結果を表として出力するため、辞書型のデータをDataFrameに変換し、都市名を列名(column)として再指定している。そして最後(*3)の部分で、木更津をキーにしてデータを並び替え、最初の10件を出力する。
これをJupyterノートブックでプログラムを実行すると以下のような結果が表示された。
木更津で会場を取るなら、11月5日、9月3日、11月13日が良いという結果になった。その場合、横浜をはじめ他の都市は、雨が降る可能性が高めであることも分かった。
それでは、上のプログラムで、最終行の並び替えに使うキーを別の都市にして試してみよう。例えば、御殿場にしてみよう。
df.sort_values(by="御殿場", ascending=True)[0:10]
すると、御殿場で開催するなら、11月13日、11月16日が有力だ。そう考えると、9月3日なら木更津、11月の13、16日なら御殿場が良いということが分かった。
まとめ
以上、今回は、過去の降水量データをもとにして、秋限定で晴れる日を調べるプログラムを作ってみた。最初に、横浜の過去10年のデータを利用し、次に、複数都市を対象に計算を行ってみた。いずれも簡単なプログラムながら、説得力のある具体的な日付を導くことができたのが面白かった。
原稿執筆時点では、まだ判明していないが、今回、導き出した、木更津で最も秋晴れの日、今年の11月15日の天気はどうなるのだろうか。結果も楽しみにしたい。
また、気象庁からは他にもいろいろなデータをダウンロードすることができるので、何か別のデータと組み合わせることで、価値のある情報を見いだすことができるかもしれない。本稿を参考にしていろいろ試してみよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。