為什麼說不能絲毫放鬆對疫情的警惕?Python模擬實驗告訴你
新智元推薦
來源:Crossin的編程教室
編輯:張佳
這一個月來,大家最關注的就是新冠病毒疫情的發展了。令人欣慰的是,最近國內不少省市都沒有新增確診病例甚至病例數「清零」,已調低了防控級別,逐步復工復產。
這時我發現,在朋友圈中分化出了兩種截然不同的觀點:
一種認為,病毒還沒完全消失,這時候就出門,很可能帶來第二次傳播,所以應該繼續延續之前的封閉式管理;
而另一種則認為,目前湖北以外地區的疫情已基本得到控制,風險已經不高,而如果繼續限制出行則會給經濟帶來更大的損失,應該放開管控。
這兩個觀點我個人覺得都有道理但都不能走極端。既沒有必要過度恐慌,也不能對防控麻痹大意。尤其現在國外疫情擴散的情況下,我們更要注意潛在的風險。
這段時間在家裡,我也自己做了一個模擬人群行為和病毒傳播過程的程序,或許可以給大家一些參考。(代碼見文末)
出行模型:模擬群體中每一個人的行為
在流行病學中,已經有一些成熟的模型和公式。但我並非相關專業人士,所以我並沒有套公式,而是用了一種簡單粗暴的方法:模擬群體中每一個人的行為。
這個模型的基本要素是區域和人,這裡是10萬個人分布在1萬個區域上的效果。圖上點的大小反應了這一區域里人數的多少。考慮到現實中人群不是均勻分布的,這裡我們讓80%的人集中在了中間25%的區域中。
然後,讓其中的每一個人都移動起來。我給這個二次元世界的人們設定了這樣的規則:
在每個時間段中,有一定概率會出行,否則將留在原地。這個概率我們稱之為出行意願,可以在程序中修改。對應現實中,我們上班、上學、逛街、坐公交、去飯館,都是一種出行,都會在某個時刻與一群人在同一個區域
每個人會有3~6個常駐區域,在出行時,會有大概率在常駐區域中移動,但也有一定幾率會去新區域。這就好比,大多數人主要在辦公室、食堂、公交、家等幾個固定區域移動,同時也不可避免去其他一些地方
如果去新區域,那麼大概率會在周邊一格區域;但也有一定幾率會去隨機位置。對於隨機位置,你可以理解為火車、飛機等長途交通,現代人有可能在一天之內去到世界上任何一座大城市。
基於上述規則,我們的世界就動起來了。為了方便確認,我們標記出3個人,來觀察下他們的行為是否符合預期。
大部分時候,每個人都會在鄰近的幾個區域移動,偶爾也會出個遠門。
沒有設定任何數學公式的傳染模型
定義了人的行為,我們還要來定義另一個主角:病毒。我們設定如下規則:
疾病具有一定的潛伏期和發病期,潛伏期無癥狀,難以識別。但潛伏期不代表沒有傳染性,所以我們會用另一個參數來設定傳染期的開始時間
在每個時間點上,人們會接觸部分同區域的人,處在傳染期的人就有一定幾率傳染給其他接觸者。
隨著時間推進,被感染的人會依次經歷潛伏期、發病期。發病期有一定幾率會發展成重症,重症則有一定幾率會導致病亡。
我們假定這些基本都是可自愈的。如果能堅持到發病期結束,則會康復。
這其中牽涉的各環節幾率,我們都可以在程序的開始處設定好。
說明:因為代碼中用到的參數很多,為了便於理解,我把所有參數變數都用了中文命名。
首先嘗試設定潛伏期為5天左右,發病期為10天左右,在潛伏期結束前一天具備傳播性的情況。
我們用顏色來標記一個地區的整體情況,紅色表示感染的人群的比例,綠色表示康復人群的比例。
可以看到整個地圖上經歷了從最初小範圍轉播,到大面積爆發,再到逐步自愈康復的過程。
統計每個時間點上不同狀況人群的數量,繪製出這樣幾條曲線:
其中藍色為健康人群、紅色為被感染者、綠色為康復人群、黑色則是不幸病亡人的數量。雖然我沒有設定任何數學公式,但這一曲線的形態與流行病學的經典模型是相符合。這也從側面驗證了我們的模擬具備一定的可參考性。
【模擬參數】
潛伏期分布 = (5, 2)
發病期分布 = (10, 3)
傳染起始日 = -1
傳播概率 = 0.5
免疫概率 = 0.1
重症概率 = 0.05
病亡概率 = 0.1
戴口罩意願 = 0
出行意願 = 0.8
接觸比例 = 0.5
入院意願 = 0.1
【模擬結果】
被感染:72019
病亡:18018
病亡率:20.0%
在這個比較粗放的模型中,如果不加以干預任其發展,最後除了我們預先設定了一定比例的天然免疫人群外,其餘人最終都會被全部傳染。最終的病亡人數就單純取決於該疾病的致命性。這在現實中自然是不可能的。
於是,我們再給這個模型增加額外的參數:醫院
在這個世界中,我們增加2萬張床位。當一個人有了發病表現之後,就很可能去醫院就醫。一旦進入醫院,那麼他將不再出行,同時病亡的可能性將大大下降。
再次模擬運行後可以看出,如果有充足的醫療資源,病亡率低很多。
【模擬參數】
醫院床位 = 20000
入院意願 = 0.1
救治概率 = 0.95
其他同上
【模擬結果】
被感染:85867
病亡:3944
病亡率:4.4%
但是!
在現實中,醫療資源是有限的,當遭遇到傳播性強、甚至潛伏期無癥狀時就會傳播的疾病,醫療資源會在短期內迅速耗盡,失去對疫情的控制:
【模擬參數】
醫院床位 = 2000
其他同上
【模擬結果】
被感染:80901
病亡:8956
病亡率:10.0%
開啟口罩、方艙防控模式,疫情擴散得到抑制
所以,抗疫不能僅靠醫院。當發病人數達到一定閾值之後,我們開啟防控模式:
大幅降低人群的出行意願,並減少同一區域的人群接觸比例
讓大多數人帶上口罩,降低傳播幾率
另外很重要的一點是,增加方艙這個設定:將所有發病人員儘可能收入方艙,阻止進一步傳播;同時也把有限的醫院資源留給重症病人
在多措並舉的努力下,可大大抑制疫情的擴散。
【模擬參數】
醫院床位 = 2000
方艙床位 = 10000
警戒人數 = 1000
戴口罩意願 = 0.9
出行意願 = 0.2
接觸比例 = 0.2
入院意願 = 1
其他同上
【模擬結果】
被感染:11343
病亡:173
病亡率:1.5%
放鬆警惕後果不堪設想
那麼,是否到了可以放鬆的時候呢?
如果現在我們稍稍改動一下程序,在進展到40天之後,把人們的出行意願、戴口罩意願、接觸幾率都恢復到平常的水準。那麼,疫情將會再次出現一波擴散。這還是考慮到已康復人不會再次感染的情況。真實情況下,潛在的風險可能更大。
【模擬參數】
解除時間 = 40
其他同上
【模擬結果】
被感染:76083
病亡:9901
病亡率:11.5%
所以啊,萬不可放鬆警惕,復工復產很重要,也要記得戴口罩,開窗通風勤洗手,別往人多地方跑。
即便不繼續維持之前高級別的防控措施,我們只要保證大多數人還在戴口罩,適當降低不必要的外出,那麼疫情就會得到有效的控制。並非一定要休克式的嚴防死守。在做好重點地區疫情防控的前提下,相對安全地區的人做好個人防護,有序復工才是更加可持續的應對方式。
【模擬參數】
解除時間 = 40
戴口罩意願 = 0.9
出行意願 = 0.8
接觸比例 = 0.5
入院意願 = 1
其他同上
【模擬結果】
被感染:11212
病亡:181
病亡率:1.6%
最後我想說,這次新冠病毒來勢兇猛,人類對它知之甚少。因此在第一回合,我們損失慘重,短期內也難有特效藥的出現。但我們的防控體系已經建立起來,從數據上也明顯看出國內的情況正在不斷好轉。但隨著復工潮的到來,以及病毒在國外的擴散,接下來的任務依然艱巨。而在這場防控戰中,我們每個人都不可能置身事外,都是決定成敗的因素之一。
在這裡,也希望在這個特殊時期大家多一些理性,也多一些寬容。齊心協力,共克時艱。
詳細的參數使用和模擬邏輯,大家可結合代碼來理解。建議使用Jupyter來運行代碼。
作者簡介:Crossin先生,上海交大計算機碩士,計算機視覺方向,曾在業內多家公司從事相關方面的技術工作。他的公眾號「Crossin的編程教室」專註於Python教學已有6年,淺顯易懂的零基礎教程累計讓數萬名學習者邁入編程的大門。
病毒傳播模型代碼:
https://gitee.com/crossin/snippet/tree/master/InfectSim
B站視頻:
https://www.bilibili.com/video/av93691362/