可视化冠状病毒爆发
数据新闻
对这种疾病在全世界传播的深入观察
“如果不加以控制,它会像病毒一样传播.”——丽斯·麦克布莱德
我已经很久没有在媒体上写东西了。我觉得目前的疫情给我带来了完美的机会,让我期待已久的复出。让我们开始吧。
概观
2020 年初,冠状病毒(新冠肺炎)爆发将成为全球各大报纸的头条。截至 2020 年 2 月 28 日,这种臭名昭著的病毒已经影响了 84124 人,并导致 2867 人死亡。病毒的中心是位于湖北 Mainland China 的武汉市。与 SARS 爆发相比,中国这次确实反应更快,以限制疾病向其他地区的传播。然而,尽管他们尽了最大努力,在许多其他国家还是出现了一些疑似和确诊病例。这篇博客文章将作为对病毒爆发的具体观察。
免责声明:所有数据都是截至 2020 年 2 月 28 日的最新数据。
数据源
使用的数据集可以在 Github 上找到。它由约翰·霍普金斯大学系统科学与工程中心(CSSE)出版。数据每天更新两次。
探索性数据分析(EDA)
数据源有三种类型的数据,已确认、死亡和已恢复,在三个单独的文件中可用。让我们来看看。
结构
在观察我们的数据结构时,我们看到它具有地理数据集的常见嫌疑(州、国家、纬度、经度)。每行的粒度仅在状态之前可用。在检查 State 列时,我们看到它缺少值。让我们对此进行调查。
我们看到,当删除 State 列中的空值时,唯一国家的数量有所不同。大多数州数据来自 Mainland China,其次是美国。让我们来看看汇总统计数据。
汇总统计数据
这里没有太多惊喜。我们的数据有 4332 行。一切似乎都很简单。让我们更深入地进行一些分析和可视化。
中国
我们知道冠状病毒爆发源于中国。因此,它应该是我们的首选。让我们看看中国的一些地区是如何受到影响的。
我们看到湖北地区显然是该病毒的高发区。如前所述,武汉市是湖北区的首府。难怪我们在湖北看到大量确诊病例。确切数字是 65914。这尤其令人着迷,因为全球确诊病例总数为 84,124 例。这意味着仅湖北区就占确诊病例总数的 78.35%!
让我们来看看中国湖北以外的情况。
广东的确诊病例数(1348 例)仅次于湖北。其次是河南省(1272)。
从死亡和康复图表中,我们可以看到河南区的死亡和康复人数最多。快速的谷歌搜索显示,与广东相比,河南实际上离湖北更近。或许,邻近可能是造成这些高数字的一个因素?对这些假设进行统计测试会很有趣。也许我们应该在以后的博客文章中重新讨论这个问题。
这张图是中国冠状病毒病例的时间序列图。我们可以看到,在 2 月 12 日至 2 月 13 日期间,确诊病例数量突然激增,随后斜率变平。也许关于诊断和治疗的信息在这个时候得到了改善?这一假设得到了以下事实的支持,即红色回收线的斜率在图表的后半部分变得更陡,表明回收的案件数量有所增加。🙂
让我们慢慢把注意力从中国转移到世界其他地方。
世界其他地方
韩国是中国以外确诊病例最多的国家。全国冠状病毒病例 2337 例。
值得注意的一个非常有趣的数字是,在韩国之后,意大利的确诊病例最多,为 888 例。几个小时前,我收到消息,一场大型的意大利足球联赛由于努力应对病毒而被推迟。意大利米兰的一名传染病教授表示,在最初几个病例被发现之前,病毒可能已经在欧洲国家存在了数周。看起来意大利可能还有很长的路要走。
让我们看看在中国以外有多少病例被证明是致命的。
伊朗(34 人)其次是意大利(21 人)在中国境外因该病毒而伤亡人数最多。据来自中东国家的报道,一名伊朗议员死于该病毒。随后,一些国家已经决定禁止航班往返伊朗。
尽管韩国是中国以外病例最多的国家,但该病毒在该国的死亡率相当低。
到目前为止,我们只研究了世界各地的死亡人数。让我们来看看世界各国抗击这种病毒的情况。
我们可以看到,一些国家似乎有 100%的病毒恢复率。乍一看,似乎是越南、比利时、印度等。对疾病爆发表现出了惊人的反应。然而,百分比在很大程度上取决于分母,在这种情况下,分母恰好是确诊病例的数量。让我们看看当我们过滤掉复苏百分比最高的国家时会发生什么。
所有治愈率为 100%的国家的确诊病例数都少于 20 例。相比之下,新加坡(93 人)和泰国(41 人)的病例都要高得多。新加坡的回收率为 68%,而泰国为 66%。这两个相邻的亚洲国家似乎在治疗这种病毒方面做得非常好。好消息!👍🏼
现在,让我们将我们在中国使用的时间序列图复制到世界其他地方。
我们可以看到,自 2 月 23 日以来,确诊病例数量急剧增加。最近有新闻报道提到世界范围内病例数量的快速增长。
最后,这是一个显示病毒在全球传播的动画地图。
最初,我们只在中国和周边地区看到斑点。在 2 月 20 日左右,欧洲的病例数量大幅上升。这和前面提到的这篇博文的观察结果是一致的。
结论
冠状病毒是当今媒体最热门的话题之一。记者称之为致命的。由于担心疫情爆发,全球市场已经看到7 万亿美元化为乌有。流行病学家对这种病毒的致命性没有把握。
尽管这篇文章提供了很多真知灼见,但世界各地可能还有更多未被发现的病例。
“没有证据并不是不存在的证据”——卡尔·萨根
如果你在受病毒影响的地区或去中国旅行,确保遵循这些指示以保持安全。
我希望你们都喜欢这篇文章。所有的图表都是使用 Plotly 创建的。Plotly 是一个非常棒的可视化库,用于构建交互式的图形。他们有 Python、R 和 JavaScript 的图形库。我鼓励我所有的读者去尝试一下。
文章中使用的所有代码都可以在这里找到。
如果你喜欢这篇博文,请在 Medium 和 LinkedIn 上关注我,并与你的朋友分享这篇博文。下次见。✋
参考资料:
【2】https://www . ka ggle . com/imdevskp/新冠肺炎-分析-viz-预测-比较
用 Python 漂亮地可视化新冠肺炎数据(不到 5 分钟!!)
让 Matplotlib 不那么痛苦!
让我们用 Python 创建一些漂亮的数据可视化!资料来源:Nik Piepenbreier。
Matplotlib 可能是 Python 事实上的数据可视化库,但它并不总是最漂亮的。在这篇文章中,我们将探索如何把一个单调的默认 Matplotlib 图变成一个漂亮的数据可视化。我们将研究新冠肺炎的数据,看看病毒是如何在不同国家传播的。
让我们载入数据
我们将使用来自这个美妙的 Github 库的数据,它每天自动更新数据。我们将根据 URL 把我们的数据加载到熊猫的数据框架中,这样它将每天为我们自动更新。
加载我们的数据并创建汇总变量。资料来源:Nik Piepenbreier
- 在上述要点的第 1 节 中,我们正在加载我们的库。在本教程中,我们将使用 Pandas 和 Matplotlib。
- 在 第 2 节 中,我们将数据读入数据帧
df
,然后只选择列表countries
中的国家。选择数据使结果可视化更具可读性。 - 在第 3 节 的 中,我们创建了一个汇总列,汇总了所有确诊病例、已康复病例和任何因新冠肺炎而死亡的个体的病例总数。
为数据可视化准备数据框架
现在我们已经将数据存储在一个数据帧中,让我们准备另外两个数据帧,将数据保存在交叉表中,这将使我们能够更容易地可视化数据。
为可视化准备数据。资料来源:Nik Piepenbreier
让我们更详细地探讨一下我们在这里做了什么:
在 第 4 节 中,我们旋转我们的数据框架df
,创建国家的列,以案件数量作为数据字段。这个新的数据帧被称为covid
。然后,我们将数据帧的索引设置为日期,并将国家名称分配给列标题。
在 第 5 节 中,我们复制了我们的数据帧covid
,称之为percapita
。我们使用存储所有国家人口的字典,将每个值除以人口,再乘以 100,000,得出每 100,000 人中的病例数。
如果你想学习如何解透视数据,看看这篇关于熊猫融化功能的教程。
让我们来看看我们的数据从开始到现在是如何变化的:
我们如何重塑数据来讲述一个故事。资料来源:Nik Piepenbreier
创建我们的第一个可视化—案例随时间推移
让我们首先创建第一个可视化视图,展示不同国家/地区一段时间内的病例总数:
创建我们的第一个可视化。资料来源:Nik Piepenbreier
让我们更详细地探究一下我们对她做了什么:
在 第 6 节 中,我们创建了一个包含不同国家十六进制值的字典。将它存储在字典中可以让我们稍后在 for 循环中轻松调用它。我们还分配了 FiveThirtyEight 样式来添加一些通用格式,我们将在此基础上进行大量构建。
在 第 7 节 中,我们使用 Pandas 的 plot 函数创建了我们的第一个可视化。我们使用 colors 参数将颜色分配给不同的列。我们还使用set_major_formatter
方法来格式化带有千位分隔符的值。
然后,在 第 8 节 中,我们创建一个 for 循环,为各个国家生成标签文本。这个 for 循环以列表的形式从字典中的关键字获取每个国家的名称,并遍历这个列表。它将包含国家名称的文本放置在最后一个 x 值的右侧(covid.index[-1]
→数据帧中的最后一个日期),在当天的 y 值处(它将始终等于该列的最大值)。
最后,在 第 9 节 中,我们添加了一个关于图表的标题、副标题和源信息。我们再次使用变量来定位数据,因此当图形更新时,这些位置会动态更新!
这是我们第一张图表的最终结果:
我们的第一个可视化结果——各个国家的案例。资料来源:Nik Piepenbreier
创建我们的第二个可视化——每 100,000 人中的病例
为了创建我们的第二个可视化,我们将使用下面的代码:
创建我们的第二个可视化——每 10 万人中的病例。资料来源:Nik Piepenbreier
这一部分主要遵循我们为第一个图表所做的。这表明,一旦使用 Python 设置了图表,更新不同数据集的可视化效果是多么简单!
这是我们的可视化结果:
我们的第二个设想——每个国家每 10 万人中的病例。资料来源:Nik Piepenbreier
结论:用 Matplotlib 实现漂亮的 COVID 可视化
感谢阅读!资料来源:Nik Piepenbreier
在这篇文章中,我们学习了如何使用 Github 上的新冠肺炎数据集生成漂亮的数据可视化。我们可以利用 Python 的强大功能,根据今天的数据自动更新我们的图表。
非常感谢你花时间阅读这篇文章!
使用 Julia 可视化新冠肺炎数据
探索 Python 和 R 的强大替代品
朱莉娅在科学计算领域相当有名。继 2018 年发布稳定的 1.0 版本后,逐渐成熟为一种功能强大的通用编程语言。Julia 是动态类型的,被设计得和 C 一样快(参见基准测试),并且使用了令人印象深刻的数学友好语法。我最近完成了 Coursera 上的一门入门课程,之后开始将 Julia 纳入我的日常工作流程。作为一个小项目,我决定利用 Julia 中的 DataFrames 来可视化新冠肺炎时间序列数据。在这个过程中,我意识到关于使用和排除 Julia 故障的信息相对较难找到,这可能会提高像我这样的新用户的准入门槛。因此,我决定把我分享的过程、代码和结果放在一起。
我通常使用 Jupyter 笔记本,它们很容易使用并能完成工作。我没有包括在您的系统上设置 Julia 的详细步骤,这是相对简单的。请记住:
- 您需要有一个工作的 Jupyter 安装,强烈推荐使用 Anaconda
- Julia 二进制文件可以在线获得,不要忘记验证 sha256 校验和
- 你需要“IJulia”包来让 Julia 使用 Jupyter 笔记本,这些指令对我起作用了!我可以很容易地在初级操作系统(基于 Ubuntu)中建立一个工作的 Julia 环境。
让我们开始吧:加载基本包
与 Python 类似,Julia 也使用了许多可以加载到 Jupyter 笔记本中的包。不像 Python,大部分都是用 Julia 本身写的!“Pkg”是 Julia 中内置的软件包管理器,处理它们的安装、更新和删除。“Pkg”带有一个 REPL(读取-评估-打印-循环)。在茱莉亚·REPL 上按]
进入“Pkg”REPL。要返回到 Julia REPL,请按退格键或^C.
在朱莉娅 REPL 中添加 StatsBase 包。这一个已经被添加,因此没有做任何改变。
可以如上所示添加包。或者,您可以直接在 Jupyter 笔记本中添加它们,例如通过执行:import PkgPkg.add(“假设检验”)。因为软件包会定期更新(错误修复、新特性等)。),这篇文章中链接的一些代码可能会在不同的时间点对您不起作用。不过不要担心,朱莉娅有一个非常聪明的解决方案。“Pkg”创建两个额外的文件——“project . toml”和“Manifest.toml”,这两个文件包含关于依赖项、版本、包名、UUIDs 等信息。这些文件可以很容易地共享,并让您重新创建我所拥有的确切的工作环境。
使用笔记本第一个单元格中的“InstantiateFromURL”包直接从我的 GitHub 库下载这些文件。它还激活所需的环境。
现在可以在下一个单元格中编译包,如下所示。包版本将完全一样,我在这个项目工作时使用。
在第一个单元中一次执行(加载和编译)所有包,这需要一段时间(2-3 分钟)
导入数据
在这个练习中,我使用了来自著名的 GitHub 库的新冠肺炎数据,该库由约翰霍普金斯大学系统科学与工程中心(CSSE)维护。数据为 CSV 格式,每天更新。它可以直接导入到文件中,如下所示:
从 GitHub 存储库导入 CSV 数据
第一眼
在继续之前,让我们看一下我们的数据。我想知道更多关于它的结构,大小和类型。
探索数据框架
- size(data_df)返回数据帧中的行数和列数。由于每天都会添加新列,因此根据检索数据的日期,输出看起来会有所不同。有一列是国家名称,另一列是日期。
- 使用 names(data_df)列出所有列名,请参见下面的输出示例。这在以后会很方便!
数据帧中所有列名的列表
- 快速调查显示,我们有一个国家名称列和许多包含所有日期的列。在 Julia 中,缺失的条目用一个特殊的缺失对象来表示。
在数据框架内选择一个国家
我希望能够从数据框架中选择给定国家的时间序列数据。有些国家还列出了“省/州”,这对我来说不是很有用。但是,列为的“省/州”行缺少,包含该国家所有地区的总和。
我将编写一个函数,只选择“省/州”缺少的行,并丢弃其余的行。然后,我可以通过将“国家/地区”条目与我提供的关键字进行匹配,轻松找到该国家。在浏览数据时,我已经注意到提到的国家名称有澳大利亚、德国、印度等,所以我的输入关键字应该相同。
函数返回带有与国家名称匹配的关键字的数据行
处理日期
日期可以直接从列名中读取。为了绘制时间序列数据(x 轴上的日期),我们需要以正确的日期-时间格式显示它们。看看下面的代码片段:
为国家列表创建输入数据
到目前为止,我已经创建了用于绘制时间序列中 x 轴的数据。在 y 轴上,我们可以绘制该特定日期每天的确诊病例总数。然而,我想为我选择的一系列国家这样做,这将有助于比较它们之间的感染传播。回想一下,我之前创建了一个函数,它返回特定国家的一行数据。我们可以使用这个函数遍历用户指定的国家列表。
“find_country”函数从原始数据帧中返回行。然后,从第 5 列开始,也就是第一个日期 22/01/2020 开始,将它堆叠成垂直布局。请注意,Julia 中的索引从 1 开始。
“y”数据帧的最后 10 个条目,最新条目为 2020 年 7 月 24 日。
将所有内容整合在一起—是时候开始策划了!
我们现在有了适合各个国家的时间序列图的 y 轴数据(“y”数据帧)。Julia 允许使用宏’ @df '直接从数据帧绘图。我们之前已经加载了“Plots”包,它使用“gr()”后端来生成图形。
用指定的绘图选项绘制 y(所有列)与 x,如图所示。剧情!(称为爆炸)将添加到相同的数字,在这种情况下,虚线标记 100 万个报告的病例。
当返回到单元格时,绘图输出内联显示。这里,我使用了“显示”来明确显示用红色虚线覆盖的原始图(使用 plot!)标志着一百万计数(至少可以说是一个令人担忧的数字)。添加了额外的打印选项以改善打印外观。关于绘图的综合指南可以在这里找到。
前面代码块的输出,红色虚线表示一百万标记
另一组国家的先前代码块的输出
计算每日报告的病例数
另一个值得关注的指标是每天报告的案例数量。我们已经有了一个包含给定日期报告病例总数的数据框架,每天的增加只是任何两个连续日期之间的差异。这种操作可以很容易地全天进行。请参见下面的代码片段:
计算并绘制每日报告病例的增加
在这种情况下,条形图通常能提供更多信息。对于报告病例总数开始饱和的国家,我们可以看到每日病例的增加开始下降。一旦没有新的病例报告,这一数字最好为零。意大利、德国和英国已经设法限制了增长,而印度目前正经历指数增长。
印度每日确诊病例数持续上升
美国每天确诊的病例数最初在下降,然后又开始增长
查找报告病例数最多的前五个国家
为了找到确诊病例数量最多的国家,我们可以根据最后(最近)日期列中的值对原始数据帧“data_df”进行排序。排序是使用“sort!”完成的功能(bang 版,就地排序)降序排列。
对原始数据框架“data_df”进行排序,以确定确诊病例数量最多的国家,并绘制一个水平条形图
截至 2020 年 7 月 24 日确诊病例数最多的前五个国家
随着时间的推移,可视化哪些国家占据了前五名的位置可能会特别有用。幸运的是,Julia 允许我们使用“@animate”宏轻松生成动画。我们只需要遍历这些日期,并为每一天生成一个排名前五的国家的图表(如上所示)。然后将这些图组合成动画,可以以任何所需的帧速率运行。之前使用的代码块需要放在动画循环中,如下所示:
通过循环浏览日期并绘制每个日期的前五个国家来生成动画。fps=2 '设置所需的帧速率,在本例中为每秒 2 帧(2 个日期)。
截至 2020 年 8 月 14 日,新冠肺炎确诊病例最多的前五个国家的动画。执行完代码块后,视频会自动开始在你的 Jupyter 笔记本上播放。
死亡、康复和当前感染的人数
CSSE GitHub 库还包含死亡和康复病例数的时间序列数据。我们可以使用前面所示的相同代码将这些 CSV 数据导入两个新的数据帧:“data_df_recovered”和“data_df_deaths”。
导入附加 CSV 数据
我们可以从这些新的数据框架中收集数据,再一次收集一些国家的数据。下面显示的代码创建了新的数据帧“y_r”和“y_d ”,它们分别包含恢复病例和死亡人数的数据。y '包含确诊病例数,与早前相同。
“find_country”函数从原始数据帧中返回行。然后,从第 5 列开始,即第一个日期 22/01/2020 开始,将其堆叠成垂直布局。请注意,Julia 中的索引从 1 开始。
成组的条形图是可视化一系列国家的多个数据集(确诊、恢复、感染、死亡数)的有用方法。回想一下,我们已经在上面创建了数据帧“y_r”和“y_d”。既然知道了确诊病例总数,我们也可以计算出目前感染人数=确诊病例数(痊愈病例数+死亡人数)。
为了制作柱状图,我们需要从所有单独的数据框架中收集数据。下面的代码将最后一个 DataFrame 行(最近的日期)转换成一个向量,然后作为列添加到二维数组“Y”中。该数组的大小为:行(国家名称列表)×列(=4,对应于确认、恢复、死亡和感染数据)。
请注意,“Y[:,1] = deaths”将一维数组“deaths”分配给“Y”的第一列。类似的赋值用于“已确认病例”和“已恢复病例”。
二维数组“Y”的每一行现在包含给定国家的 4 个数据点。绘图类型“groupedbar”允许我们直接读取这些数据,并使用下面的代码根据国家排列条形组。额外的绘图选项控制条形的外观。
使用 x 轴上的国家名称(names(y))和 Y 轴上的二维数组“Y”中的数据制作一个分组条形图
包含截至 2020 年 7 月 31 日数据的各个国家的分组条形图
德国似乎在管理疫情方面做得很好,类似的“已确认”和“已恢复”数字就证明了这一点。对于印度和巴西等国来说,复苏看起来很有希望,尽管仍有相当一部分工作要做。与痊愈人数相比,法国感染人数更多。
查找康复病例数和死亡人数最多的前五个国家
为了找到恢复案例数量最多的国家,我们可以根据最后(最近)日期列中的值对数据帧“data_df_recovered”进行排序。排序是使用“sort!”完成的函数(bang 版本,就地排序)按降序排列,类似于前面所做的。使用“数据 _ df _ 死亡”数据帧,死亡人数遵循相同的逻辑。
对数据框“数据 _ df _ 恢复”进行排序,以确定确诊病例数最高的国家,并绘制一个水平条形图
截至 2020 年 7 月 31 日,恢复案例数量最多的前 5 个国家
截至 2020 年 7 月 31 日死亡人数最多的前 5 个国家
结论:Julia——解决数据科学问题的通用工具
通过这篇文章,我试图展示一个初学者使用 Julia 解决数据科学中一些基本问题的经验。完整代码可以在这里找到。我意识到我可能错过了一些细节,这是意料之中的,因为这绝不是一个权威的指南。其他资源也存在于网络上,尽管这样的指南可能很难找到。我对 Julia 的世界还很陌生,很乐意收到一些反馈,甚至是改进代码的建议。我将继续探索高级的 Julia 库,并使用它们来创建使用大型复杂数据集的更有洞察力的可视化。请继续关注更多这样的指南。感谢你花时间阅读这篇文章!请随时在 LinkedIn 上与我联系。
参考资料:
- 链接完成茱莉亚代码要旨
- https://syl 1 . git book . io/Julia-language-a-concise-tutorial/language-core/getting-started
- https://julialang.org/
- 另一个使用 Python 的优秀数据可视化教程
什么是数据可视化?
towardsdatascience.com](/covid-19-data-visualization-using-python-3c8bcfaeff5f)
想象 2020 年 8 月的新冠肺炎
通过一个案例研究来展示新冠肺炎的发展
图片作者:特里斯特·约瑟夫
自 2019 年 12 月底在中国首次记录以来,新冠肺炎已传播到世界各地,并被世界卫生组织宣布为疫情。正因为如此,数十亿人被封锁,卫生服务部门疲于应付。现在,在 2020 年 8 月,学生是否应该亲自回到学校度过新学期,餐馆等企业是否可以恢复正常运营,以及各国是否应该加强之前的封锁措施,这些都有很多问题。
这些决策中的许多需要由数据保健专业人员来指导,而不应该在没有数据的真空中做出。数据分析过程有许多方面,数据可视化是一个非常重要的方面。数据可视化是获取信息并将其转换为可视化上下文(如图表)的过程。大多数人倾向于同意,看一个图表并理解潜在的信息比通读一个数字表要容易得多,特别是对于大型数据集。因此,为了了解新冠肺炎病例在各个国家的分布情况以及新冠肺炎是如何在这些国家传播的,我将进行一次数据可视化练习。
图片作者:特里斯特·约瑟夫
所有分析都将在 R 中使用 tidyverse 进行,数据可以从一个公开可用的数据库中检索(参考资料部分中的链接)。
library(tidyverse)
library(ggthemes) # contains the theme used for the graphs
第一步是将数据加载到我的环境中,并确保它的结构适合可视化分析。
covid_df <- read_csv('file_path'+'file_name')
glimpse(covid_df)
该数据集包含日期、国家、省份、经度、纬度、给定日期的病例数以及这些病例是确诊阳性病例、痊愈还是死亡等变量。对于这一分析,我感兴趣的是确诊阳性病例的日期、国家和数量。因此,我将选择这些列,并创建一个仅包含感兴趣的变量的新数据框。
但是,在检查来自glimpse(covid_df)
的输出时,发现日期变量被解析为字符类型而不是日期类型,并且 case 类型也被解析为字符,而它应该是因子。因此,我将把变量转换成适当的数据类型,然后创建新的数据框。
covid_df$date <- parse_date(covid_df$date, format="%m/%d/%Y")
covid_df$type <- parse_factor(covid_df$type)confirmed_cases <- covid_df%>%
filter(type=="confirmed")%>%
select(c("date", "country", "cases"))
现在我有了感兴趣的数据,这将对了解新冠肺炎的全球增长很有价值。由于数据框包含许多国家/地区,并且多个国家/地区在同一天出现确诊阳性病例是合理的,因此需要按日期对数据进行分组,然后进行汇总,以找到每天的病例总数。此外,为了了解增长情况,还应该计算一段时间内案例的累计总数。
confirmed_cases_total <- confirmed_cases%>%
group_by(date)%>%
summarise(Total_cases= sum(cases))%>% #aggregates by day
mutate(Cumulative_cases = cumsum(Total_cases)) #calc cumulativeggplot(confirmed_cases_total, aes(x=date, y=Cumulative_cases))+
geom_line()+
scale_y_log10()+
scale_x_date(date_breaks = "months", date_labels = "%b-%Y")+
ylab("Cumulative Cases")+
xlab("Date")+
ggtitle("Cumulative World Covid-19 Cases per day")+
theme_tufte()
图片作者:特里斯特·约瑟夫
该图显示,全球新冠肺炎病例在 1 月至 2 月间迅速增加,在 3 月初放缓,然后在 3 月中旬后再次迅速增加。还可以看出,目前的新增病例率低于 3 月中旬至 4 月的比率,但世界范围内的病例仍在增加。
尽管在疫情爆发的早期,病例主要集中在中国,但美国很快成为关注的地区。因此,我接下来将绘制美国与世界其他地区的对比图,以收集关于 3 月份及以后案件上升的见解。
------------------ # Data
UnitedStates_confirmed_cases <- confirmed_cases%>%
filter(country=="US")%>%
group_by(date)%>%
summarise(Total_cases = sum(cases))%>%
mutate(Cumulative_cases = cumsum(Total_cases))UnitedStates_confirmed_cases$Location <- as.factor(rep("USA", nrow(UnitedStates_confirmed_cases))) #creating memebership variableNotUnitedStates_confirmed_cases <- confirmed_cases%>%
filter(country!="US")%>%
group_by(date)%>%
summarise(Total_cases = sum(cases))%>%
mutate(Cumulative_cases = cumsum(Total_cases))NotUnitedStates_confirmed_cases$Location <- as.factor(rep("USA", nrow(NotUnitedStates_confirmed_cases)) #memebership variableusa_vs_world <- rbind(UnitedStates_confirmed_cases, NotUnitedStates_confirmed_cases) #combining the two df's------------------ # Graph
ggplot(usa_vs_world, aes(x=date, y=Cumulative_cases, color=Location))+
geom_line()+
scale_y_log10()+
scale_x_date(date_breaks = "months", date_labels = "%b-%Y")+
xlab("Date")+
ylab("Cumulative Cases")+
ggtitle("Cumulative Covid-19 Cases per day, USA vs The World")+
theme_tufte()
图片作者:特里斯特·约瑟夫
这两条曲线具有相似的形状;它表明,美国国内确诊病例的数量在 3 月份期间迅速增加,并且这种迅速增加一直持续到 4 月份。尽管这确实为第一个图中出现的病例激增提供了洞察力,但也可以看出,世界其他地区在 3 月期间和之后仍出现了确诊病例数量的快速增加。
正因为如此,我将比较美国和中国,以确定这两个国家的疫情之间的异同。
------------------ # Data
UnitedStates_confirmed_cases$Country <- UnitedStates_confirmed_cases$LocationUnitedStates_confirmed_cases$Location <- NULLChina_confirmed_cases <- confirmed_cases%>%
filter(country == "China")%>%
group_by(date)%>%
summarise(Total_cases= sum(cases))%>%
mutate(Cumulative_cases = cumsum(Total_cases))China_confirmed_cases$Country <- as.factor(rep("China", nrow(confirmed_cases_China)))USAvsChina <- rbind(China_confirmed_cases, UnitedStates_confirmed_cases)------------------ # Graph
ggplot(USAvsChina, aes(x=date, y=Cumulative_cases, color=Country))+
geom_line()+
scale_y_log10()+
scale_x_date(date_breaks = "months", date_labels = "%b-%Y")+
xlab("Date")+
ylab("Cumulative Cases")+
ggtitle("Cumulative Covid-19 Cases per day, USA vs China")+
theme_tufte()
图片作者:特里斯特·约瑟夫
图表显示,随着美国确诊病例的持续增长,中国相对趋于平稳。因此,中国的情况无法解释前面图表中看到的跳跃。
那么是哪些国家导致了新冠肺炎病例的持续增长呢?理想的做法是确定哪些国家在确诊阳性病例总数方面名列前茅。
Hardest_hit_Countries <- confirmed_cases%>%
group_by(country)%>%
summarise(Total_cases = sum(cases))%>%
arrange(desc(Total_cases))%>%
top_n(5)
Hardest_hit_Countries
的输出显示了确认阳性病例总数排名前 5 位的国家的表格。从该表可以看出,美国是这方面最多的国家,共有 4,823,890 起案件。美国之后是巴西,为 2859073 例;印度,1964536 例;俄罗斯 864948 例;南非有 529,877 个病例。
为了了解这些国家在一段时间内对全球新冠肺炎病例增长的相对贡献,可以绘制一个图表,比较这些国家与世界其他国家的增长情况。如果这些国家是前面图表中出现的凸起的原因,那么与前面图表中的同一条线相比,代表世界其他地区的线将会平坦得多。
图片作者:特里斯特·约瑟夫
图表显示,受打击最严重的国家在 3 月期间和之后的病例上升中占了相当大的一部分,其中美国占了 3 月份病例的大部分。然而,在三月份,世界其他地方仍然存在着明显的颠簸。一个原因是,受打击最严重的过滤器决定了哪些国家目前新冠肺炎病例最多,而这些国家可能不是 3 月份的同一批国家。
为了确定在此期间哪些国家是受打击最严重的,我将更新受打击最严重的过滤器,并确定哪些国家现在名列前茅。
Hardest_hit_Countries_before_may <- confirmed_cases%>%
filter(date <= "2020-04-01")%>%
group_by(country)%>%
summarise(Total_cases = sum(cases))%>%
arrange(desc(Total_cases))%>%
top_n(5)
这个数据框的输出现在显示,美国仍然是排名第一的国家,有 214,205 例。然而,美国现在以 110,574 例紧随其后的是意大利;西班牙 104118 例;中国 82361 例;德国有 77872 例。
这些数字还表明,在 4 月 1 日至 8 月 5 日期间,美国确诊阳性病例的数量增加了 2000%以上。疯狂。
那么,现在知道了美国确诊的阳性病例大幅增加,那么美国占全球病例的比例是多少呢?事实上,了解每个国家在确诊病例中所占的比例将是令人感兴趣的。
share_of_cases <- confirmed_cases%>%
group_by(country)%>%
summarise(Total_cases = sum(cases))%>%
mutate(p_of_total_cases = (Total_cases/sum(Total_cases))*100)%>%
arrange(desc(p_of_total_cases))%>%
mutate(cumulative_p_of_total_cases = cumsum(p_of_total_cases))
share_of_cases
的输出显示,3 个国家的病例目前约占全球确诊阳性新冠肺炎病例的 50%,其中美国的病例约占 26%;巴西的病例占~ 15%;印度的病例约占 10%。这尤其令人担忧,因为该数据集包含 188 个国家。因此,这意味着该数据集内不到 2%的国家占全世界病例的 50%。
结果还显示,14 个国家的病例目前占全球确诊阳性新冠肺炎病例的 75%。现在,这一指标仍然表明病例集中在少数几个国家,但这比占全球病例约 50%的 3 个国家的病例要好。
我要做的最后一件事是创建一个图表来显示美国境内确诊阳性病例的增长情况,同时标注关键事件,例如何时宣布疫情以及何时所有州都处于封锁措施之下。
------------------ # Data
usa_events <- tribble(
~date, ~event,
"2020-01-30", "Global Health\nEmergency",
"2020-03-11", "Pandemic\nDeclared",
)%>%
mutate(date = as.Date(date))------------------ # Graph
ggplot(confirmed_cases_USA) +
geom_line(mapping=aes(x=date, y=Cumulative_cases)) +
geom_smooth(mapping=aes(x=date, y=Cumulative_cases), method="loess")+
geom_vline(aes(xintercept = date), data=usa_events, linetype="dashed")+
geom_text(aes(x=date, label=event), data=usa_events, y=3000000)+
annotate("rect", xmin =as.Date("2020-03-19", "%Y-%m-%d"), xmax=as.Date("2020-04-24", "%Y-%m-%d"), ymin=0, ymax=6000000, alpha=0.25)+
annotate("text", x=as.Date("2020-04-06", "%Y-%m-%d"), y=4000000, label="All States Lockdown")+
theme_tufte()+
scale_x_date(date_breaks="months", date_labels="%b-%Y")+
xlab("Date")+
ylab("Cumulative Cases")+
ggtitle("United States Cumulative COVID-19 Cases")
图片作者:特里斯特·约瑟夫
该图显示,尽管此前采取了封锁措施,美国确诊的新冠肺炎阳性病例数量仍在以二倍的速度增长。由于一些州反对继续(或重新实施)封锁措施,这一点更令人担忧。
由于它涉及前面提到的关于学生、餐馆和类似企业以及其他国家的问题,决策者应继续监测其管辖范围内的案件,并根据其情况做出最佳决定。冠状病毒肯定没有消失,任何关于健康和安全的决策都需要高度的数据驱动。
参考文献:
数据仓库:github.com/RamiKrispin/coronavirus
代号:github.com/trisxcj1/visualizing-covid19
其他有用的素材:
【tidyverse.org/learn/
r-bloggers.com/why-learn-the-tidyverse/
linkedin.com/learning/learning-the-r-tidyverse
linkedin.com/in/rick-scavetta/
新冠肺炎:隔离措施在加州奏效了。我们需要全国范围内更多的承诺。
随着美国最近声称全球大多数冠状病毒病例的不良区分(根据官方统计),纽约时报提供了一个全国所有确诊新冠肺炎病例的数据集,在州和县一级进行跟踪,并每天更新。
虽然承认数据永远不会完美,但真实的案例数量可能要大得多,并且测试频率和有效性因地区而异,以下是我迄今为止的发现。
为了保持简短和可操作性,我将只限制两个要点,概述如下 (请注意,我不是流行病学家、医生或医疗保健专业人士):
- 几个星期以来,安东尼·福奇博士等专家一直鼓励我们保持社交距离,与他人隔离,以使曲线变平,减缓新冠肺炎病毒的传播,让压力过大的医疗系统有机会迎头赶上。最近来自加利福尼亚的报道表达了谨慎的乐观,认为这些努力在减缓病毒传播方面是有效的。下面分享的我的数据分析,支持了这个观点。
- 因为目前没有有效的治疗方法或疫苗,更不用说新冠肺炎病毒会在它存在的任何地方呈指数级传播。这个国家的不同地区只是位于指数曲线的前部或后部。与其坐等疫情在适当的时候爆发,让医疗系统不堪重负,病例数量较少的州和管辖区应该抓住机会,在局势更加可控的时候实施隔离:
继续分析…
由于早期采取了积极的隔离措施,加州似乎正在减缓新冠肺炎的传播。
下图显示了在撰写本文时美国十个州每 100,000 人的新冠肺炎病例数。
除了纽约和新泽西非常需要我们的帮助这一事实之外,这张图表中更微妙的观察和一线希望是,与其他州相比,加州的病例增长相对缓慢,尽管加州是早期震中的所在地。该州采取了果断的行动,在纽约事件发生前 5-7 天下令“避难所就位”,这似乎产生了巨大的影响,尽管显然不是唯一的影响因素。
鉴于新加坡和台湾等国家使用积极的检测和隔离措施成功控制了病毒的传播,有理由认为,及早采取积极的隔离措施有助于加州控制传播,并将有助于全国其他州。
虽然对许多人来说,积极的隔离措施显然是有效的,但一些国家仍然没有执行任何就地安置/留在家中的命令,或任何其他形式的强力隔离。
实施这些隔离措施可能是我们在世界上抗击病毒传播的最佳机会,因为美国目前是世界上确诊病例最多的国家。
案例数较少的州应实施隔离。新冠肺炎到处呈指数传播。
第二个要点:所有州似乎都遵循类似的指数增长模式,正如你将在下面看到的那样——即使是那些病例数量较少的州。
鉴于他们中的许多人似乎处于曲线的早期,当务之急是在他们的情况可能更加可控的时候,抓住机会采取行动和实施隔离措施。
下图显示了“前 10 名”之外的各州案件总数的增长情况。你会注意到所有的曲线都有相似的形状。为了便于查看,我将每个图表限制在不超过 10 个状态。
社交距离和隔离可能是我们目前在全球抗击新型冠状病毒的最佳工具,根据数据,当正确实施时,它们正在发挥作用。
我希望那些处于领导地位的人将迅速采取必要的行动,我们每个人都将认真对待这一问题,尽我们的努力,尽我们最大的能力留在家里。
当然,所有这些隔离并不是没有代价的。我们还需要社会解决方案、政府干预、新的创新和大量的同理心来相互帮助,度过这个在精神上、精神上和经济上极具挑战性和毁灭性的经历,特别是对我们人口和经济中最脆弱的部分。
怀着谨慎的乐观,我相信我们有能力应付这一局面,但我不想在这里探讨这些问题。在我的公寓里,我将和我的家人呆在一起,祝愿我们一切都好。
想进一步了解我分析背后的细节,或者想看背后的 Python 代码,可以 访问我的 Github 这里 。
请理解这是一项正在进行的工作,不要指望我清理任何东西😆
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
使用 React 可视化新冠肺炎随时间的变化
如何创建同时显示地理和时态数据的工具。
[## 新冠肺炎(新型冠状病毒肺炎)
可视化电晕超时
neerajcshah.github.io](https://neerajcshah.github.io/corona/)
当我在二月份第一次看到 Johns Hopkins 拼凑了一个新冠肺炎可视化工具时,我也想看看我能做些什么。我意识到,我不可能制作出比现有的在线地图好得多的实时地图,但我开始回答一个不同的问题:我们能看到日冕在地理和时间上是如何传播的吗?
追踪新冠肺炎的基于时间的地图的屏幕截图
从那以后,我制作了一个 React 可视化程序来监控电晕的传播,我想我会分享它,以防它能让其他人受益。它从约翰霍普金斯大学 CSSE 分校提取数据,并允许用户查看从 1 月 22 日起任何日期的病毒状态(这是 JHU 有数据的第一天)。您可以拖动地图下的滑块来查看案例如何随着时间的推移而改变世界。
可视化是基本的,但它帮助我更好地理解一些由研究人员表达的东西。
首先,它告诉我,美国现在是危机的中心,但以前,中国和意大利拥有这个头衔。
它还帮助我理解,在像中国这样的国家,测试或报告方面的差距肯定存在,那里的数据已经几个月没有变化了。
最后,如果我们在 2020 年 6 月 8 日检查新西兰的所有方框,我们可以看到“感染”圈与“恢复”圈几乎完美重叠。也是在这一天,新西兰宣布在其境内消灭了该病毒。
新西兰宣布零病例的那一天
用 python 开发这种交互式的东西可能会很有挑战性,也不那么完美。相反,React 是自然的选择,因为它被设计成通过简单、响应迅速的 UI 组件来呈现变化的数据。在本文的其余部分,我将介绍使用 React 开发这个项目的关键部分。
1-获取数据
任何可视化的一个挑剔的部分可能是处理输入数据,在这种情况下尤其如此,因为数据由另一方(Johns Hopkins)拥有和更新。这意味着当他们改变他们的组织风格时,我也必须适应。我选择依赖他们的数据库,因为这意味着我不必担心自己存储和维护实时数据。
他们目前每天在世界协调时 23:59 分左右上传一次时间序列数据到 Github。csv 文件。我希望我的应用程序在启动时提取数据,这样我们就可以始终显示世界的当前状态。
每当您从托管文件中提取内容时,获取原始内容是一种很好的做法。我们可以在 Github 上通过点击任何文件右上角的“Raw”按钮来实现。
始终提取“原始”内容,以便于后期处理
我使用了一个名为“ Axios ”的基于 promise 的 HTTP 客户端,用这个原始内容的 URL 执行“get”请求。这个异步操作的结果可以用“then”关键字来处理,它接受一个成功完成的承诺,并对其执行一个函数。
static pullAndParseUrl(url) {
return axios.get(url).then(response =>
Papa.parse(response.data,
{ header: true }));
}
如上所示,“then”函数获取“axios.get”的结果,并用浏览器内的 csv 解析器“ Papa Parse ”解析内容。
Johns Hopkins 将数据存储在 csv 中,其中行映射到国家,列映射到日期。因为第一行包含列名,所以我们在调用“Papa.parse”时指定“header : true”。Papa.parse 生成一个与国家对应的字典列表。每个字典都允许我们按日期索引感染人口规模,这对于稍后的 slider 集成非常重要。这整个行动的结果是一个承诺,一旦它完成,我们将有我们想要的形式的数据!
2-传单地图
为了制作地图,我们将使用传单,这是我选择的一个 JavaScript 交互式映射库,因为它有很好的文档,并且不需要任何 API 键或令牌。还有一个 react 库叫做 react-leaflet ,它是带有 React 组件的 leaflet 库的抽象。
我们将从导入“Map”和“TileLayer”组件来显示一个简单的地图开始。
import { Map, TileLayer } from 'react-leaflet';
作为反应的快速复习,组件接受参数,这些参数被称为“道具”。每当组件的属性改变时,组件就更新它的显示。组件之间的嵌套允许数据流经应用程序的各个部分。
我们现在将创建一个新的传单类,它扩展了“React。组件”。注意,构造函数只接受一个参数——“props”——它包含所有传入的参数。作为参考,要访问传递给组件的特定参数,我们可以编写“this.props.parameterName”。
export default class Leaflet extends React.Component {
constructor(props) {
super(props);
}
render() {
//TODO: Return map you wish to display.
}
}
传单地图可以用很少的代码显示在屏幕上。我们只需用纬度/经度和缩放级别实例化地图组件。我们还应该添加 TileLayer,为开放街道地图团队增光添彩。
我们将用我们希望类返回的内容填充 render 方法。每当传递给类的参数发生变化时,就会调用 render 方法。
render() {
const position = [35, -40];
const zoom = 2;
return (
<Map center={position} zoom={zoom}>
<TileLayer
url={"[https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png](https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png)"}
attribution={contributors}
/>
</Map>
}
我们有地图!
3-表示数据
我们将使用 react-leaflet 中的圆形组件在地图上描绘人口。圆是一种有点粗糙的地理数据可视化方式,因为它们可能无法很好地反映地理事实。例如,我们知道美国的大多数病例都发生在沿海地区,但如果我们只能画一个圈来代表美国的新冠肺炎病例,我们会将它放在国家的中心。解决方案应该是拥有更细粒度的数据,并利用这些数据构建详细的热图,但不幸的是,我们受到数据稀疏性的限制。
import { Circle } from 'react-leaflet';
地图上圆圈的大小代表了感染、康复或死亡人口的数量。我们可以通过指定半径来控制圆组件的大小。因为增加半径会导致圆的面积以平方的方式增加,所以我们需要小心不要将人口直接映射到半径上。相反,我们通过取每个群体的平方根并乘以某个常数来计算半径。
我们将在传单组件中添加一个名为“MyCircles”的组件,它将处理圆圈的创建。它将接收数据(在第 1 节中构造)、选定的日期和所需的圆圈颜色——所有这些都传递给了传单。
// Within the Map tags in Leaflet.
<MyCircles data={this.props.data}
date={this.props.date}
color="red"/>
下面实现了一个简化的 MyCircles 类。
const MyCircles = (props) => {
return (
props.data.map((row, i) => {
if (row["Lat"] != null && row["Long"] != null) {
return (
<Circle
key={i}
center={[row["Lat"], row["Long"]]}
radius={1000 * Math.sqrt(row[props.date])}
fillColor={props.color}
/>)
}
}
)
);
}
回想一下,props.data 由一个列表组成,其中的每一项都是一个字典,按日期表示一个国家的病例数。MyCircles 遍历 props.data 中的每个国家/地区,并读取该国家/地区在 props.date 的事例数。如果事例数不为零,它将返回一个在给定纬度/经度处具有计算半径的圆组件。
4 —滑块
React 的一个核心概念是将 UI 分割成几部分。正如我们为地图构建了一个名为“传单”的组件一样,我们也将为滑块构建一个组件。我们通过使用“material-ui”中内置的“Slider”组件来实现它。我在下面包含了一个对 slider 组件的简化调用:
<Slider
defaultValue={0}
onChange={this.handleChange}
marks={marks}
max={difference_in_days}
/>
如您所见,它有不同的参数,如“默认值”、“标记”和“最大值”。我们将第 0 天(2020 年 1 月 22 日)指定为默认值。“标记”是指滑块上带标签的“记号”,在这种情况下,我们只标记开头和结尾。“max”设置的“difference_in_days”变量指的是第 0 天和今天之间的天数(这是动态计算的,并保持可视化为最新)。最后,“onChange”被分配给一个名为“this.handleChange”的函数,如下所示。每当滑块移动时,React 都会调用它。
handleChange(event, newValue) {
var result = new Date("01/22/2020");
result.setDate(result.getDate() + newValue);
this.props.handleDateChange(formatDate(result));
}
这个函数基于从滑块传入的值更新日期,并调用“this.props.handleDateChange”,我们将在下一节讨论它。
5 —管理状态
到目前为止,我们已经看了道具。Props 是不可变的,用于从高层组件向下传递数据。为了利用 React 的响应能力,我们还将查看状态。状态是可变的,不应由子组件直接访问。
状态帮助我们将组件之间的交互联系在一起。如前所述,我们将看看滑块的 onChange 方法如何修改地图。
下面,我在 React 项目中加入了顶级“App”组件的简化版本。如图所示,它在“state”中有一个名为“date”的条目。
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
date: "1/22/20",
};
this.handleDateChange = this.handleDateChange.bind(this);
}
}
您还会注意到,构造函数提到了“handleDateChange”方法,在上一节中,我们将该方法传递给了 slider 组件。“bind”函数将方法的“this”关键字设置为总是引用“App”,即使我们将方法传递给不同的类。
“handleDateChange”方法的简短实现如下所示。
handleDateChange(selectedDate) {
this.setState({ "date": selectedDate });
};
它调用名为“setState()”的 React 生命周期方法来设置新的日期。“setState”函数更新组件的状态,并告诉该组件及其所有子组件再次呈现它们自己。
我们将这个方法传递给 slider,这样它的“onChange”方法就可以改变父组件的状态。
<DateSlider
handleDateChange={this.handleDateChange}
/>
现在,每当我们拖动滑块时,父“App”组件将更新其状态的日期。
由于我们将“this.state.date”作为道具传递给了 Leaflet 类,因此每当日期发生变化时,地图都会动态更新,从而满足我们在地理和时间上显示日冕分布的愿望。
<Leaflet
date={this.state.date}
/>
这种结构有助于应用程序具有流动性,也用于帮助复选框修改地图。它允许您编写少量代码来促进引人注目的 UI 交互。
结论
通过将这些案例可视化,我已经能够观察到一些趋势,否则我会发现很难理解这些趋势。这个工具帮助我确认我正在阅读的报告,但它偶尔也会让我有新的惊喜,因为它可以一次显示大量的全球数据。我所介绍的框架可以用于任何项目,在这些项目中,您希望在不同的时间灵活地查看某些内容。我建议将它应用到您感兴趣的另一个数据集并共享结果!
如需进一步参考,可在此处找到代码。
[1] ReactJs, React 顶级 API (2020)。Reactjs.org
可视化新冠肺炎传播与 Tableau 动画
动画地图,赛车条形图,和 Python 合并,天啊!
绘制从美国首次爆发到 2020 年 7 月 1 日的新冠肺炎病例传播图。作者 GIF。
这个项目产生于一种兴趣,即想象新冠肺炎的热点是如何随着疫情的发展而变化的。自从看了这个视频之后,我就对视频中显示的“赛车条形图”这样的基于时间的动画产生了兴趣,还有动画地图。
由于 COVID 的爆发与地理高度相关,我将创建一些动画地图和赛车条形图,看看我们可以了解到什么。在此过程中,您将了解如何将数据集与 Python 相结合,以及如何使用 Tableau Public 创建基于时间的动画。如果你只是想跳到已完成的项目,在这里查看。
🚨强制性公共卫生咨询🚨远离拥挤的海滩,去和后院的游泳池做朋友吧😉(当然,只要他们的测试结果是阴性的……而且他们没有邀请其他朋友……你知道吗,只要洗个放松的澡就可以了)
我将在这里使用两个数据集:
- 来自《纽约时报》的数据显示了美国各县的新冠肺炎病例。它每天都在更新,但我下载的数据只到 2020 年 7 月 1 日。 注: COVID 病例在此列为截至给定日期的累计总数,包括无症状病例、有症状病例和已痊愈病例。换句话说,病例数可能高估了在给定时间点实际患有 COVID 的人数,所以请记住这一点。
- 人口普查局的美国各县人口数据表。
数据清理和混合(也是每个数据科学家最喜欢的部分,❤️)
我不仅希望看到哪些县的病例最多,而且希望看到哪些县的感染率最高。虽然像佛罗里达、加利福尼亚和纽约这样的地方有大量的病例(主要是因为人口较多),但是它们就一定有最高的感染率吗?
NYT 数据集不包括县人口信息,所以我将使用 Python 和pd.merge()
将两个数据集合并为一个。如果您对 Python 不感兴趣,也可以通过在 Excel 中使用 SQL JOIN 或 VLOOKUP 来完成。在此之前,我们首先需要清理数据,使其成为最适合合并的格式。
我不会用清理数据的所有细节来烦你——如果你想看到我的数据清理的全部,请查看 Github repo 这里 。然而,我确实遇到了一些意想不到的障碍。
路易斯安那州有教区而不是县,阿拉斯加州的县名与“斯卡圭市”、“诺姆人口普查区”和“德纳里自治市”完全不一致。这使得隔离这些地区的名称以便 Tableau 可以正确地识别它们来构建地图成为一项***有趣*** (阅读:两个痛苦的小时)的任务。
import numpy as np
import pandas as pdcovid = pd.read_csv('covid-us-counties.csv')
cpop = pd.read_excel('co-est2019-annres.xlsx',skiprows=2)df = pd.merge(covid,cpop,left_on=['county','state'],right_on=['County','State'],how='inner')
dfm = df[['date','County','State','cases','deaths','Population Estimate 2019']]dfm.to_excel('covid-us-county-population.xlsx')
注意,我已经执行了一个内部合并,这意味着两个数据集将只在 county 和州的值匹配的行上连接,所有不匹配的行将被丢弃。现在我们的数据看起来像这样,只有我们需要的行:
按县数据集合并新冠肺炎病例。图片作者。
Tableau 动画
Tableau 是最强大的数据可视化平台之一,他们的免费版本 Tableau Public 拥有我们完成这一分析所需的所有功能。Tableau 的团队和保罗·艾萨克斯在解释如何实际制作动画和赛车条形图方面做得比我好得多,所以我会让他们告诉我如何做,并更多地关注我们可以从数据中提取哪些见解。
让我们从用动画地图可视化各县的新冠肺炎案例开始,如下图所示。
一段时间内各县的累计 COVID 病例(左),以及 2020 年 7 月 1 日的最终分布(右)。作者图片。
当我第一次创建地图时,颜色之间的对比度太小,地理上的小县如纽约县(基本上只是曼哈顿)和少数其他暗红色。为了使地图阅读起来更有趣,并显示更大的颜色梯度,我设置了最大值(在加利福尼亚和新英格兰的暗红色),这样 20%的县将被暗红色覆盖。(病例数的第 80 百分位恰好是 513 例。)
关于这张地图的一些观察立刻引起了我的注意:
- 无论是由于缺乏足够的检测资源,缺乏报告病例,还是真正没有冠状病毒,相当多的县似乎没有冠状病毒病例。加利福尼亚州、内华达州和华盛顿州的这些县可能是灰色的,因为周围的县往往有大量病例,因此缺乏报告。
- 另一方面,整个中西部的灰色县可能真正没有报告病例,因为周围的县都是浅红色阴影,表示病例很少。
- 虽然加州、纽约州和德克萨斯州一直占据着新闻报道的中心,但很明显,其他几个州也受到了重创,尽管受到的关注相对较少:亚利桑那州、科罗拉多州、密歇根州、北卡罗来纳州以及新英格兰的大部分地区。
让我们更仔细地看看病例数最多的 10 个县。
按一段时间内累计病例和死亡人数排名的县(左),以及 2020 年 7 月 1 日的最终排名(右)。作者图片。
根据 Worldometer 对纽约市COVID 病例和死亡病例的分析,平均感染死亡率为 1.4% 。人们很容易看到 1.4%这样的数字,并认为它在任何地方都适用,这将使比较各县的病例和死亡人数变得完全没有意思。换句话说,很容易假设:
(病例数)*(1.4%) =(死亡数)
在上面的图表中,我们开始发现事实并非如此。例如,洛杉矶县在病例数量上排名第二,但在死亡人数上排名第三。另一方面,米德尔塞克斯郡在病例数量上排名第六,但在死亡人数上排名第四。
也许洛杉矶县比米德尔塞克斯县拥有更多的医院床位和更好的优质医疗服务,所以感染 COVID 的人很少到达危急阶段。另一种可能的解释是,洛杉矶县的年轻人比例高得多,他们死于 COVID 的风险较小,因此更愿意外出冒险,这使他们感染 COVID 的风险更大。老年人可能更不愿意去公共场合,但当他们感染了 COVID,他们更有可能死亡。
在下面的州一级,同样的趋势也很明显。加利福尼亚州在病例数上排名第二,但在死亡率上排名第七,而另一方面,马萨诸塞州在病例数上排名第七,但在死亡率上排名第三。
各州按一段时间内的累计病例和死亡人数排名(左),2020 年 7 月 1 日的最终排名(右)。作者图片。
各县受感染人口的百分比
尽管病例数在纽约和洛杉矶等地继续以惊人的速度攀升,但我在新闻中没有听到的一项统计数据是,这些县的人口中有多少百分比实际上受到了感染。我使用人口普查局的数据创建了下面的地图和条形图。
****
随着时间的推移,县人口感染的百分比(左)和 2020 年 7 月 1 日的最终分布(右)。作者图片。
暗红色县的聚集似乎从主要的大都市地区急剧转移到人口密度较低的农村地区。突然间,洛杉矶县看起来相当受控制,而亚利桑那州、密西西比州和中西部的一些县看起来受到了破坏。
用数字来说明:
- 洛杉矶县只有 1.05%的人被感染,而亚利桑那州的马里科帕县(凤凰城州府所在地)的感染率为 3.3%。
- 纽约县(曼哈顿)感染率 13.52% 依然惊人!
- 人口只有 7816 人的田纳西州特鲁斯代尔县,感染率高达 13.2% 。住在这里而不知道至少一个被感染的人是不可能的。
想象一下这些感染率超过 5%的县正在经历的灾难,然后结合这些地方获得高质量医疗保健的机会可能比洛杉矶或纽约少的事实,我们面临着一个相当严峻的局面。
****
按累计病例数和县人口感染百分比对各县进行排名(左),最终排名于 2020 年 7 月 1 日。作者图片。
免责声明:我不分享这些见解来贬低像洛杉矶和纽约这样有大量病例的城市。我只是想指出一些事实,揭示另一个没有受到关注的故事:获得优质医疗服务较少的农村地区的故事,他们遭受的痛苦可能超出我们大多数城市居民的想象。
有待改进的领域
#1:将固定的 x 轴改为动态轴
动态 x 轴示例。视频由 RankingTheWorld 制作(https://www.youtube.com/watch?v=8WVoJ6JNLO8)。
在经典的赛车条形图(如上所示)中,排名第一的条形占据了屏幕的整个宽度,每隔一个条形占据的宽度与排名第一的条形成比例。然而,目前所有的赛车条形图的 x 轴都是固定的,这使得分辨率太低,无法看到 4 月份之前的真实情况。
这里有一个关于如何修复这个的教程,它适用于非聚合的原始数据,但是因为我们的原始数据是预聚合的,所以他们对 WINDOW_MAX 的修复不起作用。(如果你能想出如何让它工作就加分!)**
#2:创建实时连接
我在 2020 年 7 月 1 日从 NYT 的 Github 页面下载了这个数据集,从那以后出现了相当多的案例和新趋势,这些都没有被这些动画捕捉到。目前,我使用的是 Tableau Public (Tableau 的免费提供),它不允许与数据集进行实时连接。如果我升级到完整版的 Tableau Desktop,我可以与 NYT 的 Github 页面建立实时连接,这样数据每天都会自动更新,可视化效果也会随之更新。
#3:速度
这个数据集有大约 280k 行,所以每次放大或缩小地图时,整个地图都需要重新绘制,这使得界面有时非常滞后。我不知道这是否可以用 Tableau 来修复,但我很想知道是否有人知道如何修复。
希望你喜欢这个分析,即使它有点令人沮丧…要查看完整的可视化,请查看我的 Tableau 公共简介这里,我也期待看到你观察到的!
使用 Plot.ly For Python 可视化新冠肺炎漏洞
使用 Python 的 Plot.ly 模块创建 choropleth 的快速演练。
(图片由作者提供)
介绍
随着新冠肺炎病例在美国再次上升,一个有趣和令人兴奋的发展可能被忽略了,那就是每个州对这种性质的病毒的实际威胁程度。当我决定用 Python 的 Plot.ly 绘图库写一篇可视化地理数据的简介时,我很快意识到这是我想做的项目。因此,今天我们将通过 Plot.ly 创建 choropleth 地图并可视化 FIPS 数据,同时了解有关我国整体的有趣信息。与往常一样,数据和笔记本都可以通过以下链接获得:
数据读取和清理
幸运的是,对于今天的工作来说,数据已经准备好了——虽然我们也可以查询 API,但我决定使用 CSV 数据,所以让我们使用 Pandas 库中的 read_csv()函数来读取它:
import pandas as pd
import numpy as npimport plotly.express as pxdf = pd.read_csv("data/CDC_SVI.csv")
接下来,我们将使用 head()函数来查看我们的数据帧:
df.head(10)
(图片由作者提供)
那可是好多列啊!
所有这些特征都需要一千年才能完成。幸运的是,使用在获取数据的网站上找到的描述,我们可以删除不需要的列。我最初是通过删除列来实现这一点的,当列数超过 100 时,这很快就变得乏味了——所以我决定构建一个全新的数据框架。
df = pd.DataFrame({"FIPS": df["FIPS"], "POP": df["E_TOTPOP"],
"HOUSEHOLDS": df["E_HH"], "POV": df["E_POV"], "UNEMP": df["E_UNEMP"],
"PCI": df["M_PCI"], "DIS": df["E_DISABL"], "UNINS": df["E_UNINSUR"]})
我使用的功能如下:
- FIPS —给定辖区的联邦 ID。(我们需要这个来绘制 choropleth。)
- POP——对给定县的总人口的估计。
- 家庭——给定县的估计家庭数量。
- POV —该县生活在贫困线以下的估计平民人数。
- UNEMP——该县失业美国人的估计人数。
- PCI——估计的人均收入。
- DIS——辖区内残疾平民的估计人数。
- unis——该县未投保的美国人的估计人数。
接下来,我得到了这些数据中所有潜在缺失值的总和。幸运的是,这些数据非常干净!实际上没有丢失值:
(图片由作者提供)
特征是氯过多
首先,我们需要可视化我们的美国县是一组 JSON 数据,它将告诉 Plot.ly 对应于正确的 FIPS 的地图区域。我们可以从 Plot.ly Github 获得这一点:
https://raw . githubusercontent . com/plot ly/datasets/master/geo JSON-counties-FIPS . JSON
我们可以获取这些数据,然后用 JSON 甚至 Pandas 读取,或者我们可以简单地使用 URLLib 用 Python 请求数据:
from urllib.request import urlopen
import json
with urlopen('[https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'](https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json')) as response:
counties = json.load(response)
接下来,我将创建一个名为 current_feature 的新变量,它将代表我们要可视化的数据帧中的特征。这只是我为了使事情变得简单一点而加入的一个步骤,因为从这一点开始所要做的就是复制、粘贴和更改值来创建一个新的 choropleth。我们还需要这些数据的最小值和最大值,作为我们 choropleth 色标的参数。
current_feature = "POV"
curr_min = min(df[current_feature])
curr_max = max(df[current_feature])
现在,我们将把我们创建的所有数据插入 px.choropleth():
fig = px.choropleth(df, geojson=counties, locations='FIPS', color=current_feature,
color_continuous_scale="reds",
range_color=(curr_min, curr_max),
scope="usa",
labels={current_feature: current_feature}
)
接下来,我将使用 fig.update_layout()函数添加一个标题:
fig.update_layout(title_text = "US Poverty by county")
最后,展示新的 choropleth:
fig.show()
(图片由作者提供)
进一步考察,我们说美国在贫困问题上是相当平衡的。也就是说,有一些异常值,如德克萨斯州的哈里斯县。这是休斯顿所在的地方——就传播和住院率而言,这几个月来它实际上已经深陷泥潭。接下来,让我们用同样的方式想象我们的其他特征。
首先,让我们看看人口:
current_feature = "POP"
curr_min = min(df[current_feature])
curr_max = max(df[current_feature])fig = px.choropleth(df, geojson=counties, locations='FIPS', color=current_feature,
color_continuous_scale="blues",
range_color=(curr_min, curr_max),
scope="usa",
labels={current_feature: "Population"}
)
fig.update_layout(title_text = "US Population by county")
fig.show()
(图片由作者提供)
比较这两种可视化,似乎人口和贫困是相互关联的——至少在某些县是如此。回到德克萨斯州的休斯顿/哈里斯县,情况确实如此。我决定在 GIMP 中的另一张地图上叠加一个不透明版本的地图,我们看到大多数非白色的区域变成了紫色,是红色和蓝色的混合:
(图片由作者提供)
这可能是需要记住的事情,但让我们看看它与家庭的关联程度:
current_feature = "HOUSEHOLDS"
curr_min = min(df[current_feature])
curr_max = max(df[current_feature])
fig = px.choropleth(df, geojson=counties, locations='FIPS', color=current_feature,
color_continuous_scale="greens",
range_color=(curr_min, curr_max),
scope="usa",
labels={current_feature: "Population"}
)
fig.update_layout(title_text = "US Household Count By County")
fig.show()
(图片由作者提供)
定性地说,我们可以说,人口和共享住房肯定是新冠肺炎感染的一个风险因素。话虽如此,贫困和普遍差异也肯定是一个因素。利用这一点,我们可以构建一个新的探索基础。
特征工程
一个很好的方法是使用我们自己的特征来重新想象这些数据的真实表现。我想调查的第一个指标是共有家庭的人口。为了做到这一点,我认为将人口中的居民数量除以家庭数量是有意义的,它给出了一个大约有多少人一起生活在一个地点的数字。为了设计这个特性,我创建了一个快速 Lambda 函数:
POPPERH = lambda pop, hh: pop / hh
然后将我们传递的列的返回设置为 dataframe 上的一列。
df["POPPERH"] = POPPERH(df["POP"], df["HOUSEHOLDS"])
如果你想了解更多关于使用 Python 的 lambda 来做像这样又酷又简单的事情,我也有一篇文章详细介绍了它是如何工作的:
Python Lambda 函数的正确用法:Python 科学编程的最佳语法。
towardsdatascience.com](/scientific-python-with-lambda-b207b1ddfcd1)
现在让我们以同样的方式来想象这个特征:
(图片由作者提供)
有趣的是,通过设计这一特征,我们发现,尽管美国某些地区的人口和贫困率很高,但这两个属性并不一定与生活在一起的大家庭相关。当然,这不能说是客观事实,而很可能是一个粗略的估计;但有趣的是,这可能是一个潜在的风险因素,就像我们今年早些时候在意大利看到的那样。
对于我的最后一个想法,我想通过结合所有这些特征来创建一个任意值,该值可以指示某个区域构成的风险有多高。当然,这个数字将是任意的,并且可以是基本上任何东西的计算结果,只要这些值在具有统计显著性的特征上呈现不同的结果。话虽如此,请允许我向您介绍我的新的任意风险测量系统:
RVRI
- 呼吸的
- 病毒
- 风险
- 索引
让我们为这个值建立一个公式:
然后,我们将像以前一样创建一个新的 lambda 函数,并将其应用于数据帧:
# (unemp + POV + UNINS / POPPERH) + POV
RVRI = lambda df: (df["UNEMP"] + df["POV"] + df["UNINS"] / df["POPPERH"]) + df["POP"]df["RVRI"] = RVRI(df)
现在,我们将像之前一样可视化这些数据:
(图片由作者提供)
结论
使用 Plot.ly API,这些数据的可视化变得相对简单明了。Plot.ly 是一个很棒的工具,我以前讲过很多,最近在本文中更具体地讲过:
[## 用于数据分析的 10 个我最喜欢的 Python 库
一些你应该在 Python 中使用的优秀分析包的快速概要。
towardsdatascience.com](/10-of-my-favorite-python-libraries-for-data-analysis-597e09cca026)
我认为我们可以从这些视觉化图像和任意的 RVRI 值中得出一些有趣的见解。对我来说,有趣的是,在没有保险的美国人、贫困和其他被调查的特征方面,看到了最大的风险群体。更有趣的是,这些价值中有多少是相关的,因为更多的人口意味着更多的贫困,而更多的贫困意味着更多的患病风险。
明确地说,这一武断的特征还假设,在平民没有保险、贫困且居住密集的情况下,所讨论的病毒要危险得多。也就是说,对于(美好的)2020 年,这个计量单位当然是适用的。
可视化新西兰的犯罪和 Twitter 数据
推特科学
用 R,Shiny,Python 和 QGIS3 开发的可视化 app。
推特和执法
新西兰警方的目标是提高公民参与度,同时提高警务效率。量化公民参与度的方法之一是观察他们的 twitter 习惯,以确定其与该地区犯罪的相关性。
这项工作背后的基本想法是通过分析他们的推文来可视化特定地点的犯罪和该地区人民的情绪。显然,对于像新西兰这样一个人口稀少的国家来说,选择分享地理位置的人太少了,这种分析不可信。
因此,我们使用了 5 年内发送到 https://twitter.com/nzpolice的推文总数以及新西兰各地区的犯罪数据。本文描述了开发可视化的方法。检查短视频,看看它看起来怎么样。
分析犯罪和推特数据
提取推文
我试图获得 Twitter 开发者的帐户,但它被拒绝,声称它不符合他们的条款和条件,这是愚蠢的。因为我既没有做任何商业目的的事情,也没有试图窃取私人数据。这只是一个小实验。所以我用了 TweetScraper ,它实际上工作得很好,尽管它不是没有错误。
我摘录了 2015 年到 2020 年初发给新西兰警方的推文。下面的命令是一个典型的例子。
scrapy crawl TweetScraper -a "query=@nzpolice near:Auckland since:2014-07-01 until:2020-03-31"
这个查询并没有真正的用处,因为在这段时间的 80,000 多条推文中,只有几百个用户允许从奥克兰进行地理定位访问。用它来分析毫无意义。
推文感悟
我在寻找深度学习来进行适当的情感分析,但并不热衷于在这个方向上做更多的研究。这是一个单独的话题,NLP 的深度学习是一个正在增长的领域,但还没有接近与视觉相关的应用。因此,我决定使用非常简单易用的Vader presentation。
import re
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
from tqdm import tqdm_notebook
analyser = SentimentIntensityAnalyzer()sentiment = []for i,tweet in enumerate(tqdm_notebook(tweets)):
string = tweet
string = re.sub(r'https?:\S+', "", string) #Removes Hyperlink
string = re.sub('@[^\s]+','',string) #Removes Usernames
string = re.sub('#[^\s]+','',string) #Removes Hashtags
score = analyser.polarity_scores(string)
score.pop('compound')
sentiment.append(max(score, key=score.get))
警方犯罪数据
从警方网站提取受害数据。顺便说一句,他们已经用 Tableau 实现了可视化。
来自新西兰警方网站
数据准备
说到数据准备,没有什么能打败熊猫。因为这是一个已经被警方清理和管理过的结构化数据,所以任务相当简单。下面是代码片段。
代码快照
闪亮的应用仪表板
所以这个练习的真正乐趣就是去做。由于我对这些工具很熟悉,我选择了 R 和 Shiny 来开发可视化。闪亮的仪表板使得制作高质量的交互式可视化效果变得非常容易。
Shiny 将这个过程分解为用户界面和服务器。逻辑驻留在服务器中,而 UI 可以单独管理。很容易在侧面板上设置控制面板。
可视化由两部分组成。第一个是 choropleth。维基百科对 choropleth 的定义是:
choropleth 地图(来自希腊语 χῶρος“区域/地区”和πλῆθος“大众”)是一种主题地图,其中区域按照统计变量的比例进行阴影化或图案化,该统计变量代表每个区域内地理特征的汇总,例如人口密度或人均收入。
如上所述,这基本上就是警方网站上显示的内容。
第二个是推特和犯罪的时间序列数据。R 中 Dygraph 的使用使其成为一个交互式的情节。以下是它的快照。
新西兰犯罪和推特活动的时间序列
注意,2019 年 3 月有一个峰值。这是新西兰历史上不幸的一天,克赖斯特彻奇发生了枪战。
新西兰警方的推特账号上还有其他一些推特活动高峰,对此进行调查会很有趣。总的来说,我看不出推特活动和犯罪活动之间有任何联系。虽然我在刑事案件中看到了某种循环。我想知道它是否比实地的实际事件更具行政性。
使用 QGIS3 创建矢量文件
最有趣的部分是在 QGIS 中,多边形被准备好放在地图上。很难确定一个载体形状文件,其中包含的区域与警方用于管理的区域相同。更重要的是有相同的名字。例如,警察数据集将奥克兰称为奥克兰市。
网上有许多矢量文件。例如链接
QGIS 使得根据需要合并不同区域和重命名要素变得非常容易。它肯定不如商业版的 ArcGIS,但进步很快。我已经在不同的项目中使用它两年了,我已经看到新版本有了很大的改进。
QGIS3 在运行
这是最终应用程序的样子。请注意,不同地区的犯罪数量差异很大。因此,颜色编码很困难。因此,使用对数标度。
此外,滑块会导致不必要的计算,因为滑块中的每个增量都会重新计算贴图。应该使用更好的输入部件。
最终可视化的快照
后续步骤
这只是一个简单的可视化,并没有提供任何尚未知晓或预期的见解。这些是我在扩展这项基础工作时可能会用到的一些想法。首先,我收集了 Twitter 数据。很多都是对一系列事件的反应。
了解人们在什么水平上参与这些活动并量化他们的情感投入将会很好。目前,情绪只是积极,消极和中性的。这将是有用的分配学位,这是一个极其困难的问题。
此外,通过给犯罪添加更多类别来使这种可视化更有用也是不错的。虽然不可能确定地理位置,但量化人们对这些到来的参与度会很好。举例来说,它可以让我们了解与金融犯罪相比,人们对毒品的担忧程度。
在https://github.com/deepakkarunakaran/nzpolice找到代码
用 RoughViz.js 可视化数据
使用 RoughViz.js 让您的图表更有趣、更具互动性
在本教程中,我们将深入到 RoughViz.js 来可视化数据。有了它,你就能画出具有草图视觉效果的图形。对于本教程,我们将使用**disease . shAPI**来可视化各个国家的人口和新冠肺炎数据。我选择这个库的原因是对如何可视化数据有一个更开放的想法。随着每一次数据可视化,我们用不同的艺术风格讲述一个故事可以极大地改变人们对它的看法。对我来说,这也是一个实验,看看使用 RoughViz.js 这样的工具的数据可视化是否可以因为本库使用的视觉效果而使看起来枯燥的主题变得更有趣。****
RoughViz.js 示例图
设置我们的开发人员环境
对于本教程,我们将使用 React 创建一个项目。建立 react 项目最简单的方法是通过创建 React 应用。如果您还没有安装 create react 应用程序,请检查他们的文档以准备好工具开始使用。我们将使用以下命令创建并运行项目:
**npx create-react-app rough-vizcd rough-viznpm start**
文件夹的名字可以是你喜欢的任何名字,但这是我在本教程中选择的。执行npm **start**
应该显示一个带有旋转 react 标志的运行页面。现在让我们安装 RoughViz.js,这样我们就可以在我们的项目中使用它了。因为我们使用 react,所以我们将安装 react 包装器。
**npm install react-roughviz --save**
我们现在可以开始在app.js
中导入库了。从起始项目中移除所有代码,并添加导入。你的app.js
应该是这样的:
**import React from 'react';
import { Bar, StackedBar, Scatter } from 'react-roughviz'
import './App.css';function App() {return (<div className="App">
<header className="App-header">
</header>
</div>
);
}export default App;**
创建我们的第一个条形图
我们现在可以开始 bij 建立我们的第一个图表。现在,我们将使用一个硬编码的数组来向您展示 RoughViz.js 的功能。不要担心,在我们设置完第一个图表后,我们将使用来自 API 的数据。对于第一张图表,我们将使用条形图。使用下面的代码,你应该能够看到一个有 4 个条的条形图。
**<Bar
data={{
labels: ['Appels',
'Bananas',
'Strawberries',
'Blueberries'
values: [10, 5, 8, 3],
}}
color="pink"
title="Top 4 sold fruits"
stroke='coral'
axisFontSize={"1.5rem"}
tooltipFontSize={"2rem"}
roughness={5}
labelFontSize={'3rem'}
strokeWidth={2}
fillStyle="hachure"
fillWeight={1}
margin={{ top: 70, right: 50, bottom: 80, left: 150 }}
padding={0.2}
height={700}
width={window.innerWidth - 100}
font={1}
/>**
图 1:条形图销售的前 4 种水果
我添加了一些额外的可选属性,如fillWeight
、axisFontSize
、roughness
和padding
。我添加了这些属性,以便您可以随意使用。更改这些值,并查看它对图形的影响。增加roughness
和fillWeight
特别有趣,因为它允许我们将图表从图 1 变成类似下面的图 2。
图 2:粗糙度和填充重量增加的相同条形图
用 API 数据填充图表
在这个例子中,我们将使用 Disease.sh API 来显示人口最多的 10 个国家。让我们首先设置 API 调用,以便用来获取我们想要的数据。首先导入useState
和useEffect
,因为我们将使用它们来存储我们的数据。
**import React, { **useState, useEffect** } from 'react';**
接下来用useState
初始化变量以存储数据。我们还需要为人口和姓名初始化一个单独的数组,因为我们需要两个数组,一个用于标签,另一个用于人口字段。
**const [data, setData] = useState([]);let population = [];let names = [];**
接下来,我们将创建一个fetchData
函数,该函数将调用 API 来检索数据。检索之后,我们可以将这个响应存储在上面初始化的setData
中。尝试控制台记录数据,看看是否能从 API 获得数据输出。如果一切就绪,我们可以开始过滤数据,只显示人口最多的前 10 个国家。我们将使用 ES6 中的过滤功能来只检索这些国家,并将它们从最高到最低排序。
**useEffect(() => {
fetchData();
}, [])const fetchData = () => {
fetch(`[https://disease.sh/v2/countries`](https://disease.sh/v2/countries`))
.then(response => response.json())
.then(json => setData(json))
}**
完成后,我们将把它存储在。将函数映射到我们上面初始化的人口变量中。最后,我们还将填充上面的 names 数组,以在图表的标签字段中显示每个国家的名称。
**let dataCut = data.filter(*a* => (*a*.population > 106932753) && data.sort((*a*, *b*) => *b*.population - *a*.population));population = dataCut.map((*a*) => *a*.population);
names = dataCut.map((*a*) => *a*.country);**
我们现在可以用新检索到的数据填充图表。图形的代码看起来应该是一样的,唯一不同的是数据属性。
**<Bar
*data*={{
labels: names,
values: population
}}
color="pink"
title="Top 4 sold fruits"
stroke='coral'
axisFontSize={"1.5rem"}
tooltipFontSize={"2rem"}
roughness={5}
labelFontSize={'3rem'}
strokeWidth={2}
fillStyle="hachure"
fillWeight={1}
margin={{ top: 70, right: 50, bottom: 80, left: 150 }}
padding={0.2}
height={700}
width={window.innerWidth - 100}
font={1}
/>**
图 3:拥有 API 数据的前 10 个人口大国
如果操作正确,您的图表应该如图 3 所示。
显示前 10 个活动新冠肺炎案例的散点图
现在我们可以尝试另一个图表。散点图的代码大致相同。这里最重要的区别是,我们将数据存储在 x 和 y 属性中,而不是标签和值中。我们仍将使用人口数组,但添加了一个活动数组来显示每个国家有多少活动病例。接下来,我们还应该设置地图上显示的每个圆圈的radius
。我把我的设置为 40,但你可以设置为任何你想要的。接下来,我们还添加了一个colors
属性来添加颜色数组。这是用来确定什么颜色的一个圆的基础上的价值
**let population = [];
let names = [];
** let active = [];** useEffect(() => {
fetchData();
}, [])
const fetchData = () => {
fetch(`[https://disease.sh/v2/countries`](https://disease.sh/v2/countries`))
.then(response => response.json())
.then(json => setData(json))
}let dataCut = data.filter(a => (a.population > 106932753) && data.sort((a, b) => b.population - a.population));population = dataCut.map((a) => a.population);**active = dataCut.map((a) => a.active);**<Scatter
data={{
x: population,
y: **active**
}}
title='Population country versus active covid-19 cases'
titleFontSize={'2rem'}
roughness={2}
bowing={true}
radius={40}
xLabel={'Population'}
yLabel={'active covid-19 cases'}
labelFontSize={'2rem'}
fillWeight={8}
axisRoughness={0}
font={0}
height={700}
tooltipFontSize={'1.5rem'}
colors={['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928']}
width={window.innerWidth}
margin={{ top: 50, right: 50, bottom: 170, left: 300 }}
curbZero={true}**
如果实现正确,您的图表应该如图 4 所示。
图 4:人口国家与活跃的新冠肺炎病例
太好了,你现在已经用真实的 API 数据做出了两个很棒的图表。RoughViz.js 有更多的图形,如折线图、堆积条形图和圆形图。在图 5 中是另一个例子,我用同样的新冠肺炎数据制作了散点图。
图 5:每个国家的死亡/康复/活跃病例
如果你想了解他们的图书馆,你可以查看他们的 GitHub 页面。他们有各种代码甚至 React、Vue 和 Python 的包装器的例子。我希望你喜欢这个教程,并学到一些新的东西。编码快乐!
本文使用的资源…
- rough viz . js—github rough viz . js
- NovelCOVID API — 全球新冠肺炎 api
用 Python 可视化决策树(Scikit-learn,Graphviz,Matplotlib)
了解如何使用 matplotlib 和 Graphviz 可视化决策树
图片来自我的理解分类决策树(Python)教程。
由于各种原因,决策树是一种流行的监督学习方法。决策树的好处包括它们可以用于回归和分类,它们不需要特征缩放,并且它们相对容易解释,因为你可以可视化决策树。这不仅是理解您的模型的一种强有力的方式,而且也是传达您的模型如何工作的一种强有力的方式。因此,了解如何基于您的模型进行可视化会有所帮助。
本教程涵盖:
- 如何使用 Scikit-Learn 拟合决策树模型
- 如何使用 Matplotlib 可视化决策树
- 如何使用 Graphviz 可视化决策树(Graphviz 是什么,如何在 Mac 和 Windows 上安装,如何使用它可视化决策树)
- 如何可视化袋装树或随机森林中的单个决策树
和往常一样,本教程中使用的代码可以在我的 GitHub 上获得。就这样,让我们开始吧!
如何使用 Scikit-Learn 拟合决策树模型
为了可视化决策树,我们首先需要使用 scikit-learn 来拟合决策树模型。如果这一节不清楚,我鼓励你阅读我的理解分类决策树(Python)教程,因为我会详细介绍决策树如何工作以及如何使用它们。
导入库
我们将在本教程的这一部分使用以下导入语句。
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
from sklearn import tree
加载数据集
Iris 数据集是 scikit-learn 附带的数据集之一,不需要从外部网站下载任何文件。下面的代码加载 iris 数据集。
import pandas as pd
from sklearn.datasets import load_iris
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target
原创熊猫 df(特色+目标)
将数据分为训练集和测试集
下面的代码执行训练测试分割,将 75%的数据放入训练集,25%的数据放入测试集。
X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)
图像中的颜色表示数据帧 df 中的数据用于特定训练测试分割的哪个变量(X_train,X_test,Y_train,Y_test)。迈克尔·加拉尼克的图片。
sci kit-学习 4 步建模模式
# **Step 1:** Import the model you want to use
# This was already imported earlier in the notebook so commenting out
#from sklearn.tree import DecisionTreeClassifier**# Step 2:** Make an instance of the Model
clf = DecisionTreeClassifier(max_depth = 2,
random_state = 0)**# Step 3:** Train the model on the data
clf.fit(X_train, Y_train)**# Step 4:** Predict labels of unseen (test) data
# Not doing this step in the tutorial
# clf.predict(X_test)
如何使用 Matplotlib 可视化决策树
自 scikit-learn 版本 21.0(大约 2019 年 5 月)起,现在可以使用 scikit-learn 的[**tree.plot_tree**](https://scikit-learn.org/stable/modules/generated/sklearn.tree.plot_tree.html#sklearn.tree.plot_tree)
用 matplotlib 绘制决策树,而不依赖于dot
库,后者是一个难以安装的依赖项,我们将在稍后的博客文章中介绍。
下面的代码使用 scikit-learn 绘制了一个决策树。
tree.plot_tree(clf);
这还不是最容易解释的树。
除了添加允许您保存图像的代码之外,下面的代码试图通过添加特性和类名(以及设置filled = True
)来使决策树更容易理解。
fn=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']
cn=['setosa', 'versicolor', 'virginica']fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=300)tree.plot_tree(clf,
feature_names = fn,
class_names=cn,
filled = True);fig.savefig('imagename.png')
如何使用 Graphviz 可视化决策树
通过 Graphviz 生成的决策树。请注意,我使用文本编辑器编辑了文件,使文本颜色与叶/终端节点或决策节点相对应。
Graphviz
是开源的图形可视化软件。图形可视化是一种将结构信息表示为抽象图形和网络的方式。在数据科学中,Graphviz
的一个用途是可视化决策树。我应该注意的是,在介绍完 Matplotlib 之后,我之所以要回顾 Graphviz,是因为让它工作起来可能很困难。这个过程的第一部分包括创建一个点文件。点文件是决策树的 Graphviz 表示。问题是使用 Graphviz 将点文件转换成图像文件(png、jpg 等)可能很困难。有几种方法可以做到这一点,包括:通过 Anaconda 安装python-graphviz
,通过 Homebrew (Mac)安装 Graphviz,从官方网站(Windows)安装 Graphviz 可执行文件,以及使用在线转换器将您的点文件内容转换成图像。
创建点文件通常不是问题。将点文件转换成 png 文件可能很困难。
将模型导出到点文件
代码下面的代码将在任何操作系统上工作,因为 python 生成了点文件并将其导出为名为tree.dot
的文件。
tree.export_graphviz(clf,
out_file="tree.dot",
feature_names = fn,
class_names=cn,
filled = True)
安装和使用 Graphviz
将点文件转换成图像文件(png、jpg 等)通常需要安装 Graphviz,这取决于您的操作系统和许多其他东西。本节的目标是帮助人们尝试并解决出现以下错误的常见问题。dot: command not found
。
dot: command not found
如何通过 Anaconda 在 Mac 上安装使用
为了能够通过这种方法在你的 Mac 上安装 Graphviz,你首先需要安装 Anaconda(如果你没有安装 Anaconda,你可以在这里学习如何安装它)。
打开一个终端。你可以点击屏幕右上角的聚光灯放大镜,输入终端,然后点击终端图标。
键入下面的命令来安装 Graphviz。
conda install python-graphviz
之后,你应该可以使用下面的dot
命令将点文件转换成 png 文件。
dot -Tpng tree.dot -o tree.png
如何通过家酿在 Mac 上安装使用
如果你没有 Anaconda 或者只是想要另一种在 Mac 上安装 Graphviz 的方式,你可以使用自制软件。我以前写过一篇关于如何安装家酿软件并使用它将点文件转换成图像文件的文章这里(参见教程的家酿软件帮助可视化决策树部分)。
如何通过 Anaconda 在 Windows 上安装使用
这是我在 Windows 上更喜欢的方法。为了能够通过这种方法在您的 Windows 上安装 Graphviz,您首先需要安装 Anaconda(如果您没有安装 Anaconda,您可以在这里了解如何安装它)。
打开终端/命令提示符,输入下面的命令来安装 Graphviz。
conda install python-graphviz
之后,您应该能够使用下面的dot
命令将点文件转换成 png 文件。
dot -Tpng tree.dot -o tree.png
通过 conda 安装 Graphviz。这应该可以解决“点”不被识别为内部或外部命令、可操作程序或批处理文件的问题。
如何通过 Graphviz 可执行文件在 Windows 上安装和使用
如果你没有 Anaconda 或者只是想要在你的 Windows 上安装 Graphviz 的另一种方式,你可以使用下面的链接下载并安装它。
如果您不熟悉改变 PATH 变量,而想在命令行上使用 dot,我鼓励您使用其他方法。有许多 Stackoverflow 问题是基于这个特殊的问题。
如何使用在线转换器来可视化你的决策树
如果其他方法都失败了,或者你只是不想安装任何东西,你可以使用在线转换器。
在下图中,我用 Sublime Text 打开了文件(尽管有许多不同的程序可以打开/读取点文件),并复制了文件的内容。
复制点文件的内容
在下图中,我将点文件中的内容粘贴到在线转换器的左侧。然后,您可以选择想要的格式,然后将图像保存在屏幕右侧。
将可视化保存到计算机
请记住,有其他在线转换器可以帮助完成同样的任务。
如何可视化袋装树或随机森林中的单个决策树
关于袋装树木的免费预览视频,来自机器学习与 Scikit-Learn 课程
决策树的一个弱点是它们往往没有最好的预测准确性。这部分是因为高方差,这意味着训练数据中的不同分裂可以导致非常不同的树。上面的视频涵盖了袋装树,这是一个集合模型。这意味着使用多个学习算法来获得比单独从任何组成学习算法获得的预测性能更好的预测性能。在这种情况下,许多树相互保护,避免各自的错误。有趣的是,上面视频中的缩略图可能是袋装树或随机森林的示意图(另一个集合模型)。袋装树和随机森林模型如何工作的区别是另一个博客的主题,但是值得注意的是,对于这两个模型,我们都生长了 N 棵树,其中 N 是用户指定的决策树的数量。因此,在你拟合一个模型之后,看看组成你的模型的各个决策树会很好。
使用 Scikit-Learn 拟合随机森林模型
为了可视化单个决策树,我们首先需要使用 scikit-learn 拟合一个袋装树或随机森林模型(下面的代码适合一个随机森林模型)。
# Load the Breast Cancer (Diagnostic) Dataset
data = load_breast_cancer()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target# Arrange Data into Features Matrix and Target Vector
X = df.loc[:, df.columns != 'target']
y = df.loc[:, 'target'].values# Split the data into training and testing sets
X_train, X_test, Y_train, Y_test = train_test_split(X, y, random_state=0)# Random Forests in `scikit-learn` (with N = 100)
rf = RandomForestClassifier(n_estimators=100,
random_state=0)
rf.fit(X_train, Y_train)
可视化您的评估人员
现在,您可以从拟合的模型中查看所有单独的树。在本节中,我将使用 matplotlib 可视化所有决策树。
rf.estimators_
在这个例子中,注意我们有 100 个评估者。
现在,您可以将单棵树可视化。下面的代码可视化了第一个决策树。
fn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=800)
tree.plot_tree(rf.estimators_[0],
feature_names = fn,
class_names=cn,
filled = True);
fig.savefig('rf_individualtree.png')
请注意,随机森林和袋装树木中的单个树木正在长得更深
您可以尝试使用 matplotlib 子图来可视化尽可能多的树。下面的代码可视化了前 5 个决策树。我个人不喜欢这种方法,因为它更难阅读。
# This may not the best way to view each estimator as it is smallfn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (10,2), dpi=3000)for index in range(0, 5):
tree.plot_tree(rf.estimators_[index],
feature_names = fn,
class_names=cn,
filled = True,
ax = axes[index]);
axes[index].set_title('Estimator: ' + str(index), fontsize = 11)fig.savefig('rf_5trees.png')
为每个决策树(评估者)创建图像
请记住,如果出于某种原因,您需要所有评估者(决策树)的图像,您可以使用 my GitHub 上的代码来实现。如果你只是想看看随机森林模型的 100 个估值器中的每一个都适合本教程,而不需要运行代码,你可以看看下面的视频。
结束语
本教程讲述了如何使用 Graphviz 和 Matplotlib 可视化决策树。请注意,使用 Matplotlib 可视化决策树的方法是一种较新的方法,因此将来可能会有所改变或改进。Graphviz 目前更加灵活,因为你可以随时修改你的点文件,使它们在视觉上更具吸引力,就像我使用点语言所做的那样,甚至只是改变你的决策树的方向。我们没有谈到的一件事是如何使用 dtreeviz ,这是另一个可以可视化决策树的库。上面有一个很棒的帖子这里。
图片来自 dtreeviz 库制作。
我的下一个机器学习教程介绍了如何加速 Scikit-Learn 模型训练。如果您对本教程有任何问题或想法,请在下面的评论中或通过 Twitter 联系我们。
使用 ClinicalTrials.gov 可视化疾病关系
我喜欢可视化数据。如果要做到这一点,我必须经历一个叫做“生物医学文本处理”的地狱循环,那感觉就更好了。这里的情况也是如此。
众所周知,疾病之间的遗传和症状相似性允许将已知药物重新用于新的适应症。但是,如果相似性也可以从用于计划和进行临床试验的专家知识中发现呢?逻辑很简单: 如果在相同的两种疾病上试验了大量不同的药物,就说明这些疾病之间有很强的生物学联系。 让我们看看是不是真的。
我决定利用 ClinicalTrials.gov 的研究数据来可视化不同类型癌症之间的关系。后者有许多关于公共和私人支持的临床研究的有用信息,每个介入研究记录都包含参与者收到的适应症和干预措施(例如,药物或设备)。
如果我只需要从 ClinicalTrials.gov 下载数据,并根据普通药物将疾病配对,这本来是一件容易的事情,但问题是同一生物医学概念在数据库中可以有许多不同的名称。例如,乳腺癌可以写成“乳房肿瘤”或“乳房恶性肿瘤”。不幸的是,毒品也是如此。
为了解决这个问题,我使用了一个名为科学空间的 NLP 模型来查找临床试验记录中的疾病和药物术语,并从 UMLS 字典中获得它们的通用名称。在建立了癌症类型对并计算了每对上测试的常见药物的数量后,我用 Gephi 可视化了网络。
这里,节点代表癌症的类型,节点的大小与针对该类型癌症测试的药物数量成比例。节点之间的边表示在该边所连接的两种癌症上测试的药物。边缘越厚,颜色越浅,对这两种疾病进行测试的药物数量就越多。
有些关系非常明显,如下图所示。
但是该图也揭示了具有不同定位的癌症之间的联系。下面的例子表明,同样的药物经常在前列腺癌和乳腺癌上进行试验(多西他赛,仅举一例)。
对疾病关系的深入了解可以帮助科学家发现新的治疗方案。这就是为什么使用 NLP 技术和不同类型的可视化来充分利用历史临床研究数据是有意义的。
如果你有任何问题或者想要一个 gephi 文件来检查整个图表,请告诉我。
可视化电子商务调查数据
使用 Python 和 Pandas 从 SurveyMonkey 数据进行数据辩论和可视化
卢克·切瑟在 Unsplash 上的照片
我和 Dimitri Mahayana 博士在概率统计课上有一个期末项目,是关于分析印度尼西亚的电子商务调查数据的。每个学生从一些回答者那里收集数据,做出大约 1600 个回答。这项调查由 50 多个问题组成。有些问题是关于网上购物的个人数据和个人行为。
在这篇文章中,我使用的是 2019 年的数据。我将向您展示数据争论和可视化如何让我们对数据有更多的了解。我们将查看个人数据、行为数据以及它们之间的组合,以获取更多信息。
数据集解释
该调查使用 SurveyMonkey 进行数据收集,这是一个流行的调查平台。然而,SurveyMonkey 的原始数据变得非常混乱,因为有许多未命名的列和 NaN 值。因此,清理和分析数据需要一些时间。如下图所示,问题在列名中,选项在第一行。幸运的是,我们可以使用 Pandas,它对于数据争论来说是非常通用的。
来自 SurveyMonkey 的原始数据(图片由作者提供)
重新组织数据
数据争论不是一件容易的事情,尤其是当你处理大量数据的时候。也就是说,清理数据是令人疲惫的,因为你必须做一个迭代的过程,直到你得到你需要的。所以,我把我的数据重新整理成一个问题列表,我可以单独访问。例如,我可以键入“Q32”来访问第 32 个问题。这是数据重新排列后的样子。(你可以在我的 Github 上看到我的代码)
预处理数据(图片由作者提供)
您可以看到问题和子问题是如何移动到多索引列中的,所有答案都在它下面的行中。此外,您可能已经注意到,仍然有很多 NaN 值,因为 SurveyMonkey 将答案选项视为数字。假设有 2 个选项,A 和 B,当回答者选择 A 时,SurveyMonkey 用 1 填充 A 列,用 NaN 填充 B 列。我们将在以后可视化数据时处理这个问题。
因为这个调查中有很多问题,我只选取其中的一部分进行分析。想看看性别,职业,月收入等一些个人信息。除此之外,我将分析他们的行为,如首选网上购物平台,购买偏好等。之后,我将结合一些特性来获得关于数据的更多见解。
个人资料
首先,我想形象化一下按性别划分的回答者人数。下面的饼状图显示了受访者的性别分布。女性人数比男性略高约 8%。请注意,当我们可视化数据时,我们计算每一列的值,并忽略所有 NaN 值。
受访者的性别(图片由作者提供)
接下来,我们将职业分布可视化,以了解受访者的背景。下面的饼图显示,超过三分之二的受访者是学生。第二高的数字是私人雇员,然后是家庭主妇和其他职业。
受访者的职业(图片由作者提供)
最后,我们来看看他们的月收入,以印度尼西亚卢比计算。根据这个问题,我们有四个收入类别,即每月 200 万以下、200 万至 500 万之间、500 万至 1000 万以及 1000 万以上。柱状图表明,近 1000 名受访者的月收入低于 200 万卢比(相当于 135 美元左右)。
受访者的月收入范围(图片由作者提供)
行为数据
现在,我们继续研究行为数据。第一个是受访者用于网上购物的平台分布。柱状图表明他们中的大多数人使用 marketplace 进行网上购物。印度尼西亚有几个市场,例如 Tokopedia、Shopee 和 Bukalapak。接下来,在线交付(如 Gojek 和 Grab)是第二高的数字,有超过 800 名受访者。Instagram 的比例也很高,大约 25%(1600 人中有 400 人)的受访者使用它进行在线购物。
受访者使用的网购平台(图片由作者提供)
正如我们所知,他们中的大多数人使用 marketplace 进行在线购物,我想更深入地了解在线商店或 marketplace 的分布。下面的柱状图代表了有多少人选择不同的在线商店作为他们的最爱。大多数人选择 Gojek、Shopee 和 Tokopedia 作为他们最喜欢的三大在线平台,而在印度尼西亚,没有多少人使用 Elevenia、Blanja 和 Matahari Mall。
最喜欢的购物平台(图片由作者提供)
根据我的经验,我用 Gojek 主要是为了食物,用 Tokopedia 是为了其他东西。所以,我认为看看人们在购买某些物品时的偏好可能会很有趣。下面的柱状图表明了在购买某些商品时,从电脑到电话信用卡,有多少人更喜欢某种在线方式。对于每个类别,人们可以通过市场、官方在线商店、在线交付和社交媒体购买商品。
基于商品的首选网上购物方式(图片由作者提供)
总的来说,市场似乎是购买物品时最受欢迎的方式。大多数人在购买化妆品和美容、时尚、爱好、电子产品和电话信用时都会使用市场。然而,大约 75%的人在购买食品和饮料时选择在线交付。此外,在购买电脑和手机时,官方网上商店是最受欢迎的方式。就购买食品杂货而言,网上交货和市场似乎是最受欢迎的网上购物方式。
结合个人数据和行为数据
我们不仅可以查看每个特征,还可以组合两个(或更多)特征来获得更多的数据信息。下面的堆积条形图显示了各平台的男女比例。在 Instagram、Line 和 Whatsapp 上,女性的比例明显更高。相比之下,其他平台的男女数量并没有明显差异。
基于性别的首选平台(图片由作者提供)
最后但同样重要的是,我试图根据月收入将三个最受欢迎的在线商店结合起来。堆积条形图显示,月收入低于 200 万卢比的人在所有平台中占主导地位,因为大约 60%的受访者属于这一类别。尽管如此,我们仍然可以观察到每个平台的收入分布大致相同。我们可以有把握地说,基于这一数据,月收入不会严重影响购物平台的偏好。
基于商品的首选网上购物方式(图片由作者提供)
结论
数据争论和可视化并不总是一件有趣的事情,但它可以给我们更多关于数据的见解。在清理和可视化之后,我们有了一些关于个人和行为数据的信息。除此之外,组合要素还可以增加对数据的了解。
你可以在这里找到我这个项目的代码。
关于作者
Alif Ilham Madani 是一名有抱负的数据科学和机器学习爱好者,他热衷于从他人那里获得洞察力。他在印尼最顶尖的大学之一 万隆技术学院 主修电子工程。
如果你有任何要讨论的话题,你可以通过 LinkedIn 和 Twitter @_alifim 联系 Alif。
用 Hopfield 网络可视化情景记忆
一个可以学习模式的网络,给定部分学习的模式,该网络可以恢复整个学习的模式。
2018 年,我写了一篇文章描述神经模型及其与人工神经网络的关系。我参考的《T2》一书中的一章解释说,当一组神经元一起工作并形成网络时,某些特性可能会出现。书中有很多理论,但更吸引我的是一个可以模拟人类记忆如何工作的网络,叫做 Hopfield 网络【Hopfield,J.J. 1982】。
Hopfield 网络的前身是受限玻尔兹曼机(RBM)和多层感知器(MLP)。这是一个基于能量的自动联想记忆、循环和生物启发网络。
- 它是一个基于能量的网络,因为它使用能量函数并最小化能量来训练权值。想象一个神经元被一种外部脉冲能量触发,这种能量在整个网络中传播,激发所有其他连接的神经元。
- 它是一个自联想记忆网络,意思是训练好的网络可以在只给部分信息作为输入的情况下恢复全部记忆信息。例如,假设我们有一个由 10 个相互连接的神经元组成的网络。当我们用所谓的输入一个状态触发 8 个神经元时,网络会来回反应和计算,直到所有的神经元和神经元突触(神经元之间的连接)稳定。假设这个稳定状态叫做 S,但现在实际上网络被隐含地记忆了输入状态。之后,当我们触发一些神经元(与之前被触发的神经元相同,但不是全部,少于 8 个)时,网络将再次做出反应,直到所有神经元都稳定下来。而稳定的条件是先前的 8 个神经元都处于输入状态。
- 这是一个循环网络,意思是网络输出回到网络输入,网络形成一个有向图。在这种情况下,有向循环图。
- 由于海马 CA3 区的结构形成了与 Hopfield 网络相似的结构和行为,这是一个受生物启发的网络。
行为研究表明,CA3 支持空间快速一次性学习、以空间为成分的任意联想学习、模式完成、空间短期记忆和通过连续项目之间形成的联想进行的序列学习。[ Cutsuridis,V. &温内克斯,T 。2006]
与其他使用反向传播来学习权重的神经网络不同,Hopfield 网络使用 Hebb 的学习或 Hebbian 学习 Hebb,D.O. 1949 ,这也是一种生物启发的学习。希伯莱学习背后的想法是,如果两端的神经元积极相关,两个神经元(突触)之间的连接将会更强。在 Hopfield 网络中,神经元只有两种状态,激活和非激活。有时人们用 1 来量化激活状态,用 0 来量化非激活状态。有时他们也用 1 来量化激活状态,用-1 来量化非激活状态。
2019 年底,我抽出时间试图用 Hopfield 网络模拟和可视化记忆回忆是如何工作的。我做的模拟和可视化是一个网络应用程序,所以它是可访问的,所有人都可以尝试。关于 Hopfield 网络有很多解释,这是多余的(或者不是?)如果我在这里也解释一下。相反,我将开放这个 web 应用程序的源代码,让人们探索并获得实现的想法。这里的链接是这里的。
hopfield 网络可视化模拟 web app 截图
上图显示了用于可视化 Hopfield 网络的 web 应用程序的屏幕截图。有两个部分,Train
和Predict
。您可以在每个网格上绘制一些图案(最多 3 个),也可以选择提供的预定义图案。图案绘制完成后,可以点击Train 3 Patterns
按钮。完成后,网络已经记住了上面提供的 3 种模式。您可以通过在Predict
网格中绘制(不完整的)模式,来尝试形象化 Hopfield 网络如何回忆一个模式。下面是我们玩可视化时的 GIF。
Hopfield 网络如何工作的可视化
这篇文章和模拟希望启发一些仍然对 Hopfield 网络如何工作感到困惑的人。对于那些通过视觉更好地学习的人来说,这可能也是有用的。
除了 Hopfield Network,我还创建了一个 web 应用程序来模拟 Q-learning 是如何工作的。q 学习是强化学习算法的一种。你可以在这里查看。
可视化高斯消去法
行列式与矩阵中向量所跨越的平行六面体的体积有关,让我们来看看是怎么回事。
最近,我被要求制作一个视频,演示如何将一个矩阵转换成减少行梯队形式(RREF)揭示行列式。我知道这听起来难以置信,但它确实发生了。这篇文章的目的不是描述行列式的所有性质,也不是解释高斯消去法是如何工作的,有大量的其他资源,而是展示矩阵的几何如何与行列式相关,以及将矩阵转换成 RREF 揭示了几何对象的体积。首先,让我们考虑如何从几何角度来看矩阵。在整个讨论中,我将使用矩阵:
查看该矩阵的一种方式是将它看作行向量的集合,如图 1 所示。
该矩阵与图 2 中的平行四边形相关,其中行列式的绝对值是其体积。我们最终会证实这一点,但现在请相信我。
我们取行列式ad--BC= 1。这很好,你们大多数人已经知道如何计算一个行列式了,但是对矩阵进行行归约是如何实现的呢?当我们缩小矩阵时,我们开始将值集中在矩阵的对角线上。这基本上相当于将矢量与笛卡尔轴对齐。为了看到这一点,让我们朝着矩阵的简化行形式的方向前进一步。让我们从 A_2 中取. 1 × A_1 几次,看看会发生什么。
我们可以看到,底部向量逐渐与规范的 x,y 轴对齐!如果我们做同样的事情,但是从 A _ 1 中减去 A_2,我们将对齐另一个向量。这意味着查看缩减的行梯队形式的另一种方式是作为原始矩阵的轴对齐版本。这一点可以从下面的视频中看出。
高斯消去法的可视化
现在,我们可以很容易地计算这个缩小的平行四边形的体积,因为高度和底部尺寸只是对角线的条目,它们都是 1,意味着体积是 1。
为了验证原始平行四边形的体积是 1,我们可以使用标准的体积=底×高计算方法。在开始走这条路之前,我们需要考虑我们的基础和高度。我们将我们的底||A_1||,我们可以使用三角公式 sin (θ) =对边/斜边和点积 a⋅b = | | a | | | b | |cos(θ)来找到我们的高度。在这种情况下,我们的对立面是||A_2||现在我们有了计算体积所需的一切。
实际上是 1!这里我们已经验证了所有矩阵的行列式和体积都是相同的。我们还可以看到减少一个矩阵是如何改变基础向量的几何形状,使其与轴对齐,从而更容易解释。如果你想在更高的维度上看到同样的过程,我为 3× 3 矩阵制作了另一个视频。
**
3×3 矩阵上高斯消去法的可视化
最初发表于【http://www.nbertagnolli.com】*。*
用 Python 可视化地理空间数据
用于在自定义地图上可视化数据的开源工具和技术
在全球疫情中,许多人花了大量时间查看可视化数据的地图。重要数据。从事数据科学工作的人可能会发现使用地理空间数据的需求越来越多,尤其是在可视化方面。越来越需要了解有关地理区域的指标,分析供应链,制定考虑当地条件和规则的计划等。
本文展示了如何使用 Python 中两个流行的地理空间库:
第二个库特别有用,因为它建立在其他几个流行的地理空间库之上,简化了通常需要的编码。这些工具包括: cartopy ,它依次利用 Cython 、 NumPy 、 GEOS 、 Shapely 、 pyshp 、 PROJ 、六个,或许还有其他一些工具,比如 mapclassify ,这取决于您需要使用哪些功能。
注意:所有这些代码都可以在 Jupyter 的笔记本上找到,网址是github . com/DerwenAI/IBM _ DSC _ articles/blob/master/2020 _ 05/tutorial . ipynb
装置
安装应该很快。只需将以下三个命令行与 conda 一起使用:
注意:如果您在这些安装中遇到问题,还有其他方法可用。一些附加说明讨论了如何在 Linux 上构建这些依赖项
github . com/DerwenAI/IBM _ DSC _ articles/blob/master/2020 _ 05/install . MD
术语
使用地理空间数据的部分学习曲线是使用了大量的特殊术语。这里有一张你可能会遇到的术语的便签:
- shapefile : 用于表示地图上项目的数据文件格式
- 几何 : 用于表示点、多边形和其他几何形状或位置的向量(通常是数据帧中的一列),通常表示为 熟知文本【WKT】
- 多边形:一个区域
- 点:具体位置
- 底图 : 地图的背景设置,如加州的县界
- 投影 : 由于地球是一个三维球体,选择了一种如何将一个区域展平到 2D 地图的方法,使用一些 坐标参考系统 (CRS)
- 色彩图 : 选择渲染数据的调色板,用 cmap 参数选择
- 过度绘制:将几块不同的图堆叠在一起
- choropleth : 用不同的色调给多边形上色,作为一种表现数据等级的方式
- 内核密度估计 : 一种数据平滑技术(KDE ),创建阴影轮廓来表示数据级别
- 图表 : 扭曲多边形的相对面积来表示数据等级
- 分位数 : 将宁滨数据值分成指定数量的大小相等的组
- voronoi 图 : 将一个区域划分为多边形,使得每个多边形恰好包含一个生成点,并且给定多边形中的每个点都比任何其他点更靠近其生成点;也称为狄利克雷镶嵌
好了,这些术语定义在这里供参考…让我们开始吧!
获取一些数据
我们需要获得一些数据用于这些例子。虽然 geoplot 包含大量样本数据集的 geojson 格式,但它有助于了解如何加载您自己的数据。
首先,让我们从美国人口普查局 TIGER 数据库中获取一个 shapefile 来可视化州边界,我们将把它放入一个“maps”子目录中:
当然,像这样的 shapefiles 有很多开放的数据源。以下是一些例子:
接下来,让我们获取一些要绘制的数据,在这种情况下,我们将把美国 2018 年的人口估计值放入“data”子目录中:
开始绘图
要在 Python 中导入所需的包:
如果你在一个 Jupyter 笔记本上工作,确保运行下面的“魔法”命令来正确渲染图形:
%matplotlib inline
然后加载 shapefile 并查看其部分内容:
注意“几何”栏,它指定了多边形的形状。
现在,我们将把美国人口普查数据作为一个熊猫数据框架加载,并查看其中的一部分:
接下来,我们将 shapefile 与人口数据合并,加入州名:
很好,现在数据已经准备好绘制形状了。我们将按名称指定加利福尼亚:
或者,我们可以通过从 geoplot 加载一个样本数据集来创建一个地理数据框(一个包含地理空间数据的数据框),在本例中是州边界的多边形:
然后画一张美国各州的地图:
让我们加载另一个样本数据集,在本例中是美国城市:
然后以点的形式标出美国大陆每个城市的位置:
合成这两个,我们将使用超画来显示美国大陆的城市和州。请注意,州多边形的“ax”变量如何提供一个轴,我们在该轴上绘制城市:
这看起来有点夸张,所以让我们调整投影以使用艾伯斯等面积圆锥投影:
好吧,这样更好!同样,由于地球是一个 3D 球体,投影是一种如何使用某个坐标参考系统 (CRS)将一个区域展平到 2D 地图中的方法。geoplot 库使我们可以方便地使用任意数量的投影— 艾伯斯等积投影是一个符合库文档的选择。你也可以玩一些你可能还记得的小学游戏,比如“墨卡托 gcrs”。墨卡托()或它的现代变体,如
gcrs . web 墨卡托()`投影。和他们一起玩吧,让我们知道你更喜欢哪一个,为什么!
表示数据
现在让我们比较几种不同的可视化地理空间数据的方法。首先,我们将根据城市的海拔高度更改城市标绘点的色调,并添加一个图例,以便人们解读不同色调的含义。参数列表开始变得很长,所以我们将在不同的行中指定参数:
我们也可以使用每个标绘点的刻度来表示另一个尺寸。在这种情况下,城市点的比例基于其高程:
使用 choropleth 我们使用不同的色调给多边形着色,以表示数据的维度:
一种被称为核密度估计 ( KDE )的数据平滑技术创建等高线来表示数据的维度。在这种情况下,我们将放大查看纽约市各区的交通碰撞:
让我们缩小范围,在全美国的主要人口中心尝试 KDE:
下一节将介绍如何处理与区域(多边形)相关的数据。我们将加载一个关于美国各州肥胖率的数据集:
使用连接将其转换为地理数据框架。请注意这是如何添加所需的“几何图形”列的:
现在我们可以使用这些数据来绘制一个图表,它可以增长或收缩多边形来表示一个维度的数据——在本例中,是每个州的肥胖率:
简化数据可视化的一个好方法是将数据宁滨成分位数。这些是大小相等的组,在这种情况下,10 个分位数代表海拔:
这里,我们将高程分为 10 个分位数,每个分位数大约有 375 个值。现在让我们给每个分位数分配一个不同的色调,加上一个图例来解释它们:
注意色彩图是如何被更改为“inferno_r”设置的。
接下来,让我们为可以忽略的典型警告添加一个过滤器:
下一个例子使用了一个 voronoi 图,根据数据的维度计算多边形面积。每个多边形以一个生成点为中心,这样多边形中的每个位置都比其他任何位置更靠近它的生成点。当您想要检查一列数据,以查看它是否有任何地理空间相关性时,这很有帮助。
在以下示例中,我们将绘制澳大利亚墨尔本小学的位置,并使用 voronoi 图显示它们的集中位置:
让我们构建一个美国城市海拔的 voronoi 图。这是一种数据平滑技术,因为高程是针对点的,但我们将跨区域“平滑”这些值:
可视化新冠肺炎数据
接下来,让我们从华盛顿大学 IHME 中心下载一些新冠肺炎的数据。根据需要更改解压缩目录的名称(下载日期):
然后加载数据集:
我们将过滤行,将此可视化限于 2020 年地球日(4 月 22 日):
现在将州名与之前的美国大陆数据集合并:
为“每百万死亡人数”添加一个计算列:
然后为了形象化这些数据,让我们画出每个州“每百万死亡人数”的曲线图,再画出每个城市的人口:
请注意,通过重复使用相同的“ax”变量,choropleth 是如何与点绘图过度绘制的。点绘图规定了一个“zorder”参数(哪一个“层”)和一个“alpha”参数(如何“半透明”),以使过度绘图更可读。第一个图中的“figsize”参数修改图的整体大小。
这幅图像显示了美国人口集中的地方风险更大:纽约市地区、路易斯安那州、伊利诺伊州、密歇根州、乔治亚州等。这也是 2020 年地球日当天美国关于新冠肺炎的新闻头条的焦点。
动画地图
接下来,让我们准备动画这个可视化。我们将定义一个函数来可视化给定日期的数据:
然后定义一个日期范围:
遍历这些日期,为每个日期创建一个可视化结果,并保存到一个文件中:
使用“imageio”以 2 帧/秒的速度将这些单独的图形拼接成动画 GIF:
这是最终动画的视频:
注意:还有一个 matplotlib.animation API,我们可以用它来代替 imageio。前者在最近的版本中有一些 bug,而后者有更多的通用用途。
同样,所有这些代码都可以在 Jupyter 笔记本上找到,网址是github . com/DerwenAI/IBM _ DSC _ articles/blob/master/2020 _ 05/tutorial . ipynb
如果你想尝试扩展这个可视化的例子,在 https://covidtracking.com/data 的有很多相关的数据集
合著: 威廉·罗伯茨
最初发表在 IBM 数据科学社区博客上,地址:https://ibm.biz/paco-geospatial
使用优步的 Kepler.gl 可视化地理空间数据
了解事件发生的方式、地点和时间。
最终产品是一张按人口普查区域划分的拼车出行地图
Kepler.gl 是优步对地理空间分析的回答。它于 2019 年开源,以最终用户为中心,创建了一个“拖放”系统,能够在瞬间分析数百万个点。幸运的是,对于我们这些喜欢在 Jupyter 笔记本上工作的人来说,他们已经使用 ipywidgets 创建了一个扩展,允许用户在我们的日常数据科学工作流中创建地图。继续阅读教程,轻松开始创建自己的地图!
如果你想在笔记本文件中跟随,继续前进,并在这里叉我的 github repo-found。你也可以在下面玩我们最终地图的现场版本:
[## 芝加哥的拼车旅行- kepler.gl
www.dancorley.com](https://dancorley.com/chicago.html)
套餐
首先,我们需要安装将要使用的软件包;GeoPandas、keplergl 和 sodapy。这些可以很容易地安装,然后导入到我们的笔记本电脑与每个人都喜欢的包管理系统,匹普!
安装/导入软件包
收集数据
我们今天要看的数据可以很容易地通过芝加哥市的数据门户网站获得,其中包括从圣诞树回收地点到当前政府雇员工资的各种数据。很多数据,但今天我们将只关注两个数据集——交通网络提供商——Trips和人口普查区。
该城市的数据门户有一个很棒的用户界面,可以方便地导出到用户选择的文件类型。csv,。xml 等。),但是在撰写本文时,我们的目标数据集已经超过 1.29 亿行。为了节省时间(和本地存储空间),谢天谢地,他们允许通过 Socrata 进行类似 SQL 的查询。我们之前安装的包(sodapy)将允许我们轻松地对这个数据集进行请求。同样值得注意的是,我们可以匿名访问这些数据,但您将受到限制,为了绕过,您可以获得一个可选的授权令牌-请参见此处的
让我们继续收集我们的旅行数据。以下要点将带领我们创建一个 Socrata 查询,返回由 2019 年 3 月的旅行次数组成的 geojson(按点分组)(纬度/经度坐标),并实例化地理数据框架。然后我们只用三行代码就可以创建我们的第一张开普勒地图……就这么简单!
函数来调用旅行数据,并创建我们的第一个地图
该地图是交互式的,允许用户轻松缩放、平移和滚动点来查看数据。还可以根据与每个点相关联的乘坐次数来定制点,以改变颜色或大小,从而更容易摄取。这可能是本文的结尾,但开普勒不仅仅是点。输入人口普查区域多边形:
调用芝加哥人口普查区域数据集的函数
将图层添加到我们创建的当前地图中,可以让我们看到每个人口普查区域的边界,以及我们之前点的位置。现在,因为这是两个不同的数据集,我们不能根据另一个来操纵每个数据集的属性。借助 GeoPandas 的几何操作,这一点很容易克服,它允许我们检查一个点是否包含在一个区域内,并返回乘坐的总次数:
有了这张地图,我们为我们的最终用户添加了更多的数据,我在最后几张图片中提到过。根据客流量级别创建区域的填充颜色和高度使得从我们的数据中收集见解变得更加简单。
这个看起来很棒,但是还没有完成。我们仍然需要添加等式的最后一部分;时间。下一个代码块运行了我们在这篇文章中完成的查询,并添加了一个 datetime 元素,创建了每天每个区域的乘车次数总和:
现在,我们如何分享它,以便其他人可以享受??当然 Kepler.gl 的 python 包也有一个简单的方法来做这件事!
保存文件以便于部署!
如果你已经走了这么远,感谢你加入我的地理空间之旅!我们已经通过查询芝加哥的开放数据来收集数据,在 Kepler.gl 中使用点和多边形创建地图,以及使用 GeoPandas 进行几何操作。
如果你对方法论有任何问题/意见,欢迎在评论栏或我的收件箱——hello@dancorley.com 里开始对话
用 kepler.gl 可视化地理空间电子商务销售数据
在几分钟内实现优雅的数据可视化
(最初发布于https://www . dattivo . com/visualizing-geospatial-e-commerce-sales-data-with-Kepler-GL/)
任务背景
作为内部研究和发现工作的一部分,我们希望评估可视化数据分析工具的可用性和功能,以检查我们的一个客户举办的活动的在线门票销售数据集。我们的数据集包括在线购买活动门票的客户的位置,以及提前多长时间购买活动门票。在这种情况下,像 kepler.gl 这样的数据可视化工具非常适合快速生成任何观察者都能轻松理解的数据视图。
Kepler.gl 是由优步开发的开源地理空间数据分析和可视化工具。Kepler.gl 可以直接集成到基于 React 的 web 应用程序或 Jupyter 笔记本中。在这个练习中,我们将在 https://kepler.gl/demo使用“演示应用程序”。
请注意,虽然这些可视化效果是由现实生活中的事件激发的,但实际的可视化效果只是为了演示 kepler.gl 而放在一起的。
地理编码电子商务订单
在对订单数据集执行任何地理空间分析之前,我们首先需要通过为每个订单分配一个纬度和经度来对附加到订单的地址进行地理编码。对于我们的数据集,一个包含客户订单和相关细节的 MySQL 数据库,我们将基于客户账单地址的邮政编码来完成这项工作。许多提供商提供不同价位和请求限制的地理编码 API,但在本练习中,我们将使用 Google 的地理编码 API。为了获得最佳结果(以及数据集的一般可读性),我们通过将字母转换为大写并过滤掉任何空格、连字符或其他非字母数字字符来“规范化”邮政编码。
将初始数据集导出到 CSV 文件后,下一步是检索地理编码数据。这是使用 Python 脚本完成的,但当然也可以使用任何允许您发出 HTTP 请求和/或写入 CSV 的语言来完成。首先,我们导入必要的库,并将地理编码数据加载到 Pandas DataFrame 对象中:
熊猫⁴是一个非常强大的 Python 开源库,具有许多数据操作和分析的特性。它可以快速有效地读写串行数据或 DataFrame 对象中的数据,处理 CSV、Excel 或文本文件,以及数据库导出。接下来,我们将开始构建邮政编码“目录”的过程,将邮政编码映射到其纬度和经度值。条目的示例可能是:[N6J3T9,43.3326543,-79.4324534]。我们将使用它来修饰我们当前的数据集,但也保留它以备将来使用,以便我们可以在将来将它应用于任何重复的邮政编码,而不必进行多余的 API 调用。为了向 Google 的地理编码 API 发出这些请求,我们使用 Python 的开源 Requests ⁵库,它提供了发出 HTTP 请求的简单函数,来创建一个会话对象来发出我们的多个请求。我们还使用了地理编码器 ⁶库,它带有简单的功能,可以向许多不同的提供商发出地理编码 API 请求,包括 Google、Bing、ArcGIS 等等。
这段代码将遍历数据集中每个唯一的邮政编码,并请求获取其大概的经度和纬度。我们将把响应保存到我们的目录文件中,并输出到控制台,这样我们仍然可以把它复制到一个文件中,以防脚本运行时出现问题。如果脚本由于任何原因中断,并且我们最终只得到部分地理编码数据,我们可以简单地重复该过程,过滤掉任何已经地理编码的值,并将结果文件合并在一起。
一旦我们有了地理编码数据,我们就可以用 Pandas 来修饰我们最初的客户数据导出。
准备好数据后,我们现在准备将其导入 kepler.gl。
在 kepler.gl 中可视化数据
将数据加载到 kepler.gl 很简单,https://kepler.gl/demo的演示应用程序提供了一种直观的方式来立即在地图上查看数据。页面首次加载时,会提示您上传数据。请注意,kepler.gl 演示在您的浏览器中运行,因此任何上传的数据都不会发送到他们的服务器,而是保留在您的本地计算机上。
基于数据集中的列,kepler.gl 将尝试自动决定如何呈现数据。如果您的数据集包含标记为“lat”和“lng”的列,kepler.gl 将自动识别它们,并使用这些字段将您的数据放置在地图上。
定义数据图层时,也可以手动指定用于纬度和经度的列。单击图层名称旁边的符号查看设置,然后单击“基本”旁边的省略号选择要用于点位置的列。
当前状态下的地图向我们显示了每张已购买机票的位置,但是 kepler.gl 提供了不同的图层类型,我们可以使用它们来聚合数据。在这个练习中,我们将使用一个 Hexbin 层,它将数据点聚合成一个指定半径(默认为 1 公里)的六边形。
基于指定的度量,将选定光谱上的颜色分配给每个六邻体。默认情况下,这基于点计数,但可以更改为数据集中的任何列。还可以配置使用的色标和光谱中的级数。
如果我们通过切换右上角的立方体图标从 2D 地图切换到 3D 地图,我们可以根据数据集中的另一个字段为我们的 hexbins 分配一个高度值。在这个例子中,我们用高度表示每个聚类的点数(在我们的例子中,它表示购买的门票数量),用颜色表示在活动日期前多少天购买的门票。还可以应用高程比例,以便更容易地识别数据集中的极值。
从视觉上看,我们可以看到,虽然有客户会提前购买全省的门票,但那些远离多伦多市中心的客户似乎更有可能在接近活动日期时购买(其中较暗的数据点表示门票是在活动当天购买的)。这是有意义的,因为天气等变量会影响客户的决策过程。
接下来,我们可以基于数据集的任何列对数据集应用过滤器。单击漏斗图标切换到过滤器选项卡,然后单击添加过滤器并选择一列。
对于数值或“时间”数据类型(例如,格式化为日期和时间,如 2019–12–25 12:00:00),您可以通过单击并拖动显示的范围来选择要过滤的列的最小值、最大值和范围值。按时间值过滤时,您还可以单击播放按钮来显示地图数据的延时动画(您需要单击并拖动屏幕底部的日期过滤间隔的边缘,这样才有用)。对于字符串或日期等其他数据类型,可以选择特定的值进行筛选。
如果我们想要比较多个数据集之间的数据(例如,多年的活动销售数据),我们可以简单地在 kepler.gl 中向我们的可视化添加另一个图层。此时,从默认的“点”标签的图层选项卡中重命名您的图层很有帮助,以便更容易地在菜单和图例中区分它们。
如果您愿意,可以在同一个地图视图上显示多个图层,但是如果我们像本例中一样尝试在相似的数据集之间进行直接比较,在各自的地图上查看每个数据集会更有意义。我们可以通过点击右上角的图标切换到双地图视图,并切换每个视图中可见的图层。请注意,滤镜是分别应用于每一层的。
结论
如前所述,数据集的初始地理编码数据检索和修饰可以通过多种方法完成,但我们选择使用提到的 Python 库,以评估它们在未来项目中的效用。这个练习没有深入到 Pandas 的功能中,但是我们鼓励您深入了解它,看看它是否适合您的需要,因为它提供了各种各样的功能。
Kepler.gl 允许非常快速地生成专业外观的数据可视化,并提供许多不同类型的数据可视化。除了这里演示的点和六边形以外,kepler.gl 的可用数据图层还包括用于聚合分析的热点图和聚类、用于可视化移动的弧和线,以及用于显示复杂路径或多边形(如出行路线)的 GeoJSON 图层。如果我们将来需要执行这些类型的分析,kepler.gl 将是一个显而易见的选择。生成的视图在第一次呈现时有一个明确的“哇”的因素,并且可以根据被调查的数据提供清晰的、可操作的见解
Kepler.gl 也是一个 React 库,可以集成到现有的前端项目中。对于未来的工作,我们可能会研究实现在嵌入管理界面的 kepler.gl 地图中查看最近销售数据子集的能力。
需要注意的一点是:数据点的颜色比例和高度/大小会根据当前正在检查的数据子集而动态变化。这意味着,当从一个视图到另一个视图比较数据时,您必须关注图例,以确保您得出的结论是准确的。例如,来自不同过滤数据集的两个点可能具有相同的颜色,但是为其分配特定颜色的值的范围在视图之间可能不同(例如,在一个视图中,值小于 16.2 的点可能显示为红色,而在另一个视图中,阈值为 12.0)。遗憾的是,在执行时间序列回放或使用双地图视图时,目前似乎没有标准化该比例的方法。
参考文献
[1] 开普勒. gl
[2] S. He,从美丽的地图到可行的见解:介绍开普勒. gl,优步的开源地理空间工具箱 (2018)
[4] 熊猫— Python 数据分析库
[5] K. Reitz,请求:人类 HTTP 请求 2.23.0 文档
[6] D. Carriere, Geocoder:简单、一致— geocoder 1.38.1 文档
使用 leav 可视化新冠肺炎的全球地位
这个博客是关于根据国家对抗冠状病毒的表现将国家分为不同的组,并最终可视化地理结果。
2019 年全球冠状病毒状况
冠状病毒已经影响了我们每一个人的生活。随着世界大部分地区陷入经济活动萎缩的困境,我们每个人都想知道我们在遏制疫情方面做得有多好,它何时会最终结束?
虽然预测疫情的终结是一个百万美元的问题,也是另一个博客的主题,但这篇文章是关于理解和可视化所有国家如何抑制其蔓延。在这篇博客中,我们的目的是根据确诊病例、死亡和患者康复数据将国家分类,然后在地图上显示出来。
方法
我们将使用 PPDAC 方法来解决这个问题。我们将从讨论我们的问题开始,然后计划解决它。一旦我们弄清楚了这一点,下一步就是收集必要的数据并对其进行分析。最后,我们将提出我们的结论并交流我们的结果。
解决数据科学问题的 PPDAC 方法
我们会一步一步地走完每一步。
问题
我们试图解决的问题是将不同的国家分为不同的类别,分别命名为“低风险”、“高风险”、“稳定”和“复苏”。在这一点上,我们只能模糊地定义这些群体。如果新冠肺炎病毒的传播正在增加,增长仍然是线性的,但存在指数增长的普遍风险,我们可以将任何国家标为“低风险”。使用类似的标准,“高风险”国家是 COVID 病例呈指数增长的国家。“稳定”阶段可以定义为病例减少和指数增长停止的情况。最后,恢复是指病例非常少,而且该国正在走向彻底根除疫情。由于新病例不能作为确定任何国家状况的唯一标准,我们需要有类似的报告死亡和成功康复的标准。
一旦我们对我们的标签有了一个模糊的理解,我们就需要制定一个标准,如何从一个包含新病例、死亡和康复的数据集转移到一个包含我们的标签的数据集。为此,我们必须后退一步,理解疫情图。
疫情图
我们现在已经看够了这个图表,它解释了使曲线变平的所有智慧,这样医疗保健系统就不会压力过大,最迫切需要医疗护理的人可以得到最多的医疗护理。但是我们可以比这挖得更深一点。正如我们从图表中看到的,病例数开始或多或少地呈线性增长,之后呈指数增长。指数增长达到峰值,之后开始下降。这是任何流行病的一般趋势,它达到最大值,趋势开始逆转。这一点被称为病毒的死亡,因为在这一点上,要么所有的人都被感染,人群中没有更多的人被感染,导致病毒死亡,要么在另一种情况下,采取措施,如社会距离,锁定,这拒绝了新的宿主病毒导致其死亡,或者我们可能有最终的救世主,一种疫苗基本上杀死它。
有了这样的理解,我们现在可以看看另一个有趣的特征,在特定点的导数或变化率。这定义了每天新病例的增加或减少。请看下图:
正如我们所见,导数展示了四种特定的行为。第一个,当变化率是正的和线性的,在这个点之后它变成指数正的。在达到最高点之后,梯度为零,它开始变成指数负值,并最终变成线性负值。衍生产品的所有这四种不同行为都可以与我们的标签联系起来,即低风险、高风险、稳定和恢复。这个想法可以用下图来表达:
哇,我们这里有很多信息,我们还有一段路要走。顺便说一下,如果你有兴趣了解我是如何制作这些图表的,请查看这里的。
现在,我们已经定义了衍生品如何帮助我们确定任何特定国家的地位或标签,故事中还有另一个陷阱。我们注意到,即使该国处于稳定阶段,回到低风险或高风险阶段,病例数量仍可能增加。为了迎合这一点,我们需要以某种方式检查情况是在变好还是在变坏。
我们可以通过将任何特定一天的导数与 14 天的平均导数(14AVd)进行比较来做到这一点。如果我们用特定一天的导数减去 14AVd,值为负,这意味着特定一天的导数高于 14 天的平均值,这意味着情况正在变得更糟。反之亦然,如果答案是肯定的,这意味着情况正在好转,疾病正在走向根除。
现在,我们可以将上述基本原理应用于确诊病例、死亡和康复的所有数据集。一旦完成,我们就可以应用 K-means 算法来寻找组的聚类。由于我们对可视化和简单理解 k-means 结果更感兴趣,所以我们需要将我们的维度从新增病例、死亡和恢复的三个维度降低到两个信号。
新病例信号对确定任何国家的情况都至关重要。我们称这个信号为“强度信号”。它决定了病毒在特定国家传播的快慢。然而,死亡和康复的其他数据集是疾病的两个结果。要么,任何人都可能死于这种疾病,要么康复。从今以后,死亡和康复可以结合起来产生一个冲击信号。我们可以从死亡中减去康复。如果结果是负数,这意味着死亡人数大于复苏人数,情况正在变得更糟,而在其他情况下,结果是积极的,这意味着复苏正在增加,情况正在好转。
看看下面的象限,它们有意义吗?
据此,我们更新了不同标签的定义,建立了从新病例、死亡和康复的数据集到特定国家的标签或标记的必要联系。
当我们进行编码时,我们将把这种方法称为“algo”。没有特别的理由称之为“算法”。只是我找不到更好的了,😄
最后,我们可以将“强度”和“影响”这两个信号输入 k-means 算法,以生成组的聚类,从而确定标签。
Huff,如果你正在跟随,拍拍你的背,为你欢呼。
计划
我们将使用由 HDX 编辑的数据集,并将上述基本原理应用于熊猫。数据集可以在这里找到。该数据集包含每个国家每日新增确诊病例、死亡和恢复的数量,并且几乎每天更新。
一旦我们完成编码,我们只需要更新数据集,每个国家的新标签将自动计算。
数据
现在是时候用代码弄脏我们的手了。我们将首先从 HDX 网站这里下载新确诊病例、死亡和康复的所有相关数据集,并将它们放在一个名为“数据集”的文件夹中。
现在需要一些预处理。很少有国家有一个以上的列与自己相关联,像澳大利亚有八个相关联的列,每个列代表一个州。我们需要将所有这些列相加,以获得整个国家的数据。
接下来,我们需要将每个数据集作为一个熊猫数据框,提取最后 14 列数据,计算导数,并使用它来计算所有国家的 14 天平均值。
完整的 python 实现以及代码解释可以在这里找到。至此,我们已经完成了数据预处理练习,可以继续前进了。
分析和结论
我们已经走得足够远,可以对我们的数据实现 k 均值。这个想法是在两个强度和冲击信号之间应用 k-means 聚类,看看我们是否能找到一些足够接近我们早先开发的基本原理的聚类。KNN 的 python 实现可以在这里找到。一旦我们运行这个 python 脚本,我们最终会得到如下所示的聚类图:
现在,我们需要根据我们之前开发的原理,查看哪个集群可以被标记为“低风险”、“高风险”、“稳定”和“恢复”。正如我们所看到的,大部分国家都被困在原点附近,只有少数国家在他们的探索中做得特别好或特别差。然而,正如我们所看到的,集群并没有像我们预期的那样形成。我们已经结束了左边的三个集群,标记出可以被称为低、中、高风险区域的区域,而例外的是没有国家处于复苏阶段,描绘了一幅令人沮丧且与事实相反的画面。
我们数据集的主要问题是离群值问题,这使得聚类过程变得困难。正如我们所看到的,在图表的右边有一个国家,做得非常好。但是它使我们无法进行聚类工作,因为它被当作自己的一个聚类。为了解决数据中的这些问题,我们可以尝试使用一个简单的 if-else 函数对我们之前的基本原理进行编码,并查看其结果。
对右边的国家很好奇。点击查看。
我们之前开发的基本原理的一个简单 Python 实现可以在这里找到。生成了下图。
是啊,这还差不多。按照我们的基本原理准确地描绘我们的世界。然而,上面提到的右边的异常值在这里被忽略了,以强调数据集中的主要聚类。分配状态标签后,我们可以进入项目的最后一个也是最有趣的部分,地理数据可视化。
我们将使用 Geopandas 和 leav 来可视化我们的数据。安装 geopandas 有时会很棘手。如果您正在任何阶段挣扎,请看看如何创建 anaconda 的环境来管理依赖关系。
一旦我们的环境创建完成,Geopandas 和 Folium 启动并运行,我们就可以在这里实现代码来生成我们对抗冠状病毒的性能的全局可视化。
请使用这个链接查看你所在国家的状态。
我们终于看到了新冠肺炎的世界地位。结果更新至 2020 年 4 月 11 日。想要可视化当前状态吗?只需锥形这个储存库,更改文件夹数据集中的文件,并执行 jupyter notebook 这里的。
在最后,一个直方图显示了每种状态下的国家数量,可以帮助我们进一步了解世界的状态。
正如我们可以想象的那样,世界上最大的一部分陷入了“低风险”,稳定和复苏的频率越来越低。对于许多国家正在复苏的世界来说,这仍然是一线希望。低风险和高风险的最高频率强调了仍然坚持自我隔离和社会距离的重要性。
数据可视化完成后,讨论我们的数据和算法的缺点是很重要的。所使用的强度信号并不是一个很强的方向指示器,这个国家正在前进。几个病例的随机出现可以极大地影响一个国家的地位。另一个主要争论点是缺少测试数据。怎么强调都不为过,任何国家的地位都可能是虚假的,因为它没有积极地测试其公民。事实上,病毒的传播速度可能比想象的要快得多。
最后,我想说,我绝不是流行病方面的专家,但是如果有人碰巧读到这篇文章,请随时向我提出你的建议。我们可以一起使这些数据更准确,更能代表地面的实际情况。同时,这里的是可视化 web 应用的链接,玩一玩,乐一乐。
特别感谢艾哈迈德·赛义德对这个项目的帮助。