【DataRobot】せっかくなので気象データを使って分析してみた（光化学スモッグ予測）

#はじめに

この記事は、[機械学習の自動化プラットフォームDataRobotを使って楽しむ冬のイベント予測チャレンジ 【PR】 DataRobot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/datarobot)の投稿記事です。

こんにちは、運良く仕事でDataRobotを使っているsatromiです。
普段は、[キーボードのこと](https://landfilljp.wordpress.com/2020/12/10/advent2020/)や[自作キーボードのこと](https://landfilljp.wordpress.com/2020/05/24/tron/)しか書いていませんが、せっかくのAdvent Calendarなので、DataRobotについて書いてみたいと思います。

DataRobotは、これまで業務分析とかデータ分析に困っていた人にとって、プログラミングせずにすぐ結果を出せるのが素晴らしく、会社でも使ってくれている人が増えています。DataRobotを広める立場だったので、嬉しい限りです。
何か起きた時に当たりをすぐに付けたい時、実績データを残しているデータベースのテーブルさえまともなら、ダウンロードしたデータそのままで分析して、まずはすぐに結果を得た上で、さらに深い分析もしていけるのが素晴らしいところだと思います。
これまで、実績データを無理矢理Excelや統計解析ツールで時間をかけて解析していたのに比べると、凄い進化です。

#今回のお題の年末年始に関係するデータで、気象データを使ってみたい

さて、今回のお題が年末年始のイベントや風物詩に関係するモノについてテーマを決めてと言うことだったので、冬の寒い季節に何か関係したデータで分析してみたいと思いました。
冬の寒さに関係、相関がありそうなデータというとなんでしょうか？
気象データで、気温やらと関係があるデータなら良さそうです。

気象データは、機械学習（もちろんDataRobotでも）を使えば、アイスやビールといった季節性商品の売れ行きが予測できる！といった話は良く聞きます。
実際、[気象ビジネス推進コンソーシアム](https://www.wxbc.jp/)では、気象庁、気象事業者だけでなく関係する産業界や学識経験者など、産学官の連携組織で気象データを活用した新たなビジネス創出に向けて、検討が進められています。

##気象データの難しさ

ただし、気象データを使う場合に困るのが、本当に欲しい自分が予測したいポイントでのデータを貯めていないし、予報（予測データ）も得られないと言うことがあります。

例えば、夏場アイスが売れるからと気温を使って予測しようおうと思っても、得られる天気・気温・湿度・風速といったデータは30km先のデータだったりします。
簡単に無料で得られるデータは、気象庁の気象観測所（アメダスで有名）のデータであることが多いので、日本に1300箇所程度あるとは言っても、そのデータが本当に使えるのか？というところがポイントになります。
そのため、距離が離れていればもちろんのこと、距離が近くても高度や場所（沿岸、内陸、山間部）が違うことで、あまり寄与度が高くないデータしか得られないことがよくあります。

また、仮に温度を得たい場合でも、サービス業の場合、店舗が商業施設などの大きな建屋内にあって室温が制御されていたり、製造業の場合、工場・設備の温度が気温と大きく異なっていたりということがあるため、温度を予測で用いたい場合に単純に気温の予測値を持ってきても、使えないことが多々あります。
かと言って、設備での温度データを取得するとなると、IoTの仕組みで安価にできるとしても、電源や耐久性（防水・温度）、データ蓄積期間と蓄積場所、データ伝送含めて難しいのが現状です。

以前、海洋に関連したデータ分析をしたこともありますが、海洋の場合は観測ポイントがさらに限られてくるので、地点誤差が大きいけれど実測値をベースにモデルを作るのか、地点誤差は小さくできるけれど数値予報モデルの計算誤差がある前提で数値予報モデルの計算値をベースにモデルを作るのか、非常に悩んだ経験があります。
結局、海洋の場合、沿岸に近くなるほど地形の影響を受け、局地的な傾向が大きくなるので、実測値は諦めて数値予報モデルのデータを使いました。

このように、本当に寄与度の高いデータなのか？寄与度がある程度高かったとしても、もっと直接的に説明するデータが今見ているデータの他に無いのか？原理的・物理的、はたまた経験則からもっと良い項目は無いのか？足りない項目は無いか？と言ったことを考えた上で、さらに予測する場合に使用するデータに誤差が大きい値が無いか？と考えてみることが重要です。

#
#【小ネタ】データ分析を＊＊ツールでやってみましたネタ、よくある競馬の事例で不足していること

データ分析試してみた系のネタに、よく競馬を当ててみようと思いましたと言うネタがありますが、データ取得しやすいデータがレース結果しか無く、レースの結果に影響が大きそうな、競走馬のコンディションに関わる馬体重の増減含めた体調、気象データ、騎手に関するデータ（直近の勝率、得意なレースの傾向）といったデータは使われていません。そらやってみたと言う結果だけで、当たらないわーという結果になってしまいます。
試しにやってみただけなので良いのかもしれませんが、やはりきちんと予測に寄与する項目を入れることが重要です。

データ分析する対象について、業務知見や物理法則や物理モデル、どう成り立っているか理解していないで（もしくは理解していても、寄与度の高いデータをきちんと取得しないで）データ分析すると、ろくなことになりません。

#何をテーマにするか？

さて、話を戻して、寒さに関係あるデータを探して、データ分析してみましょう。となると良いのですが、会社で扱っているデータは出せませんし、なかなか寒さや冬と相関がある、オープンデータが無いか色々探してみました。

冬は雨が降らないので、ダムの水位データなんて良さそうだなと思ったんですが、足下1週間程度のデータは参照できますが、モデル作成出来るほどのデータは取得できませんでした。
やはり、気象に相関するデータは、データの収集がネックになることが多いです。

こんな、デモ事例を紹介する時に便利なのが、[オープンデータカタログ](https://www.data.go.jp/)で、今回は[東京都のオープンデータカタログ](https://portal.data.metro.tokyo.lg.jp/)から探してみました。
※仕事でオープンデータカタログ使うことはめったに無く、あるデータ項目から寄与度の高い項目を得られるか？業務知見から寄与度が高いと想定されるけれど収集していないデータは、どうやって収集するか？と言うところから始まるので、

#光化学スモッグの予測をしてみよう

[東京都のオープンデータカタログ](https://portal.data.metro.tokyo.lg.jp/)から、[港区の大気汚染測定データのデータ](https://catalog.data.metro.tokyo.lg.jp/dataset/t131032d0000000013)が見つかったので、光化学スモッグの予測をしてみることにしてみました。
光化学スモッグであれば、『夏場、暑くて良く晴れた日に光化学スモッグは発生する』ということもよく知られていますが、『冬、よく晴れた日に光化学スモッグが発生する』ということも都心部なら良くあることなようなので、今回のテーマにも相応しそうです。
と言うことで、今回は港区の大気汚染測定データを使って、光化学スモッグの発生予測（実際はオキシダントの濃度予測）をみることにしました。
冬の発生予測に限定してしまえると良かったのですが、傾向的にオキシダントの月平均は4～6月がダントツだったので、玉虫色な感じですが例題ということなので許してください。
季節性の高いものなので、1年通して当てられるモデルができるでしょうか？
こういう場合、季節ごとにモデルを作るというのも有りかもしれませんが、時間も無いので通年モデルにしてみます。

#データと発生理由の把握

港区内の地点別に、測定地点での大気汚染（二酸化硫黄や一酸化窒素、PM2.5など）データが含まれており、気温や湿度、風向・風速も含まれています。
本来であれば、天気（特に降雨量）や、雲底（雲底が低い≒空気が対流する高度が低い）も相関がありそうなので、取得したいところですが、今回はAdvent Calendarの記事なので勘弁してください。

今回のテーマは、冬ということなので光化学スモッグの冬の特徴を調べてみました。
[船橋市の環境ページ](https://www.funabashi-kantele.jp/taiki/smog/about/)によると、下記のような特徴があるそうです。
>夏の光化学スモッグの場合
>「強い日差し」「高温」「風が穏やか」この３つの条件がそろうと発生します。
>このような条件がそろい光化学スモッグが発生する期間は主に4月～10月と長いのですが、特に連日強い日差しと暑くなる夏を中心に発生頻度が増えます。

ということなので、「日照時間や気温、風向・風速」が影響しそうです。

今回のテーマは冬ということなので、冬について調べてみました。

>ダストドームは、大気汚染物質が地表付近にドーム状に閉じ込められ停滞する現象です。
>風が弱い夜間に郊外で接地逆転層が形成されると冷たい空気層がふたをした状態となり、郊外よりも気温が高い都市内部にヒートアイランド循環が発生し、高濃度汚染になります。

と、郊外の逆転層（空気の蓋になるところ）の高度が地表近くで、都心部の気温が高い（≒気温差がある）と都心部が高濃度汚染になるようです。[気象予報士の方の記事を読むと](https://news.yahoo.co.jp/byline/nyomurayo/20171110-00077959/)、逆転層を把握できるエマグラムや郊外との気温差、露点温度、地表温度といったデータに相関がありそうです。本当は、ここら辺のデータを取得した方が良いのですが、今回は測定データに含まれる、風向・風速、気温、湿度といったデータのみ利用しています。

##データの取得・加工について

このデータでは、港区の測定データの中に既に気温や湿度、風向・風速がありましたが、気象データが無い場合に取得する方法を紹介します。

まず、ピンポイントでないデータなら、気象庁の[過去の気象データ・ダウンロード](https://www.data.jma.go.jp/gmd/risk/obsdl/index.php)のページからダウンロードできます。
とは言っても、この記事の最初で地点誤差が…と言っておきながら、それだけではしょーもないので、気象庁の数値予報モデルのデータを使う場合にどうすれば良いか紹介します。

業務で利用した場合は、[気象業務支援センター](http://www.jmbsc.or.jp/jp/)から過去データを購入することができます。当方は、若干面倒ですが購入したことがあります。
足下は、気象庁がデータ提供していますが、昨年度はFTPから取得も出来ましたが、[今年度の提供方法を読むと](https://www.jma.go.jp/jma/press/2009/25b/2020_past_data.html
)、AWSのアカウントがあってS3からコピーする必要があるようなので、ちょっとハードルが高いかもしれません。

数値予報モデルのデータは、[wgrib2](https://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/)というツールがあり、このツールを使用すると、数値予報モデルのデータをcsv化することができます。
ただし、数値予報モデルのデータは、バイナリ形式でコンパクトとはいえ1ファイル数十MBあったりするので、むやみやたらとcsvに吐き出すと数十MBどころじゃないcsvファイルが出来て、その後加工するのが大変になります。
出力したデータは、データベースにいったん保管してやるのが一番なのですが、さすがにそこまの話はここでは割愛します。

csvデータも量が多くなるとExcelで結合するというのが辛くなるので、Pythonを使うか、DataRobot Data PrepのようなDataPrepツールを使うかして頑張りましょう。
これまで、SPSSやKnime、TableauPrepといったツールを使ってみましたが、DataRobot Data Prepは、DataRobotと連携できるので便利だと思います。

#DataRobotを使ってのデータ分析
2010年から2019年までのデータがあったので、2010～2018年のデータを学習用データとしてみました。
データには、"点検"や"校正"という文字で欠測値があったり、数値で"9995"とあったりしたので、前処理ではPython・Excelで加工して確認しました。

今回、測定データには下記項目がありました。
二酸化硫黄[ppb]、一酸化窒素[ppb]、二酸化窒素[ppb]、窒素酸化物[ppb]、オキシダント[ppb]、一酸化炭素[0.1ppm]、ノンメタン炭化水素(非メタン9[0.01ppmC]、メタン[0.01ppmC]、浮遊粒子状物質[μg/立方メートル]、PM2.5[μg/m3]、風速[0.1m/s]、風向、温度[0.1℃]、湿度[%]、THC[0.01ppmC]

光化学スモッグは、窒素酸化物や炭化水素が太陽の紫外線で反応し、光化学オキシダントという物質が生成され、高濃度になった場合もやのようになるので、[光化学スモッグと呼ぶ](http://taiki.kankyo.pref.osaka.jp/taikikanshi/smog/what_smog/index.html)そうです。

測定データにも、オキシダントという項目があるので、こちらを当てれば良いようです。

##DataRobotでデータ比較し分析点を決定

まず、データの傾向を見てみます。とりあえず、データ加工する時にもExcelで見たりもしたのですが、DataRobotのデータ画面のヒストグラムで見た方が傾向を把握しやすいので、最近はDataRobotでデータの傾向を見ることが多いです。
できるだけ、光化学スモッグが多い場所が良かろうと、港区の測定点からトラックの交通量が多そうな一ノ橋・芝浦・港南を抜き出して、どの測定点が多いか見ました。

![ichinohashi_2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/1f79b6a1-eb11-187a-fc5d-7a52ac0efa09.png)
![shibaura_2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/f6a28757-1b0d-8871-aca3-d22411a8637b.png)
![kounan_2019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/9278b3f1-4026-500b-353e-ca7ff45721c8.png)
結果、意外なことに一ノ橋が一番オキシダント濃度が40ppbを超える回数が多かったので、こちらのデータを分析してみます。

##一ノ橋データの確認

とりあえず、DataRobotでデータを確認してみると、リニアな相関がありそうだった炭化水素や窒素酸化物を見てみると、単純に炭化水素や窒素酸化物の濃度が高くなったからと言って、オキシダント濃度が高くなるのでは無く、逆に負の相関が見られました。

![datarobot_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/96a0f01b-d674-5851-23b0-26acd79c7437.png)

![datarobot_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/bccc9ef9-1e6e-5afc-c53e-5f2bf7e439a3.png)


また、風速についても風が吹かずに滞留した方が濃度が高くなると思いきや、風がある方が高くなっています。一ノ橋のあたりは周囲に丘に囲まれた地形なので、風が吹くとオキシダントが運ばれて来るのかもしれません。
気象データの場合、観測点の地形効果も大きいため、観測点と予測したい場所が近くても、地形が違ったりすると顕著に違う（特に風）なので、注意が必要です。

![datarobot_wind.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/f6854fc5-0bd6-389b-1285-3b416b400d6d.png)

曜日や温度の特徴が顕著で、休日である土日は極端にオキシダント濃度が高く、温度も30度を超えると発生しやすいということが分かり、交通量と温度により発生しやすくなるという知見と適合しそうです。日付で見ても、一般的に忙しいと言われる五十日や月末が多くなっています。

![datarobot_week.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/4c54a06a-5843-fe3c-804c-445691a99ac3.png)
![datarobot_temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/cc94b374-6b7a-c16c-ae1f-3a2dc7150f1b.png)
![datarobot_date.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/ac9e374b-ba14-21da-b4d4-c5889e440a78.png)

##モデル作成について

本来であれば、時系列データなので時系列モデリングすべきなのですが、今回は会社の環境が使えず、DataRobotのトライアル環境でモデル作成したため、データ加工で工夫して凌ぎます。
※DataRobotさん、時系列モデリングをトライアルさせてもらえたら、クリスマスまでには時系列モデリングでの結果を載せます！
1行ごとに1hr前、3hr前、6hr前のデータを加えてやることである程度予測しやすいようにします。


#モデル作成結果
今回、1hr後の予測であればある程度予測しすいということで、3hr後の予測が可能かを主に試しています。
一番良さそうだったのは、Light Gradient Boosting on ElasticNet Predictionsになりましたが、RMSEで7.5598となっており、ある程度傾向も捉えられているので、DataRobotで気象データを使ったモデル作成をまずやってみるには十分な精度だと思います。

![datarobot_model_elasticnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/9273c10b-37cc-6146-6e83-a16aa44c6be4.png)

1hr前のデータで予測するとある程度傾向が追えるようですが、3hr・6hr前のデータのみで予測してみると、冬場はある程度予測できていますが、初夏の一番光化学スモッグが発生しやすいシーズンは予測しづらいようです。

##2019年データでの予測

モデルとしてはできましたが、きちんと未来方向の予測ができるのか、2019年データにて検証してみました。

![datarobot_prediction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930386/2c4cbe6a-7911-f67b-5657-f50787a43cf9.png)

誤差はありますが、傾向的には予測できているようです。ピークについては初夏の極端にオキシダント濃度が高まる状況を予測し切れていませんが、時系列モデリングで再度モデル作成し直せば、きちんとピークも予測できると思います。
また、現状の手法でも、1hr後の短時間予測で精度を担保したり、下記のような追加検討事項でモデルを再作成することで、実用可能な精度は担保できるのでは無いかと思います。

#（実際のデータ分析の場合）追加検討事項について

本当であれば、ここからさらに特徴量の絞り込みや新規データ項目追加検討をした上で、モデルの再作成を行っていきます。今回やった範囲は、データ分析する上でデータについて知見を付けて、当たりをつけた状態までになっています。
今回は、Advent Calendarネタということもあり、データの取得・加工の時間が短かったため、冬の光化学スモッグ発生の原理である、都心部の気温が高く郊外の気温が低いことで逆転層が下がり、都心部の空気が閉じ込められてオキシダント濃度が上がるという事象に寄与するデータは含められませんでした。
ここら辺については、実際に追加検討する場合（や時系列モデリングで追加検討する機会があれば）、郊外（八王子あたり）と港区の気温差など、より発生に寄与しそうなデータを追加して検証していく流れになると思います。
また、先に調べてみたように、エマグラムのデータで逆転層に寄与する空気が対流する高度を把握したり、天候・降水量からもある程度分かることがありそうなので、こういったデータも追加していく必要がありそうです。

また、時間が限られていたので単一測定点のみの分析でしたが、複数測定点での傾向を見るなどして、分析モデルの精度を向上していくことが可能だと思われます。

#終わりに

気象データを使った分析事例はなかなか無いので、これまでにも何らかの事例を紹介してみたいと思っていました。
今回、オープンデータとDataRobotを組み合わせて分析してみましたが、やはりデータの取得から加工、モデル作成（と今回やってないけどAutoMLによる実業務適用まで）まですぐに出来てしまうDataRobotは凄いです。
今回のデータ分析・モデル作成も、DataRobotのおかげで数時間である程度のことができました。

この記事を読んでもし興味を持って貰えたら、まずはトライアル利用を申し込んで、オープンデータを使ってデータ分析してみると良いかもしれません。既存ユーザとしても、事例・適用先が広がるのでDataRobotユーザが増えてくれることを期待しています。