一、前言
为练习数据可视化技能,故在这段时间以新冠肺炎数据为内容,以Tableau为工具制作数据可视化仪表板。
由于技术有限,获取完整可信的官方数据较为困难,所以部分采用了第三方数据,感谢数据提供者的付出,不然我无法找到合适的数据进行练习。
如果有读者有更好的方式,或发现我的方法存在问题,请您不吝赐教,谢谢。
另外说明,这里所做内容仅作练习之用,不作为真实疫情形势的参考,若要了解真实有效的数据,请访问国家及各地卫健委官方网站或权威媒体。
二、数据来源
数据有两个来源,一是国家卫健委网站(来源1),二是GitHub的一个数据仓库(来源2)。
采自国家卫健委网站的数据有每日全国境内汇总疫情数据及港澳台地区数据;采自数据仓库的数据为每日境内各地数据,来源2的数据来源及采集方式请见仓库地址内说明。
三、数据处理
对于来源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_deadCount updateTime
0 海南省 三亚 ... 1 2020-02-08 18:19:37.487
1 海南省 海口 ... 0 2020-02-08 18:19:37.487
2 海南省 万宁 ... 0 2020-02-08 18:19:37.487
3 海南省 儋州 ... 0 2020-02-08 18:19:37.487
4 海南省 澄迈 ... 1 2020-02-08 18:19:37.487
... ... ... ... ... ...
25569 云南省 昆明 ... 0 2020-01-24 03:50:31.353
25570 山西省 太原 ... 0 2020-01-24 03:50:31.353
25571 吉林省 长春 ... 0 2020-01-24 03:50:31.353
25572 河北省 石家庄 ... 0 2020-01-24 03:50:31.353
25573 宁夏回族自治区 银川 ... 0 2020-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)
- 数据中关于地区有两个维度,
provinceName
及cityName
,经抽取部分省份查看城市名称,发现有多个城市有相似的名称,由于地理知识及技术有限决定放弃城市相关的字段,仅保留省份数据;另外由于列名中有Count
字样,所以这里当做累计数据来处理(经与我所在地的卫健委网站发布的数据核实,确认为累计数据,其他地区的未逐一确认)。
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 25574 entries, 0 to 25573
Data columns (total 11 columns):
provinceName 25574 non-null object
cityName 25574 non-null object
province_confirmedCount 25574 non-null int64
province_suspectedCount 25574 non-null int64
province_curedCount 25574 non-null int64
province_deadCount 25574 non-null int64
city_confirmedCount 25574 non-null int64
city_suspectedCount 25574 non-null int64
city_curedCount 25574 non-null int64
city_deadCount 25574 non-null int64
updateTime 25574 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 provinceName province_suspectedCount
3535 2020-02-07 14:09:37.074 上海市 166
3552 2020-02-07 14:08:36.321 上海市 166
3569 2020-02-07 14:07:35.551 上海市 166
3752 2020-02-07 12:55:41.987 上海市 166
3769 2020-02-07 12:45:34.322 上海市 166
4707 2020-02-07 08:00:58.406 上海市 166
数据处理大致就是这些,详细的Python代码请见文末。下面进行数据可视化。
四、数据可视化
这一部分简述一下作图中遇到的问题及处理方式。
可视化中计划作五个图、一个文字描述,分别为:
- 全国疫情地图,实现用户可自选日期、指标;
- 分地区的环形图,按实现用户自选变化;
- 各指标每日新增的区域图;
- 医学观察的条形图,对比观察接受医学观察和解除医学观察的人数;
- 疑似确诊率的图,条形图和折线图复合而成,条形图显示新增疑似和新增确诊,折线图显示疑似的确诊率;
- 文字描述,以文字的形式展示各指标的新增情况,按用户自选变化。
遇到的问题1:在Tableau中,港澳台地区没有默认显示在中国地图上。
处理方式1:用两个经度创建两个地图,一个定位内地地区,另一个定位港澳台地区,然后通过双轴合并即可。
遇到的问题2:希望只显示部分标签。
处理方式2:新定义一个度量,当标签值小于于设定阈值时返回NULL即可。
其他的作图没有遇到太大的问题,基本都是小问题,各副图片显示如下:
- 全国疫情地图

- 分地区的环形图

- 指标每日新增区域图

- 医学观察条形图

- 疑似确诊率的图

最终的仪表板如下:

五、更新
2020-02-13
移除数据处理部分第6条的逻辑。由于疫情发展后期确实会出现新增为负的情况,比如2020年2月12日全国“重症病例减少174例”,这里暂不考虑来源2中各地的数据是否准确,统一移除这条逻辑。
六、其他
- 数据整理的Python文件,Tableau文件,及相关数据已上传码云Gitee,链接如下:
https://gitee.com/studentjz/data_analysis_practice/tree/master/nCoV
- 各地卫健委网站疫情相关链接
网友评论