2 분 소요

# 출처
### https://towardsdatascience.com/infectious-disease-modelling-part-i-understanding-sir-28d60e29fdfc

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt
import mpld3
mpld3.enable_notebook()

SIR 모델

SIR 모델은 전염병의 전파 과정을 가정하는 수학적 모델이다.

SIR 모델의 S, I, R은 다음과 같다.

S (Susceptible) == 미감염자의 수. 전염병에 노출되었을 때 감염될 가능성이 있는 사람들의 수

I (Infected) == 감염자의 수. 전염병에 감염된 사람들의 수

R (Recovered) == 완치자의 수. 감염되었지만 회복되거나 사망한 사람들의 수

N (Total Population) = S + I + R

SIR 모델은 전체 인구를 S + I + R = N 으로 나누어 모델링합니다. 시간이 지남에 따라 미감염자 수 (S)는 감염자들과의 접촉이 일어날 때 감염될 가능성이 있으므로 감염자 수 (I)에 비례하여 감소합니다. 감염자 수 (I)는 시간이 지남에 따라 감염자끼리의 접촉이 일어나 감염자 수(I)가 증가합니다. 완치자의 수(R)는 감염자 수(I)에 비례하여 증가합니다.

SIR 모델에서는 시간에 따른 S, I, R의 변화를 각각의 수학적 방정식으로 모델링하고, 이를 토대로 전염병의 전파 과정을 예측하고 대처방안을 모색할 수 있습니다.

1. SIR 모델의 미분 방정식

SIR 모델의 미분 방정식은 다음과 같이 나타낼 수 있습니다.


\[\large dS/dt = -\beta \times S \times I / N\]

\(\therefore 미감염자 수S는 감염확률 \beta와 감염자 수 I에 비례해 감소한다\)

\[\large dI/dt = \beta \times S \times I / N - \gamma * I\]

\(\therefore 감염자 수I는 회복확률 \gamma에 비례해 감소한다\)

\[\large dR/dt = \gamma \times I\]

such that

dS/dt = 시간에 따른 미감염자 수의 변화율
dI/dt = 시간에 따른 감염자 수의 변화율
dR/dt = 시간에 따른 완치자 수의 변화율
$\beta$ = beta = 감염 확률
$\gamma$ = gamma = 회복 확률
N = 총 인구수

def deriv(y, t, N, beta, gamma): #t : 현재 시간
    S, I, R = y # y : S, I, R의 초기값을 담은 배열
    dSdt = -beta * S * I / N # S의 변화율
    dIdt = beta * S * I / N - gamma * I #I의 변화율
    dRdt = gamma * I #R의 변화율
    return dSdt, dIdt, dRd

2. 모델 파라미터 가정

N = 10,000 ==> 인원 10,000명의 모집단
beta = 2.0 ==> 감염자는 하루에 2명에게 병을 감염시킨다
D = 4.0 ==> 감염은 4일간 지속한다
gamma = 1.0 / D ==> 회복률 : 4일간 점진적으로 치유

S0, I0, R0 ==> 처음 모델을 시작할 때의 조건

N = 100000
beta = 2.0
D = 4.0
gamma = 1.0 / D

S0, I0, R0 = 99994, 5, 1

3. Train Model

t = 발병일 0부터 50일까지의 경과 확인

scipy.integrate.odeint 함수는 초기값 y0과 미분 방정식 deriv을 입력받아 미분 방정식의 수치해를 계산하여 시간에 따른 변수의 변화를 예측하는 함수이다. 이 때, 미분 방정식은 1차 미분 방정식이어야 한다.

odeint 함수는 먼저 초기값과 시간 범위를 설정하고 초기값을 이용하여 미분 방정식을 계산한다. 그 다음 계산된 미분 방정식을 이용하여 다음 시점의 변수 값을 추정한다. 이를 다시 초기값으로 사용하여 미분 방정식을 계산하고, 다음 시점의 변수 값을 추정하는 과정을 반복한다.

t = np.linspace(0, 49, 50)
y0 = S0, I0, R0

ret = odeint(deriv, y0, t, args=(N, beta, gamma)) # SIR 모델 시뮬레이션
S, I, R = ret.T # 각 변수의 값을 추출하여 배열로 반환

plotsir(t, S, I, R)

댓글남기기