中國疫情發展趨勢分析預測(python實現)

中國疫情發展趨勢預測

筆者使用的增長模型預測中國疫情發展趨勢,使用了3種增長模型進行了預測,這裏只貼出利用邏輯斯蒂增長模型的代碼。

 

logistic增長的曲線也稱爲s型曲線。下圖左圖爲曲線數量,右圖爲增長速率。

 

邏輯斯蒂增長模型,又叫阻滯增長模型,
邏輯斯蒂曲線通常分爲5個時期:

  • 開始期,由於種羣個體數很少,密度增長緩慢,又稱潛伏期。
  • 加速期,隨個體數增加,密度增長加快。
  • 轉折期,當個體數達到飽和密度一半(K/2),密度增長最快。
  • 減速期,個體數超過密度一半(K/2)後,增長變慢。
  • 飽和期,種羣個體數達到K值而飽和。

根據歷史經驗,2003年非典患者預測,部分學者利用邏輯斯蒂增長模型進行預測,並且準確率很高,所以我們也嘗試利用邏輯斯蒂增長模型進行新型冠狀病毒患者數量,邏輯斯蒂增長模型具體爲:$y=\frac{k}{1+\mathrm{e}^{-a(x-b)}}$
其中k表示新型冠狀病毒患者的上限值;a反映了增長速度;b表示拐點,即從b點開始上升速度變慢,在b點時上升速度達到最高。

好了邏輯斯蒂增長模型的基本知識就介紹這麼多,現在讓我們開始來點乾貨。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import warnings
# from scipy.optimize import curve_fit  # 非線性最小二乘法擬合
from scipy.optimize  import leastsq

warnings.filterwarnings('ignore')

plt.style.use("seaborn")
plt.rc('font', family='SimHei', size=13)  # 顯示中文
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號


# 先讀取數據
China_data = pd.read_csv(r"./total.csv", encoding='gbk')
China_data

然後我們先來繪製中國疫情累計確診患者數量走勢圖,我們主要的任務是預測,所有就不貼出交互的圖,貼個簡單的走勢圖即可

 

plt.plot(China_data['累計確診'], label='確診')
plt.plot(China_data['現存疑似'], label='現存疑似')
plt.plot(China_data['累計死亡'], label='死亡')
plt.plot(China_data['累計治癒'], label='治癒')
plt.legend(loc="best")
plt.xlabel("時間")
plt.title("2019-nCoV疫情曲線")

根據之前預測非典患者數量的經驗,我們也考慮使用增長模型來預測

# 邏輯斯蒂增長模型
def logistic_increase_function(p, t):
    K, a, b = p
    exp_value = np.exp(-a * (t - b))
    return K / (1 + exp_value)
# 定義預測誤差函數
def err_f(p, t, y):
    return logistic_increase_function(p, t) - y
# 參數初始值
logistic_p0 = [80000, 0.8, 20]  # 初始值只要不是太離譜,最終都會收斂

# 我們選擇的數據
t = np.array([i + 1 for i in range(56)])
China_y = China_data['累計確診'].values

# 利用最小二乘法求解參數
logistic_params = leastsq(err_f, logistic_p0, args=(t, China_y))

China_p = logistic_params[0]

# 利用我們定義的邏輯斯蒂增長函數預測
China_predict_data = logistic_increase_function(China_p, t)
China_predict_data

# 預測的誤差
China_e = China_y - China_predict_data
China_e

# 繪製誤差的散點圖
plt.scatter(China_y, China_e)

對於誤差大的樣本點,可以刪除,然後重新擬合參數,這裏我們就不刪除了

# 繪圖
plt.scatter(t, China_y, label="實際確診患者數量")
plt.plot(t, China_predict_data, label='預測患者數量曲線')
plt.xlabel('time')
plt.ylabel('患者數量')
plt.legend(loc='best') 

 

# 預測中國疫情未來走勢
future_t = [i + 1 for i in range(0, 100)]
China_future_fit = logistic_increase_function(China_p, future_t)
China_future_fit
# 繪圖
plt.scatter(t, China_y, label="實際確診患者數量")
plt.plot(future_t, China_future_fit, label="預測未來患者數量")
plt.xlabel('time')
plt.ylabel('患者數量')
plt.legend(loc='best') 

模型預測的結果是中國新冠肺炎最終的患者數量是80717人左右,拐點出現在第30天,即2月7日左右,疫情將在第80天,即3月29日左右結束。

感興趣的朋友,可以利用這個模型預測韓國、日本、意大利、伊朗等國家的疫情發展趨勢,另外筆者還利用Gompertz增長模型也進行了預測,這裏就不貼出來了,感興趣的朋友,可以自己實現一下。

這裏僅貼出Gompertz模型的函數

# Gompertz增長模型
def func(p, t):
    k, a, b = p
    return k * a**(b**t)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章