前回、身近なオープンデータの例として「郵便番号」を取り上げたが、今回は、気象庁が公開している過去の気象情報を活用してみたいと思う。今回は、過去10年分の天気データを分析して必ず晴れる日を調べてみよう。

運動会は必ず晴れる日に開催したい

さて、会社などで運動会を企画することがある。しかし、運動会など屋外で行うイベントは、雨が降ると中止になってしまうことも多い。特にそのイベントのために外部の会場を予約していた場合など、雨が降って中止になれば、そのまま翌年、あるいは、数年後ということも珍しくないだろう。とは言え、せっかくの企画なので、晴れると分かっている日を選んで開催したいと思うのは当然だろう。

そこで参考にするのが、過去の気象情報をもとにした天気予報だ。会社のイベントなどは、かなり前から告知と準備が必要なので、週間予報などの直近の天気予報が発表されてからでは遅い。そこで、過去の気象情報から晴れやすい日を探してみよう。

気象庁から過去の気象情報をダウンロードしよう

まずは、気象情報をダウンロードしよう。まずは、気象庁のWebサイトにアクセスしよう。

気象庁 > 過去の気象データ・ダウンロード [URL] http://www.data.jma.go.jp/gmd/risk/obsdl/index.php

気象庁のWebサイトより、過去の気象データ・ダウンロードができる

このサイトでは、地点と気象項目、期間を指定して、ダウンロードを行います。ただし、あまりにも大きなデータを一気にダウンロードすることはできないようになっています。そのため、期間を短くして、複数回に分けてデータをダウンロードする必要があります。

今回は、以下の条件を指定して、10年分のデータをダウンロードしてみよう。

地点: 神奈川県 > 横浜
項目1つ目: 降水 > 降水量の日合計
項目2つ目: 雲量/天気 > 天気概況(昼: 06-18時)
期間: 2006年1月1日から2016年12月31日まで

ダウンロードしたデータをExcelで開いて見ると、次のようなデータが得られました。

10年分の降水量と天気のデータ

Pythonで気象情報を解析しよう

それでは、Pythonを手軽に実行できるJupyterノートブックを利用して、いろいろな統計を調べてみよう。Jupyterノートブックのインストールは、こちらを参考に(第2回 Jupyterノートブックで気軽にPythonをこね回そう)。

まずは、コマンドライン(WindowsならPowerShellやコマンドプロンプト、macOSならターミナル)を開いて、先ほどダウンロードしたdata.csvを配置したフォルダに移動する。そして、「jupyter notebook」とコマンドを入力しよう。ブラウザが起動したら、画面右上から[New > Python3]をクリックして、新規ノートを作ろう。

そして、以下の2行のPythonプログラムを実行してみよう。すると、CSVファイルの内容を読み込んで表形式に整形して表示してくれる。これで、CSVファイルに何が書かれているのか、だいたい把握することができる。

 import pandas as pd
 pd.read_csv("data.csv", encoding="SHIFT_JIS")

Pandasでdata.csvを読み込んだところ

CSVデータを整形しよう

とは言え、data.csvをよく見てみると、ダウンロードした時刻や、説明など不要な情報も多く含まれていることが分かる。そこで、一度、Excelでデータを開いて、不要な列や行を削除しよう。ここでは、データの品質などの情報も含まれているが、削除してしまおう。ここでは、「年月日, 降水量の合計, 天気概況」と三つの列だけを残し、ヘッダ行も扱いやすくなるよう単位などを削除した。そして、「data-kai.csv」(data-kai.lzh)という名前で保存した。

Excelで不要なデータを削除したところ

それでは、改めてPandasでCSVファイルを読み込んでみよう。

 import pandas as pd
 pd.read_csv("data-kai.csv", encoding="SHIFT_JIS")

pd-read_csv_kai.png: 改めてPandasでCSVファイルを読み込んだところ

ここ10年の合計で最も降水量の少ない日は?

だいぶデータが読みやすくなった。それでは、CSVファイルを読み込み、単純に、一年の中で最も降水量が少ない日を計算してみよう。以下のプログラムを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]["降水量の合計"]
     md = re.sub(r'\d{4}\/', '', ymd) # 月/日だけにする
     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=['日付', '降水量'])

実行してみると、以下のような表が出力される。結果を見てみてどうだろうか。なんと、横浜では、この10年で見ると、11日間も全く雨の降らない日があるのだ。特に目を引くのが、元旦だ。確かに毎年晴れているという印象があったが、統計を取ってみると納得の結果と言える。

実行結果 - 横浜の累積降水量の少ない日にち

プログラムを見てみよう。ここでは、辞書型の変数sumdを使って1年365日の降水量の合計を調べている。実際には、for構文を利用して、10年分の天気を一日ずつ処理するのだが、sumd["月/日"]に降水量の合計を足していくという方法で調べている。全てのデータを合計したら、sorted()関数を利用してデータを並び替え、上記20件を切り出して表にして出力するという流れになっている。

天気概況でも調べてみよう

次に、降水量ではなく、天気概況で調べてみよう。今度は、雨が降っていないという日を調べてみよう。つまり、天気概況が「雨」でない日を調べる。今度は、上位25件を表示してみよう。

 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]["年月日"]
     tenki = row[1]["天気概況"]
     md = re.sub(r'\d{4}\/', '', ymd) # 月/日だけにする
     if not (md in sumd): sumd[md] = 0
     if tenki.find("雨") >= 0: sumd[md] += 1

 # 集計結果を並び替え
 result = sorted(sumd.items(), key=lambda n: n[1])
 # 上位25件を表示
 top = result[0:25]
 pd.DataFrame(top, columns=['日付', '雨の日数'])

実行してみると、以下のようになった。

雨の日の日数の少ない順に表示してみた

確かに、一つ前の降水量の合計とだいたい同じ結果になっていることが分かる。

まとめ

今回は、気象庁のWebサイトで公開されている10年分の気象データを利用して、雨の降らない日を調べるプログラムを作ってみた。Pythonを使えば、数行のプログラムで、CSVファイルを読み込んで、統計を取ることができることが分かったと思う。

とは言え、運動会と言えば、秋に行うものだが、残念ながら、今回調べた一覧の中では、9月と10月だと、一日しか候補が見当たらなかった。次回、もう少し分析して、秋口で雨の降りにくい日を特定してみたいと思う。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。