查看原文
其他

Excel实例:上海疫情统计

瓜牛就是蜗牛 瓜牛笔记
2024-09-21

先看最终效果图:

第一张图,上面的彩色小柱子是每日新增病例,下面浅灰色的柱子是截止今天之前的累计病例数,图的下面还有每日病例的各区分布情况。


第二张图,是在每日新增病例里面单独将社会面的病例提取出来。


excel不是本公众号的主业,以后也不是,今天想写这个教程主要基于以下几点考虑:


1、首先,我和大部分人一样,excel用的不多,水平也很菜,软件只是工具,我不会为了学而学,肯定是要解决某个问题才去学的。刚好我想要自己去统计疫情发展情况,为什么呢?其一疫情来得太突然,对政府也一样,也没有经历过,面对初期政府的各种政策大家不理解,我也不理解,但是评论之前至少应该先了解它。其二,如果掌握了疫情的情况,对理解政府行为是不是会很有帮助呢?其三,也是最重要的,上海发布每天都公布了详细的病例情况,数据都是公开的,获取很容易。


2、想写下来是因为张五常曾说,不把思想写下来不会清楚的知道自己想的是什么,写的过程也是自己再一次学习加深印象的过程。


3、excel是一个很好的工具,很多人的工作生活中都能用到,顺便分享出来如果刚好对其他人有一点点帮助,那也是一件很美好的事。


正文:


下面我会以一个小白自学的思路来教你,我不保证我的方法是最好的,我只能保证我自己是这么想和这么做的。


总病例柱状图


1、先想想你需要什么,比如第一张图,我们很容易就想到常用的柱状图,就是下面这种,“堆积柱形图”,例子里,上面柱子是确诊,下面是无症状,这个应该没难度。



2、接下来就简单了,我们想要的不是每日新增,而希望上面是每日新增,下面是截止昨天的累计病例。上图底下的蓝色是确诊,对应数据的前面一列,上面的柱子对应后面一列。类比到我们想要的效果就是:底下(前面一列)换成累计病例数据源,上面(后面一列)换成日新增数据源,把数据做成下表这样就可以了。然后就是美化一下,添加数据标签等常规操作,本质上还是那个“堆积柱形图”,只不过数据源要自己稍微整理下。


我自己的原始数据是下面这样的,图上显示的只需要3列数据,日期、累计新增和日新增,其他列都是辅助的,每天只需要把确诊、无症状和转归3个数字填上,图就自动更新了,日新增=确诊+无症状-转归,累计新增就是把之前的日新增全部相加。(日新增、累计新增都只用到了每个人都会的求和SUM函数,这个就不展开说了。)

说一下制图的时候如何跨列选取数据源,直接参考下图试试就会了,很简单。


3、上面的图是不是挺简单的?接下来一个问题就是如何获取每天的确诊、无症状和转归3个数字,我想很多人已经会了,比如下图中727、6606、529就是我们要找的3个数据。到这里,第一张图上面的那个柱状图你就已经会了。

各区数据获取


接下来说说第二部分的各区分布数据怎么获取。


1、数据源还是上海发布,每天发布的数据分两部分,一部分是确诊,确诊又分为闭环、风险人群筛查、还有转归,另一部分是无症状,无症状又分为闭环、风险人群筛查。

也就是上图的5小块,风险人群筛查就是我们说的社会面,怎么得出具体数据呢?也简单,比如“病例227—病例233,居住于嘉定区,”那就是233-227+1=7,简单的减法,每个区都由这5小部分的数据组成,上海一共16个区,5*16=80,也就是说你每天口算80次减法就能得到你想要的数据了。原理就是这么个原理,不难,就是费脑细胞


透露个小秘密,我刚开始就是这么干的,每天早上起来做口算题,哈哈哈,不过你们也发现了,刚开始我只是统计了各区的社会面数据,2*16=32,每天早上最多做32个口算题,而且大部分是两位数或一位数,三位数的少,这没什么难度,就当早上醒醒脑。如下图,每天填32个数字。我并没有统计各区的所有日新增数据,因为口算量太大,也没有迫切的需求,因为在疫情初期,社会面清零是第一目标。


