ごあいさつはありません

できたものだけがある

人々がイメージする某ウイルスを架空の東京にばらまいてみる

 

!!!注意!!!

  • この記事は暇つぶしの域を出ないものであり、科学的な正しさは全く保証されていません。僕も色々頑張りましたがトンチンカンな内容である可能性も十分あることは留意してください。気になったら自分で勉強しよう
  • ウイルスの製造は当然違法です。パソコンでのシミュレーション以外はやらないようにしましょう。

 

 スマと申します。

 

 物騒なタイトルの記事だが、今回行うのはちょっとしたシミュレーションである。

 

理論編(面倒だったら飛ばそう)

モデルを作る

 今回は「SIR」モデルを参考にしたオリジナルの計算式で感染症に関するシミュレーションを行う。

 

 

〜SIRモデルとは〜

 平たく言うと、感染者を「まだ感染していない人(S)」「今感染している人(I)」「もう感染しない人(R)」の3つに分けて、その変化を考えるもの。

 1日単位で計算する場合、毎日「まだ感染している人」から一定の割合(「今感染してる人」の数が多いと高くなる)で新たに感染者が発生し、「今感染している人」は一定の割合(この割合は不変)が回復し「もう感染しない人」になる。

 

 

 これを参考に、毎日「まだ感染していない人」から「今感染している人」に移る人数を決める式を以下のように設定することにした。 

f:id:gouwanowan:20200607001642p:plain

 接触人数はいわゆる濃厚接触(感染する可能性がある接触)の人数のこと。これに「今感染している人」の人数を掛け、それが「まだ感染していない人」である確率を掛ける。すると、感染者と接触した「まだ感染していない人」の数が求められるので、あとはこれに接触した場合に感染する確率を掛けることで、新たに感染する人の人数が求められる。なお、新たに感染する人数は「まだ感染していない人」の人数を超えないものとする。

 

 シミュレーションの状況やウイルスに対する仮定は以下のように設定する。

  • シミュレーションを行う期間は最初の感染者が出てから100日間
  • 最初の感染者は1人
  • 総人口は東京都とほぼ一致する1400万人
  • ウイルスに感染した人は6日後に回復(=「もう感染しない人」へ移動)する

 これらの設定を元に東京都とウイルスを作っていく。

 

東京都を作る

 と言ってもこのシミュレーションにおける東京都はたった3つの数字で表される。シミュレーション用のプログラムも組むことも考えたが、今回はExcelでゴリ押すことにした。

 

①必要な大きさの表を用意する

 今回のシミュレーションに必要な要素は「日数」「まだ感染していない人」「今感染している人」「もう感染しない人」に加えて「新しく感染した人」の全部で5つになる。これらの項目を日数分書き込める大きさ(5列×100行)の表を用意する。

f:id:gouwanowan:20200607185601p:plain

日数の項目は100まで続く

②あとで変えたい項目を書き出す

 シミュレーションの条件は簡単に変えられる方が便利なので、いじる予定のある数字は先に書き出しておくと後が楽になる。今回は「接触人数」「感染率」をまだ決めていない。加えて、楽に変えられるとうれしい「総人口」「感染期間(治るまでの日数)」「最初の感染者数」も一応出しておくことにした。

 

f:id:gouwanowan:20200608172137p:plain

最初はちょっと混乱するが、後々の苦労がだいぶ減る

③計算式を作る

 1日目についてはどの値も総人口と初期感染者数から求められるが、2日目以降は前日のデータを使用して計算することになる。やることを大きく分けると、

  • 前の日のデータから「新しく感染した人」の人数を計算する
  • (7日目以降)治る人の人数を計算する

 前者はそこそこ長い式を使うことになるし、後者は簡単そうに見えるが、最初の数日は参照先が存在しないので適当に書くとエラーになる。その上に治るまでの期間を変えられるようにしなければならない。

f:id:gouwanowan:20200608175714p:plain

一見複雑だが......

f:id:gouwanowan:20200607001642p:plain

上のセルの式と比べてみよう


 セル内の式は最初の計算式に「謎のMIN関数をつけて」「全体をROUND関数で囲った」ことがお分かりいただけただろうか?MIN関数は「感染者が接触した人数の合計」と「総人口」のうちの小さい方を返すことになっている。つまり、感染者が接触した人数の合計は総人口を超えないという意味だ。また、ROUND関数はROUND(数字,0)で「数字を四捨五入して整数にする」という意味である。

 見た目のわりにやってることは大したことはないことがわかっていただければ問題ないし、わからなくても大丈夫。

 ちなみに、「$H$4」みたいな表記は「絶対参照」と呼ばれ、後のコピペの下準備である。

 

 続いて治る人数の計算だが、ここは別に難しければ感染期間を固定すればいいだけなので詳しくは説明しないことにする。具体的にはOFFSET関数(基準となるセルから指定行数、列数ずらしたセルを返す)を使うとこの処理を実現できる。真似する際は範囲外を参照しないよう、条件分岐に注意されたし。

 

 ここまでで「今感染している人」「もう感染しない人」は計算できたので、あとは総人口からこれらを引いた残りが「まだ感染していない人」である。

 

④コピペ

 2日目の計算式が完成したら、あとは下までコピペすれば完成となる。

f:id:gouwanowan:20200608200942p:plain

コピペすると参照セルが勝手にずれるが、絶対参照のセルはずれない

 

 

 

ウイルスを作る

 (ここから本編)

 

 東京都ができたので次はウイルスを作る。ここまでで決まっていないのは「接触人数」「感染率」なので、あとはこの値を決めればウイルスが完成(?)する。

 

 せっかくなので、ここでアンケートを取ることにした。つまり、人々にウイルスのイメージを聞き、その通りのウイルスが実際に流行したらどうなるかを試そうというわけだ。

 

 

