ウイルス感染の簡単なシミュレーション

ある星に1000人の人が住んでいます。
ある日、そのうちの10人があるウイルスに感染しました。
そのウイルスの感染は、7日間の潜伏期間とその後の7日間の発症期間があります。

感染期間（潜伏期間と発症期間）に免疫のない人と接触した場合に、相手に 0.1 の確率で感染させてしまいます。

感染期間が終了すると 0.01 の確率で死亡します。残りは治癒します。

治癒したときに 0.5 の確率で免疫を獲得します。免疫があるともう感染しません。

人は毎日平均して3人の割合でランダムな人と接触します。（1000人中3人なので、もし人口が500人に減れば1.5人と接触という意味です）

発症している人のうちの 0.9 の割合の人は、自覚もしくは検査によって感染が明らかとなり自主隔離をすることで人と接触しなくなります。

このときの感染者数の推移をシミュレーションしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/892f4fc3-72ef-116f-ab69-71950c0c6500.png)

横軸は時系列で、左端が最初に10人感染した日、右端は感染者0になった日です。

縦軸は人数です。

紫（左上から急激に減っている線）：一度も感染していない人数
青緑（右の平坦になっているところの一番上）：免疫を獲得した人数
薄い紫（右の平坦になっているところの上から2番目）：感染したことはあり治癒しているが免疫を獲得できなかった人数
薄い緑（左のピークがある2つのうちの左のピーク）：感染し潜伏期間の人数
黄緑（左のピークがある2つのうちの右のピーク）：感染し発症期間の人数
黄：死亡した人数

最大時は、全体の3分の1の人が発症しています。

一度も感染せずに済んでいるのは1000人中わずか52人です。

グラフの右端の感染者が0になった日は150日後です。

シミュレーションにはランダムの要素があるので、実行するごとに数値は変わりますが、傾向は同じです。

以下、いろいろパラメータを変えて試しました。

# 先に結論

このモデルでいろいろパラメータを変えて試した結果、医療リソースの限界の問題で同時発症者数を抑えるという目標には、世間で言われているとおり接触人数を抑えることが一番効果的だと確認できました。

一方、収束までの日数を早める方法はわかりませんでした。接触人数を逆に増やして早く集団免疫を獲得したほうが早く収まるのではとも思ったのですが、その効果は確認できませんでした。

また、どういうパラメータで試しても最終的にはほとんどの人が少なくとも1回は感染して免疫を獲得するということもわかりました。


# ソースコード

シミュレーションをしたソースコードは使い捨ての汚いコードですが、いちおうここに置いておきます。Scalaのコードです。
https://gist.github.com/suzuki-navi/211aeaa61e8168d4efff21fce4442e20

シミュレーション結果をグラフへ可視化する部分は、これとは別にPythonのmatplotlibを使いました。


# 接触人数が変わるとどうなるか

最初のシミュレーションでは、人は毎日1000人のうちの3人の割合でランダムな人と接触します。

この3人というパラメータを変えるとどうなるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/dfeb4807-2fa7-a859-4cfc-88fefd0f31f1.png)

横軸はそのパラメータです。平均接触人数です。

縦軸は最終的に感染者数が0になったときの各人数です。黄緑だけ最終の人数ではなく期間中の最大人数です。各パラメータで5回シミュレーションを実行した結果なので、点が5個ずつあります。

紫（左上から急激に減っている線）：一度も感染していない人数
青緑（横軸2人から7人あたりで一番上の線）：免疫を獲得した人数
薄い紫（横軸5人で200付近の線）：感染したことはあり治癒しているが免疫を獲得できなかった人数
黄緑（横軸5人で600付近の線）：同時発症者数の最大値
黄：死亡した人数

黄緑の線が右肩上がりなのは、接触人数が多いほど同時発症者数のピークが大きくなることを示します。単純に接触者数を少なくするほど同時発症者数を減らせます。仮に同時発症人数に応じた医療リソースが必要で、その医療リソースに限界があって上限値をコントロールしないといけない場合は接触人数をコントロールするということが重要になります。

一方で、紫の線は接触人数が多いほど急激に減少し、4人以上では見えなくなるぐらい0になっています。これは接触者数がある程度を超えるとほぼ全員が一度は感染してしまうことを示します。

