作成: 日大生産工 MA 大前
これは、大前研究室の卒業研究テーマの学習資料として作成されたものです。他のゼミ生がこのページを参考にして卒業研究を行う場合は、必ず事前に相談してください。異なる研究室なのに、同じテーマが卒業研究概要集に並んでいると、問題になるかもしれません。
SIRDモデルでは、
という4つの変数が定義されます。また、シミュレーションを行う集団の総人口を$N$としたとき、すべての$t$について、
\begin{eqnarray} N = S(t) + I(t) + R(t) + D(t) \end{eqnarray}を成立させます。これは、考えるすべての人々が、必ず「感受性、感染、回復、死亡」のどれかになることを意味します。すなわち、シミュレーションの途中で、突然人が増えたり減ったりしないことを約束するものです。
ここで、$t+1$日目の感受性者数を、
\begin{eqnarray} S(t+1) = S(t) - \beta S(t)I(t) \end{eqnarray}とします。$t+1$日目の感受性者数$S(t+1)$は、$t$日目の感受性者数$S(t)$から、$\beta S(t)I(t)$人だけ減少することを表現する数式となります。「$\beta S(t)I(t)$人」とは、「$t$日目から$t+1日目にかけて、$感染してしまった人」を表します。$S(t)$と$I(t)$の積が入っていますから、「感受性者(感染する可能性のある人)」と「感染者(感染している人)」が多ければ多いほど、次の日の感染者数が多くなる、つまり、感受性者数が減ることを意味しています(ある集団で、感染する・させる人が多ければ多いほど、感染者が増えるという構造です)。$\beta$はウイルスの感染力を表しており、これが大きいほど感染力が強いこと、小さいほど感染力が弱いことを表します。なお、ウイルス本来の感染力のみではなく、マスクをする、密集を回避するなどの対策を考慮した上での値となります。
そして、$\beta S(t)I(t)$が新たに感染する「新規感染者数」を意味するわけですから、$t+1$日目の感染者数は、
\begin{eqnarray} I(t+1) = I(t) + \beta S(t)I(t) - \gamma I(t) \end{eqnarray}となります。$t$日目の感染者$I(t)$に対し、新規感染者数$\beta S(t)I(t)$が加えられているという構造を意味します。一方で、第3項目に$\gamma I(t)$が引き算されています。これは、感染後、回復または死亡することにより、感染者が減ることを意味しています。$\gamma$は感染者数を減らす、つまり除去するという意味合いで、除去率といいます。ややこしくなるので詳細な説明は省きますが、平均感染期間の逆数を除去率$\gamma$として採用することが普通です。例えば、ウイルスの平均感染期間を10日間にしたい場合は、$\gamma=1/10=0.1$を設定します。
続いて、$t+1$日目の回復者数$R(t+1)$と死亡者数$D(t+1)$は、
\begin{eqnarray} R(t+1) &=& R(t) + \gamma (1-\delta) I(t) \\ D(t+1) &=& D(t) + \gamma \delta I(t) \end{eqnarray}となります。除去される感染者数$\gamma I(t)$のうち、
するということを意味しています。すなわち、$\delta$は致死率を表します。致死率が高ければ死亡しやすくなり(回復しにくい)、低ければ死亡しにくくなります(回復しやすい)。
ここで、ギリシャ文字のパラメータを一度まとめておきますと、
となります。この値と、各状態の初期人数、
を自分で決定すれば、シミュレーションが開始します。
Tmax = 100 # シミュレーション日数
# 各状態の初期値をセット(N = 10000人でシミュレーション)
S, I, R, D = [], [], [], [] # 各状態を保存するリストを用意
S.append(9990) # 感受性者は9990人
I.append(10) # 感染者は10人
R.append(0) # 回復者はいない
D.append(0) # 死亡者はいない
# パラメータをセット
beta = 0.00003 # 感染力
gam = 0.1 # 除去率(平均感染期間を10日間とし、1/10=0.1を採用)
delta = 0.01 # 致死率(1%=0.01を採用)
# シミュレーション開始
for t in range(Tmax):
S.append( S[t] - beta*S[t]*I[t] )
I.append( I[t] + beta*S[t]*I[t] - gam*I[t] )
R.append( R[t] + gam*(1-delta)*I[t] )
D.append( D[t] + gam*delta*I[t])
得られた結果を可視化してみましょう。可視化には、plt.plot関数を利用します。グラフ中の英語はそれぞれ、
を表します。また、pltの引数は、
を意味します。
import matplotlib.pyplot as plt
#plt.figure(figsize=(20, 5))
plt.plot(S, label="Susceptible", lw=2, c="blue") # S: 感受性者数
plt.plot(I, label="Infected", ls="--", lw=2, c="red") # I: 感染者数
plt.plot(R, label="Recovered", ls="-.", lw=2, c="green") # 回復者数
plt.plot(D, label="Dead", ls=":", lw=3, c="k") # 死亡者数
plt.legend()
plt.grid()
plt.xlabel("Elapsed day")
plt.ylabel("Number of persons")
plt.show()
まとめてグラフにすると見にくい場合は、subplot機能を利用して別々に書くのもアリです。特に感染力が低い場合は、バラバラに描かないと、とても見にくいです。
plt.figure(figsize=(20, 4)) # 横サイズ、縦サイズ
plt.subplots_adjust(wspace=0.25, hspace=0.6)
plt.subplot(1, 4, 1) #縦1横4枠の、1枚目
plt.plot(S, label="Susceptible", lw=2, c="blue") # S: 感受性者数
plt.legend()
plt.grid()
plt.xlabel("Elapsed day")
plt.ylabel("Number of persons")
plt.subplot(1, 4, 2) #縦1横4枠の、2枚目
plt.plot(I, label="Infected", ls="--", lw=2, c="red") # I: 感染者数
plt.legend()
plt.grid()
plt.xlabel("Elapsed day")
plt.ylabel("Number of persons")
plt.subplot(1, 4, 3) #縦1横4枠の、3枚目
plt.plot(R, label="Recovered", ls="-.", lw=2, c="green") # 回復者数
plt.legend()
plt.grid()
plt.xlabel("Elapsed day")
plt.ylabel("Number of persons")
plt.subplot(1, 4, 4) #縦1横4枠の、4枚目
plt.plot(D, label="Dead", ls=":", lw=3, c="k") # 死亡者数
plt.legend()
plt.grid()
plt.xlabel("Elapsed day")
plt.ylabel("Number of persons")
plt.show()
配置が気にくわない場合は、
などの工夫で、描画方法を変更できます。
グラフを見ることで大雑把な傾向がわかります。ここで、社会運営を行う上で重要となる指標、
を算出してみます。ピーク感染者数とは、「最も感染が拡大しているときに、何人の感染者がいるか」という値になります。この値が一定値を超えると、病院が捌ける数を超え、医療崩壊の状態となります。
MaxInfectors = int(max(I)) # リストIの最大値(を整数で表現)
TotalInfectors = int(I[-1]+R[-1]+D[-t]) # シミュレーション終了時点の、S以外の数
TotalDeath = int(D[-1]) # リストDの最後の値(を整数で表現)
print("ピーク感染者数: ", MaxInfectors, "人")
print("累計感染者数: ", TotalInfectors, "人")
print("累計死者数: ", TotalDeath, "人")
グラフと合わせてみると、40日目付近で、最大3127人もの感染者が出るそうです。総人口が1万人ですから、とても感染力が強いことがわかります。また、累計感染者数が9366人ですから、人口のほとんどが感染してしまったことも見て取れます。一方で、累計死者数は94名となりました。感染者数が多い割に、死者数はそこまで多くないのかもしれません(致死率を1%としたことを思い出すと、だいたい死亡者は1%となっていることがわかります)。
(1) 上のシミュレーションの感染力、致死率をベースとします。ここで、変異株が登場し、感染力が$n$倍、致死率が$m$倍のウイルスが登場した場合、ピーク感染者数、累計感染者数、死亡者数はどう変化するでしょうか?
(2) 人々がマスクや3密の回避を徹底することで、感染力が$1/n$倍になりました。この際、ピーク感染者数、累計感染者数、死亡者数はどう変化するでしょうか?
(3) その他、他に色々パラメータを変化させて考察しましょう。例えば、
などです。感染力、除去率、致死率を変更すると、色々なウイルスを想定することができます。
1章 はじめに:(文章量の比率: 15%)
2章 SIRDモデル:(文章量の比率: 30%)
3章 シミュレーション:(文章量の比率: 40%)
3.1節 概要:
3.2節 結果と考察:
4章 おわりに:(文章量の比率: 15%)
参考文献:
参考にした資料を、2〜3件記載してください。以下、書き方の例です。
本文中で引用する場合は「大前らはXXXを実施している [1]。また、〜」のように、どこで引用したのか明白にしてください。