統計学、機械学習などを使って身近な世界を分析したりするブログです

データアナリティクスによる『体感』で雨を予測する方法

我々の身の回りはデータで溢れています。人口統計、視聴率、売上、株価、内閣支持率、例を挙げれば枚挙に暇がありません。その中でも、最も身近なデータといえば、天気予報でしょう。外出する前に、傘を持っていくべきかどうかの判断に必要なデータが天気予報、さらに言えば降水確率です。

ところで、そんなに身近な降水確率ですが、朝のニュースや天気予報アプリを見て確認する行為は果たしてクールでしょうか?

結論から言うと、クールではありません。

来る日も来る日も、傘を持っていくかどうかという重要な判断を、どんなアルゴリズムで算出されたかも分からない降水確率に頼りっきりではいけません。

そんなことでは、もし無人島に漂着したときに困ってしまいます。

では、雨が降るかどうかをクールに予想するには、どうすればいいでしょうか?その答えは、簡単です。

自分の目で見て、体で感じて、予測するのです。

よくマンガなどである、

「大気の様子がおかしいな。。待てよ、この風の感じ。。。来るぞ!」

これです。みなさんも子供の頃はこれを目指していたはずです。ところが、受験、就職活動、仕事に追われて、いつしか朝のニュースで天気予報を確認するようになってしまったのではありませんか?

まだ手遅れではありません。データ分析をして、あの頃描いていた、クールな大人になりましょう。幸い、これを読んでいるということはまだ無人島にも漂着していないようですし。

