美文网首页数学教育自然科普
基于Logistic模型的新冠疫情预测模型

基于Logistic模型的新冠疫情预测模型

作者: 论文辅导 | 来源:发表于2020-04-29 09:30 被阅读0次

    本文主要介绍通过以Python为工具,首先编写爬虫爬取网络数据,获取疫情数据,然后使用Pandas和matplotlib等工具对数据进行分析,获得目前主要国家及全世界疫情变化图,最后根据目前的感染人数变化,使用Logistic算法构建拟合模型,并对未来的疫情数据进行预测的过程。

    因此,本文主要分为三部分:

    (1)数据爬取

    (2)变化趋势展示

    (3)世界疫情预测

    下文从这三方面按顺序展示。

    01

    数据爬取

    本文通过采集丁香医生网站的全世界疫情数据,通过整理,按国家排列,方便下文的分析使用,爬虫核心代码如下:

    response= requests.get(url='https://ncov.dxy.cn/ncovh5/view/pneumonia')

                    if request.status_code == 200:

                        current_data = request.json()

                        break

                    else:

                        time.sleep(1)

                        continue

    对上述爬取结果进行整理,通过网页分析工具,得出各个国家的疫情数据,由于国家数目过多,因此只展示后文使用到的几个国家数据,时间周期从3月16日到4月27日,数据展示前五条和后五条。如下图所示:

    02

    变化趋势展示

    文章以包括中国在内的10个世界大国作为研究对象,选择标准包括国家经济实力和感染人数等指标,分别是:中国、美国、日本、英国、法国、德国、印度、意大利、巴西和加拿大,使用Pandas和matplotlib绘制疫情变化趋势图,代码和趋势图如下

    data1 = data.loc[data['updateTime']>'2020-03-16']

    data2 = data1[data.provinceName.isin(['美国','中国','日本','英国','法国','德国','印度','意大利','巴西','加拿大'])]

    data4 = data3.groupby(['provinceName','data']).max()

    data4.reset_index(drop=False)

    line = Line()

    line.add_xaxis([str(i)[6:10] for i in data5['data']])

    line.add_yaxis('中国',data5['中国'],is_selected=True,is_symbol_show=False,is_smooth=False)       #绘图以中国为例,其余国家代码省略

    line.set_global_opts(title_opts=opts.TitleOpts(title="各国确诊情况"))

    line.render_notebook()       

    根据上图可以清楚的看到,目前在世界范围内,美国的疫情增长最为严重,而代表中国的红色曲线则始终为一条水平的直线,这是因为美国的数据太大,妨碍了其他国家的数据展示,可以通过使用百分比更直观的表示。

    在上图中可以发现,从3月16号开始,我国的疫情确诊患者占比从近70%,一路降低到目前不到10%,但是从确诊患者数量来看,我国确诊人数一直在81000+到84000+之间浮动,占比降低的原因是国外确诊患者的持续增多。对于这场与疫情的战斗尚未到胜利的时候,广大同胞仍需努力。

    上图将中国、美国、英国三个国家从3月16号到目前的确诊人数增长率表示出来,当天增长率=(当天确诊人数-前一天确诊人数)/前一天确诊人数*100%。

    注:为了在同一图中进行对比,上文中中国的增长率为放大10倍的结果。上图显示,40多天以来,随着国家打击疫情的力量不断增强,中美英三国的确诊增长率不断下降,疫情得到了有效控制。

    03

    世界疫情预测

    针对目前世界各国愈演愈烈的疫情发展,本文计划使用Logistic算法,基于目前的世界疫情数据,构建预测模型。

    Logistic函数或Logistic曲线是一种常见的S形函数,它是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系时命名的。广义Logistic曲线可以模仿一些情况人口增长(P)的S形曲线。起初阶段大致是指数增长;然后随着开始变得饱和,增加变慢;最后,达到成熟时增加停止。

    Logistic回归主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率,等等。

    例如,在胃癌发生的预测中,可以选择样本的年龄、性别、饮食习惯、幽门螺杆菌感染等作为自变量预测患者是否可能患有癌症。该函数的自变量既可以是连续的,也可以是分类的。在学术界,Logistic函数通常用作医学中的疾病预测、金融学中的信用信贷预测或更多具有分类需求的情境中。

    在疫情传播中,由于刚开始社会各界并不重视,疫情传播的环境阻力较小,因此增长率较大;当疫情进行到一定阶段,随着如戴口罩、感染源隔离、倡导减少活动等各项措施的实施,疫情传播的环境阻力增大,增长率减低,则传播曲线呈现出S形。本文选择该模型则是利用Logistic曲线的特性,通过调参模拟疫情的历史变化趋势,并预测未来的疫情数据。

    Logistic函数如下,其中为P0初始值,K为终值,r衡量曲线变化快慢,t为时间。

    接下来本文用Python工具,使用从3月16日到27号的世界疫情数据构建预测模型,代码如下

    # 构建Logistic函数

    def logistic_increase_function(t, K, P0, r):

         r=0.102

         t0 = 1

         exp_value = np.exp(r * (t - t0))

         return (K * exp_value * P0) / (K + (exp_value - 1) * P0)

    # 最小二乘拟合

    popt, pocv = curve_fit(logistic_increase_function, t, P)

    #拟合后对未来情况进行预测

    P_predict=logistic_increase_function(t,popt[0],popt[1],popt[2])

    future=[46,48,50,60,70,80,90,100]

    future=np.array(future)

    future_predict=logistic_increase_function(future,popt[0],popt[1],popt[2])

    #近期情况

    tomorrow=[45,46,47,48,49,50,51,52]

    tomorrow=np.array(tomorrow)

    tomorrow_predict=logistic_increase_function(tomorrow,popt[0],popt[1],popt[2])

    #拟合函数图像绘制

    plot1=plt.plot(t,P,'s',label="疫情确诊感染人数")

    plot2=plt.plot(t,P_predict,'r',label='感染人数拟合曲线')

    plot3=plt.plot(tomorrow,tomorrow_predict,'s',label='近期感染人数预测')

    plt.xlabel('日期')

    plt.ylabel('确诊人数')

    plt.legend(loc=0)

    plt.show()

    # 峰值预测图像绘制

    plot4=plt.plot(future,future_predict,'s',label='未来感染人数预测')

    plt.xlabel('时间')

    plt.ylabel('预计最终确诊人数')

    plt.show()

    # matplotlib不能直接处理中文,需要进行处理

    plt.rcParams['font.sans-serif']=['SimHei']

    plt.rcParams['axes.unicode_minus'] = False

    # 输出预测结果

    print("以下为从27号之后的10天内全世界确诊人数预测")

    for i in range(10):

         people_sick=int(logistic_increase_function(np.array(i+45),popt[0],popt[1],popt[2]))

         if i+28<=30:

            print("4月%d日确诊人数预计:%d人"%(i+28,people_sick))

         else:

            print("5月%d日确诊人数预计:%d人"%(i-2,people_sick))

    根据上述模型得出以下结果,

    根据上述结果,在未来的40-50天左右,本次疫情的增长将达到峰值,预测世界感染人数为400万左右。有鉴于此,衷心期望各国政府能加强疫情防治力度,积极限制人民的流动,增大环境阻力,尽最快速度消灭疫情,保障人民的安全。

    相关文章

      网友评论

        本文标题:基于Logistic模型的新冠疫情预测模型

        本文链接:https://www.haomeiwen.com/subject/hjowwhtx.html