通过数据探索感染:美国麻疹的交互式可视化!
点击上方关注,All in AI中国
作者:Ross Burton
对于1912年的美国而言,麻疹成为一种国家性质的疾病。所有美国医疗服务提供者和实验室都必须向联邦政府报告确诊病例。今天我将查看1928年至2002年在美国收集的麻疹数据。(https://www.kaggle.com/pitt/contagious-diseases/home)这些资料可从Project Tycho获得,该项目旨在将大规模公共卫生数据提供给全世界的研究人员、数据科学家、学生和一般公众。 这些数据来自每周一次的国家法定报告疾病监测系统报告,包括州级标准化计数和基于历史人口估计的每10万人的发病率。
该项目的目的是探索不同的数据可视化方法和BokehJS的功能。BokehJS提供了一个强大的Python API,支持你以D3.js的风格创建交互式图。我对BokehJS的了解主要来自于他们网站上提供的文档和教程。(https://bokeh.pydata.org/en/latest/)
我也强烈推荐这些资源:
·WilliamKoehrsen关于创建BokehJS仪表板的文章非常精彩,分为三部分:
- 第1部分(https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-one-getting-started-a11655a467d4),
- 第2部分(https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-ii-interactions-a4cf994e2512)
- 第3部分(https://towardsdatascience.com/data-visualization-with-bokeh-in-python-part-iii-a-complete-dashboard-dc6a86aa6e23)。
·EugineKang在这里提供了一个很好的基本概述。(https://medium.com/@kangeugine/bokeh-rshiny-replacement-ac74694bbe3f)
来自FreecodeCamp的Mandi Cai在这里对Bokeh和D3进行了很好的比较。(https://medium.freecodecamp.org/charting-the-waters-between-bokeh-and-d3-73b3ee517478)
·EricShong可以帮助你开始在Heroku上托管Bokeh应用程序。(https://ericstrong.org/running-a-bokeh-server-on-heroku-part-2/)
对于所有其他查询,通常Stackoverflow和Google就足够了。
这个项目的所有代码都可以在我的Github上找到:https://github.com/burtonbiomedical/measles_map
我的BokehJS工作的最终产品在这里展示(这是一个免费的Heroku dyno托管的Bokeh Python应用程序。):https://measles-bokeh.herokuapp.com /
什么是麻疹?
(麻疹病毒的电子显微照片)
苏格兰医生Francis Home发现了麻疹是由血液传播的传染因子引起的。1758年,爱丁堡爆发了麻疹疫情,Home开始试验麻疹疫苗。
麻疹具有高度传染性,通过麻疹病毒感染者的咳嗽和打喷嚏进行传播。该病毒的潜伏期为10至12天,后续症状可持续一周以上。这些症状最初包括高烧、咳嗽、其他类似流感的症状和眼睛发炎。一种明显的红色扁平皮疹通常发生在在症状出现后三天内,从面部扩散到身体其他部位。在大约三分之一的病例中,会出现并发症,其中一些甚至可能是致命的,包括失明、脑炎和肺炎。虽然许多人可以存活并从感染中恢复,但每千例中就有一例会导致急性脑炎,往往导致永久性脑损伤,而在欠发达国家,它的死亡率高达28%。
虽然Francis Home未能成功接种疫苗,但John F.Enders和Thomas C.Peebles博士于1954年成功地从13岁的David Edmonston身上分离出麻疹,随后研制出了第一种麻疹疫苗。但是,由Maurice Hilleman及其同事开发一种改良的弱麻疹疫苗,为1968年以来成功接种麻疹疫苗铺平了道路。
数据整理
我将在这里简要介绍项目结果,有关详细信息,请查看我的Jupyter笔记本。(https://github.com/burtonbiomedical/measles_map/blob/master/Exploring%20Measles%20with%20interactive%20plots.ipynb)
让我们首先看一下Project Tycho提供的数据:
原始麻疹数据的时间变量有一个令人困惑的列,所以在apply方法中我使用了lambda函数,创建了一个年/周数列。 Pandas库在数据整理方面是一流的。
然后我创建了一个总结函数,我可以在整个项目中使用该函数生成的DataFrames以获取摘要信息,例如:每个州的每年总病例数、平均每周发病率和每周平均病例数:
然后,我从Bokeh库中获得了绘制所需的地理坐标,如下所示:
我将地理信息嵌入到我的Pandas DataFrame中,以便在以后的项目中使用。有关更多信息,请参阅我GitHub上的笔记本。(https://github.com/burtonbiomedical/measles_map/blob/master/Exploring%20Measles%20with%20interactive%20plots.ipynb)
Seaborn与静态块
在进入数据科学世界的过程中,我非常喜欢使用Python Seaborn库。 当我刚开始工作时,我经常发现matplotlib很笨重。但不久我发现Seaborn可以与Pandas完美结合。作为一名数据科学家,你希望能够专注于你的模型并交流你的发现,而不是纠结于图形包。
我从一些简单的线条图开始:每周人均发病率随时间的变化以及病例总数随时间的变化。
我们可以看到60年代末/ 70年代初期疫苗接种计划的巨大影响。那么州的差异呢?有季节性差异吗?
由于数据的多维特性,线性图不能很好地强调这些问题。使用热图可以更好的实现可视化。在Seaborn生成热图相对简单。你可以将热图函数传递给"长"格式的Pandas数据帧,其中坐标轴值由索引和列给出,每个单元格的值是你希望在每个给定交叉点的热图上绘制的值。使用pivot方法可以以"长"格式对Pandas数据帧格式化。你可以指定要用作索引的列,用于生成新列的列(每个值将指定一个新列)以及每个交集的值。这将返回"长"格式的数据帧。
通过使用热图,我可以通过绘制x轴上的年份和y轴上的周数来显示季节性模式、每个交叉点表示麻疹严重程度(由人均发病率给出),较亮的颜色表示较高的发病率。热图非常适合像这样可视化三维数据。然后,我可以通过在y轴上绘制州名做同样的事情。这已经是一种非常有效的可视化方法,它既展示了保持一致的季节性模式,又展示了60年代和70年代疫苗接种计划的显著效果。
静态块很无聊!让我们进行互动吧!
虽然热图在美国传播麻疹疫苗接种的效果方面非常有效,但我认为在这个项目中探索交互式可视化会很有趣。有启发性的统计数据、优秀的模型和具有前瞻性的趋势都是强大的工具,但如果没有有效的沟通,它们就毫无意义。当受众不仅有机会获得广泛的数据视图,而且有机会能够与数据进行交互、探索并提出自己的问题时,数据可视化就真正变得不可思议了。在这里我推荐使用Bokeh JS。
我不会详细介绍BokehJS如何在这里工作,但在本项目的笔记本中,我将详细解释创建我在下面演示的产品的每一步。我也强烈推荐我前文列出的资源。
BokehJS的真正力量可以在几个关键方面找到,我认为这是学习这个库的关键:
- ColumnDataSource对象:Bokeh处理数据的核心是ColumnDataSource类。基本ColumnDataSource对象是一个字典,其中键与列名相关,值是这些列的内容。当在多个图中使用相同的ColumnDataSource对象时,它允许绘图之间相连接。
- Inspectors:一个非常简单的概念,可以立即创建强大的交互式图。只需使用几行代码,你就可以将静态二维图转换为交互式显示,允许用户将鼠标悬停在每个数据点上,并将其暴露给原始数据集中包含的其他变量。
- 控件和回调:Bokeh库附带了大量控件,你可以使用这些控件为图形添加交互式功能。我使用滑块并在我的应用程序中选择控件。这些方法允许使用回调函数。你可以使用自定义javascript执行此任务,也可以像在应用程序中一样使用Python函数。