융합과학마스터 도움 SIR 전염병 시뮬레이터 프로그램 Fusion Science Master Helper: Epidemic Simulator
🧬
융합과학 마스터 도움
융합과학 마스터 도움
SIR 전염병 시뮬레이터
수학 × 생물학 × 컴퓨터과학의 융합! 미분방정식으로 감염병 확산을 시뮬레이션해요 ✨
📐 수학/미분방정식
🦠 생물학/전염병학
💻 Python 코딩
📊 데이터 시각화
1
🔬 SIR 모델이란?
Susceptible · Infected · Recovered
S — 감수자 (Susceptible)
아직 감염되지 않았지만 감염될 수 있는 사람들. 바이러스에 노출되면 감염자(I)로 이동해요.
I — 감염자 (Infected)
현재 감염되어 다른 사람에게 바이러스를 전파할 수 있는 상태. 시간이 지나면 회복자(R)로 이동해요.
R — 회복자 (Recovered)
감염 후 회복하여 면역을 획득한 사람들. 더 이상 감염되지 않아요. (사망자도 포함)
📐 SIR 미분방정식 (핵심 로직!)
dS/dt = -β · S · I / N
dI/dt = +β · S · I / N -γ · I
dR/dt = +γ · I
β(베타) = 감염률 | γ(감마) = 회복률 | N = 전체 인구 = S + I + R
기초감염재생산수
R₀ = β / γ = 2.50
R₀ > 1이면 유행, R₀ < 1이면 소멸!
⚠️
2
⚙️ 파라미터 설정
슬라이더로 조절하고 시뮬레이션을 실행하세요!
⚡ 빠른 시나리오 선택
😷코로나19
β=0.3, γ=0.07
β=0.3, γ=0.07
🤧계절 독감
β=0.5, γ=0.3
β=0.5, γ=0.3
🔴홍역
β=0.9, γ=0.07
β=0.9, γ=0.07
⚠️에볼라
β=0.2, γ=0.1
β=0.2, γ=0.1
🫂 초기 인구(N)
10,000
🦠 초기 감염자(I₀)
10
📈 감염률(β) 하루 평균 감염 접촉 확률
0.30
📉 회복률(γ) 하루 회복 확률 (1/γ = 감염 기간)
0.12
📅 시뮬레이션 기간
160일
💉 백신 접종률
0%
3
📊 시뮬레이션 결과 그래프
▶ 실행 버튼을 눌러 그래프를 생성하세요
🩵 최종 감수자
-
❤️ 최고 감염자
-
💚 최종 회복자
-
📅 피크 도달일
-
4
🐍 Python 코드 구현
고교생이 직접 코딩할 수 있는 완전한 소스코드
# ✨ SIR 전염병 시뮬레이션 - 융합과학 마스터 도움
# 필요 라이브러리: pip install numpy matplotlib scipy
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button
from scipy.integrate import odeint
# ── 1단계: SIR 미분방정식 함수 정의 ──
def sir_model(y, t, N, beta, gamma):
S, I, R = y # 현재 상태 언패킹
dSdt = -beta * S * I / N # 감수자 감소
dIdt = beta * S * I / N - gamma * I # 감염자 변화
dRdt = gamma * I # 회복자 증가
return dSdt, dIdt, dRdt
# ── 2단계: 초기 파라미터 설정 ──
N = 10000 # 전체 인구
I0 = 10 # 초기 감염자
S0 = N - I0 # 초기 감수자
R0_init = 0 # 초기 회복자
beta = 0.30 # 감염률
gamma = 0.12 # 회복률
t = np.linspace(0, 160, 160) # 시간 배열
# ── 3단계: ODE 수치 적분 (Runge-Kutta) ──
y0 = S0, I0, R0_init
solution = odeint(sir_model, y0, t, args=(N, beta, gamma))
S, I, R = solution.T # 결과 분리
# ── 4단계: 결과 분석 ──
R0_num = beta / gamma
peak_day = t[np.argmax(I)]
max_infected = np.max(I)
print(f"기초감염재생산수 R0: {R0_num:.2f}")
print(f"감염 피크: {peak_day:.0f}일 ({max_infected/N*100:.1f}%)")
# ── 5단계: 그래프 시각화 ──
fig, ax = plt.subplots(figsize=(10, 6))
plt.subplots_adjust(bottom=0.35)
l1, = ax.plot(t, S, '#4090e0', lw=2.5, label='S 감수자')
l2, = ax.plot(t, I, '#e04060', lw=2.5, label='I 감염자')
l3, = ax.plot(t, R, '#40b070', lw=2.5, label='R 회복자')
ax.set_xlabel('시간 (일)'); ax.set_ylabel('인구수')
ax.set_title(f'SIR 전염병 시뮬레이션 (R₀={R0_num:.2f})')
ax.legend(); ax.grid(alpha=0.3)
# ── 6단계: 인터랙티브 슬라이더 ──
ax_beta = plt.axes([0.2, 0.2, 0.6, 0.03])
ax_gamma = plt.axes([0.2, 0.13, 0.6, 0.03])
s_beta = Slider(ax_beta, 'β 감염률', 0.01, 1.0, valinit=beta)
s_gamma = Slider(ax_gamma, 'γ 회복률', 0.01, 0.8, valinit=gamma)
def update(val):
b = s_beta.val; g = s_gamma.val
sol = odeint(sir_model, y0, t, args=(N, b, g))
s, i, r = sol.T
l1.set_ydata(s); l2.set_ydata(i); l3.set_ydata(r)
ax.set_title(f'SIR 시뮬레이션 (R₀={b/g:.2f})')
fig.canvas.draw_idle()
s_beta.on_changed(update)
s_gamma.on_changed(update)
plt.show()
💡 구현 순서 (1주 완성 플랜)
1일차: Python 환경 설정 + NumPy 배열 연습
2일차: SIR 함수 작성 + Euler 방법 반복 루프
3일차: odeint로 업그레이드 + Matplotlib 그래프
4일차: 슬라이더 위젯 추가 (matplotlib.widgets)
5일차: 시나리오 비교 기능 + 발표 자료 완성
1일차: Python 환경 설정 + NumPy 배열 연습
2일차: SIR 함수 작성 + Euler 방법 반복 루프
3일차: odeint로 업그레이드 + Matplotlib 그래프
4일차: 슬라이더 위젯 추가 (matplotlib.widgets)
5일차: 시나리오 비교 기능 + 발표 자료 완성
5
🚀 탐구 확장 아이디어
더 깊이 파고들고 싶다면!
SEIR 모델로 확장
노출자(E) 그룹 추가. 잠복기 있는 코로나19 등에 적용!
공간 시뮬레이션
지역별 네트워크 그래프로 확산 경로 시각화. NetworkX 활용!
실제 데이터 피팅
공공데이터 포털 코로나19 데이터와 모델 비교. scipy.optimize!
몬테카를로 시뮬레이션
확률론적 SIR 모델. 랜덤 요소 추가로 불확실성 표현!