forms.gle

(※今答えても当然反映されないが、ぜひ考えてみてほしい)

 質問は以下の二つ。

  1. 緊急事態宣言前の東京都で、人が一日に濃厚接触(相手がCOVID-19感染者だった場合に感染する可能性がある位の接触)する人数はどのくらいだったと思いますか?
  2. COVID-19の感染者と濃厚接触した場合、ウイルスに感染する確率は何%だと思いますか?

 

 改めて見ると結構はっきり聞くなという感じである。記事タイトルで「某ウイルス」とぼかした意味はいよいよ潰えてしまった。

 

 

 このアンケートへのリンクをTwitterに投稿して回答を募った。

 ただ、万が一にもアンケート自体がバズってしまうと後に引けなくなるのでほどほどの拡散をお願いしたところ、一日で35件の回答を得ることができた。今回は元々「国民の総意!!!」みたいなことを言うつもりはなかったので、これだけ集まれば十分な気がする。では結果をドン。

f:id:gouwanowan:20200608235628p:plain

 数字だけ見ても実感はわかない。問題は、この中からどの値をシミュレーションに使うかである。

 接触人数の相加平均がとんでもないことになっているが、これはおそらくこの質問に2000人と答えた人と500と答えた人がいる影響である。この質問については、回答時に「何桁で答えるか」という要素が大きく影響するため、シミュレーションには相乗平均を用いることにする。

 感染率は......

 

 

 ...

 

 

 まあ中央値でいいや......

 

 

 

 

 

いざ拡散

 ここまで本当に長かった。

 それではアンケートの結果を元に、接触人数は19.5人、感染率は0.2でシミュレーションを行う。

 グラフを用意して準備完了。東京都の命運やいかに!?

 

 

 

 

 

 

f:id:gouwanowan:20200609003136j:plain

後半はカット

 

 

 

 

 ––––『それ』は、嵐としか言いようがなかった。

 

 

 最初の感染者が確認されてから1週間。感染者数は急激な増加を始め、その一週間後の感染者数は推定で1000万人にも迫ったとされている。

 

 

 たった1種類のウイルスに、たった1ヶ月の間に、喰らい尽くされてしまった。

 

 

 東京都は滅んだのである。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ※ここからは崩壊した東京都で反省会を行います

 

  • どうしてこうなった

 それはもちろん感染力が強すぎたからである。感染症の感染力を示す指標の一つに「基本再生産数」というものがある。

 

 

〜基本再生産数とは〜

 免疫がない集団にポンと感染者を投げ込んだ時、1人の感染者が新しく増やす感染者は何人かを表すもの。これが1だったら集団内の感染者数は変わらないし、2だったら感染者は倍々で増えてゆくことになる。

 つまり、この数字が1より小さければ感染者数は減っていくので流行は起こらず、逆に1より大きければ感染症が流行することになる。あくまでも理論上の話なので注意されたし。

 

 

 

 ちなみに、2009年くらいに流行した新型インフルエンザの場合は2.0前後、感染力が非常に強いことで知られる麻疹は15前後と言われている。

 

 

 

 今回流行させたウイルスではどうだろうか?そもそもの定義が「1人の感染者が新たに感染させる人数」なので、この定義に基づいた計算で求められる。

 1人の感染者は1日に19.5人と接触する。これが6日間続き、接触時には20%の確率で感染させる。つまり、基本再生産数は19.5×6×0.2=23.4

 

 

 23.4!?!?!?!?

 

 

 

 おそらくこれほどの感染力を持つウイルスはそうそうないというか、下手したら地球上に存在しない可能性すらある。(架空の)都民はこんなものと闘っていたのか......

 

 

 しかし、いくら架空と言えどもこのままでは都民があまりにも不憫である。何かこのウイルスに対抗する手段はないだろうか。

 

 

 

 

 

 

 

 

???「Social distance.」

 

 

 

緊急事態宣言

 いくらウイルスが強かろうが関係ない。架空でも東京都は東京都であり、日本の一部であるのだから、アレが使える。

 

 そう。緊急事態宣言である。

 

 というわけで、以下の仕様を持つ「緊急事態宣言」を出せるようにする。

 

  • 指定した日数以降は、新規感染者を計算する際の「接触人数」に補正倍率がかかる

 

 この補正倍率だが、「補正倍率」だとなんの補正かわからないし、かと言って「緊急事態宣言倍率」とか「接触人数倍率」といった名前はちょっと長い。というわけで、ここは短く「自粛率」と呼ぶことにした。

 

 よって、感染者数の計算式は少し変わって次のようになる。

f:id:gouwanowan:20200612204859p:plain

 今回の自粛率は0より大きい1以下の値をとるものとし、数字が小さいほど効果が大きい。また、緊急事態宣言前の自粛率は1として計算する。

 

 宣言の開始日は現実の東京都をある程度参考にし、感染者が500人を超えた日(今回の場合は感染者確認から5日目)とした。この日の翌日から自粛が始まる。自粛率はもちろん0.2。つまり8割減である。

 

 

 

 東京都は崩壊してしまったが、これはシミュレーションなのですぐに”次の”東京都を用意することができる。

 

 

 

 現実世界で東京都を第一波から守り抜いた緊急事態宣言よ。もう一度、我らに力を......

 

 

 

 

 

 

f:id:gouwanowan:20200612205858p:plain

 

 

 

 

 

 

 

 

 

f:id:gouwanowan:20200612212013j:plain