@suzu6

主にWEBと解析の技術について書きます。

広く浅くも続ければ深くなるはず。

コロナウイルスなどがアウトブレイクする様子のシミュレーションをp5jsで作成した

COVID-19が世界中に拡大していき、各国・地域が対応を迫られる中、 ワシントン・ポストからアウトブレイクに対する戦略を比較したシミュレーションが出された。

コロナウィルスなどのアウトブレイクは、なぜ急速に拡大し、どのように「曲線を平らにする」ことができるのか | The Washington Post

英語版

このシミュレーションは、戦略がアウトブレイク曲線にどのような影響を与えるかを示している。 シミュレーションはシンプルで現実に即していないかもしれないが、戦略の影響が直感的にわかりやすい。 内容に関しては、ワシントン・ポストの記事を読んでください。

このシミュレーションを見て、別の条件を加えた場合どうなるかいくつかのアイデアが浮かびました。 この記事ではアイデアを検証するため、アウトブレイクのシミュレーションを再現しアイデアを加えています。 また、読んでくださった方が更にアイデアを加えられるようにコードを公開しています。

シミュレーターにはp5.jsを利用しました。 p5.jsはブラウザ上でアニメーションを描画できるライブラリであり、言語はJavaScriptです。 公式サイトにはすぐに実行できるエディターも用意されています。

元記事でも、同じか似たライブラリを利用していると思われるがコードが見つからなかったのと、自身の勉強のため1からコードを書いた。 そのため、細部のパラメータや挙動は全て再現しているわけではありません。 ご了承願います。

アウトブレイクのシミュレーション

元記事に倣い偽の病気シミュライタスがアウトブレイクする様子を再現します。

このシミュライタスは健康な人が感染している人と接触すると、この健康な人へ感染する。 病気に罹った感染者は時間が経過すると回復する。 回復した人から健康な人へ感染することも、感染者と接触したことで再度感染することもない。

人口200人の町でシミュライタスの感染が拡大する様子です。 住人をランダムに配置して、無作為に移動させます。 最初の感染者は1人です。

usually

github / p5.js

元記事と異なりgif形式で申し訳ないが、ある程度再現できた。 住人同士が接触したときの動きがおかしいので後で修正します。

このシミュレーションでは感染に対応しなかった場合の患者数の曲線を示しています。 感染に対する対応を取った場合にこの曲線がどのように変化するか、次からのシミュレーションと比較していきます。

社会距離戦略を取った場合

ひとつ、元記事にある戦略を再現しました。

感染拡大を抑えるため、公共の場への移動を控え他人と接触する機会が少なるよう人々が行動した場合です。 人口の4分の3が受け入れ、残りの4分の1が継続的に移動を続けたときの影響です。

stay_75

多少条件が異なるため元記事ほど低く抑えることはなかったが、感染者数が増加する前に回復した人も増えていき曲線はなだらかです。感染を押さえ込めているように見える。

集会が与える影響

この条件から元記事にはない私のアイデアです。

新型コロナウイルスは密閉された空間で空気感染するとも言われています。 とある空間で集会があった場合の影響を可視化してみます。 ただし、シミュライタスは接触感染しか実装していないため次のような枠を用意しました。

この町の真ん中に枠を置く。 この枠は外からは入れるが、中からは出られません。 枠の外の住人は自由に動いているため枠の中に入り、枠の中の人口密度が上がっていく。 一定時間が経過すると枠が消え、住人はもとのように自由に動き回る。

感染者はこの枠の中からスタートする。

convention

まず枠内で感染が拡大し、枠を開放した後に感染者数の伸びが増えています。 通常と比べ曲線のピークは大きく変わりませんが、曲線の傾きが比較的大きい箇所が2段階ある。

初期の新規感染者の増加を抑えることが、曲線をなだらかにすることにつながります。 このシミュレーションでは集会内での感染増加と感染した参加者からの2次感染の様子を示唆していると考えています。

地域間の移動を制限した場合

地域・国家間の移動を制限した場合をシミュレーションしてみる。

集会で利用した枠を複数用意して地域と見立てる。 格子状に9つの地域があり、この地域間の移動を制限します。 枠から外へ出られる確率を設定する。 外から内側へは自由に入れる。