黄色（死亡者数）は数字が小さくてグラフではよくわからないのですが、紫の線とは逆の傾向で、接触人数4人までは増えていきますが、それ以上はあまり変わりません。

次のグラフは感染者数が0になるまでの日数を表したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/7d7c235b-7791-753e-4e0b-39bad1150ba2.png)

横軸は平均接触人数です。

縦軸は感染者数が0になるまでの日数です。

接触人数が一定値（2人）以上になるとほとんど変わらないようです。接触人数が多いほどわずかに日数が短縮する傾向があるようには見えます。接触人数が多いほどウイルスが早く蔓延して集団免疫の獲得も早まり、収束までの日数が短縮すると思うのですが、短縮する度合いは私の思っていたほど大きくはありませんでした。


# 感染率が変わるとどうなるか

最初のシミュレーションでは、人と接触した場合に 0.1 の確率で感染します。

この 0.1 というパラメータを変えるとどうなるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/e436a1c1-c6b6-c4d0-1e74-2142f494bac1.png)

横軸はそのパラメータです。感染率です。

縦軸はさっきと同様の人数です。

このシミュレーションでは接触人数を大きくするのと感染率を大きくするのは同じ意味になりますので、横軸のスケールは異なるものの、傾向は接触人数と同じです。

感染率を下げるというのは、接触しても感染しづらいようにマスクなどの対策をとることに相当します。


# 免疫獲得率が変わるとどうなるか

最初のシミュレーションでは、免疫を獲得する確率は 0.5 です。

この 0.5 というパラメータを変えるとどうなるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/65319796-a29d-d2f5-bdb3-c17c7f1e6d6e.png)

横軸はそのパラメータです。免疫獲得率です。

縦軸はさっきと同様の人数です。色はさっきと同じですが再掲します。

紫（右下0.9付近で150ぐらいの線）：一度も感染していない人数
青緑（一番右上に延びている線）：免疫を獲得した人数
薄い紫（0.7付近で200ぐらいの線）：感染したことはあり治癒しているが免疫を獲得できなかった人数
黄緑（300から400くらいで平坦の線）：同時発症者数の最大値
黄：死亡した人数

免疫を獲得できない場合は、1回の感染あたりの致死率は0.01なのに、最終的に半分ぐらいの人が死亡してしまいます。

免疫獲得率が半分を超えるぐらいから、紫の一度も感染せずに済む人が増えてきます。100%免疫獲得できる場合は、8割から9割が免疫を得て、残りの人が一度も感染せずに済みます。

次のグラフは感染者数が0になるまでの日数を表したものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/c6c5a7ab-1fec-db09-45b6-f94ff9557f51.png)

横軸は免疫獲得率です。

縦軸は感染者数が0になるまでの日数です。

免疫獲得率が高いほど急激に収束日数が縮まります。


# 隔離率が変わるとどうなるか

最初のシミュレーションでは、発症している人のうちの 0.9 の割合の人が隔離で人と接触しなくなります。

この 0.9 というパラメータを変えるとどうなるか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/cc0d9324-71ba-c71a-ee5f-40d225de7aae.png)

横軸はそのパラメータです。隔離率です。

縦軸はさっきと同様の人数です。色はさっきと同じですが再掲します。

紫（1.0で100付近の線）：一度も感染していない人数
青緑（一番上の線）：免疫を獲得した人数
薄い紫（上から3番目の線）：感染したことはあり治癒しているが免疫を獲得できなかった人数
黄緑（上から2番目の線）：同時発症者数の最大値
黄：死亡した人数

直感通り、隔離率が大きいほど、同時発症者数は減るし、感染せずに済む人は増えます。ただ、意外と差は大きくはないようです。

次の収束までの日数のグラフを見ると、これは大きな傾向はないようです。隔離率が0と1の極端な比較でも差は大きくはありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490207/faf801e7-2572-163f-d23e-2debace83f68.png)

この記事はいま感染が流行しているウイルスを直接予測したかったわけではなく、最初に書いた設定のモデルのもとでウイルスがどう感染するのかを計算したのみで、それ以上の意図はありません。

以上。