感染症数理モデル(SIRモデルと集団免疫の数理)
感染率 β と回復率 γ の比率から、パンデミックの山とワクチン接種の必要割合を予測する微分方程式
- 1
- SIRモデルは人口を未感染者(S)・感染者(I)・回復/免疫者(R)の3群に分け、非線形連立微分方程式でパンデミックの推移を記述するモデル
- 2
- 基本再生産数 が 1.0 を超えると感染が爆発的(指数関数的)に拡大し、1.0 を下回ると自然消滅する
- 3
- 集団免疫の達成閾値は で計算され、これを超える割合の人々がワクチンや既感染で免疫を持つと、社会全体で感染拡大がストップする
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
1927年にペストやコレラの感染爆発を予測するため、人口を「未感染・感染・免疫」に分割して微分方程式で解き明かした公衆衛生の数理革命。
身につく武器・思考力
基本再生産数 R0 から「何%の人間がワクチンを打てば感染がストップするか(集団免疫閾値)」を自ら数式で計算し、感情論に惑わされない科学的判断ができる。
実社会・ITでの活躍現場
- •WHOや厚生労働省によるパンデミック時の感染ピーク予測と医療病床確保計画
- •新型コロナやインフルエンザワクチンの有効性・必要接種率のシミュレーション
- •SNS上の情報拡散(バズ)やフェイクニュース伝播のエージェントモデル解析
- •コンピュータウイルスの社内ネットワーク感染遮断プロトコル設計
Layer 1 — 直感・シミュレーター
「感染率 」や「ワクチン接種率」のスライダーを動かしてみよう。接種率を引き上げて集団免疫閾値を超えると、感染者数(赤線)の山が消滅し、医療崩壊ラインを下回る劇的な効果をシミュレーションで体感できる。
あるウイルスの基本再生産数が であるとき、感染の自然拡大を阻止して「集団免疫」を達成するために必要な免疫保有者の割合(閾値)は何%か?
Layer 2 — 定義・受験・証明
定義
総人口を (一定)とする。時刻 における未感染者数 、感染者数 、回復・免疫者数 の時間変化は、ケンドリックとマッケンドリックによるSIR方程式で定義される。
ここで は感染率(接触頻度×感染確率)、 は回復率(平均感染期間は 日)である。
公式・数理モデル
証明・導出
集団免疫閾値(Herd Immunity Threshold)の導出:
感染が拡大するか収束するかは、感染者数の時間微分 の正負で決まる。
ここで は「実効再生産数(時刻 で1人の感染者が新たに感染させる平均人数)」である。
1. のとき、 となり感染者は指数関数的に増加する(流行発生)。 2. のとき、 となり新規感染は減少に向かい収束する。
社会の中でワクチン接種などにより免疫を持つ人の割合を とすると、未感染者の割合は最大でも となる。 感染拡大を防ぐ( を維持する)ための条件は、
これより、集団免疫を達成するために社会全体で必要な免疫獲得割合の理論的下限値 が導かれる。
押さえておきたいポイント
- 感染拡大の初期段階では、感染者数は という急激な指数関数的増殖(感染爆発)を示す
- 全員が感染しなくても、免疫保持者が一定割合を超えることで未感染者への感染経路が遮断される現象が「集団免疫」である
- 現実の公衆衛生では、行動制限(ロックダウンやマスク)で接触率 を下げつつ、ワクチンで感受性人口 を減らす複合政策が取られる
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
公衆衛生政策におけるパンデミック予測とワクチン配分最適化
厚生労働省やWHOの感染症対策タスクフォースでは、年齢層別接触マトリクスや地域移動データを組み込んだ拡張SIRモデル(SEIRモデルやエージェントベースモデル)を用いて病床逼迫度を予測し、緊急事態宣言の発令やワクチン重点供給の意思決定を行っている。
1// SIRモデルの数値解法(4次ルンゲクッタ法)2function simulateEpidemic(3 totalPop: number,4 initialInfected: number,5 beta: number, // 感染率6 gamma: number, // 回復率7 days: number = 608) {9 let s = totalPop - initialInfected;10 let i = initialInfected;11 let r = 0;12 const dt = 0.2; // 0.2日刻み1314 const r0 = beta / gamma;15 const herdImmunityPct = (1 - 1 / r0) * 100;16 let peakInfected = i;1718 for (let t = 0; t <= days; t += dt) {19 const ds = (-beta * s * i) / totalPop;20 const di = (beta * s * i) / totalPop - gamma * i;21 const dr = gamma * i;2223 s += ds * dt;24 i += di * dt;25 r += dr * dt;2627 if (i > peakInfected) peakInfected = i;28 }2930 return {31 r0: r0.toFixed(2),32 herdImmunityThreshold: `${Math.max(0, herdImmunityPct).toFixed(1)}%`,33 finalRecovered: Math.round(r),34 peakInfected: Math.round(peakInfected),35 };36}3738// 例: R0 = 3.0 の感染症シミュレーション39const result = simulateEpidemic(100000, 10, 0.6, 0.2);40console.log(`基本再生産数 R0: ${result.r0}`);41console.log(`集団免疫に必要な接種率: ${result.herdImmunityThreshold}`);42console.log(`最大同時感染者数: ${result.peakInfected} 人`);
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元