作者:Ross Burton
对于1912年的美国而言,麻疹成为一种国家性质的疾病。所有美国医疗服务提供者和实验室都必须向联邦政府报告确诊病例。今天我将查看1928年至2002年在美国收集的麻疹数据。这些资料可从Project Tycho获得,该项目旨在将大规模公共卫生数据提供给全世界的研究人员、数据科学家、学生和一般公众。 这些数据来自每周一次的国家法定报告疾病监测系统报告,包括州级标准化计数和基于历史人口估计的每10万人的发病率。
该项目的目的是探索不同的数据可视化方法和BokehJS的功能。BokehJS提供了一个强大的Python API,支持你以D3.js的风格创建交互式图。我对BokehJS的了解主要来自于他们网站上提供的文档和教程。
我也强烈推荐这些资源:
·WilliamKoehrsen关于创建BokehJS仪表板的文章非常精彩,分为三部分:
(麻疹病毒的电子显微照片)
苏格兰医生Francis Home发现了麻疹是由血液传播的传染因子引起的。1758年,爱丁堡爆发了麻疹疫情,Home开始试验麻疹疫苗。
麻疹具有高度传染性,通过麻疹病毒感染者的咳嗽和打喷嚏进行传播。该病毒的潜伏期为10至12天,后续症状可持续一周以上。这些症状最初包括高烧、咳嗽、其他类似流感的症状和眼睛发炎。一种明显的红色扁平皮疹通常发生在在症状出现后三天内,从面部扩散到身体其他部位。在大约三分之一的病例中,会出现并发症,其中一些甚至可能是致命的,包括失明、脑炎和肺炎。虽然许多人可以存活并从感染中恢复,但每千例中就有一例会导致急性脑炎,往往导致永久性脑损伤,而在欠发达国家,它的死亡率高达28%。
虽然Francis Home未能成功接种疫苗,但John F.Enders和Thomas C.Peebles博士于1954年成功地从13岁的David Edmonston身上分离出麻疹,随后研制出了第一种麻疹疫苗。但是,由Maurice Hilleman及其同事开发一种改良的弱麻疹疫苗,为1968年以来成功接种麻疹疫苗铺平了道路。
数据整理
我将在这里简要介绍项目结果,有关详细信息,请查看我的Jupyter笔记本。
让我们首先看一下Project Tycho提供的数据:
原始麻疹数据的时间变量有一个令人困惑的列,所以在apply方法中我使用了lambda函数,创建了一个年/周数列。 Pandas库在数据整理方面是一流的。
然后我创建了一个总结函数,我可以在整个项目中使用该函数生成的DataFrames以获取摘要信息,例如:每个州的每年总病例数、平均每周发病率和每周平均病例数:
然后,我从Bokeh库中获得了绘制所需的地理坐标,如下所示:
我将地理信息嵌入到我的Pandas DataFrame中,以便在以后的项目中使用。有关更多信息,请参阅我GitHub上的笔记本。
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函数。
上面的视频展示了在Jupyter笔记本中本地运行的完全交互式图。然后我将这些图组合成一个单独的Python应用程序,可以在Heroku上看到。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3118053/ ,如需转载,请注明出处,否则将追究法律责任。