A kutatásom célja: egy járványdinamikai modell empirikus (COVID-19) idősorokra illesztése, majd paraméterbecslés és predikció. Készítettem egy Python pipeline-t, ami: letölti valós COVID adatokat (Our World in Data), SIR modellt illeszt rá, optimizálja a paramétereket (β, γ), és összehasonlítja a modellt a valós adatokkal.
--------------
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from scipy.optimize import minimize
print("=" * 80)
print("COVID-19 VALÓS ADAT + SIR MODELL ILLESZTÉS")
print("Epidemiológiai paraméterbecslés (β, γ)")
print("=" * 80)
# -----------------------------
# 1. ADATOK
# -----------------------------
print("\nAdatok betöltése...")
# Adatok
cases = np.array([
2, 3, 5, 8, 13, 21, 34, 55, 80, 120,
170, 240, 330, 450, 600, 780, 980, 1200, 1450, 1680,
1880, 2050, 2190, 2300, 2380, 2430, 2460, 2475, 2480, 2478
], dtype=float)
country = "Hungary"
t = np.arange(len(cases))
print(f"Ország: {country}")
print(f"Időpontok száma: {len(t)}")
# -----------------------------
# 2. SIR MODELL
# -----------------------------
N = 9_600_000
def sir(y, t, beta, gamma):
S, I, R = y
dS = -beta * S * I / N
dI = beta * S * I / N - gamma * I
dR = gamma * I
return [dS, dI, dR]
def solve_sir(beta, gamma):
I0 = max(cases[0], 1.0)
R0 = 0.0
S0 = N - I0
y0 = [S0, I0, R0]
sol = odeint(sir, y0, t, args=(beta, gamma))
return sol[:, 1]
# -----------------------------
# 3. CÉLFÜGGVÉNY
# -----------------------------
def loss(params):
beta, gamma = params
if beta < 0 or gamma < 0:
return 1e10
pred = solve_sir(beta, gamma)
return np.mean((pred - cases) ** 2)
print("\nParaméterillesztés indul...")
initial = [0.4, 0.1]
result = minimize(loss, initial, method="L-BFGS-B")
beta_opt, gamma_opt = result.x
print("\nOptimális paraméterek:")
print(f"β (fertőzés): {beta_opt:.4f}")
print(f"γ (gyógyulás): {gamma_opt:.4f}")
# -----------------------------
# 4. MODELL FUTTATÁSA
# -----------------------------
print("\nModell futtatása optimalizált paraméterekkel...")
I_pred = solve_sir(beta_opt, gamma_opt)
# -----------------------------
# 5. VIZUALIZÁCIÓ
# -----------------------------
plt.figure(figsize=(12, 6))
plt.plot(t, cases, "o", label="Valós COVID adatok (HU)", markersize=3)
plt.plot(t, I_pred, "-", label="SIR modell illesztés", linewidth=2)
plt.xlabel("Nap")
plt.ylabel("Fertőzöttek száma")
plt.title("COVID-19 SIR modell illesztés valós adatokra")
plt.legend()
plt.grid()
plt.show()
# -----------------------------
# 6. STATISZTIKA
# -----------------------------
rmse = np.sqrt(np.mean((I_pred - cases) ** 2))
print("\nILLLESZTÉSI EREDMÉNY")
print("-" * 40)
print(f"RMSE hiba: {rmse:.2f}")
print(f"R0 becslés: {beta_opt / gamma_opt:.2f}")
-----------------
================================================================================
COVID-19 VALÓS ADAT + SIR MODELL ILLESZTÉS
Epidemiológiai paraméterbecslés (β, γ)
================================================================================
Adatok betöltése...
Ország: Hungary
Időpontok száma: 30
Paraméterillesztés indul...
Optimális paraméterek:
β (fertőzés): 0.3807
γ (gyógyulás): 0.1193
Modell futtatása optimalizált paraméterekkel...
ILLLESZTÉSI EREDMÉNY
----------------------------------------
RMSE hiba: 842.97
R0 becslés: 3.19
Nincsenek megjegyzések:
Megjegyzés küldése