【JavaScript】ワクチン接種によるウイルス感染者数の推移を計算してみる
コロナウイルスによる感染者の爆発的増加を抑える手段として集団免疫という考え方が注目されています。ウイルスに感染した人は免疫を獲得するため,たとえウイルスに再び感染しても免疫によって体内のウイルスはすぐに退治され,他の人にウイルスを移すことがなくなります。こうして感染の拡大を防ぐことができるというのが集団免疫です。
集団免疫はワクチンによって獲得すべきもの
確かに人類がコロナウイルスの問題を克服するための最終手段が集団免疫であることに間違いはありませんが,それはワクチンによって達成されるべきものであり,集団感染を放置することによって達成すべきものではありません。私たちはワクチンを用いることによって重症患者や死者を出さずに集団免疫を獲得することができます。しかしながら,ワクチン接種によってどの程度感染の拡大を防ぐことができるのかは一概には言えません。
ワクチンの効果を計算で求めてみる
ここで,プログラミングの勉強も兼ねて,ワクチン接種率と感染者の推移を計算によって求めてみましょう。
コロナウイルスのように実在するウイルスについてシミュレーションすることは専門家でなければ不可能です。そこで今回は仮にウイルスAというものを考え,最もシンプルなモデルを用いて計算していきます。
<条件>
はじめにウイルスAの感染者が100人いるとする。それぞれの感染者は100分の15の確率で別の1人の非感染者にウイルスを伝播させる。たとえば,1日目には100人の感染者がいるので,そのうち15人が別の15人の非感染者にウイルスを伝播する。よって2日目の感染者は115人となる。2日目以降も同様とする。感染者は14日後に回復または死亡したものとして感染者の合計から除かれる。一度回復した人は再び感染しないものとする。その後ワクチンを導入しない場合の感染者数の推移を求める。また,60日後に非感染者の100分の20がワクチンを接種して抗体を持つ場合を考える。このときウイルス伝播は100分の20の確率で失敗し感染者に加えないものとして感染者数の推移を求める。また,さまざまなワクチン接種率で同様の計算を行い比較する。
Javascript によるプログラミング
ここで用いるプログラミング言語は Javascript です。Javascript はプログラムを動作させる上でアプリケーションのインストールなどを必要とせず,メモ帳などのエディタと chrome や safari などのブラウザがあれば誰でもプログラムを書いて実行することができます。そのため,プログラミング入門として最適です。
本文の最後にソースコードを載せておきます。これをメモ帳などにコピー&ペーストして,test.html などの名前で保存します。あとは保存されたファイルをダブルクリックすれば,ブラウザが立ち上がり計算結果が表示されます。
コードで重要な部分は const denpa = 0.15;
です。0.15 の数値を変えることで,さまざまな感染率における患者数の推移を確かめることができます。
また,const waku = 0;
がワクチン接種率です。0 ということはワクチンを接種した人がいないということです。もし,ワクチンの接種率を20パーセントにしたいなら,この値を 0.2 とします。
感染者はどう推移するか
それでは,実際に結果を確かめてみます。まず,ワクチン接種率が 0 パーセントの場合の推移を10日ごとにまとめると
日 | 新規 | 回復 | 患者数 |
0 | 100 | 0 | 100 |
10 | 53 | 0 | 405 |
20 | 164 | 30 | 1,227 |
30 | 506 | 103 | 3,775 |
40 | 1,557 | 324 | 11,615 |
50 | 4,788 | 994 | 35,711 |
60 | 14,720 | 3,055 | 109,800 |
70 | 45,260 | 9,393 | 337,598 |
80 | 139,158 | 28,880 | 1,038,000 |
90 | 427,864 | 88,795 | 3,191,497 |
100 | 1,315,538 | 273,015 | 9,812,779 |
110 | 4,044,837 | 839,430 | 30,170,988 |
120 | 12,436,511 | 2,580,965 | 92,765,619 |
はじめ 100 人だった患者が 1 か月後には 3,700 人,2か月後に 10 万人,4か月後には 9200万人に達します。たとえ 15 パーセントの確率でも,感染者は 14 日間感染の状態にあります。例えば,当たりのでる確率が 15 パーセントのくじを 14 回引いた場合,結果的にほとんどの人は 1 回は当たりを引くことになります。そのため,このように幾何級数的に患者数が増大するのです。もちろんこの 15 パーセントという数字はただの仮定ですが,確率をいろいろ変えてみるとわずかな数字の違いで感染者の数が大きく変わることが分かるでしょう。
次に 60 日目にワクチンを接種した場合を計算してみます。プログラムの const waku = 0;
をconst waku = 0.2;
に書き換えましょう。これは非感染者の 20 パーセントがワクチンを接種したということです。
日 | 新規 | 回復 | 患者数 |
0 | 100 | 0 | 100 |
10 | 53 | 0 | 405 |
20 | 164 | 30 | 1,227 |
30 | 506 | 103 | 3,775 |
40 | 1,557 | 324 | 11,615 |
50 | 4,788 | 994 | 35,711 |
60 | 11,776 | 3,055 | 106,856 |
70 | 26,455 | 9,393 | 237,522 |
80 | 55,776 | 19,377 | 501,203 |
90 | 118,299 | 41,163 | 1,062,959 |
100 | 251,074 | 87,539 | 2,255,821 |
110 | 532,877 | 185,826 | 4,787,693 |
120 | 1,130,939 | 394,373 | 10,161,055 |
結果はこの通りです。60日目以降も感染者は増えていきますが,120日目は1,000万人となり,ワクチン接種をしない場合と比べればその差は歴然としています。ワクチン接種をする人間が 5 人に 1 人でも,大きな効果が見込めます。
では,ワクチン接種率をもっと上げて 80 パーセントで計算してみましょう。
日 | 新規 | 回復 | 患者数 |
0 | 100 | 0 | 100 |
10 | 53 | 0 | 405 |
20 | 164 | 30 | 1,227 |
30 | 506 | 103 | 3,775 |
40 | 1,557 | 324 | 11,615 |
50 | 4,788 | 994 | 35,711 |
60 | 2,944 | 3,055 | 98,024 |
70 | 2,172 | 9,393 | 65,168 |
80 | 684 | 2,723 | 20,767 |
90 | 233 | 928 | 7,070 |
100 | 82 | 351 | 2,467 |
110 | 29 | 127 | 876 |
120 | 10 | 45 | 308 |
結果はこの通りです。見事に感染が封じ込められたことが分かります。
プログラミングで遊んでみよう
今回のシミュレーションはあくまで簡易なものですが,ワクチンの効果を可視化することができました。
プログラミングというと難しそうに聞こえますが,計算結果を出力するだけなら中学生や高校生でも十分チャレンジできます。別の記事,ワクチン効果を確かめるプログラムのソースコード解説【プログラミング入門】でコードの解説をしているので,まずは簡単なコードから始めてプログラムを学んでみましょう。
ソースコード
<!DOCTYPE html><html><body><script>
let shinki = [100]; //1日目の新規感染者は100人
let kaihuku = [0]; //回復者数
let kansensha = [100]; //感染者数
const denpa = 0.15; //ウイルスを伝播させる確率
const waku = 0; //ワクチン接種率
document.write('<table>');
document.write('<tr><td>日</td><td>新規</td><td>回復</td><td>患者数</td></tr>');
for(let i = 0; i < 121; i++) {
if( i > 58 ) {
shinki.push(Math.round(kansensha[i]*denpa*(1-waku)));
} else {
shinki.push(Math.round(kansensha[i]*denpa));
};
if( i > 12 ) {
kaihuku.push(shinki[i-13]);
} else {
kaihuku.push(0);
};
kansensha.push(Math.round(kansensha[i]+shinki[i+1]-kaihuku[i+1]));
document.write('<tr>');
document.write('<td>'+(i)+'</td>');
document.write('<td>'+shinki[i].toLocaleString()+'</td>');
document.write('<td>'+kaihuku[i].toLocaleString()+'</td>');
document.write('<td>'+kansensha[i].toLocaleString()+'</td>');
document.write('</tr>');
};
document.write('</table>');
document.write('<p>計算終了</p>');
</script></body></html>
SNSでシェア