今回は、「東京地方 過去の天気予報・降水確率(http://pe-sawaki.com/WeatherForecast/)」さんから天気予報の過去データを、また気象庁さんホームページ(http://www.jma.go.jp/jma/index.html)から天気の過去データを拝借しています。ありがとうございます。ともに、2006年1月~2018年7月の12年7ヶ月分を使用しています。

例のごとく、今回の分析コードはGithub(https://github.com/ShoKosaka/weather)に置いておきますのでご参照ください。

この記事は、3つのチャプターで構成されています。

1.降水確率の正体
2.『体感』で雨を予測
3.風向きの変化がもたらす影響

1.降水確率の正体

さて、そもそも、天気予報はどれくらい当たるのでしょうか。降水確率50%のとき、果たして本当に雨が降る確率は50%なのでしょうか?降水確率は10%刻みなので、有効数字を考えると、降水確率が50%のとき、実際の確率は45%~55%だと予想されます。

また、降水確率は前日だけに発表されるものではありません。通常、1週間前には天気予報と降水確率が発表されます。

1週間前の降水確率はどのくらい信用できるものでしょうか? そこそこ当たるものなのでしょうか?それとも、結局前日にならないと分からないものなのでしょうか?週末にBBQを控えているパーティーピーポー達にとって、雨が降るかどうかは死活問題です。

それではデータで検証していきましょう。まず、7日前の降水確率と前日の降水確率はどのくらい変化するのでしょうか。横軸を7日前の降水確率、縦軸を前日の降水確率としたヒートマップを見てみます。

f:id:shokosaka:20180823104411p:plain

7日前の降水確率が10%の場合、前日の降水確率は0%~20%のレンジにおさまるようです。30%以上になる確率は限りなく低いと言えるでしょう。一方、7日前の降水確率が70%のときは、約40%の確率で前日の降水確率も70%になりますが、10%になったり90%になることもあります。

これは、「一週間後に確実に晴れそうだ」という状況はあれど、「一週間後に確実に雨が降りそうだ」というのはなかなか言い切れないことを示しています。そもそも、2006年以降の日々のデータ4594件の中に、7日前の天気予報で80%、90%、100%の降水確率が0件であることも、そのことを如実に表していると言えるでしょう。

7日前の降水確率と前日の降水確率の関係性は分かりました。それでは、はたして前日の降水確率はどのように捉えればよいのでしょうか?

前日の降水確率と実際に雨が降った割合を見てみましょう。

ちなみに、降水確率について、気象庁HPにはこう書かれています。

降水確率予報で確率60%といった場合、そのような予報を100回発表すると約60回で対象時間内に1mm以上の降水があり、約40回で1mm以上の降水がないことを意味しています。

この定義に基づき、実際に雨が降った割合は、1mm以上の降水があったかどうかをカウントしています。

f:id:shokosaka:20180823104540p:plain

横軸が前日の降水確率、縦軸が実際に雨が降った割合です。

前日の降水確率70%を見てください。実際に雨が降った割合は90%を越えているではありませんか!

なんと、降水確率70%の正体は、降水確率90%だったのです!

これは驚きの事実です。これからは降水確率70%を見る目が変わりますね。

逆に降水確率が低い場合、20%でも、実際に雨が降った割合は10%以下であることも分かります。

この真実を知っているパーティーピーポーと知らないパーティーピーポーには大きな違いが生まれます。

真実を知らないパーティーピーポーは、7日前に降水確率70%という天気予報を鵜呑みにして、30%の可能性にかけて神に祈るでしょう。一方、真実を知ったパーティーピーポーは、こう考えます。

「7日前に降水確率が70%ということは、40%の確率で前日の降水確率も70%になるはず。前日の降水確率が70%になると、実際に雨が降る可能性は90%以上なので、BBQを開催することは難しいだろう。雨に備えてボーリング場を人数分予約しておく必要があるが、まだBBQまで一週間あるので晴れる可能性もワンチャンある。前日でもキャンセル料が取られないボーリング場を探そう。」

どちらのパーティーピーポーが楽しい週末を過ごせるかは明らかです。

2.『体感』で雨を予測

少し長くなってしまいましたが、ここまで、実際の天気予報がどのくらいの精度のものなのかを見てきました。しかし、我々の本来の目的は、「大気の変化を体で感じて雨を予測すること」です。

天気予報を使わずに、今日の天気情報だけで明日の天気は予測できるでしょうか?これをデータで検証しましょう。

今回使用する天気情報は以下の13項目です。

・平均気温
・降水量(mm)
・降水有無
・日照時間
・降雪量(mm)
・降雪有無
・平均風速
・最大風速
・最大風速(風向き)
・最大瞬間風速
・最大瞬間風速(風向き)
・平均蒸気圧
・平均雲量
・平均相対湿度

これらの情報を使って、翌日の降水有無を予測する問題を解いていきます。

それでは早速ですが、機械学習を使って、どの変数が翌日の降水有無に対して重要度が高いのか見てみます。ランダムフォレストで変数重要度をプロットしたものが下の図です。

f:id:shokosaka:20180823104623p:plain

なんと、素晴らしい結果ではありませんか。翌日の降水有無を予測するために一番重要なのは、瞬間最大風速の風向きなのです。想像してみてください。

突風が吹いたときの風向きで雨を予測

一番かっこいいやつじゃないですか?また、重要度が低い変数を見てみると、今日雨が降ったかどうかは、明日の降水有無にはほとんど影響しないことも分かります。これは、我々には好都合です。たとえば、雨が降っているときに

「この感じ、、明日は雨だな。。」

とつぶやいてみたとします。周りの人はどう思うでしょうか?

「いやいや、もう降っとるがな!」

と思うでしょう。雨を予測するのは、晴れのときのほうがかっこいいはずです。データは、今日雨が降っていようがいまいが、瞬間最大風速の風向き、日照時間、雲量、湿気などで予測できることを示しています。

「風向きで予測できるといっても、どの風向きだと雨が降りやすいのか分からないと意味がないじゃないか」と思った方もいらっしゃることでしょう。

細かく見ていきましょう。まず、そもそもどの方角から風が吹きやすいのかを把握しておきます。

f:id:shokosaka:20180823104704p:plain

これを見ると、北西、北北西、南南東から突風が吹くことが多いようです。西から突風が吹くことは極端に少ないようですね。勉強になります。

ところで、雨が降るかどうかは、風向きと風の強さの掛け算で決まるのではないだろうか。という仮説に基づいて見てみたのが下の図です。

f:id:shokosaka:20180823104734p:plain

これはとても重要な図なので、各自暗記するようにしてください。ここからは雨予測に必要不可欠な情報が読み取れます。

水色のラインは風速が弱め(0~10m)のとき、青色のラインは風速が強め(10~20m)のときを表しています。軸の数値は、実際に雨が降った割合なので、ラインが外に張り出しているほど雨が降る確率が高いことを示します。

このチャートによると、風速に関わらず、風向きが北北東、北東、東、東南東のときは雨が降る確率が高いようです。また、風速によって傾向が異なる風向きもあります。たとえば、北北西では風速が弱いほうが雨が降りやすいのに対して、南南西では風速が強いほうが雨が降りやすいことが分かります。分布を確認してみましょう。

f:id:shokosaka:20180823104807p:plain

北北西からは、風が強く吹けば吹くほど翌日雨が降りにくいのに対して、南南西からは、風が強く吹くほど翌日の雨の可能性が高まります。

つまり、仮説は正しかったわけです。突風が吹く風向きだけでは雨を予測することはできません。風向きは風の強さとセットで考えなければいけません。

まわりにもし、突風が吹くだけで雨が降りそうだと思ってしまう人がいればチャンスです。強い突風が吹いたとしても、風向きが北北西だと分かれば、

「逆に明日は晴れそうじゃん」

とつぶやけば、一線を画することができるでしょう。

ランダムフォレストの変数重要度によると、雲量や湿度も重要のようです。

ここで知っておきたいのは、変数同士の相関関係です。変数重要度の高い平均雲量、日照時間、平均相対湿度には相関がありそうです。確認しておきましょう。

f:id:shokosaka:20180823104903p:plain

正の相関が強い関係を濃い青、負の相関が強い関係を濃い赤で表示しています。

やはり思ったとおり、日照時間と平均雲量には負の相関(-0.78)が、平均雲量と平均相対湿度には正の相関(0.64)があります。最大瞬間風速はあまり他の変数との相関は見られないので、独立していると考えられます。

ちなみに、蒸気圧と平均気温に非常に強い相関(0.94)があるのは、蒸気圧が気温の関数になっているためです。蒸気圧が高いときに気温が高くなるのではなく、逆の因果関係になっていることに注意しましょう。

雲量がどの程度あれば雨が降るのか、湿度がどの程度高ければ雨が降るのか、知る必要がありますので、それぞれの分布を確認してみます。まずは雲量から。

f:id:shokosaka:20180823104940p:plain

雲量が9割を越えると、急激に雨の確率が上がります。これは大切な情報ですが、かっこいい雨予測をするにはやや不都合ですね。曇りの日に「明日は雨だな」と言っても、あまりインパクトはありません。

次に湿度です。

f:id:shokosaka:20180823105002p:plain

確かに湿度が高いほど雨が降る確率が増すようです。雲量よりは、湿度で予測したほうがかっこよさはあります。雲量はパッと見て誰にでも分かる兆候なのに対して、湿度を感じるには、少し訓練が必要だからです。グラフを見ると、70%を越えると雨が降る確率のほうが高まります。70%よりも高いかどうかを感じられるようになっておきましょう。

それでは、これらの情報で、どの程度降水を予測できるのでしょうか。精度を検証してみます。

以下は、実際の降水有無と、今回作成した予測モデルでの予測との比較です。

実際に雨が降った
実際に雨が降らなかった
雨が降ると予測
114
79
雨が降らないと予測
231
724
合計
345
803

まず、実際に雨が降った割合を見ると、全体の30%(=345/(345+803))です。つまり、何も考えずに運任せで翌日の降水有無を予測したときに当たる確率は30%です。一方、この予測モデルを使って雨が降ると予測した場合、当たる確率は59%(=114/(114+79))です。約2倍も当たる確率が上がりました。これは素晴らしいですね。

しかし、残りの41%は外れてしまうということに留意しましょう。今回の趣旨を考えると、翌日に雨が降るのに降ると予測しない(降らないと予測してしまう)ことよりも、かっこつけて「これは、、来るぜ!」と予測しながら実際には降らないリスクのほうが大きいはずです。

このあたりを考慮して、そのリスクを軽減し、確実に雨が降るときに予測できるモデルにするためにチューニングする必要はありそうです。

3.風向きの変化がもたらす影響

ベースモデルとしては、わりといい精度で、体感で翌日の降水有無を予測できることが分かってきました。しかし、もっと精度を高めたいですよね。

一般に、機械学習モデルの予測精度を高めるためには大きく分けて以下の3つの方法があります。

① データサイズを大きくする
② より精度の良いアルゴリズムを探す
③ 予測精度を上げる特徴量を探す

いま、我々がしようとしていることは、モデルを構築して予測させることではありません。我々がしたいことは、「体感で雨を予測すること」です。

そのためには、③予測精度を上げる特徴量を探すのが最適なアプローチでしょう。特徴量とは、予測するための材料です。

今回、最大瞬間風速の風向きが最重要であることが分かりました。また、風向きで雨を予測するのはかっこいいことも明らかです。そこで、風向きをさらに深掘りしていきましょう。

ここで私は一つの仮説を立てました。

風向きが変わるのは雨が降る前兆なのではなかろうか

ありそうじゃないですか。雨が降るときは、風向きが安定していないイメージあるじゃないですか?しかも、風向きが変わったことで雨を予測するのは相当イケてます。この仮説が真実かどうかを検証していきましょう。

最大瞬間風速の風向きが前日と今日で変わった場合に、翌日に雨が降る確率が変わるのかどうかを検証します。

風向きが変わる、といっても、さまざまです。風向きが北西から北北西に変化するのと、北西から南東に変化するのでは変化の度合いが異なります。そこで、変化の度合いを数値化する必要があります。

ここでは、角度を扱うので、極座標(r, θ)を使うのが便利でしょう。動径(r)を1で固定して、東を(1, 0)として、それぞれの方角に極座標を割り当てます。

f:id:shokosaka:20180823105107p:plain

これで、前後の風向きの極座標から円弧を求めることで、風向きの変化を数値化することができるようになりました。例えば、風向きが北北東(1, 3/8π)から西北西(1, 7/8π)に変化した場合、その円弧は単純に偏角(θ)の差分を取って4/8πとなります。

高校数学はとても役に立ちますね。

動径(r)を風速、偏角(θ)を風向きにして、座標間の距離を特徴量にすればいいのでは、と思う方もいるかもしれませんが、そのアプローチを取ると、風速が弱まったときと強まったときが見分けられないなどの不具合が出るため、今回は風向きの変化だけを極座標で数値化します。

2日前と1日前の風向きの違いを極座標から求める円弧と定義し、その円弧の長さが翌日の降水有無にどれほど影響があるか見てみました。

f:id:shokosaka:20180823105143p:plain

あんまり効いてへんがな!(下から5番目)

どうやら、あんまり効いていないようです。(下から5番目)

「せっかく新しい特徴量を作ったのに、残念な結果だ。。」と思いましたか?確かに重要度が高ければ予測精度を上げることができましたが、「あまり効いていない」ということが分かったことに価値があります。

これが分からなければ、「風向きが変わることが降水確率に影響しているかも」という間違った仮説を持ったまま生きてしまうところでした。データ分析は、仮説を検証するための手段です。無数の仮説から、正しい仮説と間違った仮説を仕分けなければ、何が正解なのか分かりませんし、何が正解なのか分からなければ、意思決定できません。

仮説が間違っていることは、データで確認すべき重要な事実なのです。

まとめ

通常は、勘や経験則に基づく意思決定や予測からの脱却のためにデータ分析を活用することが多いですが、今回、データ分析により、あたかも勘や経験則に基づくかのように予測をすることを可能にしました。これは画期的なのではないでしょうか。

AIがなんでもかんでも予測してくれるこのご時勢、AIに頼らなくても生きていける人間を目指して頑張りましょう。