疫情数据可视化分析
基于Python的全球疫情数据的可视化分析
1 项目概述
1.1项目背景
COVID-19是由病毒引起的传染病,即严重急性呼吸系统综合征冠状病毒2(SARS-CoV-2)。2019年12月在中国武汉发现了第一例已知病例,该病在全球蔓延,导致COVID-19大流行,这是第二次世界大战结束以来最严重的全球公共卫生突发事件。
到今天,新冠肺炎疫情在全球跌宕蔓延至第三个年头,对人类的生产生活产生重大影响。经过全球两年来的抗疫实践,新冠疫情暴露出全球卫生治理体系在有效防范和应对疾病大流行方面的弱点,诸如复杂分散的治理架构、资金不足、缺乏高效沟通协调的组织系统等。终结新冠肺炎疫情全球大流行,已成为国际社会一项非常紧迫而重要的任务[1]。
2022年在人类战胜新冠疫情大流行的新征程中是一个至关重要的时间节点,2022年是人类战胜新冠肺炎疫情的关键之年,世界卫生组织总干事谭德塞称,2022年必须终止新冠大流行,这将取决于国际社会和各国采取的决策和行动,也会继续受到新冠病毒变异的影响。
基于这种情况,本小组选取了2022年全球疫情数据进行可视化分析,寻找疫情在全球流行特征,希望从数据中发现规律,为抗击疫情提供理论背景和支撑,贡献一份绵薄之力。
1.2可视化工具
Plotly是一个快速完善并崛起的交互式的、开源的绘图库库,Python库是它的一个重要分支,开源 Python 绘图库 Plotly有着易于使用、文档健全、功能强大的优点[2]。现已支持超过40种独特的图表类型,涵盖了广泛的统计、金融、地理、科学和三维用例。Plotly 通过JavaScript构建,能基于Web显示实现交互式的可视化效果(Plotly最强大之处之一)。所以它的图形呈现可以方便的显示于Jupyter notebook(基于html)、独立的html中(直接显示或嵌套于后端服务器实现)、更可以通过plotly官方强推的dash实现web页面的直接生成。
相较传统的matplotlib和seaborn这两个近乎可完成所有的绘图需求的库,Plotly的核心优势就是可交互性,plotly的绘图是支持交互的,而这是matplotlib和seaborn所不具备的(默认情况下不可交互)。
1.3数据集介绍
数据来源:Kaggle
数据集名称:COVID-19 冠状病毒.csv
数据集大小:18.11 kB;(225, 10)
数据属性:
Table 1 Data attribute information
表1 数据属性描述
属性 |
含义 |
Country |
国家 |
Other names |
其他国家名 |
ISO 3166-1 alpha-3 CODE |
三字母国家码 |
'Population' |
人口 |
'Continent' |
大洲 |
Total Cases |
总感染数 |
'Total Deaths', |
总死亡数 |
'Tot Cases//1M pop' |
每百万人口感染数(Total Cases/Population *10^6) |
Tot Deaths/1M pop', |
每百万人口死亡数(Total Deaths'/Population *10^6) |
Death percentage |
死亡率(Total Cases/'Total Deaths ) |
2 数据预处理
数据处理的目的在于剔除原有数据中的“脏” 数据,提高数据的质量,使数据具有完整性、唯一性、权威性、合法性和一致性等特点。数据预处理的结果直接影响着数据分析或数据挖掘的结果。
数据预处理中常遇到的数据问题有3种:数据缺失、数据重复、数据异常,它们分别是由数据中存在缺失值、重复值、异常值而引起的。
2.1缺失值处理
首先查看各列是否有空值:df.isnull().any(),发现‘Other names’有空值。
找到‘Other names’丢失的国家/地区是Montenegro(黑山):
c1 = df.isnull().any(axis=1)
c1 = df[c1]
缺失值主要有三种处理方式:删除、填充和插补。
对此缺失值:
1.直接删去该国家的记录显然是一种糟糕粗暴的处理方式。
2.考虑填充:将‘Other names’列中存在的空值替换为该记录的‘Country’字段即“Montenegro”是一种可行的方法。
但其实'Other names’是国家/地区的其他名称,这里可以直接将该列删去,使整个数据集更简洁,并不影响整体的数据分析。
删去'Other names’列:df.drop(columns='Other names',inplace=True)
此时查看空值:df.isnull().any(),发现数据集中没有空值。
2.2重复值处理
接下来处理重复值:df.duplicated(),发现数据集没有重复值。
另外,为了后续处理的简便,重命名'ISO 3166-1 alpha-3 CODE'为‘Countrycode’。
2.3 异常值处理
最后是异常值处理,数据集中数量特征有:'Population',
'Total_Cases',
'Total_Deaths','Tot_Cases_1M_pop','Tot_Deaths_1M_pop','Death_percentage'。
对这6个数量特征进行单变量分析,可视化这些数量特征。
这里给出了六个数量特征的直方图,并其上绘制核密度估计线(KDE),KDE即将该分布近似为一组核(即诸如正态(高斯)分布之类的较为简单的分布),计算可能会产生观测数据的连续概率分布的估计。
绿色的竖线表示平均数,蓝色的实线表示中位数,从各子图的KDE线可以明显看出数据有长长的拖尾,长尾分布数据是一种偏态分布,是指几个类别(亦叫头类)包含大量的样本,而大多数类别(亦叫尾类)只有非常少量的样本。我们可以直观地观察到所有数据都不是正态分布的。
根据箱形图,分析各数量特征的异常值。
从下图,我们可以观察到,由于特征的偏度,所有特征中都存在许多“异常值”。
不同国家由于地理位置、人口数量、人口密度、防疫政策等多重因素的影响,其新冠感染数、死亡数相差很大,但即使某些国家的数据落在了“异常”的范围,本项目需要对全球疫情情况进行研究,故不能作为简单的异常值处理将其删去。
根据分析,所有特征中数据的偏度是有道理的,因为所有国家的人口不同,所有国家都有不同的国情特征,因此没有必要对这些看似“异常”的数据进行替换、删除等处理。
3 数据可视化分析
我们先按大洲分组进行整体的可视化分析,在分析中我们用到了pyecharts和Plotly库。
Plotly是一个可交互,基于浏览器的绘图库,主打功能是绘制在线可交互的图表,所绘制出来的图表种类丰富,非常赏心悦目。
而pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,可以与 Python 进行对接,方便在Python 中直接使用数据生成图。pyecharts囊括了30多种常见图表,多达400多个地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持,还可以展示动态图,可轻松搭配出精美的图表,并且展示数据方便,鼠标悬停在图上,即可显示数值、标签等。
3.1 六大属性的相关性分析
我们通过对变量两两之间的关系进行分析,可以看到对角线上是各个属性的直方图分布图,而非对角线上是两个不同属性之间的相关图,通过对不同地区用不同的颜色进行分别,我们可以从图中发现,六种属性具有不明显的关系。不论是从对角线上的分布图还是从分类后的散点图,都可以看出对于不同地区的六种属性分布差异较小。
3.2 热力图分析相关性
通过对六种属性绘制热力图,我们可以发现病例的数量和死亡人数之间存在着高度的相关性,这也是很符合逻辑的。然而其余属性之间的相关性并不是很强。
3.3 世界疫情图
我们使用pip
install echarts-countries-pypkg命令下载全球国家地图,导入库和相关的数据,利用Map模块绘制地图,就可以得到世界疫情图。鼠标悬停可以看到各个国家的感染人数。颜色从蓝到绿再到红,表示感染人数的递增。图中有几块灰色地区,是因为读取的数据中并没有这几个国家的相关信息。从图中我们明显可以看到,美国、巴西、印度的颜色为红色,感染人数都在两千万以上,而颜色较深的还包括西欧地区和俄罗斯,都是疫情重灾区。
将各大洲的人口、感染人数、死亡人数数据汇总,后面将对数据进行可视化分析。
df1=df.groupby('Continent',as_index=False)[['Continent','Population','Total_Cases','Total_Deaths']].sum()
3.4 旭日图分析世界疫情情况
在看完世界整体疫情情况后,我们可以用旭日图来直观地表现清晰的层级和归属关系。它以父子层次结构来显示数据构成情况,相邻两层中,是内层包含外层的关系。
在下面的第一个图中,我们可以看到不论是内层还是外层,每个部分的面积其实就是感染人数在全球所占的比例,而颜色越接近红色代表一个洲或者国家每百万人中的感染比例越低,可以看到印度非常显眼,因为虽然印度感染人数多,但是人口太多了,导致感染比例显得很低,而荷兰和法国也蓝的很突出,因为不仅感染人数很多,人口相对来说比较少,感染比例就变得很高。
而在下面的第二个图中每个部分的面积其实就是人口数在全球所占的比例,而颜色越深代表着感染人数越多,美国以一己之力连带着北美洲都呈现出黑色,也是整个图上唯一的黑色,严重程度不言而喻。而同为人口大国的印度和中国相比,印度接近深绿色,中国颜色接近黄色,说明了在中国疫情得到了有效的控制。
3.5 各大洲感染人数占比及死亡人数占比
接着我们用饼图标明各大洲感染人数占比,占比超过35%的欧洲确实是疫情重灾区。
下面这个环状图则标明了各大洲的死亡人数占比,虽然刚才的图显示出欧洲感染比例高,但死亡比例却没有超出30%,而拉丁美洲地区虽然感染率不高,但死亡率却相对较高,可能是因为两个洲的医疗水平差异大,拉美地区一些感染的人无法得到有效的救治。
3.5 各大洲总感染、死亡人数及分布
下面两个条形图分别描述了各大洲的总感染人数和总死亡人数,可以看出非洲和大洋洲不论是感染人数还是死亡人数都要远远少于其他洲,这应该和疫情初期时很多非洲国家都采取了封锁措施,大洋洲人口基数本来就很少有关。
通过下面的散点图,我们可以清楚地看到各大洲死亡和感染人数的分布,越靠近右上角则表明疫情越严重,欧洲综合来看依然是七大洲中最严重的。
下图中每个点都代表着一个国家,点越靠近右边就代表感染人数越多。同一个大洲的国家都会处于同一行,可以看到右下角唯一的一个点,和其他点远远地拉开了距离,毫无疑问,这个点就是美国。
3.6各国人口及感染比例
接下来我们对各个国家的数据进行分析,下图是每个国家人口散点图,因为有一些国家名太长,所以把横坐标设为了国家/地区代码。
下面的散点图直观地标明了每个国家的感染比例,y轴向上感染比例递增,最上面的是法罗群岛,一个不知名的国家,人口只有四万多人,因此感染比例很容易居高不下,排在上面的很多都是类似的情况。
3.7 各国每百万人死亡人数
下图则是各国每百万人死亡人数散点图,同样,位于上方死亡比例就高,而最高点是秘鲁。秘鲁是发展中国家,全国约有50%人口生活在贫穷之中,医疗水平可想而知,因此感染的患者应该很难得到治愈,还有一些在高处的点如保加利亚、格鲁尼亚等国家情况应该也是类似的。
3.8新冠感染人数最少、最多的15个国家
我们通过绘制横向的柱形图,统计出了新冠感染人数最少的15个国家。我们可以发现,前面几名例如密克罗尼西亚、圣赫勒拿岛、马绍尔群岛共和国等都是属于太平洋中的岛屿,并且我们国家的澳门也荣幸登榜。其它感染人数最少的国家,例如蒙塞拉特岛、萨摩亚;等等都是属于太平洋等地的小岛屿。
为了和上一张图片作对比,我们同时也绘制了感染人数最多的十五个国家。我们发现美国的感染人数在全国是最多的,高达八千两百万,第二名是印度,感染人数达到了四千三百多万,其次便是巴西的三百万,法国的二百六十万。并且,前十五名中并没有非洲国家,全都是美洲、欧洲以及亚洲的国家。
3.9 感染人数最多的十五个国家有关人口和感染人数的堆积柱状图
我们绘制了感染人数最多的十五个国家有关人口和感染人数的堆积柱状图,这样看起来更为直观。我们可以发现美国感染人数占总人口的比例还算是比较高的,除开印度的其它国家,占比也比较高。印度的感染人数虽然是全球第二位,但是印度的人口基数太大,因此占比并不是很高。
3.10 各国死亡人数、死亡率分析
我们也绘制了各国死亡人数的散点图,每个国家用不同的颜色表示,并且点越大,代表死亡的人数越多。
通过绘制死亡人数最多的十五个国家直方图,我们从图上可以直观地看出,美国死亡人数最多,达到了一百万,其次便是巴西、印度、俄罗斯等等国家。与前面所分析的感染人数最多的十五个国家作对比,我们可以发现,大部分感染人数多的国家,死亡的人数也很多。
通过对各国的死亡率进行分析,我们发现许多死亡人数很多地国家,比如美国、印度并未上榜,而感染人数与死亡人数均未排进前十五的国家,例如排名最靠前的也门、西撒哈拉、苏丹、叙利亚、索马里都是常年爆发战争的地区,也是极度贫穷的地区。所以我们认为新冠的死亡率与每个国家的经济水平,国家大环境以及医疗水平都息息相关,经济发达的国家,死亡率并不高,治愈的病例很多。
3.11 感染人数最多的15个国家死亡人数与感染人数的直方对比图
通过绘制的感染人数最多的15个国家死亡人数与感染人数的直方对比图,我们可以发现其实新冠的死亡率并不是很高,感染新冠还是有很大希望能被治愈的。
4 结论与建议
4.1结论
下面我们来总结一下此次可视化分析的结论和建议。
1.美洲、亚洲和欧洲是全球感染人数最多的地区,也是死亡人数最多的地区。我们小组在查阅资料以后认为,这些地区感染人数如此之多的原因,和该地区以及国家在疫情初期的防控规则、人民重视程度有很大关系。
2.感染人数最少的地区主要集中在太平洋的小岛上。因为海洋中的群岛几乎是与陆地地区隔绝开来的,所以即使欧洲、美洲、亚洲很多地方的疫情都十分严重,这些岛屿也完全没有受到任何的影响。
3.战乱和极度贫穷的地区是死亡率最高的地方,我们推测这与当地的医疗水平、国情以及经济水平有很大的关系。例如也门、西撒哈拉、苏丹、叙利亚、索马里都是常年爆发战争的地区,也是极度贫穷的地区。经济发达的地区和国家,死亡率普遍较低且治愈的几率很大。
4.美国的感染人数与死亡人数在全球来看一直长期位居榜首,但其死亡率并不是很高。美国作为世界第一超级大国,近两年在疫情防控方面表现得并不优秀,但是由于美国的医疗体系、全国整体医疗水平都较好,因此死亡率得到了极大的控制。但就目前而言,美国每日的新增病例依旧还是稳稳居于首位。
4.2 建议
通过本次对全球疫情数据的分析,我们可以明显感觉到一个国家的发展水平是多么地重要。经济发达的国家和地区即使感染人数较多,但通过当地较好的医疗水平和保障制度也可以将新冠死亡率维持在一个较低的水平,但是经济落后的地区与国家,即使感染人数不多,死亡率相对其它地区而言就显得很高。尤其是战乱和极度贫穷的国家,感染了新冠的百姓也无法得到及时且有效的救治,也没有一套健全的防控标准进行隔离和检查。纵观我们国家,作为疫情首个爆发地,虽然在爆发初期感染人数很多,但通过政府从上而下的一套全国人民共同遵守的、严格落实的疫情防控制度,我们国家的疫情已经得到了效果极佳的控制。
最后,我们希望大家出门都能好好佩戴口罩并且遵守疫情防控规则,作为遵纪守法的良好公民,也作为当代青年大学生,我们更应该从自身做起,为国家以及全球的疫情防控贡献力量。让我们共同期待疫情能够快点结束!