今天本地的疫情终于没有增加,抽了点时间关注其他地区的疫情形势。看官方通报的数据,对曾经的模范城市的疫情有兴趣,决定来简单看看。

1 数据获取

1.1 数据来源

要获取准确的数据,当然是上官方网站。打开上海市卫健委的官网(https://wsjkw.sh.gov.cn/xwfb/index.html),疫情数据公告都在“新闻发布”栏目中疫情信息的标题中就包含了所有新增、确诊数据。真是太方便了。

library(rvest)
library(tidyverse)
library(lubridate)
library(readxl)
library(openxlsx)
library(ggforce)
library(mgcv)
library(deSolve)
library(FME)

1.2 数据

上海的疫情变化主要从3月开始

1.3 数据清洗

这一步比较麻烦的是对标题中日期字符的整理。使用str_extract_all命令后提取的日期,变成了列表。再合并为向量形势的日期格式数据时出了点麻烦。最后使用了笨办法for循环unlist后再paste0合并。其实直接用标题前的日期-1没什么大的误差,主要是在跟自己较劲搞得这么麻烦。

2 好了,开始分析吧

2.1 先画个简单的图看看大趋势

以报告感染者类型为颜色看,从20年1月到21年12月期间,上海的感染人数几乎在处于一个长期稳定的状态,从2022年3月开始呈直升飞机式的增长。奇怪的是中间咋有个空白区,没有数据。查看原始网页,发现网站从2021年11月6日-2022年1月1日没有更新数据。这是一个奇怪的现象。不过没关系,这不影响我们后面的分析,这对原因分析有很大关系

2.2 输入感染者的趋势

对上海这波疫情有个合理的猜测是,1月初上海接纳大量某地的航班的,导致上海市输入疫情压力陡增,再加上Omicron变异株超强传播能力,双重压力下导致这个模范城市失守。好吧,我们来看看是否能验证输入压力陡增这个猜测。从图上看新增输入的感染者数量变化并不大,鉴于确诊和无症状都属与感染这,下一步我们把本地和输入的感染者的合计数的变化可视化看看。

2.3 感染者总数

先用二者做个散点图看看,如图,完全看不出啥关系啊。。。。输入感染者较多的时候,反而本地感染处于低水平。这个图像,线性回归暂时也不考虑。我们还是从感染者数量和时间的关系看看。

画出来如下,大致能看出在3月14日前,上海几乎没有本土感染病例。

2.4 2022年3-4月

我们把时间尺度拉大到2月中旬到3月看看。放大后(下图1)到3月14日,输入感染人数开始上升,此时上海本地感染数量仍然无幅度的改变,处于平稳状态。为了更仔细看清楚变化情况,我们将y轴的数量调整至0-1000例,这时候能清楚看到每天的变化,本地感染者(蓝色)数量从3月16日快速上升者。

2.5 重点关注3月的数据

2.6 地区分布

获取了地区分布的疫情数据,结果很明显,浦东新区感染者数量最多,见下表:

Local 2022-04-07 2022-04-06 2022-04-05 2022-04-04 2022-03-28 2022-03-31 2022-03-30 2022-03-29 2022-03-27 2022-04-01 2022-03-24 2022-03-26 2022-04-03 2022-03-23 2022-03-20 2022-03-21 2022-03-19 2022-03-22 2022-03-25
浦东新区 9050 8457 8145 7071 2506 2407 2207 2183 1429 NA 193 323 NA 436 220 169 135 NA NA
闵行区 2257 2409 2937 1381 NA 392 780 987 619 1043 980 972 NA 256 NA 122 NA NA NA
徐汇区 2076 1107 920 1229 NA 226 404 1100 277 639 167 331 NA 212 46 130 122 NA NA
黄浦区 1380 1044 658 970 NA 121 361 110 56 260 204 320 824 40 42 98 72 118 NA
松江区 1288 781 796 1106 NA NA 476 426 190 948 184 158 NA 68 18 76 32 NA NA
普陀区 957 1033 483 254 NA 15 146 113 70 245 38 69 NA 68 36 31 50 NA NA
嘉定区 933 NA 481 237 NA 54 158 255 0 0 130 0 NA 69 0 NA 81 NA NA
长宁区 852 350 84 33 115 256 128 30 90 74 118 29 NA 22 13 52 24 38 8
虹口区 594 668 410 608 NA 128 84 73 27 61 58 50 NA 52 24 46 NA NA NA
宝山区 414 660 554 265 311 17 504 363 94 45 87 153 NA 138 26 134 NA 32 8
杨浦区 601 630 623 220 NA 174 100 99 70 134 21 23 NA 22 16 20 28 NA NA
奉贤区 92 556 144 64 230 183 130 96 90 161 48 168 119 12 26 22 12 NA NA
静安区 381 545 302 50 104 164 102 175 70 189 70 108 338 96 64 88 30 NA 4
崇明区 520 126 79 94 NA 44 386 55 472 166 164 54 NA 108 NA NA NA 38 82
青浦区 493 470 384 314 NA 95 77 174 86 174 26 44 NA 20 8 10 10 40 26
金山区 129 79 77 52 NA 42 66 26 0 49 0 0 NA 0 22 NA NA NA NA

画个玫瑰图看看,其实这个图并并能很好反应数据特征。

感觉还不如单纯的条图清晰

2.7 发现途径数据获取

获取数据信息如下

rep_date case_c case_u case_c_zh case_c_gk case_u_gk case_c_fx case_u_fx case_all case_all_gk case_all_fx
2022-04-08 1015 22609 420 301 21853 595 756 23204 22154 1050
2022-04-07 824 20398 323 121 19798 501 600 20899 19919 980
2022-04-06 322 19660 15 12 19027 307 633 19967 19039 928
2022-04-05 311 16766 40 4 16256 271 510 17037 16260 777
2022-04-04 268 13086 4 14 12592 264 494 13350 12606 744
2022-04-03 425 8581 71 7 7920 354 661 8935 7927 1008

2.8 时间分布

首先看看的大体趋势,从3月13日起,随着时间感染者数量几乎是成指数增加。但是从风险人群(红线)中检出感染者数量似乎有下降的迹象。

2.9 人群分布

再看看每天感染者发现途径的变化情况。红色代表每天从风险人群中发现感染者,蓝色代表从管控人群。可见从风险人群中发现感染者的比例大体趋势是逐渐减少的。这种情况视乎是一个好的征兆。但同时需要考虑随着防控政策的变化,对两类人群的定义是否也随之变化? 再单独看看风险人群中检出感染者的情况,从了4月3日,4月4日连续两天下降,且看起来几乎是呈直线下降,这是一个好兆头。预示着,随着大规模核酸检测工作的全面铺开,从社会面发现感染者数量的增长势头将会慢慢遏制。

3 简单总结

从上面的简单分析可得知,上海市境外输入感染者数量,从去年2月20日左右开始上升,增加的幅度从平均12例左右,到2月24左右达到85例左右。确实存在一个数量快速增加的阶段,之后过了大概一周的时间上海本地感染者开始快速上升,我们不得不猜测这二者之间可能存在某种联系。最后一张图添加了平滑曲线,做一个大致的预测。从图可见上海这一次疫情新增病人数量仍未到达所谓的“拐点”没爬错数据。随着检测人数的增加,防控措施的进一步加码和落实,相信这一波疫情会逐渐得到控制。

3.1 预测

曲线拟合如下

4 动力学微分方程

由于数字获取不准确,缺失数据太多,无法顺利拟合。

5 时间序列模型

5.1 加载相应的包

机器学习模型

随机森林模型

propboost

校准模型

校准

5.2 预测

从最新的数字看几个模型都预测病例数量开始下降了。

5.3 准确率

从下表可见拟合度最高的前面1,2,5这3个模型。

Accuracy Table
.model_id .model_desc .type mae mape mase smape rmse rsq
1 ARIMA(0,1,0) WITH DRIFT Test 9777 45 4.4 59 10292 0.97
2 PROPHET Test 11088 52 5.0 71 11533 0.79
3 GLMNET Test 12415 57 5.5 82 13271 0.56
4 RANDOMFOREST Test 15118 71 6.8 111 15734 0.63
5 PROPHET W/ XGBOOST ERRORS Test 3386 18 1.5 20 3771 0.90

5.4 模型选择

选择较好的几个模型预测

5.5 无责任预测

4个模型的预测值如下:

模型 日期 预测值
UPDATE: ARIMA(0,1,1) 2022-04-20 20130
UPDATE: ARIMA(0,1,1) 2022-04-21 20130
UPDATE: ARIMA(0,1,1) 2022-04-22 20130
PROPHET 2022-04-20 24328
PROPHET 2022-04-21 24893
PROPHET 2022-04-22 24347
GLMNET 2022-04-20 20273
GLMNET 2022-04-21 20403
GLMNET 2022-04-22 19619
PROPHET W/ XGBOOST ERRORS 2022-04-20 19648
PROPHET W/ XGBOOST ERRORS 2022-04-21 18582
PROPHET W/ XGBOOST ERRORS 2022-04-22 17821

待补充