meta.kimura

感情の率直と、思索の明澄と、語と文との簡潔とです。

ゴールデンウィーク暇だったんで、感染シミュレーションをつくってみた。

f:id:meta-kimura:20200506172407j:plain


 暇だったんだ。
 散歩やランニングには行くものの、Stay Homeで連休らしさはどこへやら。誰かとどこかへ行きたいなー、外食したいなー、と思いつつも、やっぱり家にいる時間が長くて、それならまぁ、勉強でもしようかってなった。半分以上は以下の記事のシミュレーションへの憧れである。

https://www.washingtonpost.com/graphics/2020/health/corona-simulation-japanese/


 移動制限って大事なのね、ってのがひと目でわかる。緊急事態宣言が出るぐらいの頃にこれを見かけて、これぐらいのわかりやすさを目指さねばならぬなぁ、なんて思っていたのだった。
 というわけで調べてみたら、やっぱりpythonでつくってる方がいらっしゃった。

qiita.com
 そのアイデアとコードを参考にさせてもらって、ごにょごにょとやってみたのが以下である。
 ただ、前提として、あくまでいろんな条件を単純化したシミュレーション、その一例であることだけはおさえて見ていただきたい。プログラムが間違ってたりもするので、なんだろう、見る方も暇つぶしで見て欲しい。

●◯。。。...

 まずは【移動制限なし vs. 移動制限80%】。水色が健康な人で、オレンジが感染者、濃い青が免疫獲得者としている。下の折れ線グラフは、全体に対する感染率である。当然のことながら、あんまり動かない方は感染が広がらない。
 jupyterで表示させたものをスクリーンキャプチャしてgifアニメにしてるので、描写が甘いのはご勘弁を。matplotlibのアニメーションまでは手が届かなかった。。。

f:id:meta-kimura:20200506172441g:plain

 一応、こちらで設定した条件はだいたいざっくり以下の通り。

  • フィールドは50✕50のセルでつくられている
  • 隣接するセル(斜め含む)に感染者がいると80%の確率で感染する(追記参照)
  • 感染者は14ターン経過以降、5%の確率で免疫を獲得する
  • 感染者は14ターン経過以降、20%の確率で健康な人になる(再感染あり)
  • 感染者は14ターン経過以降、1%の確率で死亡する
  • 死亡した人はいなくなる(障害物などにはならない)
  • 人は1ターンごとにランダムで隣接する空きセルに動く
  • 移動制限の方は設定した割合で移動が起こらない

 最初の方にも書いたが上記の条件をしっかり反映できているかというと、そうでもない。間違ってるところもあるかもしれないし、明らかに違うんだけど近似値だからまぁいいかー、と思って見逃してるところもある。
 見てると感染率80%にしてるのになかなか感染しなかったりもしていて、なんだかもどかしい。その部分はきちんと書けてるはずなので、まぁ、そういうものなのかもしれない。

(2020/5/10 追記)
やはりプログラムが間違っていたようで(汗)、感染率は80%もないようでした。スミマセン。厳密には感染を判定するために周囲の範囲指定するところでミスしていたようです。まぁ、ご愛嬌ということで。GIFは移動制限の比較で見ていただくってことで、差し替えはしていませぬ。

 せっかくなので【移動制限70% vs. 移動制限80%】も載せておく。このシミュレーションではあんまり変わらない感じではあるけども、感染者をゼロにする局面では80%が強そう。

f:id:meta-kimura:20200506172629g:plain

●◯。。。...

 ボールがぽんぽん動くシミュレーションからすると、だいぶともさい見た目になってしまったけど、初心者の思いつきでここまでできたから、満足。ぶっちゃけ50✕50のセルのイメージでやってるので、EXCELでもできる。なんでもやってみたらできるもんなのだろう。
 あと、パラメータやプログラムの設計、ランダムの出方次第で、どうにもでも見せられるんだな、ってのもわかってきた。今回もそれらしく納得できる範囲になるように、結構調整している。いくら条件やプログラムが正しくったって、現実とかけ離れた結果が出てしまうのでは納得もできない。それじゃあ伝わらないのだ。
 改めて、こういうのは正確性と納得性のバランスをどう取るかが、一番の課題になるんだよなぁ、と感じる。正しさばかりでは人は動かない。



m(_ _)m