[练习]|[练习] 新冠肺炎数据可视化

一、前言 为练习数据可视化技能,故在这段时间以新冠肺炎数据为内容,以Tableau为工具制作数据可视化仪表板。
由于技术有限,获取完整可信的官方数据较为困难,所以部分采用了第三方数据,感谢数据提供者的付出,不然我无法找到合适的数据进行练习。
如果有读者有更好的方式,或发现我的方法存在问题,请您不吝赐教,谢谢。
另外说明,这里所做内容仅作练习之用,不作为真实疫情形势的参考,若要了解真实有效的数据,请访问国家及各地卫健委官方网站或权威媒体。
二、数据来源 数据有两个来源,一是国家卫健委网站(来源1),二是GitHub的一个数据仓库(来源2)。
采自国家卫健委网站的数据有每日全国境内汇总疫情数据及港澳台地区数据;采自数据仓库的数据为每日境内各地数据,来源2的数据来源及采集方式请见仓库地址内说明。

  • 国家卫健委网站:http://www.nhc.gov.cn/xcs/xxgzbd/gzbd_index.shtml
  • GitHub数据仓库:https://github.com/BlankerL/DXY-2019-nCoV-Data
三、数据处理 对于来源1的数据,一开始是使用Python从文本中直接提取(非爬虫),但是由于中间有几天内容表述发生变化,导致失败,所以此后的数据为手动摘录。由于数据来源可信且数据规整,未做进一步处理。
对于来源2的数据,在数据处理上占用了较多的精力,主要在以下方面进行处理:
  • 由于每日在多个时间点进行密集采集,所以每个地区仅提取每天的最后一条记录作为当天的完整数据
>>> import pandas as pd >>> file = r"E:\Downloads\BrowserDownloads\DXY-2019-nCoV-Data-master\csv\DXYArea.csv" >>> df = pd.read_csv(file) >>> df provinceName cityName...city_deadCountupdateTime 0海南省三亚...12020-02-08 18:19:37.487 1海南省海口...02020-02-08 18:19:37.487 2海南省万宁...02020-02-08 18:19:37.487 3海南省儋州...02020-02-08 18:19:37.487 4海南省澄迈...12020-02-08 18:19:37.487 .................. 25569云南省昆明...02020-01-24 03:50:31.353 25570山西省太原...02020-01-24 03:50:31.353 25571吉林省长春...02020-01-24 03:50:31.353 25572河北省石家庄...02020-01-24 03:50:31.353 25573宁夏回族自治区银川...02020-01-24 03:50:31.353[25574 rows x 11 columns] >>> df.updateTime.unique() array(['2020-02-08 18:19:37.487', '2020-02-08 18:18:36.711', '2020-02-08 18:14:34.167', ..., '2020-01-24 07:35:32.428', '2020-01-24 07:26:28.308', '2020-01-24 03:50:31.353'], dtype=object)

  • 数据中关于地区有两个维度,provinceNamecityName,经抽取部分省份查看城市名称,发现有多个城市有相似的名称,由于地理知识及技术有限决定放弃城市相关的字段,仅保留省份数据;另外由于列名中有Count字样,所以这里当做累计数据来处理(经与我所在地的卫健委网站发布的数据核实,确认为累计数据,其他地区的未逐一确认)。
>>> df.info() RangeIndex: 25574 entries, 0 to 25573 Data columns (total 11 columns): provinceName25574 non-null object cityName25574 non-null object province_confirmedCount25574 non-null int64 province_suspectedCount25574 non-null int64 province_curedCount25574 non-null int64 province_deadCount25574 non-null int64 city_confirmedCount25574 non-null int64 city_suspectedCount25574 non-null int64 city_curedCount25574 non-null int64 city_deadCount25574 non-null int64 updateTime25574 non-null object dtypes: int64(8), object(3) memory usage: 2.1+ MB

  • 将我从国家卫健委摘录的港澳台数据与这里的省份数据进行合并。
  • 由于部分省份的数据存在部分日期无数据的情况,这里默认为未采集到最新数据,与上一日相同,所以分别对各省采取向下填充的方式填充数据(在填充前先创建日期完整的数据框再行填充)。
  • 对以上操作后仍为空的数据填充为0,默认为此前无疫情发生。
  • 由于所有字段全部为累计数据,所以这里通过当日减前一日生成每日新增数据。这一步处理后发现新增数据中出现了负数,猜测可能是由于数据采集中提取的不是累计数据,这里为简便处理,统一将负值更改为0。(所以最终结果肯定与真实情况不同,真实情况请参考官方数据或权威媒体)
  • 此外,在作图中发现一处异常,上海累计疑似数据,2020-02-07前均为0,在2020-02-07突增到166,在上海卫健委网站核实,确认数据有问题,但没做进一步处理。
>>> df = df.loc[:,['updateTime', 'provinceName', 'province_suspectedCount']] >>> df.drop_duplicates(inplace=True) >>> df = df[df.provinceName=='上海市'] >>> df.loc[df.province_suspectedCount!=0,:] updateTime provinceNameprovince_suspectedCount 35352020-02-07 14:09:37.074上海市166 35522020-02-07 14:08:36.321上海市166 35692020-02-07 14:07:35.551上海市166 37522020-02-07 12:55:41.987上海市166 37692020-02-07 12:45:34.322上海市166 47072020-02-07 08:00:58.406上海市166

