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