おはようございます
今日はGoogle Cloud PlatformのBigQueryと言うサービス上で、無料で公開されている新型コロナウィルス感染症(COVID-19)のデータセットと、DarkSkyと言う気象サービス(3月31日にAppleのメンバーになったようです)のDailyの過去データから、「絶対湿度」を計算して、グラフ化してみて、COVID-19罹患者数などと絶対湿度との間に相関があるかを確認してみたいと思います。
BigQueryの「COVID-19一般公開データセット」
まずはこちらを参照してください
COVID-19 一般公開データセットプログラム: より優れた成果を目指して自由にアクセス可能なデータを提供
GoogleさんはBigQueryというサービスの「一般公開データセット」という形でCOVID-19のデータを提供しています。
「Google Cloud Platformを使ったことがない」という方にも、「BigQueryサンドボックス」という形で利用することによりクレジットカードの登録なしで、月に10GBのストレージと1TBまでのクエリを無料で利用できるようです。
詳しくはこちらの説明を読んでください(英文です)
About COVID-19 Public Datasets
初めて使う方でも無料で利用できるのでこの機会に是非利用してみてください。
SQLでデータベースを使ったことがある方なら難なく利用できると思います。
(BigQueryのレスポンスはめっちゃ高速なのでクエリの時間もほとんどかかりません)
日本の罹患者数、死者数、回復数、アクティブ数などを取得してみる
私は、元々Google Cloud Platformのサービスを利用していたので、GCPの無料枠(Always Free)で1TBのクエリと10GBのストレージは利用できるので、その枠内でやってみたいと思います。
(結局クレジットカードを登録しても、Always Free枠内で利用できる内容が多いので、この際GCPに本格的に登録してみるのもアリかもです。12 か月間 $300 分無料トライアルクレジットもついてきますし。)
Google Cloud の無料枠
では本題
まずは、GCP内でプロジェクトを作って、そのプロジェクトを選んだ状態でConsoleからBigQueryのサービスを選んで、「データを追加」→「プロジェクトを固定」で「bigquery-public-data」と入力して「PIN(固定)」してください。
今回は、bigquery-public-data内のcovid19_jhu_csseデータセットを利用します。
covid19_jhu_csseデータセットの中のsummaryを利用するので、コンソール上でsummaryを選んでプレビュー してみます。
「Japan」のデータも見れています。
では、上のQueryの入力欄にSQLを書いてみます。
select * from `bigquery-public-data.covid19_jhu_csse.summary` where country_region = "Japan" order by date
まだクエリは実行しないでください。
クエリエディタの右下に、「このクエリを実行すると、10.2 MB が処理されます。」などと書かれています。クエリ実行前にクエリが処理するデータ量が示されます。この数値が1ヶ月合計で1TBを超えないように利用してください。毎回クエリ実行前には注意してください。
10.2MBなので充分余裕があるので実行してみます。
こんな感じで実行結果が表示されます。
結果は「保存」から、私はGoogleスプレッドシートに保存しました。
結果のスプレッドシートからグラフを作ってみる
こんなスプレッドシートができたので、日付を横軸にした折れ線グラフを作ります。
date,confirmed,deaths,recovered,activeの列を選んで、「挿入」→「グラフ」
グラフを個別のシートに移動しましょう
グラフの右上の3点ボタンを押して「個別のシートに移動」を選びます
簡単ですね
DarkSky APIより東京観測点のDaily過去データを得る
GCPのBigQueryの一般公開データセットに気象データを保存しているデータセットはあるのですが、「絶対湿度」を計算するのに必要な、「気温」と「湿度」のうち「湿度」を保存しているデータセットが見つけられなかったので(多分あると思うのですが私がよくわからないだけだと思います。。。)、APIを公開している一般の気象情報サービスから「気温」と「湿度」の情報を得たいと思います。
3月31日付でAppleのメンバーになったDarkSkyなどは、私はよく利用していて、APIを叩く為のSECRETキーなども既に取得しているので、そこを利用したいと思います。
DarkSky
DarkSky Tokyo, Tokyo Prefecture
こんな感じでブラウザからも利用できますが、このサービスのAPIをGoogle Apps Scriptから叩いて、Googleスプレッドシートに「日付」「気温「湿度」などを取得したいと思います。
DarkSKy API
Dark sky
こちらの画面のblogにあるように、Appleのメンバーになった関係で、現在一時的に新たなAPIのアカウントの追加を停止しているようです。すぐに追加可能になるようなので、動向を見守りましょう。
では、新たなアカウント追加も現状できないので、細かい説明は省いてささっとGoogle Apps Scriptのコードを示します
var prop = PropertiesService.getScriptProperties(); // SHEET_NAME,SECRET,LATITUDE,LONGITUDEプロパティに登録しておく var sheetName = prop.getProperty('SHEET_NAME'); var secret = prop.getProperty('SECRET'); var Latitude = prop.getProperty('LATITUDE'); var Longitude = prop.getProperty('LONGITUDE'); function myFunction() { // シート取得 var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId()); var sheet = ss.getSheetByName(sheetName); // Dateオブジェクトを作成 var d = new Date("2020-01-22 00:00:00"); // UNIXタイムスタンプを取得する (ミリ秒単位) var a = d.getTime(); // UNIXタイムスタンプを取得する (秒単位 - PHPのtime()と同じ) var datetime = Math.floor( a / 1000 ); //var datetime = "2020-01-22T00:00:00" //DarkSky API 呼び出し var requestUrl = "https://api.darksky.net/forecast/"+secret+"/"+Latitude+","+Longitude+","+datetime+"?lang=ja&exclude=minutely,hourly,currently&units=si"; Logger.log(requestUrl); var response = UrlFetchApp.fetch(requestUrl); var jsonString = response.getContentText(); var jsonStr = JSON.parse(jsonString); Logger.log(jsonStr); var latitude = jsonStr.latitude; var longitude = jsonStr.longitude; var time = jsonStr.daily.data[0].time; var timezone = jsonStr.timezone; var offset = jsonStr.offset; var summary = jsonStr.daily.data[0].summary; var icon = jsonStr.daily.icon; var temperatureHigh = jsonStr.daily.data[0].temperatureHigh; var temperatureHighTime = jsonStr.daily.data[0].temperatureHighTime; var temperatureLow = jsonStr.daily.data[0].temperatureLow; var temperatureLowTime = jsonStr.daily.data[0].temperatureLowTime; var temperature = (temperatureHigh + temperatureLow)/2; var dewPoint = jsonStr.daily.data[0].dewPoint; var humidity = jsonStr.daily.data[0].humidity; var abhumidity = 217*(6.1078*10**(7.5*temperature/(temperature+237.3)))/(temperature+273.15)*humidity; var pressure = jsonStr.daily.data[0].pressure; var date = new Date(time * 1000); var DateTime = Utilities.formatDate(date, 'JST', 'yyyy年M月d日 H時m分'); sheet.appendRow([latitude,longitude,timezone,offset,DateTime,summary,icon,temperatureHigh,temperatureHighTime,temperatureLow,temperatureLowTime,temperature,dewPoint,humidity,abhumidity,pressure]); }
基本的にはこんな感じで、1/22から4/9までのデータを取得するように手を加えました。
コードを見てわかるように、1日の平均気温項目がないので、(最高気温+最低気温)÷2を計算して「気温」として「湿度」と「気温」から「絶対湿度」を計算しています。
「絶対湿度」と罹患者数などの相関
絶対湿度のデータをスプレッドシートに貼り付けて、グラフ化します(グラフで見やすいように、絶対湿度の値を100倍します)
グラフの赤丸で示したポイントあたりで、「絶対湿度」が高かった数日後に、「罹患者数」の伸びが緩やかになっているような状況が見て取れるような気がします。
しかし、日本中の罹患者数データ総計の伸びと、東京新宿観測点の「絶対湿度」との関係なので、若干相関に疑問も生まれます。
政府機関や医療専門家チームの方々においては、この「絶対湿度」と「罹患者数」の相関を各地方毎に見るような分析もしていただきたいと思っています。
よろしくお願いいたします。