数据处理大致就是这些,详细的Python代码请见文末。下面进行数据可视化。
四、数据可视化 这一部分简述一下作图中遇到的问题及处理方式。
可视化中计划作五个图、一个文字描述,分别为:
  • 全国疫情地图,实现用户可自选日期、指标;
  • 分地区的环形图,按实现用户自选变化;
  • 各指标每日新增的区域图;
  • 医学观察的条形图,对比观察接受医学观察和解除医学观察的人数;
  • 疑似确诊率的图,条形图和折线图复合而成,条形图显示新增疑似和新增确诊,折线图显示疑似的确诊率;
  • 文字描述,以文字的形式展示各指标的新增情况,按用户自选变化。
遇到的问题1:在Tableau中,港澳台地区没有默认显示在中国地图上。
处理方式1:用两个经度创建两个地图,一个定位内地地区,另一个定位港澳台地区,然后通过双轴合并即可。
【[练习]|[练习] 新冠肺炎数据可视化】遇到的问题2:希望只显示部分标签。
处理方式2:新定义一个度量,当标签值小于于设定阈值时返回NULL即可。
其他的作图没有遇到太大的问题,基本都是小问题,各副图片显示如下:
  1. 全国疫情地图
[练习]|[练习] 新冠肺炎数据可视化
文章图片
全国疫情地图
  1. 分地区的环形图
[练习]|[练习] 新冠肺炎数据可视化
文章图片
分地区的环形图
  1. 指标每日新增区域图
[练习]|[练习] 新冠肺炎数据可视化
文章图片
指标每日新增区域图
  1. 医学观察条形图
[练习]|[练习] 新冠肺炎数据可视化
文章图片
医学观察条形图
  1. 疑似确诊率的图
[练习]|[练习] 新冠肺炎数据可视化
文章图片
疑似确诊率的图 最终的仪表板如下:

[练习]|[练习] 新冠肺炎数据可视化
文章图片
仪表板 五、更新 2020-02-13
移除数据处理部分第6条的逻辑。由于疫情发展后期确实会出现新增为负的情况,比如2020年2月12日全国“重症病例减少174例”,这里暂不考虑来源2中各地的数据是否准确,统一移除这条逻辑。
六、其他
  1. 数据整理的Python文件,Tableau文件,及相关数据已上传码云Gitee,链接如下:
https://gitee.com/studentjz/data_analysis_practice/tree/master/nCoV
  1. 各地卫健委网站疫情相关链接
地区 链接 地区 链接
国家卫健委 http://www.nhc.gov.cn/xcs/xxgzbd/gzbd_index.shtml 湖北省 http://wjw.hubei.gov.cn/bmdt/ztzl/fkxxgzbdgrfyyq/xxfb/index.shtml
北京市 http://wjw.beijing.gov.cn/wjwh/ztzl/xxgzbd/ 湖南省 http://wjw.hunan.gov.cn/wjw/xxgk/gzdt/zyxw_1/index.html
天津市 http://wsjk.tj.gov.cn/col/col86/index.html 广东省 http://wsjkw.gd.gov.cn/xxgzbdfk/yqtb/
河北省 http://wsjkw.hebei.gov.cn/index.do?templet=new_list&cid=14&page=1 广西壮族自治区 http://wsjkw.gxzf.gov.cn/zhuantiqu/ncov/
山西省 http://wjw.shanxi.gov.cn/wjywl02/index.hrh 海南省 http://wst.hainan.gov.cn/yqfk/
内蒙古自治区 http://wjw.nmg.gov.cn/ztlm/2016n/xxgzbdgrdfyyqfk/yqtb/index.shtml 重庆市 http://wsjkw.cq.gov.cn/topic/25.jspx
辽宁省 http://wsjk.ln.gov.cn/wst_zdzt/xxgzbd/ 四川省 http://wsjkw.sc.gov.cn/scwsjkw/gzbd/ztxqgl.shtml
吉林省 http://www.jl.gov.cn/szfzt/jlzxd/ 贵州省 http://www.gzhfpc.gov.cn/ztzl_500663/xxgzbdgrdfyyqfk/
黑龙江省 http://wsjkw.hlj.gov.cn/index.php/Home/Zwgk/all/typeid/42 云南省 http://ynswsjkw.yn.gov.cn/wjwWebsite/web/col?id=UU157976428326282067&cn=xxgzbd&pcn=ztlm&pid=UU145102906505319731
上海市 http://wsjkw.sh.gov.cn/xwzx/ 西藏自治区 (未找到)
江苏省 http://wjw.jiangsu.gov.cn/col/col7290/index.html 陕西省 http://sxwjw.shaanxi.gov.cn/col/col863/index.html
浙江省 http://www.zjwjw.gov.cn/col/col1202101/index.html 甘肃省 http://wsjk.gansu.gov.cn/channel/list/11218.html
安徽省 http://wjw.ah.gov.cn/news_list_477_1.html 青海省 https://wsjkw.qinghai.gov.cn/ztbd/yqjk/yqtb/index.html
福建省 http://wjw.fujian.gov.cn/ztzl/gzbufk/yqtb/ 宁夏回族自治区 http://wsjkw.nx.gov.cn/yqfkdt/yqsd1.htm
江西省 http://hc.jiangxi.gov.cn/ztxx/xxgzbdgrdfyyqfk/xibd_gzdt/index.shtml 新疆维吾尔自治区 http://www.xjhfpc.gov.cn/ztzl/fkxxgzbdfygz/yqtb.htm
山东省 http://wsjkw.shandong.gov.cn/ztzl/rdzt/qlzhfkgz/ 新疆生产建设兵团 http://wsj.xjbt.gov.cn/
(未发现相关数据)
河南省 http://www.hnwsjsw.gov.cn/channels/854.shtml

    推荐阅读