疫情数据分析
根据我们之前学习的内容,我们今天就来做些有趣的数据分析。 其实我在分享 Numpy 教学的时候,就已经做过一次用 Numpy 来处理分析疫情数据的教学。 现在我们学习了更适合做数据分析的 Pandas 库,也可以来思考用 Pandas 如何来对此进行分析。
20年开始的新冠肺炎席卷全球,我们能从肺炎数据中发现什么规律呢?我提前给你准备了从 2020 年 1 月 22 日到 2020 年 7 月 27 日的数据。
数据一览¶
这份数据是 Kaggle 上的公开数据集 , 我已经提前给你准备好了,请先点击下方运行按钮,我帮你拉取数据到你的浏览器环境。
点击运行后,你可以看到,在你的浏览器环境中,已经有了 covid19_day_wise.csv
这个文件了, 而且可以发现,拉取到的这份文件是一个 csv 文件。 现在我们就应用 读取数据中的方法 来 read_csv()
文件。
如果你不方便下载,我这里也有一份同样的,有兴趣你可以自己下载下来 , 用下面的代码在你本地加载数据。
了解了数据的大概样子,那么来使用你所学到的 Pandas 技能,我们来分析下面这几个问题。
- 获取 2020 年 2 月 3 日的所有数据
- 2020 年 1 月 24 日之前的累积确诊病例有多少个?
- 2020 年 7 月 23 日的新增死亡数是多少?
- 从 1 月 25 日到 7 月 22 日,一共增长了多少确诊病例?
- 每天新增确诊数和新恢复数的比例?平均比例,标准差各是多少?
- 画图展示新增确诊的变化曲线
- 画图展示死亡率的变化曲线
某日所有数据¶
相比 Numpy 的方式,Pandas 可以更便捷的获取到这些数据。 比如我想拿到 Date Column 中的前几个数据值,我就直接调用 df["Date"][:5]
这种形式。
又或者我需要拿到具体的某一天的值,比如 获取 2020 年 2 月 3 日的所有数据。
累积确诊¶
2020 年 1 月 24 日之前的累积确诊病例有多少个?
同样,对比 Numpy 的处理方式,又是转 indexing 又是反转 indexing 的操作, Pandas 简直是不能太简单了。只需要找到 2020-01-24
所在的行,并且标出 Confirmed
Column 名,就能锁定行列位置。 然后用 df.loc[]
就能找到具体的数值了。 df.loc[]
的具体使用方法请看这里。
新增死亡¶
2020 年 7 月 23 日的新增死亡数是多少?
这还是一个在 Pandas DataFrame 中选取数据的过程,我们要搞清楚具体的索引是什么。 上面我们已经找到了确诊数
的标题(Conformed),现在你来找一下哪个标题对应着新增死亡数?
没错!就是New deaths
, 我们再按上面的流程把这个数据给拿出来。
总增长数¶
从 1 月 25 日到 7 月 22 日,一共增长了多少确诊病例?
获取数据都是小儿科,我们来点真正的数据分析。要基于原有的数据,进行多次加工,来获取新的结论和结果。 在这个任务中,为了方便运算,我们将日期数据转换成一个时间数据, 使用到的是在这一节学习到的时间转化方法。 之所以这么做,是因为转换后的时间数据,可以方便地进行大小对比。
之后我们要进行一次累和的计算,就能得到最终的病例数啦。
上面要注意一下,在时间数据的大小比对时,我用了 &
符号,这是 Python 中一个表示 and
的逻辑,而且可以对一整个向量做 and 逻辑。
有的同学肯定会问了,我们不是有累积确诊的个数嘛,我也能用累计确诊的那一 column 来计算出这段时间内的确诊病例数呀。 好的,我们就来按这种方法计算一下。
奇怪了,为什么两种计算结果对应不上呢?我大胆猜想一下,可能是因为有人感染了两次或多次,导致新增的数据中重复计算了。 所以用新增数据来算的话,比累积确诊的方式来计算的要多。
我们还能具体分析看看,具体是哪天的数据对不上,详细输出一下。
确诊恢复比例¶
每天新增确诊数和新恢复数的比例?平均比例,标准差各是多少?
这一个任务,我们需要再计算计算,会要使用到批量计算功能,首先确定要拿取到的数据是什么,然后再对这些数据进行计算。 按要求,我们要拿到新增确诊数(New cases),和新的恢复数(New recovered),然后再相除,最后再计算平均值和标准差。
咦奇怪了,我什么第一个是 nan
呢?nan
在 numpy 中表示的是 Not a Number
, 说明计算有问题。我们单独打印一下,看看为什么出现 nan
。
原来是因为 New recovered
的第一个位置数据为 0,任何数除以 0 是不成立的,所以才会把这个计算给出一个 nan
的结果。 你看做数据分析还是挺有意思吧,会出现各种意想不到的状况。然后我们把 New recovered
为零的数都剔除掉。
得到计算结果后,我们还是能明显发现,被治好的人的确比新增的要多,这就说明,我们的存活率还是挺高的。
可视化数据¶
画图展示新增确诊的变化曲线
有时候,光秃秃的数字并不能生动表现这些数字背后的规律。我们还可以把它画出来。至于如何画, Pandas 其实已经内置了很多画图工具,有兴趣了解如何用 Pandas 画图的,请点击这里。
现在,我们就来做新增确诊的可视化数据吧。
不画不知道,一画出来就吓一跳,在前半部分的时候,确诊数还在缓慢增长,但是在 50 天左右的时候,发现新增确诊数陡增。我们看看第 50 天是哪个日期。 新冠在前期还是传播得十分迅速的。
画图展示死亡率的变化曲线
画这个图也非常简单,我们只要找到对应的 column 就行。我只是觉得这个数据比较有趣,想看看人类对于一个陌生疾病的斗争历史。 因为在前期,我们对新冠还不了解的时候,可能死亡率还是比价高的,但是随着了解的加深,政策的颁布,疫苗的发布,死亡率应该都会有变化。
你看,结果也是能在图上看到的,大概在 100 天左右的时候,死亡率开始下降了,100 个人中死 7 个, 逐渐变成死 4 个。可见当时各种政策的颁布还是有效果的。
总结¶
数据分析是一件非常有趣的事情。我之前租房子,还用爬虫做过悉尼各地区的房价分析, 为我的租房开销节省了不少钱。其中我就用到了 Pandas + Numpy 来管理我爬取到的数据。