2026. június 29., hétfő

járványdinamikai modell szimuláció és elemzés

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