直到社会面基本清零之后,各区日新增总人数越来越有观察价值,但是这么大的计算量我是拒绝的,懒是推动人类进步的第一原动力,轻松获取的方法当然有,只需要不到1分钟,比原来还快。


2、先观察,发现文字都很有规律,比如“无症状感染者1—无症状感染者12,居住于浦东新区,”,如果这句话里面的浦东、1、12能自动提取出来就好了。


3、提取区名,先把文字复制到excel,然后输入下面的公式:

解释:

(说明,后面的函数有一点点难度,需要先初步了解我说到的函数,方法可以通过帮助文件或者网上搜索,之后才能更好的理解下面的公式,我只说重点部分,基础的函数需要你们先大概了解,否则这篇文章就太长了。)

FIND("于",V5)+1,返回要找的字的位置,找到“于”字的位置,+1就是往后退一个字,就是“徐”字的位置。

=MID(V5,xxx,2),这是提取函数,从“徐”字开始提取,2指的提取2个字,就是“徐汇”。


4、提取第一个出现的数字。

解释:

FIND("病例",V5,1),找出“病例”,1指的从第一个字开始找。

后面+2就是刚好到我们需要的1。

ROW($1:$6)指的是构建一个1,2,3,4,5,6的数组,什么意思呢,下面再说。

之前说了MID函数,就是提取字符,结合上面的数组,意思是提取了下面这一组文本:(选中公式按<F9>键可以实时的显示运算结果)

前面负号作用是把文本转换成数字,不是数字的文本就变成了无效,报错,#VALUE!。

LOOKUP就是查找,找什么?找1,在哪里找?后面那一堆由-1和#VALUE!里找,LOOKUP找不到1,就会找比它小的最后一个数,显然这里只有-1符合要求,LOOKUP自动忽略报错#VALUE!,这是本函数的重要特性,找到了-1返回什么呢?默认返回找到的数,也就是-1,前面的1可以换成任何大于-1的数都行,比如0也行。

最前面的负号很好理解,把-1变成1,这就是我们需要的数。


5、提取第二个出现的数字。

和提取第一个数字类似,只说不同的地方:


文本里有两个“病例”,怎么准确找到我们想要的第二个?FIND后面的5指的是我不从第一个字找,从第5个字开始找,这样开头的病例就排除了,这个5也可以换成2、3等等数字,如果换成2,意思就是从第二个字“例”开始找“病例”也会找到我们需要的。


另一个不同就是,假如就1例,比如下面的松江,那我们找第二个病例就会报错,因为找不到,如下图。

解决办法是加一个IFERROR函数,意思是如果报错,就返回第一次提取的数。



6、接下来就简单了,无症状的区别是找的不是“病例”,而是“感染者”,每天把上海发布的文字复制到我们的excel,后面的数自动就有了。

统计无症状的公式:


7、统计各区总数用SUMIFS函数,这个简单,自己试试就知道了,不详细解释。


社会面清零连续天数


这个表只有一个难点,下面的连续天数怎么统计?一个个数最近有几个0这当然是可以的,但是有缺点,每次要重复数一数,而且容易出错,我刚开始就是一个个数的,后面发现有一天数错了,你们可能没发现?然后我就去找其他不会出错的方法。


思路是,如果能找到最后一个不是0的行的行数,再把最新的行数减去它,最近连续为0的数量不是就有了?先看公式:

解释:

LOOKUP,找1,哪里找?前面用0/本列的数会得到什么呢?0/0报错,返回#VALUE!,0/不是0的数=0,所以返回的是一组由0和#VALUE!,这里有很多0,而最后一个0才是我们需要的,这刚好就是LOOKUP的优势。

用1去找,找不到1,怎么办?会找小于1的最后出现的数,错误值#VALUE!会自动被函数忽略,找到之后返回什么值呢?默认返回找到的数,但是显然不是我们想要的,用ROW返回这个数所在的列数,再把最新的数所在的列数减去前面的列数,是不是就是我们需要的最近连续为0的个数了?


备注:

以上应该也有其他的方法及函数,可以得到同样的结果,如有好方法,可以留言,望不吝赐教。

继续滑动看下一个
瓜牛笔记
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存