日本の感染者数予測グラフをGitHub Actionsで自動更新する仕組みを作った知見を共有します

日本がCOVID-19の対策に失敗した場合、感染者が指数関数的に増えていくことが予想されます。
どの程度の速度で増えるかを把握することは、リスクの低い行動を促すのに有効だろうという仮説を立てて、感染者数の増加具合を予測するグラフを作りました。

感染者予測グラフ
https://kmdsbng.github.io/COVID-19/

<img width="1025" alt="スクリーンショット 2020-04-06 8.59.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529/3dbedec7-280c-3583-9557-7370415cc733.png">



仕組みは簡単です。これまでに爆発的に感染者が増えた国の感染者数推移データを使って、それらの国が今の日本の感染者数と同じ時からどの程度感染者が増えたのかを、日をずらしてプロットしただけです。




* JSでグラフ書くのはHighChartsが良いという情報だけ仕入れて、サンプルプログラムを元にデータ元のCSVだけ差し替える形で実装しました。データさえ与えたらいい感じにインタラクティブなグラフを書いてくれるのでHightChartsすげー、と思いました。使い込んでないのでメンテ性がいいかはよくわかりません。でも良さそう。
* https://github.com/CSSEGISandData/COVID-19 で公開されている各国のCOVID-19感染者数CSVを元に、グラフ描画用のCSVを生成しています。
* 毎日データを自動更新します (GitHub Actionsを使っています。)


# グラフからわかること、感じたこと

* アメリカは日本と同じ感染者数3,000人から20日で100倍の300,000人にまで増えてて、感染者数だけを見るとヤバいヤバいと言われていたイタリアの3倍くらい多い。ただし、死亡者数はイタリアのほうが多いが、このグラフではそれはわからない。 (参考: Coronavirus COVID-19 Global Cases https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6)
* 感染者数が爆発した国でも、増え方に差がある(イラン:3万人〜アメリカ:30万人)。ただ、すべての国で指数関数的に感染者数が増えることは共通している。
* 日本は感染者数が抑えられてると思っていたが、現状、他国より20日程度遅いだけであることがわかる。

# グラフで達成したかったができなかったこと

富士山に比べての世界中の火山の規模がヤバいの動画とか、宇宙の星の大きさがヤバい動画みたいに、「今の日本の感染者ヤバいなー」というところから始まって「あ、ヤバいと思ってた規模の100倍くらいやばかった。マジでリスク対策せにゃ」とみんなが感じるような図にしたかったんだけど、いまいちそれがわかりにくい図になってしまった。

実際日本の件数だけをプロットすると、エグいスピードで感染者数は増加してますが、

![スクリーンショット_040620_073456_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529/da2ebc8a-a35e-2133-5707-1442158820f9.jpeg)

他国の件数と一緒にプロットすると、日本の件数の増加は全然わからなくなってしまう。
当然ながら、これは日本がまだ大丈夫ということを示しているのではなく、日本の対策がうまくいかなければ他国と同様の感染者推移をたどる、十分起きうる20日後のシナリオです。

もっとわかりやすく図示するために、最初に表示したときには期間を短く表示して、どんどん表示期間を長くしていけるなどするともっと事態のヤバさがわかりやすくなる気がするが、HighChartsでそういうことができるのかわかってない。

あと今日がどこかがわかりにくいので、わかりやすくできるとよかった。

# GitHub Actions でデータを自動更新する処理の実装手順

GitHub Actionsでデータ自動更新している個所の作成手順を共有します。

リポジトリ: https://github.com/kmdsbng/COVID-19

![スクリーンショット_040620_075107_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529/d74104fc-fca5-dd98-82f3-becf2b13fe4b.jpeg)
Actionsタブ -> New workflowボタンとたどります。

![スクリーンショット_040620_080426_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529/d2ab7e9a-0ae6-1d56-7c66-9f70a369e906.jpeg)
今回はActionsからRubyを実行したかったので、Rubyのworkflowを見つけて「Set up this workflow」ボタンをクリック。

すると .github/workflows/ruby.yml という名前のyamlファイルの編集画面に入ります。
https://github.com/kmdsbng/COVID-19/blob/master/.github/workflows/ruby.yml

今回は1日1回更新したかったので、on: の中身を定期実行するように修正。

```yaml
on:
  schedule:
    - cron:  '0 22 * * *'
```

あとは jobs: build: steps: の中に実行したい処理を書いていく。
今回の処理でのデータ更新は、fork元のリポジトリをgit pull することで行います。
いくつかのコマンドを連続で実行するとき、stepを分けたほうが、エラーが発生したときにどこで失敗したかわかりやすくてよかったです。

```yaml
    steps:
    ...
    - name: git checkout master
      run: |
        git checkout master
    - name: git config
      run: |
        git config --global user.email "kameda.sbng@gmail.com"
        git config --global user.name "update csv"
    - name: git fetch
      run: |
        git remote add src https://github.com/CSSEGISandData/COVID-19.git
        git fetch src
    - name: git merge
      run: |
        git merge --allow-unrelated-histories -m 'merge data' src/master
```

このようにstepを細かく分けておくと

![スクリーンショット_040620_082752_PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529/3ea653fa-6ded-65d4-9ba2-8f1e1bf542fd.jpeg)

ログがコマンドごとに分かれて出てきていい感じです。

最後に変更をコミットして、終了です。

ご参考まで。

# 最後に

COVID-19の感染者を抑えるためには国民の行動変容が必要だと思います。

行動変容施策が重要な理由は、外部からの介入よりも、当事者が自ら行動するほうがずっと強力だからです。政府からの給付金より、ビル・ゲイツのワクチン開発より、我々の意識、行動が変わることのほうが大きなインパクトがあります。

なので、リスクの少ない行動を心がけ、自分の周りの人に行動変容の大切さを伝えることを続けていきましょう。

先週末からCOVID-19対策に関して大きな動きがいくつかありました。

行動変容の促進にとって大きな前進は、コロナ専門家有志の会のサイトが立ち上げられたことです。

https://note.stopcovid19.jp/

コロナウイルスに不安を感じる人に相談されたら、このサイトを紹介すれば良くなり、行動変容にすごく効果のある施策だと思います。

我々もできる範囲で行動変容を促すムーブをしていきましょう。