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