地域間の移動を1割まで制限した様子です。

local

感染者数の曲線がなだらかになりました。 感染源に距離的に近い地域へ感染が広がっていく様子がわかります。 感染者が居ない地域が最後まで複数残っており、そこは感染源から遠い地域です。 感染源は一つですが位置はランダムでです。

この戦略では、曲線を抑えられることに加えウイルスが拡大するルートを予測することができます。 他の地域と交流が多い中央の地域が感染すると止めることが難しそうです。 無症状者が多くいる病状の場合は経路が推測しやすいため効果的な戦略だと思います。

患者が行動を抑えた場合

感染者の隔離、もしくは自発的に自宅待機した場合をシミュレーションしてみます。

感染者は接触の機会を抑えるため、その場で留まり移動を制限する。 他の健康な人と回復した人は変わらず自由に移動する。 また、感染者の内2割が無自覚であり感染期間中も他と同じように自由に移動をするとします。

pcr

制限がない場合に近い曲線になりました。 感染者の2割が無自覚でも、予想以上に増加数が大きいです。

このシミュレーションだと無自覚感染者からよりも、停止している感染者に向かった健康な人が感染する場合が多いように見えます。 感染者が固まっている場所は、健康な人が感染者に接触しに行ったところ。 また、最初の感染者が端に居る場合のシミュレーションでは、曲線がもっと平らになります。 現実で自宅待機ないし隔離している方に接触する機会はもっと少なくなるため、曲線も更に平坦になるはずです。

感染確率を導入する

新型コロナウィルスは感染確率は比較的高いですが、このシミュライタスのように接触したら確実に感染するわけではありません。 次のシミュレーションでは感染確率を取り入れてみます。

感染者と接触した場合に3割の確率で感染するとする。 つまり、1回の接触で感染することもあれば何度接触しても感染しない人もいる。 接触回数が多い人は感染する確率が高くなります。

infection_rate30

感染率100%に比べ当たり前ですが曲線はなだらかです。 ただし、感染者数が3割以上になると接触する回数も増えるため、増加数も高くなります。 プログラムの不備でごちゃごちゃ接触している住人も居ますが、全体的な傾向としては概ね予想通りです。

では、感染率はこのままにして、集会がある場合を見てみます。 集会を模した枠は以前のものと同じです。

infection_rate30_convention

感染率100%に近い曲線になりました。 枠内の密集地域では接触回数が外よりも増え、短い間に半数が感染しました。 それらの感染者が外に出たことで、他の健康な人へも感染が拡大しているようすがわかります。

これらの結果から、2つのことが言えそうです。 感染確率が低くても感染者数が一定の割合を超えると増加量も高まる。 また、集会など密集地域では感染者との接触回数が増え感染する確率も高い。

コードについて

コードはMITライセンスで公開しているので自由に使ってください。

github / p5.js

p5.jsでは左上の三角をクリックしたら実行できます。 編集や保存してもオリジナルのファイルは変わらないので好きなだけいじってください。

これまで示したシミュレーションは全てパラメータをいじれば再現できます。 最初のsetup()関数に各パラメータの変数があるのでそれを変えてみてください。 各シミュレーションの設定値やコメントは後で追記するはずです。 先にブラウザで実行できるようにします。 接触がごちゃごちゃするなど、いくつかバグもあるので修正を募集もしてます。

おわりに

元記事にいくつかのアイデアを加えシミュレーションしてみました。 シミュレーションから得た結果は、受け取り方は各人様々でしょうが、ごく当たり前のことだと思います。 もちろんこのシミュレーションはとてもシンプルなもので、現実に即しているとは言えません。 ただし、当たり前のことも定量的に示せばより精度の高い予測や次の議論へと発展すると期待しています。

この記事を書いたのは、医療や感染症の専門知識を持たないただのプログラマーです。 シミュレーション結果のそれぞれひとつをgifとして掲示しています。 ランダムなパターンの内、恣意的な抽出をしてそれを元に意見を書いているおそれがあります。 所属とは関係なくこのサイトに関する全ては個人の責任です。

twitter

以上、最後までご覧頂きありがとうございます。