TowardsDataScience 博客中文翻译 2016~2018(七十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

[ CVPR /论文摘要]再谈显著目标检测:多个显著目标的同时检测、排序和分类

原文:https://towardsdatascience.com/cvpr-paper-summary-revisiting-salient-object-detection-simultaneous-detection-ranking-and-b759a9226d63?source=collection_archive---------13-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GIF from this website

请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。

Paper from this website

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

许多研究人员提出了显著对象检测任务的解决方案,然而本文的作者认为,迄今为止大多数工作都解决了一个相对不适定的问题。具体来说,当有多个观察者时,对于什么构成显著物体没有普遍的一致意见。(这意味着一些对象比其他对象排名更突出,并且在对象之间存在排名。).本文的作者提出了一种方法/数据集,其性能优于传统的和新提出的工作。

简介

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大多数显著目标检测任务考虑单个显著目标或多个显著目标,但是它们没有考虑不同的人可以将一些目标排列得比其他目标更显著。(此外,一些物体可以被认为更普遍地突出。因此,在本文中,作者更广泛地考虑了显著对象检测的问题,其包括检测图像中的所有显著区域,并通过向不同的显著区域分配置信度来解决观察者之间的可变性。(如上所述,模型不仅检测图像中的所有显著对象,还对它们进行排序。).

显著物体检测/替换

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卷积神经网络提高了许多涉及图像的任务的性能标准。一些 CNN 使用超像素方法来实现显著对象检测。其他方法包括使用快捷连接来聚合多级特征。本文的作者通过应用新的机制来控制网络中的信息流,同时重要的是包括一个隐含携带确定相对显著性所必需的信息的堆叠策略,来使用逐级细化。除了分割之外,最近的工作还包括对图像中的显著对象进行子分类,这涉及对图像中的显著对象进行计数。

提议的网络架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于粗略预测的前馈网络

对于这一部分,作者使用 ResNet-101 作为编码网络,生成特征图。此外,为了用自上而下的细化网络增强编码器网络的主干,作者首先附加一个额外的卷积层以获得嵌套的相对显著性堆栈(NRSS),然后附加堆栈卷积模块(SCM)以计算每个像素的粗略水平显著性分数。(作者对某些网络使用了 atrous 金字塔池。)

分阶段细化网络

大多数现有的工作共享一个公共的逐级解码结构来恢复每个像素的分类。这是因为尽管 CNN 中的最深层具有最丰富的可能特征表示,但是仅依靠解码阶段的卷积和解卷积来恢复丢失的信息可能会降低预测的质量。受此启发,作者提出了一种基于多级融合的细化网络,通过将初始粗略表示与在早期层表示的更精细特征相结合,来恢复解码阶段丢失的上下文信息。(该单元恢复丢失的空间信息,并对图像中呈现的对象的显著性进行分级。)

多级显著图融合/地面真实的堆叠表示

为了组合不同 SCM 做出的不同预测,作者在网络末端添加了一个融合层,将不同阶段的预测显著图连接起来。此外,作者生成了一组对应于不同显著性级别(由观察者间协议定义)的堆叠地面实况图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显著物体分群网络

为了生成给定图像的置信度得分,作者再次使用 ResNet-101 作为基础模型,但去掉了最后一层。(并且已经附加了完全连接的网络以生成存在于输入图像中的 0、1、2、3 和 4+个显著对象的置信度得分,随后是另一个完全连接的层导致生成每个类别的最终置信度得分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,作者为 Pascal-S 数据集创建了子分类基础事实,如上所述,可以看到图像中显著对象数量的分布。

实验

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者添加了多种不同的网络体系结构,它们是……
RSDNet(expanded ResNet-101,NRSS,SCM),RSDNet-A(同 RSDNet 但 gt 标签缩放 1000,使网络学习更多对比度。)、RSDNet-B (atrous 金字塔池模块)、RSDNet-C (RSDNet-B +地面实况缩放)、RSDNet-R(具有逐级秩感知细化单元的 RSDNet+多级显著图融合)。).

数据集和评估指标

作者使用了 PASCAL 的数据集,并将图像分成两个子集,425 个用于训练,425 个用于测试。使用的指标包括精确召回(PR)曲线、F-measure(沿曲线的最大值)、ROC 曲线下面积(AUC)和平均绝对误差(MAE)。此外,作者还引入了显著对象排序(SOR)分数来评估显著对象的排序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上表可以明显看出,RSDNet-R 优于许多现有技术方法。值得注意的是,尽管作者的模型是在 Pascal-S 数据的子集上训练的,但它优于其他也利用大规模显著性数据集的算法。(即使没有 CRF)。最后一列(SOR)分数也是作者发明的新度量分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,作者的方法能够生成最接近地面真实遮罩的显著图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即使在其他任务上,如显著对象子分类,作者的方法也优于现有的方法。(需要注意的是,没有很多其他基线可以与这个分数进行比较。).

检查嵌套的相对显著性堆栈

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当作者对嵌套的相对显著性堆栈进行主成分分析,并以 RGB 图像的形式可视化时,我们可以看到这三个分量本身就足以看出显著对象的排序。

结论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提出了一种神经框架,不仅可以检测给定图像中的显著对象,还可以根据它们的显著性对它们进行排序。他们的方法不仅优于传统方法,也优于新提出的方法。

遗言

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我也实现了广残网,请点击这里查看博文 pos t。

参考

  1. (2018).Openaccess.thecvf.com。检索于 2018 年 9 月 11 日,来自http://open access . the CVF . com/content _ cvpr _ 2018/camera ready/2523 . pdf

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Scott Webb from Pexels

网络安全:定义、持续时间、破坏和欺骗,Simon Smith eVestigator 网络调查员兼硕士

原文:https://towardsdatascience.com/cybersecurity-definition-duration-devastation-and-deception-simon-smith-cyber-investigator-44e5a14637ed?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Cybersecurity: Definition, Duration, Devastation and Deception, Simon Smith eVestigator — Cyber Forensics Expert

西蒙·史密斯

我叫西蒙·史密斯。不认识我的人可以查看我在https://www.linkedin.com/in/simonsmithinvestigator的个人资料

我被要求解释我对所谓的“网络安全人才短缺”的立场。我花了一些时间,所以我想分享我的答案。这可以结合与工作相关的事实证据来理解:

https://www . LinkedIn . com/feed/update/urn:Li:LinkedIn article:6268034510613544960

网络安全——由于所谓的“网络安全人才短缺”而出现的新一批专家(的确如此),政府和我听说的一些人提出的培训方法近乎疏忽。

有基础技能。这就像去参加第五节丹黑带课程,是的,那天晚上你可能学了 1 个动作,而且那天晚上还能重复。第二天你会忘记的,这对你来说并不自然,因为你没有在过去的 20 年里通过等级和基础技能达到目的,而这些技能是掌握手臂、臀部、腿部和头部每一个动作的必备艺术。您错过了“手臂学派”、“腿学派”教导的重要元素,因为它们相互依赖。如果一个人不工作,他们都不会工作。你没有达到那个更高的水平。那天晚上你做的是一个短期记忆运动,不是经过身体训练的自然运动。

你旁边的第五个丹甚至没有想到任何来自“手臂学校”或“臀部学校”的训练,因为它是内置的。这就像呼吸。这很自然。他无缝地完成了这个动作,可以重做或完美地适应它,而不需要使用任何记忆,而是利用他身体的自然本能“随波逐流”,就像呼吸一样。

网络安全不是每个人的“行业”。这是一个级别,一个级别,一种方式。这是一门学科。这需要成为 6 个或更多“行业”的专家。这不是一份你可以直接学习的工作——它必须从你对其他行业专业知识的直觉知识中感受到。这就像呼吸,很自然。你需要打好基础。

这个组织有两扇门和一个秘密的活板门。一个输入门和一个输出门和一个地下室。然后,您需要理解通过这些门以任何方式进入的每个元素的“输入和输出”的工作方式。这包括数字、人力、文档、业务、流程、培训、监控、审核、账单、费用、整个业务。所有在里面被完全计算出来的东西都在活板门中被过滤,所有通过的东西都需要和下面描述的一样的等级。我可以更进一步,但这超出了范围,人们可能会在大师课上问这个问题。

这个原则留待以后讨论。关于技能短缺和风险或无风险的话题,我已经在上面和文章中提到了。我想说的是,人们似乎认为他们可以参加课程并报名参加,即使你可以,你还想参加吗?

发生网络犯罪时,谁会受到损失?

最终,股东和所有人都失去了工作,或者有人失去了生命、自由或隐私(或者数百万)。

谁负责?

会议室。因此,他们必须而且在很多地方被引用,如果不是负责公司生活的网络安全人员的话。网络安全是董事会和立法关注的问题,这是事实,也是不争的事实。这不是一份你可以在下班时带些食物回家的工作,而是:

  • 你做对了,公司就能生存;
  • 你做错了,公司就完蛋了。

除了生命受到威胁,这也是网络勒索和网络跟踪的一部分,该公司将面临法定罚款。如果你认为网络保险就是答案,请三思。仔细阅读政策。

现实生活:

**事实:**凭经验,我见过。公司停工也会毁掉公司,不仅仅是罚款。我甚至没有提到我参与的无数死亡威胁、诱拐儿童、邪教、强奸、自杀和网络跟踪案件,其中包括诱捕、勒索和一起持枪案件。

对于那些新手来说,如果你不说出自己的名字,我来说。如果我认为你会危及这个行业,我建议你参考这篇文章:

这完全是一种行业误解。公司可以选择雇佣他们想要的人,但在他们理解网络安全的定义(包括澳大利亚政府)甚至谷歌和脸书之前,你将继续拿生命、身份、安全和工作冒险,这不是我们任何一方想要生活的世界。


座右铭——你不能取代人类的优秀——你可以帮助它

记住,人类是任何系统中最薄弱的一环。技术第二!

🏆在 2018 年 12 月之前投票选出西蒙·史密斯为 2018 年度网络专业人士:
https://Cyber security-Excellence-awards . com/candidates/Simon-Smith/

在 LinkedIn 上连接见解和媒体请求:https://www.linkedin.com/in/simonsmithinvestigator
http://www.cybersecurity.com.au
http://www.cyberblog.com.au
http://www.evestigatortestimonials.com.au

点击这里通过我的 YouTube 频道订阅所有媒体采访:https://www.youtube.com/c/evestigatorAu/?sub_confirmation=1

CycleGAN:学习翻译图像(无配对训练数据)

原文:https://towardsdatascience.com/cyclegan-learning-to-translate-images-without-paired-training-data-5b4e93862c8d?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An image of zebras translated to horses, using a CycleGAN

图像到图像转换是将图像从一个领域(例如,斑马的图像)转换到另一个领域(例如,马的图像)的任务。理想情况下,图像的其他特征——与任何一个领域都不直接相关的任何东西,例如背景——应该保持可识别的相同。正如我们可以想象的,一个好的图像到图像的翻译系统可以有几乎无限的应用。改变艺术风格,从素描到照片,或者改变照片中风景的季节只是几个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Examples of paired and unpaired data. *Image taken from the paper.

虽然对这项任务有大量的研究,但大多数都利用了监督的训练,在那里我们可以访问( xy )对来自我们想要学习在两个领域之间进行翻译的相应图像。CycleGAN 是在伯克利分校的 2017 年论文中介绍的,使用循环一致的对抗网络进行不成对的图像到图像翻译。这很有趣,因为需要成对的训练数据——虽然仍然需要一组 xy 图像,但它们不需要彼此直接对应。换句话说,如果你想在草图和照片之间进行转换,你仍然需要在一堆草图和一堆照片上进行训练,但是草图不需要是数据集中的精确照片中的*。*

由于配对数据在大多数领域中很难找到,甚至在某些领域中不可能找到,因此 CycleGAN 的无监督训练功能非常有用。

它是如何工作的?

两台发电机的故事

CycleGAN 是一个生成式对抗网络(GAN ),它使用两个生成器和两个鉴别器。(注意:如果您不熟悉 GANs,您可能想在继续之前阅读一下关于它们的内容)。

我们称其中一个生成器为 G ,让它将图像从 X 域转换到 Y 域。另一个生成器称为 F ,将图像从 Y 转换为 X

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Both G and F are generators that take an image from one domain and translate it to another. G maps from X to Y, whereas F goes in the opposite direction, mapping Y to X.

每个发生器都有一个相应的鉴别器,用于区分合成图像和真实图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

One discriminator provides adversarial training for G, and the other does the same for F.

目标函数

循环目标函数有两个组成部分,一个对抗损失和一个循环一致性损失。两者对于获得好的结果都是必不可少的。

如果你熟悉 GANs,这种对抗性的失败应该不会让人感到意外。这两个生成器都试图“愚弄”它们对应的鉴别器,使其无法区分它们生成的图像和真实版本。我们使用最小二乘损失(由毛等人发现比典型的对数似然损失更有效)来捕捉这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,仅仅是对抗性的损失不足以产生好的图像,因为它使模型受到约束。它强制生成的输出是适当的域,但是没有强制输入和输出是可识别的相同。例如,一个生成器输出图像 y 是该领域一个很好的例子,但是看起来一点也不像 x ,按照对抗性损失的标准,它会做得很好,尽管没有给出我们真正想要的。

周期一致性丢失解决了这个问题。它依赖于这样的期望,如果你将一个图像转换到另一个域,然后再转换回来,通过连续地将它输入两个生成器,你应该得到与你输入的相似的东西。它强制执行F(G(x)≈xG(F(y)≈y)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以通过将这些损失项放在一起,并用超参数λ对循环一致性损失进行加权,来创建完整的目标函数。我们建议设置λ = 10。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发电机架构

每个周期信号发生器有三个部分:一个编码器,一个变压器,和一个解码器。输入图像被直接输入编码器,这样可以缩小图像的大小,同时增加通道的数量。编码器由三个卷积层组成。产生的激活然后被传递到转换器,一系列的六个剩余块。然后由解码器再次扩展,解码器使用两个转置卷积来扩大表示大小,并使用一个输出层来产生最终的 RGB 图像。

具体可以看下图。请注意,每一层后面都有一个实例规范化层和一个 ReLU 层,但为了简单起见,这些都被省略了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An architecture for a CycleGAN generator. As you can see above, the representation size shrinks in the encoder phase, stays constant in the transformer phase, and expands again in the decoder phase. The representation size that each layer outputs is listed below it, in terms of the input image size, k. On each layer is listed the number of filters, the size of those filters, and the stride. Each layer is followed by an instance normalization and ReLU activation.

由于生成器的架构是完全卷积的,一旦经过训练,它们就可以处理任意大的输入。

鉴别器架构

鉴别器是 PatchGANs,这是一种全卷积神经网络,它查看输入图像的“补丁”,并输出该补丁“真实”的概率。这不仅比试图查看整个输入图像的计算效率更高,而且也更有效——它允许鉴别器专注于更多的表面特征,如纹理,这通常是在图像转换任务中被改变的那种东西。

如果你读过其他图像到图像的翻译系统,你可能已经熟悉 PatchGAN。在 CycleGAN 发表论文时,Isola 等人已经在使用条件对抗网络的图像到图像翻译中成功地将 PatchGAN 版本用于成对图像到图像的翻译。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

An example architecture for a PatchGAN discriminator. PatchGAN is a fully convolutional network, that takes in an image, and produces a matrix of probabilities, each referring to the probability of the corresponding “patch” of the image being “real” (as opposed to generated). The representation size that each layer outputs is listed below it, in terms of the input image size, k. On each layer is listed the number of filters, the size of those filters, and the stride.

正如您在上面的架构示例中所看到的,PatchGAN 将表示大小减半,并将通道数量加倍,直到达到所需的输出大小。在这种情况下,让 PatchGAN 评估 70x70 大小的输入补丁是最有效的。

减少模型振荡

为了防止模型从一次迭代到另一次迭代发生剧烈变化,鉴别器被提供了生成图像的历史,而不仅仅是由最新版本的生成器生成的图像。为此,我们保留一个池来存储最近生成的 50 幅图像。这种减少模型振荡的技术是由 Shrivastava 等人在通过对抗训练从模拟和无监督图像中学习开创的。

其他培训详情

这种训练方法对于图像到图像的翻译任务来说是相当典型的。Adam optimizer 是梯度下降的一种常见变体,用于使训练更加稳定和高效。在训练的前半部分,学习率被设置为 0.0002,然后在剩余的迭代中线性降低到零。批处理大小被设置为 1,这就是为什么我们在上面的架构图中提到实例规范化,而不是批处理规范化

优势和局限性

总的来说,CycleGAN 产生的结果非常好——在许多任务中,图像质量接近成对图像到图像的翻译。这令人印象深刻,因为配对翻译任务是一种完全监督学习的形式,而这不是。当 CycleGAN 的论文问世时,它轻而易举地超越了当时可用的其他无监督图像翻译技术。在“真实对虚假”的实验中,人类在大约 25%的时间里无法区分合成图像和真实图像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CycleGAN can be used for collection style transfer, where the entire works of an artist are used to train the model. *Image taken from paper.

如果您计划将 CycleGAN 用于实际应用,了解它的优势和局限性是很重要的。它适用于涉及颜色或纹理变化的任务,如白天到晚上的照片翻译,或照片到绘画的任务,如收藏风格转移(见上文)。然而,需要对图像进行大量几何改变的任务,例如猫对狗的翻译,通常会失败。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A very unimpressive attempt at a cat-to-dog image translation. Don’t try to use a CycleGAN for this. *Image taken from paper.

对训练数据的翻译通常比对测试数据的翻译好得多。

结论

感谢阅读!我希望这是一个有用的概述。如果你想看更多的实现细节,你可以参考一些很棒的公共实现。如果你对这篇文章有任何问题、修正或建议,请留下你的评论。

CycleGANS 和 Pix2Pix

原文:https://towardsdatascience.com/cyclegans-and-pix2pix-5e6a5f0159c4?source=collection_archive---------0-----------------------

演职员表:展示这些博客的节略版,解释 pix2pix 和 cycleGANs 背后的思想和概念。

克里斯多夫·黑塞 博客:

[## 张量流——仿射层中的像到像转换

确保你已经安装了 Tensorflow 0.12.1 首先 python -c “导入 tensor flow;打印(tensorflow。version)” …

affinelayer.com](https://affinelayer.com/pix2pix/)

Olga Liakhovich 博客:

[## 用 CycleGANs 学习图像到图像的翻译

我们最近与全球图片社 Getty Images 合作,探索图像到图像的翻译…

www.microsoft.com](https://www.microsoft.com/developerblog/2017/06/12/learning-image-image-translation-cyclegans/)

像素 2 像素:

论文:https://phillipi.github.io/pix2pix/

pix2pix 使用条件生成对抗网络(cGAN)来学习从输入图像到输出图像的映射。

数据集的一个例子是输入图像是黑白图片,而目标图像是图片的彩色版本。在这种情况下,生成器试图学习如何给黑白图像着色。鉴别器正在查看生成器的彩色化尝试,并试图了解生成器提供的彩色化与数据集中提供的真实彩色化目标图像之间的差异。

发生器的结构称为“编码器-解码器”,在 pix2pix 中,编码器-解码器大致如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些体积是为了给你一种感觉,它们旁边的张量维度的形状。本例中的输入是一个 256x256 的图像,具有 3 个颜色通道(红色、绿色和蓝色,对于黑白图像都是相同的),输出是相同的。

生成器获取一些输入,并试图用一系列编码器(卷积+激活函数)将其减少为更小的表示。这个想法是,通过以这种方式压缩它,我们有希望在最终编码层之后获得数据的更高级表示。解码层执行相反的操作(去卷积+激活功能),并反转编码器层的动作。

为了提高图像到图像变换的性能,作者使用了一个“U-Net”来代替编译码器。这是同样的事情,但是“跳过连接”直接将编码器层连接到解码器层:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果不需要编码/解码部分,跳过连接为网络提供了绕过编码/解码部分的选项。

这些图表是一个轻微的简化。例如,网络的第一层和最后一层没有批范数层,而中间的几层有丢失单元。

鉴别器

鉴别器的工作是获取两个图像,一个输入图像和一个未知图像(它将是来自生成器的目标或输出图像),并决定第二个图像是否是由生成器生成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该结构看起来很像发生器的编码器部分,但工作方式略有不同。输出是 30×30 的图像,其中每个像素值(0 到 1)表示未知图像的相应部分的可信度。在 pix2pix 实现中,这个 30x30 图像的每个像素对应于输入图像的 70x70 补丁的可信度(由于输入图像是 256x256,所以补丁重叠很多)。这种架构被称为“PatchGAN”。

训练

训练这个网络有两个步骤:训练鉴别器和训练生成器。

为了训练鉴别器,生成器首先生成输出图像。鉴别器查看输入/目标对和输入/输出对,并猜测它们看起来有多真实。然后基于输入/输出对和输入/目标对的分类误差来调整鉴别器的权重。

然后基于鉴别器的输出以及输出和目标图像之间的差异来调整发生器的权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Discriminator and Generator training

CycleGANs

原创 CycleGAN 论文

虽然 PIX2PIX 可以产生真正神奇的结果,但挑战在于训练数据。您想要学习转换的两个图像空间需要预先格式化为一个包含两个紧密相关图像的 X/Y 图像。根据您尝试在两种图像类型之间进行转换,这可能会很耗时、不可行,甚至是不可能的(例如,如果两个图像配置文件之间没有一对一的匹配)。这就是 CycleGAN 的用武之地。

CycleGANs 背后的关键思想是,他们可以建立在 PIX2PIX 架构的能力上,但允许你将模型指向两个离散的、不成对的图像集合。例如,一个图像集合,组 X,将充满阳光海滩照片,而组 Y 将是阴天海滩照片的集合。CycleGAN 模型可以学习在这两种美学之间转换图像,而无需将紧密相关的匹配合并到单个 X/Y 训练图像中。

CycleGANs 能够在没有明确的 X/Y 训练图像的情况下学习如此出色的翻译的方法包括引入一个完整翻译周期的概念,以确定整个翻译系统有多好,从而同时改进两个生成器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种方法是 CycleGANs 为图像到图像的翻译带来的巧妙力量,以及它如何在非配对图像风格之间实现更好的翻译。

最初的 CycleGANs 论文“使用循环一致对抗网络的不成对图像到图像的翻译”由朱俊彦等人发表。

损失函数

CycleGANs 的强大之处在于他们如何设置损失函数,并使用全周期损失作为额外的优化目标。

作为复习:我们正在处理 2 个生成器和 2 个鉴别器。

发电机损耗

让我们从发电机的损耗函数开始,它由两部分组成。

第 1 部分:如果伪造(生成)的图像非常好,鉴别器无法区分这些图像与真实图像,则生成器成功。换句话说,鉴别器对假图像的输出应该尽可能接近 1。在张量流术语中,发电机希望最小化:

g_loss_G_disc = tf.reduce_mean((discY_fake — tf.ones_like(discY_fake)) ** 2)g_loss_F_dicr = tf.reduce_mean((discX_fake — tf.ones_like(discX_fake)) ** 2)

注意:上面的“**”符号是 Python 中的幂运算符。

第 2 部分:我们需要捕捉循环损耗:当我们使用另一个发生器从一个发生器回到图像的原始空间时,原始图像(我们开始循环的地方)和循环图像之间的差异应该被最小化。

g_loss_G_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))g_loss_F_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))

最后,发电机损耗是这两项之和:

G _ loss _ G = G _ loss _ G _ disc+G _ loss _ G _ 循环

因为循环损耗非常重要,所以我们想增加它的影响。我们为这个乘数使用了一个 L1λ常数(在论文中使用了值 10)。

现在发电机损耗的大结局看起来像:

G _ loss _ G = G _ loss _ G _ disc+L1 _λ* G _ loss _ G _ cycle

g _ loss _ F = g _ loss _ F _ disc+L1 _ 拉姆达* g_loss_F_cycle

鉴频器损耗

鉴别器需要做出两个决定:

  1. 真实图像应标记为真实(推荐值应尽可能接近 1)
  2. 鉴别器应该能够识别生成的图像,从而预测假图像为 0。
DY_loss_real = tf.reduce_mean((DY — tf.ones_like(DY))** 2)DY_loss_fake = tf.reduce_mean((DY_fake_sample — tf.zeros_like(DY_fake_sample)) ** 2)DY_loss = (DY_loss_real + DY_loss_fake) / 2DX_loss_real = tf.reduce_mean((DX — tf.ones_like(DX)) ** 2)DX_loss_fake = tf.reduce_mean((DX_fake_sample — tf.zeros_like(DX_fake_sample)) ** 2)DX_loss = (DX_loss_real + DX_loss_fake) / 2

D3 . js——现在就把它作为定制的模块化包使用吧!!

原文:https://towardsdatascience.com/d3-js-the-custom-modular-bundle-now-bebd6f25bc8b?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Charts created using D3 — https://github.com/richavyas/D3-Charts

我们今天呼吸数据!!!!

当今是一个大数据世界,我们每天都在与数字打交道。数字是迷人的,但让我们都同意,阅读这些数字是令人生畏的,也是令人疲惫的。这就是数据可视化的起源!!!

我从事数据可视化已经有几年了。2013 年,当我开始研究数据的最佳工具 viz 时,几乎没有任何挣扎, D3.js 赢得了这场战斗。我在很多地方读到过它的学习曲线和复杂性,但我是一名 JavaScript 工程师,它对我很有用。这里有大量的例子’’ https://bl.ocks.org/mbostock’和超级支持的 D3 社区,像我这样的人可以使用现有的,并根据具体要求创建自定义图表。

与此同时,我们的网络社区正在发生变化,它正在向模块化冲刺。 NPM ,没有处方药也没有狂欢的流浪艺人,LOL,接管了几乎每一个框架,它已经成为一个最强大的规范,将软件包作为依赖项安装,而不是将任何东西作为外部资源加载。

重点是只进口需要的东西。

在这个阶段,当 D3 v4.0.0 在 6 月份发布时,支持 ES6 并包含所有的导入/导出语句就不足为奇了。

我两天前开始用它做实验。从官方文档来看,D3 4.0 是一个模块的集合,这些模块被设计成一起工作;您可以单独使用这些模块,也可以将它们作为默认构建的一部分一起使用。最后一行, 你可以一起使用它们作为默认构建的一部分 是我花时间在这上面的最有说服力的原因。

我拿了 D3 的线图,https://bl.ocks.org/mbostock/3883245,,并打算使用 ES2015 模块和汇总构建一个定制的 D3 4.0 捆绑包。

让我们谈谈代码。

d3 折线图是 d3 形状模块的一部分,有更多的依赖关系,如 d3 刻度、d3 轴、D3 选择等。

代码库可以在这里查看:https://github.com/richavyas/d3-v4-line-chart

D3.js

此文件包含来自其他模块的导入语句,默认情况下会导出这些语句。

package.json

提到了 npm 安装的依赖关系。

它有一个关键步骤:

" build “:” roll up-c | uglifyjs-c-m > D3 . min . js "

它仅为要包含的模块创建缩小的 d3 文件。

汇总.配置

npm 导入/导出和默认的文件

index.html

负责图表创建的文件,包括,而不是整个 d3.js 库。

怎么建???

  • npm 安装
  • npm 运行构建
  • http-服务器

这将启动一个节点服务器,并生成一个 D3 折线图,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

灵感来源于迈克的枪托原帖:https://bl.ocks.org/mbostock/3883245

这个 D3 V4 折线图定制包经过优化,只包含您需要的代码。感谢阅读。❤️,如果你觉得值得分享的话。

叙利亚内战造成的破坏:数据说明了什么

原文:https://towardsdatascience.com/damage-caused-by-the-syrian-civil-war-what-the-data-say-ebad5796fca8?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Jobar neighborhood, Damascus, 2018–02–27 (Source).

七年多的战争让整个叙利亚城市成为废墟。数字还不清楚,但据估计重建这个国家将花费大约 2000 亿美元。

利用 2013 年至 2017 年拍摄的卫星图像, UNOSAT (训研所的业务卫星应用方案)对叙利亚八个最大的城市进行了全面的损害评估。

我研究了 UNOSAT 的数据,在这篇文章中,我解释了我的发现。

数据

联合国组织卫星数据是通过目视检查 2013 年 9 月至 2017 年 11 月期间拍摄的高分辨率卫星图像收集的。检测到的受损结构分为四类:1) 中度受损,2) 严重受损,3) 毁坏,或 4) 无可见损坏。评估了叙利亚最大的八个城市,即阿勒颇、大马士革、德拉、代尔祖尔、哈马、霍姆斯、伊德利卜和拉卡(图 1)。不同城市的评估重复了不同的时间。数据shapefilegeodatabase 格式提供下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1: Cities assessed by UNOSAT.

评估摘要

截至 2017 年 11 月,共有 109,393 个检测到的受损结构。2016 年见证了最高的破坏,共有 77,568 个结构(图 2-左)。

37%检测到的结构被中度损坏。 35.3%为严重损坏,其余 27.7%为毁坏(图 2—右图)。

阿勒颇占受损建筑总数的 32.7%(图 2 —中间)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2: Summary of UNOSAT assessment.

损伤计数与密度

阿勒颇共有 35,691 座受损建筑,是受损数量最多的城市。其次分别是大马士革、拉卡、霍姆斯、哈马、代尔祖尔、德拉和伊德利卜(图 3—左)。

另一方面,拉卡的受损密度(单位面积受损建筑的数量)最高,其次是霍姆斯、代尔祖尔、大马士革、哈马、阿勒颇、伊德利卜和德拉(图 3 —右)。

值得注意的是,阿勒颇(破坏数量排名第一)的破坏密度是拉卡的 40%(图 3 —右图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3: Damaged structures: count (left), and density (right).

中度损坏的结构

阿勒颇以 16256 座中度受损建筑的数量位居第一。其次分别是大马士革、拉卡、霍姆斯、代尔祖尔、哈马、伊德利卜和德拉(图 4 —左)。

伊德利卜的 m 中度受损结构(被归类为中度受损的结构比例)最高。另一方面,哈马的中度受损的建筑仅占该市总数的 6%。这意味着,无论是严重受损的还是被毁的构筑物,都占到了城市受损构筑物的 94%(图 4 —中)。

拉卡的中度损坏结构密度最高(图 4 —右图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4: Moderately damaged structures: count (left), ratio (middle), and density (right).

严重受损的结构

阿勒颇再次成为严重受损建筑数量第一的城市,共有 14671 座建筑。其次分别是大马士革、霍姆斯、拉卡、代尔祖尔、哈马、德拉和伊德利卜(图 5 —左)。

霍姆斯的严重受损建筑比例最高。阿勒颇紧随其后,位居第二(图 5 —中间)。

至于严重破坏的密度,霍姆斯和拉卡以几乎相似的值占主导地位(图 5 —右图)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5: Severely damaged structures: count (left), ratio (middle), and density (right).

被毁的建筑

哈马在被摧毁的建筑的数量(图 6-左)、比例(图 6-中)和密度(图 6-右)上都排在第一位。注意哈马 90%的受损建筑是如何被摧毁的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6: Destroyed structures: count (left), ratio (middle), and density (right).

重建的结构

总共有 1153 个重建的结构(结构从损坏无可见损坏)。哈马的建筑数量最多,有 353 座。大马士革没有(图 7-左)。另一方面,代尔祖尔的重建结构密度最高(图 7 —右)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7: Reconstructed structures: count (left), and density (right).

摘要

  • 利用 2013 年至 2017 年期间拍摄的卫星图像,联合国组织卫星评估了叙利亚八个最大城市的损失。
  • 截至 2017 年 11 月,检测到的受损结构总数为 109,393 个。
  • 阿勒颇占受损建筑总数的 32.7%。
  • 拉卡的受损建筑密度最高。
  • 哈马拥有最高数量和密度的被摧毁的建筑。
  • 总共有 1153 个重建的结构。哈马的票数最高。代尔祖尔的密度最高。

敢于在数据科学社区中与众不同

原文:https://towardsdatascience.com/dare-to-be-different-in-the-data-science-community-6a3a275230a9?source=collection_archive---------1-----------------------

如果您想提高对某个问题的认识或倡导一项重要的事业,将数据科学作为您的工具,该怎么办?作为一名数据科学家,这种想法可能会让你非常兴奋:让问题变得明朗,用数据让故事变得生动。但是,如果你的专业知识没有明确的定位,你该怎么办呢?如果您的主题目前在数据科学社区中不可见,该怎么办?

吹响号角:

好消息:您可以利用您的独特性来推动您在数据科学社区中想要做的事情。你题材的独特性就是你的优势。

1。拥抱你的融合存在

作为一名数据科学家,我相信你一定认得这张图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Data Science Venn Diagram- Courtesy of Drew Conway Site

作为复习,当我们第一次接触数据科学领域时,这张图表概述了哪些技能是必需的。

不要把这些技能看成是孤立的,而是拥抱这些领域的交汇点。寻找可以让你探索自己专业知识的社区项目。例如,考虑提出你自己的基于数据的项目。

  • 例 1:体育数据分析

Mara Averick 是一名狂热的体育迷和数据分析师,他将两者结合起来探索数据:点击此处查看她关于体育数据分析的讨论:

Mara Averick 的项目讨论

  • 例 2:诗歌与 AI

Joy Buolamwini,诗人、企业家和麻省理工学院研究生研究员,一直倡导人工智能中的偏见,并使用许多工具就这一主题进行交流,包括诗歌。点击这里查看她的作品:

Joy Buolamwini 的项目

2。坚持自己的独特性

在数据科学领域挑战自我的最佳方式是规划自己的道路。找到没有被强调的地方,将你的天赋与你在一个尚不存在的领域的发展联系起来

这个领域的伟大之处在于,几乎所有东西都是新的,都是开放创新的。直到 2008 年,“数据科学家”这个头衔才被创造出来(9 年多前!)。这门学科对任何事情都开放。

如果你觉得你的话题可能太晦涩或者太独特,记住:你的独特就是你的优势。让我们的领域如此令人兴奋的是,新的想法和新的声音经常会受到好奇和欢迎。

今年初夏,芝加哥大学数据科学与政策中心举办了 2017 年数据科学促进社会公益大会的公开提案会议。我对提交犹豫不决。在我脑海里盘算着我的提议不会被批准的所有可能性。1.我不在学术附属机构 2。我不在数据科学团队工作。甚至在我犹豫的时候,我利用了我认为“不足”的东西,并把它们作为杠杆点。我的主题演讲是关于作为一名单独的数据科学家开发一个社区数据项目**(利用不在团队中的优势)**。有一次,我被选中参加一个演讲机会,我意识到我是唯一一个来自公共图书馆的演讲者(利用作为不同附属组织的一部分)。所以,即使你觉得自己不具备抓住机会的条件,也要抓住它。忽略内心的对话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Excerpt Photo’s from Presentation

永远要认识到你独特视角的价值。

3。继续前进

一旦你开始走上自己独特的道路,就要一直向前。这种向前的情绪,是由一个以他的独特性铺平了自己的道路并一直向前推进的人华特·迪士尼表达的。

“在这里,我们不会长久地向后看。我们不断前进,打开新的大门,做新的事情,因为我们很好奇……好奇心不断引领我们走上新的道路。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo Courtesy of Pixabay

请记住这些提示

1.好奇。

不要让你的犹豫或抗拒阻止你。保持谦逊。提问。

有意识地把握你要抓住的机会,这样你就能继续增强自己独特的声音。

2.建立并加强你的人际网络。有意接触他人。与人见面。向你渴望成为的人学习。当你发现自己的技能有差距时,寻求帮助。对你着手寻找的机会要坚持不懈。

在工作中拓展和延伸自己。不要只是突破你的舒适区,而是迭代到另一个增长水平。

我希望这条信息能引起你的共鸣,尊重并接受你在数据科学方面的独特观点。拥抱自己的观点让我受益匪浅,我得到了一个演讲的机会,而且几乎马上就有了另一个机会。

Dash:初学者指南

原文:https://towardsdatascience.com/dash-a-beginners-guide-d118bd620b5d?source=collection_archive---------11-----------------------

简单介绍该库框架的特性和优点,以便用纯 Python 构建 web 应用程序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为一名数据科学家,我们工作中最不可或缺的一个方面就是向“非数据科学家”传递和显示数据,以提供可视的可操作数据的格式。在我看来,我们工作中最酷的部分之一就是与数据互动,尤其是在有视觉互动的时候。当我们想要构建一个交互式应用时,我们可以选择一个叫做 Dash 的框架。Dash 是一个用于构建 web 应用程序的开源 Python 框架,由 Plotly 的人员创建和维护。Dash 的网络图形是完全交互式的,因为框架是建立在 Ploty.js 之上的,Ploty 编写和维护的 JavaScript 库。这意味着在将 Dash 框架导入 Python 文件后,您可以构建一个完全用 Python 编写的 web 应用程序,而不需要其他语言。

如果你是编码新手,你可能会对自己说,“一个框架听起来像一个库…有什么不同?”很高兴你问了!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Library vs. Framework

“控制反转是框架不同于库的关键部分。库本质上是一组你可以调用的函数,现在通常被组织成类。每个调用都做一些工作,并将控制权返回给客户端。框架体现了一些抽象的设计,内置了更多的行为。为了使用它,你需要通过子类化或者插入你自己的类,把你的行为插入到框架的不同地方。然后框架的代码在这些点上调用你的代码。”
——马丁·福勒——

库和框架的关键区别在于“控制”是颠倒的。当你从一个库中调用一个方法时,你是在控制中。然而,对于框架来说,控制是相反的;框架召唤你。想到这个概念的一个简单方法是好莱坞原则——“不要打电话给我们,我们会打电话给你。”

“Dash 应用程序代码是声明性和反应性的,这使得构建包含许多交互元素的复杂应用程序变得容易。”

-https://github.com/plotly/dash

让我们把它分解成更简单的术语。声明式编程是一种构建计算机程序的技术,其中程序员只声明所需结果的属性,而不声明如何计算它。这种风格基本上是告诉你程序应该完成什么,而不是要遵循的具体步骤顺序。“如何做”取决于程序的解释者。假设你有掌握烘焙技巧的朋友,我会打个比方。声明式编程就像让你的朋友给你做蛋糕一样。你不关心他们是怎么做的;这个过程取决于他们。声明性语言的一个例子是 SQL,一种数据库查询语言。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们来看看 Dash 的一些动作:

你可以在这里找到安装说明:【https://dash.plot.ly/installation。因为您将使用 Python,所以您只需学习一些关于编写 Dash 应用程序的语法。一个松散定义的格式应该是这样的:1)导入必要的框架和库。2)提供布局,包括输入和输出。3)提供你的应用程序将如何与用户交互。

前两个例子是相当简单的应用程序,分别用 43 行和 59 行代码编写。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用程序的每个时尚组件都可以定制,并完全控制交互性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们在 Goldman Sachs 报告原型中看到的,Dash report 应用程序具有高度定制化、时尚化和直观化的能力。应用可以是对人类和老鼠大脑的 3d 探索,或者是一个物体探测器,它可以实时提供复杂视频中发生的事情的有用可视化(下面的例子)。无数的可能性是相当惊人的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码是什么样子的?

下面是一个很酷的 Dash 应用程序的例子,它只用了 56 行代码:

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Outputexternal_stylesheets = ['[https://codepen.io/chriddyp/pen/bWLwgP.css'](https://codepen.io/chriddyp/pen/bWLwgP.css')]app = dash.Dash(__name__, external_stylesheets=external_stylesheets)all_options = {
    'America': ['New York City', 'San Francisco', 'Cincinnati'],
    'Canada': [u'Montréal', 'Toronto', 'Ottawa']
}
app.layout = html.Div([
    dcc.RadioItems(
        id='countries-dropdown',
        options=[{'label': k, 'value': k} for k in all_options.keys()],
        value='America'
    ),html.Hr(),dcc.RadioItems(id='cities-dropdown'),html.Hr(),html.Div(id='display-selected-values')
])[@app](http://twitter.com/app).callback(
    dash.dependencies.Output('cities-dropdown', 'options'),
    [dash.dependencies.Input('countries-dropdown', 'value')])
def set_cities_options(selected_country):
    return [{'label': i, 'value': i} for i in all_options[selected_country]][@app](http://twitter.com/app).callback(
    dash.dependencies.Output('cities-dropdown', 'value'),
    [dash.dependencies.Input('cities-dropdown', 'options')])
def set_cities_value(available_options):
    return available_options[0]['value'][@app](http://twitter.com/app).callback(
    dash.dependencies.Output('display-selected-values', 'children'),
    [dash.dependencies.Input('countries-dropdown', 'value'),
     dash.dependencies.Input('cities-dropdown', 'value')])
def set_display_children(selected_country, selected_city):
    return u'{} is a city in {}'.format(
        selected_city, selected_country,
    )if __name__ == '__main__':
    app.run_server(debug=True)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我认为这是一个很酷的例子,因为代码片段包含了几个 decorators(这是我最近在课上学到的),并将输出和输入链接在一起,这样一个回调函数的输出就是另一个回调函数的输入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Jared and I share the same sentiment

所以,总结一下…

Dash 是数据科学家使用的一个很好的工具,因为它允许您构建分析 Python 后端的前端,而不必使用单独的工程师/开发人员团队。因为 Dash 应用程序代码既是声明性的又是反应性的,所以创建包含许多交互元素的丰富的、易于共享的、基于 web 的应用程序的过程现在变得容易多了。我真的很高兴在我未来的项目中开始使用 Dash。

-应用示例图片来自【https://dash.plot.ly/】-

精益仪表板:数据包含和排除原则

原文:https://towardsdatascience.com/dashboard-data-inclusion-and-exclusion-criteria-51cd934e7f60?source=collection_archive---------2-----------------------

仪表板以互动的方式将数据和可视化呈现给用户,因此获得了大量的喜欢和欢迎。为了保持仪表板讲述故事的强大力量,我得出的结论是,一定数量的数据包含和排除是必要的,因为粗心的数据选择可能会使仪表板故事难以理解、播放缓慢、难以维护且存储成本高昂。你有没有遇到过很难理解的图表?我有:)

这里有一个激励人心的假设例子:假设一个科学家来找我,告诉我我患老年痴呆症的几率是 321%。我不会要求在仪表板上显示每月更新的概率,我不会对这个概率做任何事情,因为这个概率不会逐月变化,因为阿尔茨海默病是基因相关的。事实上,到目前为止,阿尔茨海默氏症还没有有效的治疗方法,知道我有更高的几率患上这种疾病不允许我采取任何行动,因此没有任何有意义的商业行动。我不会因为可以更新和监控指标就去更新和监控。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Business world is full of dashboards, on papers or on screens

这个假设的例子可能看起来滑稽可笑,但它意味着在使用信息时要突出一个深思熟虑的过程。我们如何使用信息进行决策决定了我们如何创建、显示和存储信息。这些方面中的每一个都对人们非常关心的数据的分析、计算和可视化有影响。

我反思了我个人的仪表板经验,提出了一套数据包含和排除原则。在我的工作中,这些原则已经在帮助我指导我的技术决策和业务协作。我用以下五点来说明五个原则。

1。包括多少感兴趣的指标?

在业务分析项目中,我们使用许多指标,如基点、下降率、交易量等(我在工作中提到了一些指标,但这些原则应该适用于其他设置)。这些指标允许我们从不同的角度探索有趣的话题。自然,人们要求将这些指标包含在仪表板中,以便他们可以选择、过滤和评估。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Exponentially growing complexity

当我们有一个感兴趣的度量时,我们研究这个度量的性质。当我们有两个感兴趣的指标时,我们研究这两个指标的属性,并比较这两个指标,例如,我们首先研究欺诈,然后研究退款,并将欺诈与退款进行比较(我在金融技术部门工作)。

考虑到两个指标,我们可能会认为再研究一个指标并不是一个大问题,但是,如上图所示,多一个点会产生更多的边,突出了指数增长的复杂性。

因此,前期小心控制度量的数量可以有效控制下游的复杂度。

我的经验告诉我,每个仪表板少于三个指标就可以了。少即是多。

2。要包括哪些过滤器?

如果没有过滤器,仪表板就是图形和表格的集合。过滤器让仪表板活起来。在数据探索阶段,我们使用尽可能多的过滤器来发现洞见。美国的交易比其他国家多吗?产品类别 A 的客户最多吗?

然而,在将这些过滤器提交到最终的仪表板(定期更新的服务器端仪表板)之前,我们需要仔细考虑这些过滤器的“ROI(投资回报)”。我有两种方式来思考“滤镜的 ROI”。

**这个过滤器揭示了一种模式吗?**在研究 F 封锁的影响(这是我公司对我们的用户实施的干预计划)时,与 F 封锁相关的过滤器显示,在 F 封锁发生后,提交的退款减少。这个过滤器揭示了一个模式,证实了我们的业务决策。

此过滤器支持业务操作吗?由于巴西对我们团队来说是一个重要的市场,因此包含巴西的国家过滤器与业务相关,并支持我的业务行动。另一方面,如果我的仪表板用户不愿意(或不能)对特定市场采取行动,那么国家过滤器不支持业务行动,因此没有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A filter should divide things into meaningful piles

如果一个过滤器既不显示模式也不支持业务操作,我们最好排除这个过滤器,以避免浪费资源。在我的工作中,按商家渠道过滤的欺诈基点通常不能真实反映模式(它只给出一些旧消息),也不能支持业务操作,因此我们不将其包括在最终仪表板中。

3。我应该随着时间的推移跟踪这个指标吗?

如果一个指标不随时间变化很大,那么一次探索就足够了。很多时候,我的合作者要求 12 个月的指标,而这些指标实际上并没有因为自然波动和季节性而改变。你通常不需要知道 12 个月的世界人口,对吗?一张世界人口的快照可能就足够了。

4。认识探索和最终仪表板之间的差异

因为我们无法直观地看到草案仪表板和生产仪表板之间的区别,所以这两者在很多时候被视为相同的。我们都知道笔记本电脑上的机器学习模型不同于生产系统中部署的机器学习模型。仪表板在探索和生产中是不一样的。

在 exploration(仪表板草稿)中,我们使用许多相关的过滤器来发现趋势和见解。然而,在 production dashboard 中,我们使用优化的仪表板来一致地提供见解。细化和剪切不能保存在仪表板部署路径中。

很多次,我听到人们说“你能每月给我提供这个仪表板吗?”。人们将探索仪表板视为生产仪表板,这可能会有问题。

5。装袋目的是一个危险的游戏

仪表板可以有多种用途:探索、监控、报告甚至预测。探索优化了灵活性和规模。监控优化了自动化和准时性。报告优化了演示文稿和内容读者适合度(会议或目标群体)。

如果我们将探索、监控、报告甚至预测需求打包到一个仪表板中,我们会忽略基本的权衡,同时追求许多优化,这可能会导致折衷的结果。想象一下,如果我们想要一项低风险、高回报和低成本的投资,我们很可能会失望,因为低风险和高回报很难共存。

和你的商业伙伴一起明确目标,如果可能的话,分而治之。

结论

构建一个仪表板实际上就像构建一个统计模型(您需要决定包含哪个变量),一个健康的数据包含和排除对于成功的仪表板是必要的。这五点希望能启发你找到自己的精益仪表板原则。

用 Folium 实现 Python 中的空间可视化和分析

原文:https://towardsdatascience.com/data-101s-spatial-visualizations-and-analysis-in-python-with-folium-39730da2adf?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by NASA on Unsplash

在这篇文章中,我将通过一个例子来说明如何使用 Python 来可视化空间数据,并在著名的 Python 库follow的帮助下从这些数据中生成见解。

注意:当我在本文中提到空间数据时,我指的是包含地理信息(纬度、经度、海拔高度)的所有类型的数据。

我假设您已经了解了:

  1. 计算机编程语言
  2. Jupyter 笔记本
  3. 熊猫

使用地图可视化空间数据的优势

使用地图可视化空间数据有几个明显的优势:

  1. 能够获得数据点位置的可视化表示,从而使我们能够轻松地将我们拥有的数据点与现实世界联系起来。
  2. 让我们有可能从现有的数据中获得地理信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Plotting spatial data in a map allow us to gain geographical insights that we cannot obtained from other chart forms

Alberto Cairo 在他的书 《功能艺术:信息图形和可视化简介》 中的陈述雄辩地表达了上述观点:

“图形不应该简化信息。他们应该阐明它们,突出趋势,揭示模式,揭示以前看不到的现实。”

当涉及到空间数据时,使用地图而不是其他形式的图表使我们能够突出趋势,揭示模式,并揭示在之前不可见的现实。它还帮助我们获得数据的清晰度,而不仅仅是简化数据本身。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

It is extremely hard, if not impossible, to gain useful insights from spatial data using tables as a way to represent the data

薄层

引用 Github 页面上 Folium 的 Python 库:

“follow 构建在 Python 生态系统的数据优势和 fleet . js 库的映射优势之上。在 Python 中处理您的数据,然后通过 leav 在传单地图中将其可视化。”

Folium 是一个 Python 库,它允许我们以交互的方式可视化空间数据,直接在许多人(至少我自己)喜欢的笔记本环境中。该库使用起来非常直观,并且它提供了高度的交互性和较低的学习曲线。最棒的是,这一切都是开源的🎉

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Map of New York and its surrounding areas visualized using Folium

数据集

我们将使用从 Kaggle 获得的纽约市出租车出行持续时间数据集 中的数据,我们将在本文中使用这些数据。该数据集可以从上面的链接下载,并且该页面还包括关于数据集中存在的列的文档。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

New York City Taxi Trip Ride Data Set available from Kaggle, alongside the documentation explaining the data available in the dataset

该数据集包含两个独立的数据文件,分别是 train.csvtest.csv. 数据集之间的区别在于 train.csv 文件包含一个额外的列,即 *trip_duration。*在本例中,我们不会关注这一点,因此我们不需要额外的列。

分析问题

我们将设置一个模拟问题,让我们在分析中努力解决(给文章一个方向感)

该市正计划建造出租车停靠站,在全市范围内,人们可以乘坐出租车上下客,然后等待出租车来接他们。该倡议旨在:

  1. 减少停在自行车道上的出租车数量
  2. 使得城市居民更容易和更安全地获得出租车,尤其是在晚上
  3. 让出租车司机知道他们想找乘客时去哪里
  4. 允许潜在乘客在寻找出租车时有一个可以去的地方。

您的任务是建议这些出租车停靠点的最佳位置,并了解城市中全天的乘车量模式。

导入和预处理数据

我们首先导入我们将要使用的库, Pandas 和*leav,*导入我们将要使用的所有文件,删除我在上一节提到的 trip_duration 列,并将这两个不同的文件合并为一个数据帧。

Initial steps

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Preview of the data set that we will be working with

上面的截图显示了我们将要使用的数据的预览。从数据集来看,可以说我们确实有相当大量的游乐设备数据可以处理(2M+6 个月的数据)。使用 Python 中的 Datetime 包可以生成一些列,如月份*、或其他时间特征。除此之外,这个数据集看起来已经准备好被叶*使用(叶基本上只需要行方向的纬度/经度数据就可以运行它的功能)

Generating the month from the pickup_datetime column

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The new dataframe generated after the process above.

如您所见,我们可以从 pickup_datetime 列中获取月、周、日和小时(该列也被转换为 datetime 列,而不是 object)。我们将在后面的分析中使用这些列。

用叶子可视化空间数据

在我们使用 leav 进行可视化之前,有几件事情需要注意:

  1. 地图被定义为叶子。映射对象,我们可以在叶子上添加其他叶子对象。地图改善/添加到渲染的地图
  2. 页允许用户选择不同的地图投影。我们将在本文中使用球面墨卡托投影,因为我们正在可视化一个相对较小的区域,这是一个更常用的投影。
  3. 我们可以使用不同的地图切片来绘制由 follow 绘制的地图,例如来自 OpenStreetMap(我将在本教程中使用的那个), MapBox (使用来自 MapBox 的切片需要您将您拥有的用于 MapBox 许可的 API 密钥作为参数之一),以及您可以从这个 github repo 文件夹这个文档页面中看到的其他几个切片

**叶子。地图()

这个类方法将永远是您在使用 leav 时执行的第一件事。这个函数的目的是生成默认的地图对象,该对象将由您的笔记本呈现,并且我们将在其上构建我们的可视化对象。

我们可以通过定义默认的地图对象来开始我们的地图可视化。

Function to generate the base map object

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Generating the base map object that we will be using for our visualizations

这个类函数中有几个我经常使用的参数,它们是:

  1. 位置,这个参数基本上定义了默认位置,它将被地图显示为中心位置。
  2. zoom_start,定义地图的默认放大级别
  3. control_scale,启用/禁用给定缩放级别的地图比例。这有时对我们了解我们所观察的地理区域的规模很有帮助。

在这个类方法中还可以设置许多其他参数,您可以从这里的中读到这些参数。

热图()

我们将使用一个类方法 Heatmap() 来可视化我们现在拥有的乘坐数据。这个类函数可以用来在我们之前创建的 map 对象上覆盖一个热图。

Using data from May to June 2016 to generate the heat map

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Visualizing 2 months worth of rides in a map view

从上面的地图可视化中可以看出,曼哈顿区内的区域以及靠近曼哈顿区的皇后区和布鲁克林区内的区域对出租车的需求量很大。查看地图,我们还可以看到,该区域周围的需求高于其周围的需求。

Adding the functionality for us to add markers to the map by clicking on the location where we would like to add the marker

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Running the command allows us to click on the map to add markers where we would recommend them to place the stops for phase 1

加入叶子后。ClickForMarker() 对象添加到我们创建的地图对象中,我们可以单击地图中的位置来添加标记,这些标记是我们建议在第一阶段放置这些出租车停靠站的位置。有些地点位于纽约的机场,因此我们可以跳过第一阶段的这些地点,因为机场已经有乘客可以寻找出租车的地点。

我们还可以使用一个名为 HeatMapWithTime() 的类方法,根据特定维度(即小时、月)来改变热图上显示的数据。这种方法将允许我们将笔记本呈现的热图制作成动画。

首先,我们需要创建一个包含我们想要绘制的值列表的列表,按照我们想要使用的维度进行分组(在本例中,我们将使用 hour 作为维度)。

Generating the list that we will be using as the data value for HeatMapWithTime()

在我们生成了将用于 HeatMapWithTime 类方法的数据之后,我们可以调用该方法并将其添加到我们的地图中。

We use the data from the previous step as the data argument for the HeatMapWithTime class method

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Looking at the hourly data pattern, it can be seen that Manhattan will always have a high amount of rides coming from it throughout the day

从上面的结果可以看出,在一天中,总会有一辆车来自曼哈顿地区,因此我们可能会在整个曼哈顿地区设置许多站点,因为我们会将该项目扩展到整个城市的更多站点

结束语

如上所述,可以看出,作为一种可视化空间数据的方式,使用 follow 非常直观。Folium 内置了许多特性,包括热图、动画、标记和许多我在本文中没有涉及的其他特性。

从上面的例子中还可以看出,通过使用地图而不是其他形式的可视化,我们确实可以突出趋势,揭示模式,并揭示在空间数据之前不可见的现实。最重要的是,它将我们拥有的数据的清晰度提升到了一个全新的水平。

你可以在这里下载本文使用的附带笔记本:https://colab . research . Google . com/drive/1 hjb 7 ugj 7 yuueji-ckzrar 3 o 4d lym 2 krp

参考

功能艺术:信息图形和可视化介绍阿尔贝托·开罗写的关于有效可视化的书。

https://python-visualization . github . io/folio/docs-v 0 . 6 . 0/quick start . html # Getting-Started,follow 的快速入门指南,非常方便地入门。

http://python-visualization . github . io/Folium/docs-v 0 . 5 . 0/modules . htmlFolium 的文档页面。

https://github.com/python-visualization/folium叶氏 Github 页面。

数据分析:纳粹禁书

原文:https://towardsdatascience.com/data-analysis-books-banned-by-the-nazis-c9d3cf0cfab3?source=collection_archive---------11-----------------------

数据显示希特勒对自由媒体发动了一场文化战争

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Fred Kearney on Unsplash

在这个数据分析中,我们将使用柏林开放数据倡议提供的数据集来探索 1935 年被纳粹禁止的书籍的作者、书名和位置。您可以在这里访问数据集。它包含了 13 个变量的 4762 个观察结果,包括作者姓名、头衔、出版商所在地和出版年份。为了可视化数据,我们将使用 r 中的 tidytextwordcloudtreemapggmap

为什么这与今天相关?

在美国对媒体、过滤泡沫和错误信息“开战”的时代,我们应该保持警惕,当权者如何控制信息流来支持他们的政治议程,并重新叙述我们的集体历史。

#Cleaning up for display and loading necessary packages
library(tidyverse)
library(tidytext)
library(wordcloud)
library(treemap)
library(ggmap)
df <- read.csv('nazibooks.csv', stringsAsFactors = F)
df <- df%>%
  unite('name', authorfirstname, authorlastname, sep=' ' )
df <- df%>%
  mutate(firsteditionpublicationyear = as.integer(firsteditionpublicationyear))

戈培尔和纳粹文化理想

据该网站称,这份名单是由约瑟夫·戈培尔(Joseph Goebbels)的心血结晶“帝国文化宫”(Reichskulturkammer)拟定的,并被传递给所有的图书馆和书店。根据维基百科,

【帝国文化室】意在获得对德国整个文化生活的控制,创造和推广符合纳粹理想的雅利安艺术。每个艺术家必须出示雅利安证书才能申请会员资格。被拒绝的登记事实上导致了职业禁令。

两种禁书

党卫军实际上使用了两种“旗帜”:第一种是“威胁纳粹文化”的书籍,第二种是“不适合落入青少年(18 岁以下的儿童)手中”的书籍这些书也不能陈列在店面的橱窗里,或者放在书店里,公众可以在那里找到它们。

df%>%
  ggplot(aes(firsteditionpublicationyear, fill=as.factor(ssflag)))+
  geom_histogram(alpha=.5)+
  theme_minimal()+
  labs(fill='Type of Ban', x='Year First Published', y='Count')+
  annotate('text',x=1890, y=600, size=3, label = 'Type 1: Die Reichsschrifttumskammer führt eine Liste solcher Bücher und Schriften,\n die das nationalsozialistische Kulturwollen gefährden.\n Die Verbreitung dieser Bücher und Schriften durch \n öffentlich zugängliche Büchereien \nund durch den Buchhandel in jeder Form (Verlag, Ladenbuchhandel,\n Versandbuchhandel, Reisebuchhandel, Leihbüchereien usw.) ist untersagt.
\n Type 2: Die Reichsschrifttumskammer führt eine weitere Liste solcher Bücher und Schriften,\n die zwar nicht in die in § 1 erwähnte Liste aufzunehmen,\n jedoch ungeeignet sind, in die Hände Jugendlicher zu gelangen. Solche Schriften dürfen:
           1\. nicht in Schaufenstern und allgemein zugänglichen Bücherständen öffentlich\n ausgelegt werden,
           2\. nicht durch Reisende, Bücherkarrenhändler, Ausstellungshändler und sonstige \nHändler ohne festen Verkaufsraum\n vertrieben werden,
           3\. nicht an Jugendliche unter 18 Jahren ausgehändigt werden.')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到大多数书籍都是在 20 世纪 30 年代出版的,尽管看起来第二类禁令(针对年轻人)针对的是出版时间稍早的书籍。1900 年以前出版的书籍很可能与共产主义有关。卡尔·马克思的《共产党宣言*(Manifest der Kommunistischen Partei)*出版于 1848 年,是柱状图中显示的最早出版的书籍。

禁书的 Tidytext 和 Wordclouds

我们将使用 tidytext 包和一个定制的德语停用词数据帧来过滤掉大部分语法单词。然后,我们将使用 Wordcloud 包来可视化被禁标题中的前 150 个单词。我们将首先看单个单词,然后看二元模型,它倾向于给出更多的上下文。

custom_stops <- bind_rows(data.frame(word = c(as.character(seq(1,100,1)),'nicht', 'kann','na', 'en','le', 'het', 'st', 'aufl','hrsg','unsere','de', 'bd', 'la','sämtliche', 'u', 'schriften', stopwords::stopwords(language = 'german')), lexicon = c('custom')), stop_words)my_pal1 <- rev(c("#FF4040", "#EE3B3B", "#8B2323", "#030303"))
df%>%
  unnest_tokens(word, title)%>%
  anti_join(custom_stops)%>%
  count(word, sort=T)%>%
  with(wordcloud(word, n, scale=c(2, .3), color=my_pal1, random.color = F, max.words = 150))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在用二元模型来深入了解单词的上下文。

df[df == ' '] <- 'unknown'
df%>%
  filter(ssflag==1)%>%
  mutate(title = iconv(title, 'UTF-8', 'latin1'))%>%
  unnest_tokens(word, title, token = 'ngrams', n=2)%>%
  separate(word, into=c('word1', 'word2'))%>%
  #filter(nchar(word1) > 2)%>%
  #filter(nchar(word2) > 2)%>%
  filter(str_detect(word1, '[a-zA-Z]'))%>%
  filter(str_detect(word2, '[a-zA-Z]'))%>%
  filter(!word1 %in% custom_stops$word)%>%
  filter(!word2 %in% custom_stops$word)%>%
  unite('bigram', word1, word2, sep=' ')%>%
  count(bigram, sort=T)%>%
  with(wordcloud(bigram, n, scale=c(1.2, .3), color=my_pal1, random.color = F, max.words=100))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最危险的想法

在 bigrams cloud 中,我们注意到对德国诗歌的大量关注。很可能纳粹试图盗用德国的文化偶像,并用它们来支持他们的意识形态。我们也在俄罗斯和中国(远东)找到了很多共产主义的参考资料。最后,我们看到了控制家庭价值观和年轻人(年轻一代)的困扰。对性话题的关注尤为有趣( erotik卖淫sexuelle )。

从单个单词中,我们可以看到许多被禁书籍关注的主题如下:

**爱情,战争,历史,德国,婚姻,青年,犹太人,苏联,希特勒,女人,革命,精神分析,社会主义,**教会在众多的当中。

重述过去

基于此,我们可以推断纳粹试图控制德国人如何看待他们自己的历史和俄国革命事件。与此同时,纳粹担心家庭的角色和婚姻制度,尤其是当时女性的性观念。最后,他们试图压制与基督教和教会相关的思想的自由表达。

所有这些都支持了人们熟悉的历史叙事,即纳粹利用新闻审查来支持种族优越的政党意识形态。任何含有可能使人们质疑党的路线的思想的书籍都被禁止出版。

禁书是在哪里出版的?

在这幅图中,我们将看到禁书是在哪里出版的。为了做到这一点,我们将需要地理编码的城市,并加入他们的出版物计数。

*#these were created separately
map_counts <- read.csv('euro_map_counts.csv')
nazi_words <- read.csv('top_nazi_words.csv')
#Google maps has changed its API since this time...
w_map <- get_map('Europe', zoom=4, maptype = 'toner')
ggmap(w_map)+
  geom_point(aes(lon, lat, size=n, color=n), alpha=.5,data=map_counts)+
  scale_color_gradient(low='blue', high='red')+
  guides(size=FALSE)+
  labs(color='# Banned Books', title='Location of Banned Books')+
  theme_void()*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

纳粹痛恨苏联共产主义

我们看到柏林出版了许多被禁的书籍(超过 1000 本),但也有许多书籍来自莫斯科。同样,这些很可能与共产主义和俄国革命有关,后者发生在大约十年前。

我们也可以看到更多来自伦敦、巴黎和维也纳等大城市的书籍。有趣的是,瑞士似乎也出版了很多书。

禁书的主题和位置

在这里,我们将看看在每个地方被禁止的热门词汇,希望能对各个城市出版的书籍中的观点有所了解。

*top_words <- df%>%
  unnest_tokens(word, title)%>%
  anti_join(custom_stops)%>%
  count(firsteditionpublicationplace,word)%>%
  arrange(desc(n))%>%
  group_by(firsteditionpublicationplace)%>%
  top_n(1,n)%>%
  filter(n>1)%>%
  inner_join(map_counts, by='firsteditionpublicationplace')library(ggrepel)
#get new map to see colors better
water_map <- get_map('Europe', zoom=4, maptype = 'watercolor')
ggmap(water_map)+
  geom_text_repel(aes(label= word,lon, lat, size=log(n.y)),min.segment.length=.9,segment.alpha = .2,color='black', force=2,data=top_words)+
  guides(size=FALSE)+
  scale_size(range = c(1, 5))+
  theme_void()+
  labs(title='Top Words by City')*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自柏林的爱与革命

这幅图让我们感受到纳粹想要控制哪些思想,以及这些思想的来源。单词的大小与包含该单词的标题数量成正比。

爱情和革命主要来自柏林,当时柏林以拥有一个蓬勃发展的共产党而闻名,而纳粹显然不喜欢这个政党。看来纳粹也在击退苏联的反宣传。

在德国南部,你可以看到对天主教会的提及,在维也纳,你可以看到对“Sittengeschichten”的压制,“Sittengeschichten”翻译过来就是“道德的历史”。

这些例子再次显示了纳粹为了控制和限制违背党的社会、历史和宗教叙事的思想的自由表达而在媒体上发动文化战争的程度。

这就是为什么特朗普的媒体战争树立了如此危险的先例:通过控制民众如何理解现实,当权者获得了以可预测的方式在情绪上操纵和煽动民众的能力。

哪些作家的禁书最多?

为了更好地了解纳粹最反感哪些作者,我们将统计禁书最多的作者,然后给出一个(随机选择的)标题示例,以了解该作者所写的书的类型。

*df_authors <- df%>%
    filter(name != 'unknown')%>%
    count(name, sort=T)%>%
    filter(n > 4)top_title <- df%>%
  filter(name != 'unknown')%>%
  count(name,title, sort=T)%>%
  filter(name %in% df_authors$name)%>%
  group_by(name)%>%
  slice(1)tot_count <- df%>%
  filter(name != 'unknown')%>%
  count(name, sort=T)%>%
  filter(name %in% df_authors$name)%>%
  group_by(name)%>%
  slice(1)%>%
  inner_join(top_title, by='name')#PLOTs
  ggplot(tot_count, aes(reorder(name,n.x),n.x, fill=n.x))+
  geom_col()+
  geom_label(aes(x=reorder(name,n.x), y= 2, label=title),color='white', size=2.5)+
  coord_flip()+
  theme(axis.text.y = element_text(size=7))+
  labs(y='# Books Banned', title='Authors with Most Banned Books', subtitle='(example title)', fill='# Banned Books')+
  theme_minimal()*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

纳粹认为新思想的自由表达是危险的

有趣的是,我看到鲁道夫·斯坦纳是最被禁止的作家之一。现在在德国和美国有许多“鲁道夫·斯坦纳学校”。鲁登道夫是第一次世界大战中最著名的德国军事领导人之一,后来参与了企图在慕尼黑刺杀希特勒的政变,但没有成功。他的书被禁并不奇怪。

这里列出的相对温和的书名显示了纳粹对任何与历史、神话、道德和性有关的书籍的担忧(《凯撒琳》、《阿佛洛狄忒》、《女人的性生活》、《大罪》)。

一个特别奇怪的标题是“使用高频波来看起来更年轻”。“我猜这本书违背了纳粹党在科学研究上的立场。

哪些作者和话题被禁最多?

最后,我们将使用一个树形图来查看最常被禁作者的标题中最常使用的单词。我们应该能够大致了解每个作者写的标题类型。

*df%>%
  filter(name != 'unknown')%>%
  unnest_tokens(word, title)%>%
  anti_join(custom_stops)%>%
  count(name, word, sort=T)%>%
  group_by(name)%>%
  slice(which.max(n))%>%
  arrange(desc(n))%>%
  head(200)%>%
  treemap(index = c('name', 'word'), 
          align.labels = list(c("left", "top"), c("center", "bottom")),
          vSize='n', 
          type='index', 
          vColor='white',
          fontsize.labels = c(6,6),
          fontcolor.labels=c("black","white"),
          title='Frequent Words by Author')*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

抹去犹太历史

矩形的大小与作者的禁书数量成正比。我们可以看到西奥多·亨德里克·范德维尔德(一位荷兰妇科医生和人体体温曲线的部分发现者)写了一些关于婚姻的书(何鄂),而齐格弗里德·利希滕斯塔滕经常写一些与犹太教相关的话题。他出版的作品涉及犹太历史、法律和习俗的政治问题。可悲的是,根据维基百科,他于 1942 年在 Theresienstadt 的犹太人区被谋杀。我鼓励你谷歌一下这些人,了解更多关于他们的作品和想法。

当心那些限制社会自由表达思想的政客或政党,尤其是那些与特定群体的历史和文化相关的思想。

这份书单强调了这样一个事实,即看似与政治无关的话题,如道德故事和神话,可以被当权者挪用和利用来控制流行话语,并使反对的观点远离年轻人,他们可能会愿意反抗这一制度。如果政党叙事被推得足够用力、足够长久,人们就会开始相信它。也许这是奥威尔的《1984 年》背后的灵感。

不管你对某些媒体出版商的看法如何,比如《纽约时报》或 CNN,下次有政治人物说他们是“人民的敌人”时,你应该提醒自己,纳粹使用了同样的策略来实施最令人发指的反人类罪行之一,并使世界陷入有史以来最具破坏性的战争之一。

原载于 2018 年 8 月 14 日https://greenet 09 . github . io*。*

数据分析:你曾经想知道的关于 UFO 目击的一切

原文:https://towardsdatascience.com/data-analysis-everything-youve-ever-wanted-to-know-about-ufo-sightings-e16f2ed34151?source=collection_archive---------6-----------------------

实践教程

NUFORC UFO 目击数据的趋势分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Jaredd Craig on Unsplash

如果文字数据外星人让你感兴趣,那你来对地方了。在本帖中,我们挖掘了 80,000+ NUFORC ( 国家 UFO 报告中心)的 UFO 目击报告。在调查过程中,我们将使用 R 中的许多方法,从树形图、棒棒糖图和网络图到地理图,甚至一些统计测试。

我们能从中学到什么?至少,如果我们想最大化我们看到不明飞行物的机会,我们可以学习在哪里和什么时候寻找一个。您甚至可能会学到一些清理和可视化数据的漂亮的 R 技巧。你可以在 NUFORC 访问这里的数据。

我的 UFO 故事

自从我三年级在光天化日之下看到不明飞行物后,我就对外星人和不明飞行物感兴趣。事情是这样的。

这只是加州拉梅萨当地公园的又一个周日下午。那年一定是 1993 年左右。当我和我的伙伴在玩滑板的时候,天空中的一些东西吸引了我的注意。我们抬头看着一个闪亮的银色圆盘毫不费力地静静地在蓝天上盘旋,瞬间穿过整片云层。我不是说它移动得很快。我的意思是它没有移动——它只是出现在不同的位置。我能描述它的最好方式是想象拿一支铅笔在一张二维纸上戳洞。如果你面对着纸,没有意识到铅笔在纸后面移动,这些洞就会“瞬间”出现。事实上,铅笔只是在另一个“隐藏的”第三维空间中移动。

不明飞行物也离我们不远,在你可能会看到一架直升机的高度。我清楚地记得太阳照射在飞行器金属外壳上的样子——就像电影里的 UFO 和你在当地新闻中听到的一样。震惊之余,我们跑去告诉了困惑但好奇的父母,他们随后过来和我们一起看了十分钟左右。总之,我相信我们至少有五个证人。最终,不明飞行物以一种只能被描述为物理上不可能的超高速飞行般的速度飞入大气层。它就这样消失了,就像一片灰尘被吸进了一根管子里。

数据分析能帮助我们弄清不明飞行物的奥秘吗?

从那以后,我试图弄清楚不明飞行物到底是什么。一个政府会蠢到大白天在圣地亚哥测试高度先进的秘密技术吗?不太可能。让我们看看是否能找到任何可能帮助我们决定不明飞行物确实是人类还是外星人的东西。

数据清理和计数

library(tidyverse)
library(tidytext)
library(ggmap)
library(stringr)
df **<-** read.csv('ufo.csv', stringsAsFactors **=** **FALSE**)

*#delete any cities with punctuation. focus on US*
*#if you put df[which...] then you get a data frame back. we just want vector of indices*
bad **<-** which(str_detect(df**$**city, '[[:punct:]]'))

df **<-** df[**-**bad,]

df **%>%**
  count(city, state, shape)**%>%**
  arrange(desc(n))**%>%**
  head()## # A tibble: 6 x 4
##          city state shape     n
##         <chr> <chr> <chr> <int>
## 1     seattle    wa light   113
## 2     phoenix    az light    90
## 3   san diego    ca light    78
## 4    portland    or light    77
## 5   las vegas    nv light    68
## 6 los angeles    ca light    63

现在,我们可以使用伟大的 tidytext 包来深入研究报告,看看我们能在文本描述中找到什么。

big **<-** df **%>%**
  unnest_tokens(word, comments, token**=**'ngrams', n**=**2)**%>%**
  anti_join(stop_words)**%>%**
  count(word, sort**=TRUE**)*#solve problem of bigrams with stop words*
bigrams_separated **<-** big **%>%**
  separate(word, **c**("word1", "word2"), sep **=** " ")

*#keep only alphabetical words and longer than 2 letters*
bigrams_filtered **<-** bigrams_separated **%>%**
  filter(**!**word1 **%in%** stop_words**$**word) **%>%**
  filter(**!**word2 **%in%** stop_words**$**word)**%>%**
  filter(str_detect(word1, '[[:alpha:]]'))**%>%**
  filter(str_detect(word2, '[[:alpha:]]'))**%>%**
  filter(nchar(word1) **>** 2)**%>%**
  filter(nchar(word2) **>** 2)**%>%**
  filter(word1 **!=** 'ufo')**%>%**
  filter(word2 **!=** 'ufo')

*#most common types of lights seen*
lights **<-** bigrams_filtered **%>%**
  filter(word2 **==** 'light' **|** word2 **==** 'lights')**%>%**
  unite('bigram', **-**n, sep**=**' ')

*#What type of shapes?*
shapes **<-** bigrams_filtered **%>%**
  filter(word2 **==** 'shape' **|** word2 **==** 'shaped')**%>%**
  unite('bigram', **-**n, sep**=**' ')

*#movement*
mvt **<-** bigrams_filtered **%>%**
  filter(word2 **==**'movement' **|** word2 **==** 'movements')**%>%**
  unite('bigram', **-**n, sep**=**' ')

speed **<-** bigrams_filtered **%>%**
  filter(word2 **==** 'speed' **|** word2 **==** 'speeds')**%>%**
  unite('bigram', **-**n, sep**=**' ')

用树形图可视化 UFO 特征

树形图的工作原理是使矩形的面积与数据帧中的某个变量成比例。在这种情况下,我们有二元模型的计数,所以我们将设置矩形的大小来反映每一对的计数。希望这能告诉我们一些关于不明飞行物最常见特征的有趣的事情。

*# treemap. the size of the box is proportional to its count among all lights*
treemap(speed,
            index**=**"bigram",
            vSize**=**"n",
            type**=**"index",
            fontsize.labels **=** 6,
            title**=** 'UFO Speed Words'
            )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

正如我所料,大多数人说不明飞行物以令人难以置信的速度移动。我喜欢对“曲速”的描述我会说我看到的不明飞行物也以违反物理定律的速度移动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

似乎有一个明确的模式不明飞行物有不稳定和不寻常的运动。

treemap(shapes,
            index**=**"bigram",
            vSize**=**"n",
            type**=**"index",
            fontsize.labels **=** 6,
            title**=** 'UFO shape Words'
            )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

有趣的是,许多雪茄形和三角形的不明飞行物。我以前从未听说过人字形/回飞镖形的不明飞行物。

treemap(lights,
            index**=**"bigram",
            vSize**=**"n",
            type**=**"index",
            fontsize.labels **=** 6,
            title**=** 'UFO Lights Words'
            )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

看起来大多数看到的光不是白光、橙光、红光就是蓝光。

用棒棒糖图显示州和城市

表示相同信息的另一种方式是棒棒糖图。这些本质上是看起来更光滑的条形图,其中条形的长度与我们的数据框架中的某一列成比例。请记住,在 ggplot2 中,我们使用 aes()参数将变量(即列)映射到我们的图中。这是 ggplot 极其有用的一个方面。

*#city state counts of sightings*
state_counts **<-** df **%>%**
  filter(state **!=** '')**%>%**
  count(city, state, sort**=TRUE**)**%>%**
  unite('location', **-**n, sep**=**',')

*#visualize with lollipop chart*
state_counts **%>%**
  filter(n **>** 90)**%>%**
  mutate(x **=** factor(location))**%>%**
  ggplot(aes(x, n))**+**
  geom_segment(aes(x**=**reorder(x,n), xend**=**x, y**=**0, yend**=**n), size**=**1)**+**
  geom_point(color**=**'red', size**=**2, alpha**=**.6)**+**
  coord_flip()**+**
  theme_minimal() **+** 
  theme(axis.text.y **=** element_text(size **=** 7))**+**
  labs(title**=**'Which cities have had the most sightings?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

*#count cities and shape*
*#seattle fireballs sounds like a basketball team*
*#get rid of others because they don't contain useful info*
df **%>%**
  filter(**!**shape **%in%** **c**('', 'unknown', 'other', 'light'))**%>%**
  count(city, shape, sort**=TRUE**)**%>%**
  filter(n **>** 20)**%>%**
  unite('type', **-**n, sep**=**' ')**%>%**
  mutate(type **=** factor(type))**%>%**
  ggplot(aes(type, n))**+**
  geom_segment(aes(x**=**reorder(type,n), xend**=**type, y**=**0, yend**=**n), size**=**1)**+**
  geom_point(color**=**'red', size**=**2, alpha**=**.6)**+**
  coord_flip()**+**
  labs(title**=**'What shapes are most commonly seen in each location?',
       x **=** 'City and Type of Shape', y**=**'# of sightings')**+**
  theme_minimal()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

使用 lubridate 寻找随时间变化的模式

lubridate 包很棒。它使处理日期和时间变得容易。如果您熟悉 xts 或 ts 对象,您会知道在 R 中处理日期和时间可能很麻烦。

一个非常方便的函数是 floor_date(),它允许您将观察结果汇总到多个时间段中。这类似于你如何在直方图中选择仓位大小,但这里我们选择的是考虑“仓位”或“桶”的时间间隔当您更改间隔(即时间单位)时,您会看到随着数据缩放级别的变化出现不同的模式。您需要运用自己的判断来找出哪种级别的聚合最适合您的需求。

library(lubridate)

*#biggest single events reported one time tinley park 17 counts*
df**$**datetime **<-** mdy_hm(df**$**datetime)

*#1 year intervals*
df **%>%**
  mutate(datetime **=** floor_date(datetime, unit**=**'1 year'))**%>%**
  group_by(datetime)**%>%**
  filter(datetime **>** '1939-01-01')**%>%**
  summarize(cts **=** n())**%>%**
  ggplot(aes(datetime, cts))**+**
  geom_line()**+**
  scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y') **+** theme(plot.subtitle **=** element_text(vjust **=** 1), 
    plot.caption **=** element_text(vjust **=** 1), 
    panel.background **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "UFO Sightings Since 1939", 
    x **=** "Date", y **=** "Sightings")*#which states have the most sightings?* 
*#ca, wa, fl, tx, ny*
df **%>%**
  count(state, sort**=**T)**%>%**
  slice(1**:**10)

    *## # A tibble: 10 x 2*
    *##    state     n*
    *##    <chr> <int>*
    *##  1    ca  8998*
    *##  2    wa  3949*
    *##  3    fl  3792*
    *##  4    tx  3445*
    *##  5    ny  2635*
    *##  6    il  2460*
    *##  7    az  2454*
    *##  8    pa  2406*
    *##  9    oh  2301*
    *## 10    mi  1930*

加利福尼亚、华盛顿和佛罗里达是不明飞行物最多的地方。考虑到他们庞大的人口,这并不奇怪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

*#top 10 states by sightings*
df **%>%**
  mutate(datetime **=** floor_date(datetime, unit**=**'1 year'))**%>%**
  group_by(datetime, state)**%>%**
  filter(datetime **>** '1950-01-01')**%>%**
  filter(state **%in%** **c**('ca', 'wa', 'fl', 'tx','ny', 'il','az','pa','oh','mi'))**%>%**
  summarize(cts **=** n())**%>%**
  ggplot(aes(datetime, cts, color**=**state), alpha**=**.5)**+**
  geom_line(size**=**1)**+**
  scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y') **+** 
  theme(plot.subtitle **=** element_text(vjust **=** 1), 
    plot.caption **=** element_text(vjust **=** 1), 
    panel.background **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "UFO Sightings Since 1950", 
    x **=** "Date", y **=** "Sightings")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

尽管华盛顿在 20 世纪 90 年代中期仅仅接管了一年左右的时间,但加州在目击事件方面占据了主导地位。哪些城市见过最多的不明飞行物呢?

*#which cities?*
cities **<-** df **%>%**
  count(city, sort**=**T)**%>%**
  slice(1**:**10)

cities **<-** cities[,1]
cities

    *## # A tibble: 10 x 1*
    *##           city*
    *##          <chr>*
    *##  1     seattle*
    *##  2     phoenix*
    *##  3    portland*
    *##  4   las vegas*
    *##  5 los angeles*
    *##  6   san diego*
    *##  7     houston*
    *##  8     chicago*
    *##  9      tucson*
    *## 10       miami*

在最受欢迎的 UFO 地点,UFO 目击事件随着时间的推移发生了怎样的变化?

*#tracking 10 cities*
df **%>%**
  mutate(datetime **=** floor_date(datetime, unit**=**'5 years'))**%>%**
  group_by(datetime, city)**%>%**
  filter(datetime **>** '1970-01-01')**%>%**
  filter(city **%in%** **c**('seattle', 'phoenix','portland', 'san diego', 'los angeles', 'houston', 'las vegas', 'chicago', 'tucson', 'miami'))**%>%**
  summarize(cts **=** n())**%>%**
  ggplot(aes(datetime, cts, color**=**city), alpha**=**.8)**+**
  geom_line(size**=**1)**+**
  scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y') **+** 
  theme(plot.subtitle **=** element_text(vjust **=** 1), 
    plot.caption **=** element_text(vjust **=** 1), 
    panel.background **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "5 year aggregate UFO Sightings Since 1970", 
    x **=** "Date", y **=** "Sightings")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

我们可以看到,随着时间的推移,所有顶级城市的游客数量都经历了大致相同的增长。西雅图和凤凰城是一年中最多的。奇怪的是,自 2008 年以来,目击事件似乎减少了。

随着时间的推移,不明飞行物的形状发生了怎样的变化?雪茄形状的不明飞行物和圆盘形状的一样常见吗?

*#how have shapes changed over time? 1 year aggregrates*
df **%>%**
  mutate(datetime **=** floor_date(datetime, unit**=**'1 year'))**%>%**
  filter(datetime **>** '1950-01-01')**%>%**
  group_by(datetime, shape)**%>%**
  filter(**!**shape **%in%** **c**('', 'changed', 'changing', 'other', 'unknown'))**%>%**
  summarize(cts **=** n())**%>%**
  ggplot(aes(datetime, cts, color**=**shape))**+**
  geom_line(size**=**1, alpha**=**.6)**+**
  scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y')**+**
  theme_minimal()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

看起来现在灯是最常见的了,尽管以前并不总是这样。过去磁盘占主导地位。

让我们来看看每种形状的比例,而不是计数:

*#5 year intervals proportion of shapes sighted*
df **%>%**
  mutate(datetime **=** floor_date(datetime, unit**=**'5 years'))**%>%**
  filter(datetime **>** '1950-01-01')**%>%**
  group_by(datetime, shape)**%>%**
  filter(**!**shape **%in%** **c**('', 'changed', 'changing', 'other', 'unknown'))**%>%**
  summarize(cts **=** n())**%>%**
  mutate(freq **=** cts**/sum**(cts))**%>%**
  filter(freq **>** .05)**%>%**
  ggplot(aes(datetime, freq, color**=**shape))**+**
  geom_line(size**=**1)**+**
  scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y')**+**
  theme_minimal()**+**
  labs(title**=**'Freq of shape in 5 year aggregate sightings since 1950')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

自 20 世纪 50 年代以来,圆盘的受欢迎程度大幅度下降,而三角形在 20 世纪 80 年代后期上升到顶峰,然后最终被光取代。球形和圆形一直稳定在所有目击事件的 10%左右。

在过去的 50 年里,加利福尼亚的形状发生了怎样的变化?

df **%>%**
  mutate(datetime **=** floor_date(datetime, unit**=**'10 years'))**%>%**
  filter(datetime **>** '1950-01-01')**%>%**
  group_by(datetime, shape, state)**%>%**
  filter(state **==** 'ca')**%>%**
  filter(**!**shape **%in%** **c**('', 'changed', 'changing', 'other', 'unknown'))**%>%**
  summarize(cts **=** n())**%>%**
  ungroup()**%>%**
  group_by(datetime, add**=TRUE**)**%>%**
  mutate(freq **=** cts**/sum**(cts))**%>%**
  filter(freq **>** .05)**%>%**
  ggplot(aes(datetime, freq, color**=**shape))**+**
  geom_line(size**=**1, alpha**=**.6)**+**
  scale_x_datetime(date_breaks **=** '20 years', date_labels **=** '%Y')**+**
  facet_wrap(**~** state)**+**
  theme_minimal()**+**
  labs(title**=**'Freq of shape in 10 year aggregate sightings since 1950')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

外卖食品

  1. 磁盘在 20 世纪 50 年代达到顶峰,现在几乎没有出现过。
  2. 直到 20 世纪 70 年代末,灯才出现,然后爆炸了。
  3. 三角形似乎在 20 世纪 80 年代末达到了顶峰。
  4. 直到 20 世纪 80 年代末和 90 年代初,火球术越来越受欢迎,然后受到了一点打击,又恢复了。也许是飞碟绑架电影天空之火的结果?
  5. 雪茄在 20 世纪 60 年代绝迹了。外星人的租约到期了,他们换了灯?

UFO 目击事件是季节性的吗?

目击事件有日常模式吗?一天中的什么时间最有可能看到不明飞行物?我们将使用来自 lubridate 的超级有用的函数,这些函数从我们创建的 datetime 对象中提取不同的时间片段。一旦我们改变了新的列,就很容易对这些时间进行分组,并制作出漂亮的视觉效果。

df **<-** df **%>%**
  mutate(day **=** day(datetime),
         month **=** month(datetime),
         year **=** year(datetime),
         hour **=** hour(datetime))

现在我们准备开始分组和可视化。

*#I'm only showing 24 years' of data here due to size limits. But the same pattern persists up till 2014.*
df **%>%**
mutate(month **=** factor(month), 
day **=** factor(day))**%>%**
filter(between(year, 1950, 1974))**%>%**
group_by(year, month)**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(month, cts, group**=**year))**+**
geom_line()**+**
facet_wrap(**~** year, ncol **=** 5, scales **=** 'free_y')**+**
labs(title**=**'Are UFO sightings seasonal? Apparently yes')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

这真的出乎意料:不明飞行物非常季节性!几乎每年都有相同的目击分布,几乎每年的六月到七月都有一个高峰。这怎么解释呢?

一天中的时间呢?更多的目击事件发生在早上还是晚上?

df **%>%**
group_by(day, hour)**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(hour, cts, group**=**day))**+**
geom_line()**+**
facet_wrap(**~** day)**+**
labs(title**=**'Does time of UFO sighting depend on the day of the month?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

我很惊讶,大多数目击事件发生在晚上 9-11 点左右。当然,在晚上我们的视力不好,天空中有太多其他东西争夺我们的注意力。

另外,看看上面图表中可见的两个峰值:一是 4 日的大峰值,一是 1 日午夜左右的大峰值。我们将很快解释这些。

我现在意识到我白天的目击事件非常罕见。有多稀有?让我们估计一下下午 3 点看到不明飞行物的概率。

df **%>%**
count(hour)**%>%**
mutate(freq **=** n**/sum**(n),
cum_prob **=** **cumsum**(freq))**%>%**
slice(15**:**17)## # A tibble: 3 x 4
##    hour     n       freq  cum_prob
##   <int> <int>      <dbl>     <dbl>
## 1    14  1042 0.01588608 0.3131784
## 2    15  1147 0.01748689 0.3306653
## 3    16  1282 0.01954507 0.3502104*#plot the estimated cumulative probability of sightings by hour in the day*
df **%>%**
count(hour)**%>%**
mutate(freq **=** n**/sum**(n),
cum_prob **=** **cumsum**(freq))**%>%**
ggplot(aes(hour, cum_prob))**+**
geom_area(alpha **=** .5)**+**
geom_vline(xintercept **=** 15, color**=**'red')**+**
geom_hline(yintercept **=** .33, color**=**'red')**+**
labs(title**=**'Estimated cumulative probability of UFO sightings by hour in the day')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

显然,只有大约 1.7%的目击事件发生在下午 3-4 点之间。我们还可以看到,只有大约 33%的目击事件发生在午夜和下午 3 点之间。绝大多数发生在晚上 8-10 点之间。更具体地说,近 50%的目击事件(实际上我应该说目击报告)发生在晚上 8 点和午夜之间。

那星期几呢?更多的目击事件发生在周末吗?我在一个周日的下午看到了我的。我们将使用 lubridate 有用的 wday()来获取当天的名称。

library(stringr)
df **%>%**
mutate(dow **=** wday(datetime, label**=**T))**%>%**
count(month, dow)**%>%**
ggplot(aes(dow, n, fill**=**dow))**+**
geom_col()**+**
guides(fill**=FALSE**)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

周六和周日的目击事件确实大幅上升。但是这种情况总是在所有月份都存在吗?如果你熟悉辛普森悖论,那么你就会知道,有时候汇总结果可能与分组结果完全不一致。

df **%>%**
mutate(dow **=** wday(datetime, label**=**T))**%>%**
count(month, dow)**%>%**
ggplot(aes(dow, n, fill**=**dow))**+**
geom_col()**+**
facet_wrap(**~** month)**+**
guides(fill**=FALSE**)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

不出所料,周末会有更多的目击事件。有更多的时间凝视天空和喝酒,所有这些都可以解释目击事件的增加。这一周的逐渐增加的浏览量类似于你在零售销售中看到的情况。周一是缓慢的,然后购物在一周内加快,周末是最大的高潮。这在我看来,这种现象更多的是人们每周日程/习惯的作用,而不是任何真正的外星现象。

这个周末的撞击是偶然的吗?让我们对一周中的某一天进行卡方显著性检验。我们将假设目击事件在一周的任何一天都同样可能发生。

cn **<-** df **%>%**
mutate(dow **=** wday(datetime, label**=**T))**%>%**
count(dow)**%>%**
ungroup()
cn

    *## # A tibble: 7 x 2*
    *##     dow     n*
    *##   <ord> <int>*
    *## 1   Sun  9533*
    *## 2   Mon  8191*
    *## 3   Tue  8856*
    *## 4   Wed  9053*
    *## 5   Thu  8989*
    *## 6   Fri  9477*
    *## 7   Sat 11493*

	*#Goodness of fit test:* 
*#Null hypothesis: Each day is equally likely for a UFO sighting*
*#What is the probability of getting the observed DOW counts we did under this condition?*
chisq.test(cn**$**n)

    *##* 
    *##  Chi-squared test for given probabilities*
    *##* 
    *## data:  cn$n*
    *## X-squared = 687.82, df = 6, p-value < 2.2e-16*

是的,几乎可以肯定的是,假设发生概率相等的零假设,周末的目击率大大高于工作日。

UFO 目击事件在特定月份的不同时间发生吗?

df **%>%**
group_by(state)**%>%**
filter(state **%in%** **c**('ca', 'wa', 'tx', 'fl', 'ny'))**%>%**
count(hour,month)**%>%**
ggplot(aes(hour, n, color**=**state))**+**
geom_line()**+**
facet_wrap(**~** month)**+**
theme_minimal()**+**
labs(title**=**'Why does July have a big spike?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

这张图表向我们展示了排名前五的州,全天都有相似的 UFO 目击时间。然而,在 7 月份,我们注意到晚上 8 点以后出现了更多的目击事件。这可能与 7 月 4 日假期有关吗?更多的人在外面看着天空放烟花,也许?

df **%>%**
group_by(state)**%>%**
filter(state **%in%** **c**('ca', 'wa', 'tx', 'fl', 'ny'))**%>%**
count(hour,month,day)**%>%**
ggplot(aes(day, n, color**=**state))**+**
geom_line(size**=**1.5)**+**
facet_wrap(**~** month)**+**
labs(title**=**'People apparently can\'t tell fireworks and UFOs apart')**+**
theme_minimal()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

令人失望的结论:烟花被误认为不明飞行物

目击人数最多的两天确实是 7 月 4 日和新年前夕,这两天有成千上万的人向夜空燃放烟花。我曾希望在年中出现神秘的目击高峰会有一个更酷的原因——但结果很可能只是人们把烟花误认为外星人的飞船。

UFO 目击事件中唯一的循环模式是美国人每周的例行公事。我在这里没有看到太多的证据表明,人们看到的不明飞行物超出了他们的预期,因为他们在周末和假期增加了休闲时间和饮酒量。

本节结束后,让我们回到文本描述,看看我们是否能在那里找到感兴趣的东西。

使用网络可视化在 UFO 描述中寻找模式

这个 igraphggraph 包将在这里帮助我们。我强烈推荐大卫·罗宾逊和茱莉亚·西尔格免费的《T4》杂志。

*#need 3 things after have igraph object: node edges and labels*
library(igraph)library(ggraph)big_graph **<-** bigrams_filtered **%>%**
  filter(n **>** 200)**%>%**
  graph_from_data_frame()

*#for some reason the edge_alpha argument isn't changing. It should make alpha levels proportional to the number of occurrences in the text.*
a **<-** grid**::**arrow(type **=** "open", length **=** unit(.05, "inches"))

ggraph(big_graph, layout **=** "fr") **+**
  geom_edge_link(aes(edge_alpha **=** n), show.legend **=** **FALSE**,
                 arrow **=** a, end_cap **=** circle(.07, 'inches')) **+**
  geom_node_point(color **=** "red", size**=**2) **+**
  geom_node_text(aes(label **=** name), vjust **=** 2, hjust **=** 1) **+**
  theme_void()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

这张图表很好地概述了不明飞行物的主要描述。箭头的方向指示该单词是二元组对中的第一个还是第二个单词。

不明飞行物热点的地理可视化

为了总结我们的分析,让我们把重点放在地理位置上,看看我们是否能在目击事件中找到任何“热点”或模式。

为了使用纬度和经度绘图,我们将遵循我在 ggmaps 教程中概述的相同策略。首先,groupby()位置,然后平均每个城市的纬度和经度。如果你想知道这是怎么做到的,请点击这里

注意:我相信谷歌地图已经改变了他们的 API。现在你必须注册进入。

us_map **<-** get_map('USA', zoom **=** 3,maptype **=** 'satellite')**%>%**
  ggmap()
us_map

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

*#cities with over 50 sightings*
over_50 **<-** df **%>%**
  count(city,state)**%>%**
  filter(n **>** 1)**%>%**
  unite('location', **-**n, sep**=**',')
head(over_50)## # A tibble: 6 x 2
##       location     n
##          <chr> <int>
## 1  29 palms,ca     2
## 2 abbeville,la     4
## 3 abbeville,sc     2
## 4  aberdeen,md     5
## 5  aberdeen,nj     2
## 6  aberdeen,sd     2*#Now it's in the shape we need to plot. Not gunna lie: this took me like 10 mins to get working*
lat_long **<-** df **%>%**
  unite('location', **c**('city','state'), sep**=**',')**%>%**
  filter(location **%in%** over_50**$**location)**%>%**
  mutate(latitude **=** **as.numeric**(latitude),
         longitude **=** **as.numeric**(longitude))**%>%**
  group_by(location)**%>%**
  summarize(lon **=** mean(longitude, na.rm**=TRUE**),
            lat **=** mean(latitude, na.rm**=TRUE**),
            cts **=** n())**%>%**
  ungroup()
head(lat_long)## # A tibble: 6 x 4
##       location        lon      lat   cts
##          <chr>      <dbl>    <dbl> <int>
## 1  29 palms,ca -116.05417 34.13556     2
## 2 abbeville,la  -92.13417 29.97444     4
## 3 abbeville,sc  -82.37917 34.17806     2
## 4  aberdeen,md  -76.16444 39.50944     5
## 5  aberdeen,nj  -74.22212 40.41710     2
## 6  aberdeen,sd  -98.48611 45.46472     2

我们已经准备好将我们的数据框架覆盖在我们的国家地图上。

us_map **+**
  geom_point(data**=**lat_long, aes(lon, lat, color**=**cts, size**=**cts, alpha**=**cts))**+**
  scale_color_gradient(low**=**'blue', high**=**'red')**+**
  guides(color**=FALSE**)**+**
  labs(title**=**'US UFO sightings since 1944')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

除了大多数目击事件发生在沿海大城市(大多数人居住的地方),有趣的是在中西部看到一个很大的垂直差距,那里几乎没有目击事件发生。我想知道地理特征(山脉/河流)是否在起作用。几乎有一条垂直线将美国分成两半。

堪萨斯州、内布拉斯加州、南达科他州和北达科他州的不明飞行物在哪里?在内华达州北部和爱达荷州,也有一个观察缺口。

我们能放大看得更清楚吗?

us_idaho **<-** get_map('Idaho, USA', zoom**=**5, maptype **=** 'satellite')**%>%**
  ggmap()

us_idaho **+**
  geom_point(data**=**lat_long, aes(lon, lat, color**=**cts, size**=**cts, alpha**=**cts))**+**
  scale_color_gradient(low**=**'blue', high**=**'red')**+**
  guides(color**=FALSE**)**+**
  labs(title**=**'Why no UFOs in Idaho?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

显然,人口越多,目击的机会就越多。可能是人口相对稀少的地区导致了这种现象。也有可能是不明飞行物厌恶土豆。我不确定我们是否会知道。目前,我坚持土豆假说。

能否将不同地区的关键词可视化?

为了做到这一点,我们将查看每个地区最常见的单词。

library(ggrepel)words_map **<-** df **%>%**
  unite('location', **c**('city','state'), sep**=**',')**%>%**
  unnest_tokens(words, comments)**%>%**
  filter(**!**words **%in%** stop_words**$**word) **%>%**
  filter(**!**words **%in%** **c**('las', 'los', 'san', 'quot', 'diego', 'sky', 'angeles', 'object',
                       'light', 'lights', 'beach', 'jose', 'francisco', 'antonio',
                       'tinley', 'myrtle', 'salt', 'texas', 'bright',
                       'moving', 'monica', 'colorado', 'city', 'barbara','flying',
                       'shaped', 'shape', 'santa', 'object', 'objects', 'craft',
                       'moved', 'alaska', 'downtown', 'north', 'south', 'east', 'west',
                       'rapids','sighting', 'cajon', 'simi', 'boca', 'paso',
                       'lauderdale', 'grand', 'puget', 'nuforc', '39s', 
                       'looked', 'nyc', 'obj', 'cruz', 'missouri','springs', 'note',
                       'appeared', 'hotel', 'night', 'park', 'red', 'palm',
                       'des', 'moines'))**%>%**
  filter(str_detect(words, '[[:alpha:]]'))**%>%**
  filter(nchar(words) **>** 2)**%>%**
  filter(words **!=** 'ufo')**%>%**
  filter(**!**words **%in%** df**$**city)**%>%**
  count(location, words, sort**=**T)**%>%**
  filter(n **>** 12)**%>%**
  inner_join(lat_long, by**=**'location')
head(words_map)## # A tibble: 6 x 6
##       location     words     n       lon      lat   cts
##          <chr>     <chr> <int>     <dbl>    <dbl> <int>
## 1   seattle,wa     sound    37 -122.3308 47.60639   524
## 2   seattle,wa     green    35 -122.3308 47.60639   524
## 3   seattle,wa  hovering    27 -122.3308 47.60639   524
## 4   phoenix,az formation    24 -112.0733 33.44833   450
## 5   seattle,wa      fast    24 -122.3308 47.60639   524
## 6 las vegas,nv     green    23 -115.1364 36.17500   363us_map **+**
  geom_point(data**=**words_map, aes(lon, lat, alpha**=**n, size**=**n), color**=**'red')**+**
  geom_text_repel(data **=** words_map, aes(label **=** words, size**=**n), color**=**'green')**+**
  labs(title**=**'Key words from UFO sightings around the US')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

概述结果

首先,你应该注意到我去掉了单词“红”和“夜”,以便为其他可能更有意义的单词腾出空间。所以如果你在晚上看到一些红色的东西,很有可能是不明飞行物。

第二,我们看到快速发光的火球似乎在西雅图更常见。尽管在德克萨斯州南部似乎也有许多绿色火球。顺便说一下,西雅图火球会成为一个很棒的 NBA 队名。随便说说。

看看哪些地区见证了 UFO 的形成也是很有趣的。看起来加州哈瓦苏湖和亚利桑那州凤凰城附近的地区更容易看到不明飞行物。

解释爱达荷州附近没有不明飞行物的最终理论…

不明飞行物不多的区域似乎位于 51 区声称存在的大致区域,这只是巧合吗?大概不会。大部分地形都是沙子和山脉,周围很少有人能看到不明飞行物。如果我们发现一个人口非常少但有很多 UFO 目击事件的地方,我会非常惊讶。这表明那里发生了不正常的事情。

m **<-** get_map('Groom Lake, Nevada', zoom **=** 6, maptype**=**'terrain')**%>%**
  ggmap()

m **+** geom_point(data**=**lat_long, aes(lon, lat, color**=**cts, size**=**cts))**+**
  scale_color_gradient(low**=**'blue', high**=**'red')**+**
  guides(color**=FALSE**)**+**
  labs(title**=**'Sightings surrounding Area 51')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image by Author

初步结论

根据这张图表,似乎没有任何无人居住的地区有大量的不明飞行物:不明飞行物报告基本上是有更多的人在周围进行不明飞行物报告的功能-而不是不明飞行物的任何潜在增加。这向您展示了没有因果知识的纯数据分析的局限性:垃圾进,垃圾出。我要说的是,这些报告中很大一部分可能是误报。

当我们发现 7 月 4 日和新年前夕的烟花是导致报告数量激增的原因时,我对报告的质量失去了很多信心。事实上,在周末有更多的报道也是可疑的。大多数报告可能只是人们有更多空闲时间的结果。此外,考虑到人们看到的大量“光”,它们可能有太多的可能性。

同样令人不安的是,几乎再也看不到“雪茄形”或“盘形”飞碟了。以我的钱来说,我只会相信发生在白天和晴朗的天气条件下的目击事件。

很明显,真相仍然存在。

面向所有人的数据分析介绍,第 2 部分

原文:https://towardsdatascience.com/data-analysis-for-everyone-part-2-cf1c79441940?source=collection_archive---------7-----------------------

在上一部分中,我们讨论了分析师成为全面的分析师或数据科学家所需的软技能。我们希望您有机会阅读它,因为它为您的所有团队成员奠定了一个很好的基础。

下一节将讨论商业分析的过程。这将有助于数据科学团队和分析师改善沟通和工作的可追踪性,并提高速度和清晰度。

重要更新!: 普华永道(PwC)最近公布的研究显示,雇主在寻找优秀的数据科学家、分析师和工程师方面面临困难。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Picture is from the PwC article linked above

我们将做一些快速的代码片段和笔记本。在这种情况下,我们将使用 Jupyter 笔记本。我们正在做的许多工作也可以在 Excel 或 r 中完成。

对于那些没有使用过 Jupyter 笔记本的人,这里有一个快速介绍。

数据科学指南

我们想补充的是,这一节的重点是规划流程,我们将在接下来的几节中提供需要解决的问题和更具体的演练。

像大多数其他学科(会计、金融、运营、软件开发)一样,数据科学家应该在工作中采用方法论。我们正在规划的过程绝不是唯一的过程,我们也不会每次都遵循它。然而,它确实有助于通过创建单个分析师可以满足的界限和目标来提高速度和减少错误。

类似于许多其他过程,总是有适应和添加个人步骤的回旋余地(像敏捷)。我们的团队使用这个过程更像是指导方针。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本节的目标是

分析结束时的目标是你的数据团队能够清晰地传达他们的想法,并且他们能够复制他们的方法。介于两者之间的是数据科学团队。只要能让它们有效,就是目标,只是不要欺骗你自己。

如果你告诉自己不需要笔记或评论,那你就是在撒谎。

如果你认为格式不重要,那你是在自欺欺人。

如果你认为其他人不够聪明,不能理解你的分析…记住…爱因斯坦在 E=mc 中解释了一个复杂得多的过程,连中学生都明白这一点。

所以如果你的分析不能被拥有 MBA 和 20 年经验的高管理解。可能不是他们。这可能是你的分析,即使你的发现非常出色,可以为公司节省数百万美元。解释不了也没关系。

你的分析想必大家都懂!

数据分析的过程

1.开始一个有清晰标签的新笔记本

我们在第一部分讨论过,关键是要注重细节。这需要有条理,并确保第一步是建立一个新的笔记本。

这意味着,没有建立一个名为“无标题 _V1”的笔记本。

确保你的项目有一个清晰的名字。一些分析师和程序员喜欢想出吸引人的名字,比如“乌贼”、“Jaberwoki”或其他一些奇怪但有意义的名字。

我们将把这个 Jupyter 笔记本命名为“创世纪”。仅作为您开始数据分析和数据科学之旅的参考!

此外,写一些关于笔记本用途、用途、修改者等的快速笔记。

这将让 5 年后偶然发现你的数据笔记本的分析师和数据科学家有能力理解它。

然后…建立某种形式的颠覆。你最不想玩的就是,哪个工作本是最近更新的。

NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.

2.召开一个明确的回顾会议或开始

这不是大多数一步一步跟着做的人能够做到的。然而,当设计一个产品、指标、仪表板、做研究或为任何其他团队或企业主甚至你自己的团队设计一个新的数据科学工具时,这是一个关键点。

你需要召开一两次会议来帮助数据团队清楚地了解他们将要承担的工作。再次延伸,回到我们的第一部分。我们在本系列的第一部分讨论了移情倾听。现在是时候开启这项技能了!

商业和技术团队仍然说着截然不同的语言。因此,通晓两种语言是有益的。一个能够倾听不仅仅是硬工程需求的数据科学家是物有所值的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这不是一个普通的技能。有时,很容易从业务团队获得需求,而对请求的实际环境充耳不闻。

然而,这正是所有增值的来源!打造一个产品是伟大的,避免镀金很重要!

然而,这意味着您需要倾听并找出实际的业务问题。这在会议之外很难模拟…实际上,在会议中甚至会很困难。

这意味着问一些好的问题,表明你理解当前的话题,同时寻找隐藏的信息。

以下是数据科学团队应该向产品团队提出的一些示例问题:

  • 谁可以看到这个项目?
  • 我们已经有类似的产品了吗?
  • 我们的数据科学团队需要参与进来吗?还是可以由工程团队来做?(数据科学团队通常资源有限,项目需要有意义)
  • 我们具备完成数据科学项目所需的技能吗?
  • 您正在查看的数据集是什么?
  • 谁会使用这个工具?
  • 有多少人会使用该产品?
  • 你目前知道这个产品的投资回报率吗?(这可能需要你的团队进行研究)
  • 可以列举几个问题吗?让我们知道!

3.探索偏见

在设置问题和设计指标和仪表板之前。我们喜欢寻找偏见,玩弄数据,哪怕只是一点点。我们的团队将根据数据的大小和复杂程度,分配一定的时间来玩游戏。

这是我们寻找偏差、寻找缺失数据、寻找任何可能奇怪的东西的时候。

这有几个目的。

第一,它有助于我们为将来的分析列出可能的问题。

第二,如果数据是坏的,我们尽快找出原因。有时坏数据很容易被发现。如果一半的字段为空,或者如果数值有字母字符,等等。嗯…

是时候重新开始了,希望它不像看起来那么糟糕!

那么如何探索偏倚和不良数据呢?

这里有一些很好的第一步。

导入您的库

NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.

自动化插件:

现在,我还将在这里添加一个奖金部分。这与分析关系不大,与自动化关系更大。还记得我们有一个快速的一行脚本,只提取数据类型和字段名吗?

如果您在数据库中跟踪元数据会怎么样!如果您计划围绕数据集开发一个完整的系统,或者有多个非常相似的数据集需要不断地处理,那么这种方法就更适用了。

我的背景是数据工程,所以这是一个你很早就学会的帮助自动化 ETL 和分析的技巧。尤其是当您从多个具有不同字段名的人那里获得相似的文件时,这些字段名意味着相同的事情。然后,您可以轻松地重新映射,或者轻松地加载,并根据您的标准化方法和它们的字段名进行分析!

【数据透视表】

NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.

直方图

NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.

相关矩阵

NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.

已经可以得出什么结论了?

嗯,我们一直在探索数据,以寻找任何可能突出的东西,这既有助于开始整理我们可能会有的问题,也有助于检查数据中的偏见和不良数据。

你已经得出什么结论了吗?

注意直方图和相关矩阵中的任何东西吗?

我们已经讨论过,我们注意到数据在满意度水平上是向右倾斜的。这是有道理的,因为如果一家公司真的很差,满意度处于中间,并且从那里平均分布。没有人会在那里工作。

当然,它可能只是一个从 0.7 到 1 的高斯分布。这可能更有意义。

然而,我们说的是一群不满意的人。

接下来,看相关矩阵。什么与什么相关?在我看来,最大的关联之一是“左”域和“满意度”域之间的关联。

它们是负相关的。这意味着,满意度越低,“离开”字段就越接近于 1,即表示离开的人。

因此,与员工主动离职实际相关的少数变量之一是“满意度”。你已经有线索了!

这只是一条线索。从这里开始,你的团队会有更多的问题!

你会想分析这两个不同的群体。也许用 IQR 来分离满意度最低的员工…你可以选择一个你觉得合适的数字。

这似乎不太科学…

现在,你可以分析两组并比较特征!

  • 有导致员工离职的事件吗?(没有加薪,过了一周年没有升职,缺乏互动)
  • 不同类型的员工(分析师和主管)在离职前会描绘出不同的特质吗
  • 加薪幅度对员工的离职有影响吗
  • 等等

计算和管理空值或 Nans

目前,我作为例子使用的数据集没有空值。您可以使用这段代码:

s.isnull()。sum()"

这是一种查看和跟踪空值的简单方法。

情况并非总是如此。事实上,我记得我曾经使用过的一组信用卡数据到处都是空值,包括收入水平、消费率等等。

它只占数据的 10%-15%。因此,我们最终找到了特定特征的每个邮政编码的平均值,并替换了空值。而不是排除数据。

这当然是一个有根据的猜测。但是,这是确保尽可能接近准确数据的好方法。

4.列出你想回答的问题

我们在分析的探索阶段开始这样做。让我们继续这个讨论。

一个很容易被忽略的重要步骤是定义您的数据团队想要回答的问题,因为分析有一种将您拖入兔子洞的方式。

团队是由数据科学家、分析师、营销人员还是企业主组成的团队并不重要。

没有一系列的问题,你可能会花上几天的时间在原地打转,却没有真正的结论。

设置问题就像设置目标。它帮助你定义什么是完成。没有它,您可能会不断地进入数据。

也就是说,每回答一个问题,可能会引出 3 个新问题。这很好也很自然。这也是过程的一部分。再次,追踪这些问题!

这样做的目的不仅仅是为了制定目标,也是为了当你的团队开始浏览你的笔记本,并与主管一起发现每个人都很容易遵循。把这个想的更像一本故事书,只是有数据!确保你可以重新追踪你的步骤,这样你就可以重新解释你的分析。

5.使用不同的方法分析数据集

我们新的计算能力。我们不再局限于标准差、数据透视表和五分位数。这些都是很好的分析方法。然而,我们现在有一系列不同的算法和工具可以帮助我们查看数据。

这包括、k-nn、支持向量机、boosting、bagging 和一群其他算法

因为有太多的算法可以深入研究。我们将在未来的几个章节中专门介绍如何将这些不同的算法应用于不同的数据集。来展示它们是如何被使用的。

6.如有必要,联系 SME(主题专家)

作为数据科学家,我们并不总是了解不同主题的一切。也许我们处理过医疗保健数据,但从未处理过会计或电子商务数据。

此外,每家公司存放的数据略有不同。因此,通过获取所有可能的上下文来解决问题是很重要的。

这意味着去找管理这些过程的人。这可能是董事,或者企业主,他们实际上负责你正在分析的过程。他们将对整个过程有一个很好的概述,这将帮助你作为一个分析师理解你正在看的数据。

例如,我们最近与一家旅行报销公司的开发人员交谈,他提到了这样一个事实,即他们的应用程序逻辑只向两个数据库中的一个插入数据。这使得一个数据库不同步。可悲的是,这些错误一直在发生。然而,如果你不去和开发商和导演谈。这就像看一个黑盒子

开发人员注意:当我们来寻找过程中的漏洞时,开发人员请对我们诚实和透明。我们不是想让你难堪…我们只是想找出数据错误的原因。在会议中,我们称之为 bug,我们也不希望你惹上麻烦!

一旦你习惯了追踪 bug 的系统(至少对我来说是这样),这实际上是一种乐趣。).就我个人而言,我喜欢在查看系统之前猜测是什么导致了数据差距。当你是对的时候,感觉很神奇,就像实验室之王一样神奇!

7.同行评审您的结果

错误是会发生的,通过分析,坏的假设随时都会出现。遗憾的是,不像在编程中那样,它们只是一些错误,有些是意料之中的。

作为分析师或数据科学家的错误仅仅是错误。少了一个数字,你的整个分析就完了。

因此,对于每个项目,以常规的节奏后退一步,并回顾正在完成的工作是很重要的。这也是为什么保持一个清晰简洁的笔记本很棒的原因。这样,当你向你的团队演示时。你可以很容易地解释每个细节。

同行评审者应该寻找错误、格式问题和理解的难易程度。如果你自己的团队不能理解你想说的话,那么一个没有和数据科学家密切合作过的主管就很难完全掌握结论。

我们的团队以及许多其他程序员和分析师喜欢说:

“如果你不能简单地解释它,你根本不理解它”

8.定期会见业务或产品负责人

类似于敏捷编程方法。与正在进行的项目的业务负责人和产品经理会面是有帮助的。

通过这样做,数据团队变得更加适应产品的实际需求,并且增加了非技术所有者的所有权。

这里也有风险。

有时,这可能会导致企业所有者希望增加许多新的特性,因为产品仍在作为 MVP 进行开发。一个团队永远不会在这种状态下完成产品。因此,定期会面很重要,但也要保持在项目的原始范围内。

摘要

数据科学和分析与许多其他学科非常相似。它需要透明度和指导方针,以避免重复工作和易于理解。作为数据人员,很容易认为每个人都明白我们在谈论什么。然而,企业主和产品经理经常忙于管理数百名员工、客户或其他变量。

因此,这取决于我们,分析师,将我们的过程提炼成一个清晰的信息。

我们接下来要讨论的:

这仅仅是数据分析过程的概述。在接下来的几周里,我们将通过不同的数据集进行更深入的研究。我们鼓励你结合例子和自己动手解决问题。

我们还将讨论应用其他最佳商业实践。包括如何建立自动化数据科学系统、数据工程等。

如果您还想了解更多关于商业基础应用统计学的信息,请阅读下面的文章:

基础统计学每一个数据科学都应该知道的

如何将统计学应用于真实的商业问题

出色的决策树示例

我们的团队还为希望帮助员工发展分析能力的公司提供培训课程。如果您有兴趣在贵公司举办分析研讨会和课程,请点击这里查看我们的服务!我们将乐意讨论我们的团队如何帮助开发您的才能以提高他们的能力,并提供 21 世纪急需的技能

R 中的数据分析:美国监狱到底有多拥挤?

原文:https://towardsdatascience.com/data-analysis-in-r-just-how-overcrowded-are-us-prisons-9b78317125bc?source=collection_archive---------14-----------------------

美国是世界上监禁率最高的国家之一,但是具体哪个州是最糟糕的呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Mitchel Lensink on Unsplash

这些数据来自司法统计局网站,该网站有许多关于美国犯罪的有趣数据。我鼓励你去探索它们。这个特殊的数据集叫做“2015 年的囚犯”

衡量监狱容量:三种方法

我们都在同一页上,BJS 以三种方式衡量“容量”: 运行容量 ,这是“根据设施的工作人员、现有方案和服务可以容纳的囚犯人数”,以及 额定容量 ,这是“官员给出的评级”,最后是 设计容量 ,这是“设施最初打算容纳多少名囚犯建筑师/规划师。”

简而言之,这些数字都会略有不同,因此如何定义“容量”会导致不同的结论。例如,如果我们使用运行容量,一个监狱可能有 110%的容量过剩,但是如果我们使用额定容量,只有 95%的容量过剩。

读入数据并清理干净

library(tidyverse)
library(stringr)

*#the original files used ... and / to denote NAs*
df **<-** read.csv('prison.csv', skip**=** 12, stringsAsFactors **=** **FALSE**, na.strings **=** **c**("…", '/'))

*#check out the data*
head(df,5)
##   Jurisdiction   Rated Operational Design Custody.population
## 1    Federal/b 134,461        <NA>   <NA>            160,946
## 2    Alabama/c    <NA>      25,763 13,318             24,814
## 3     Alaska/d    <NA>       5,352   <NA>              5,247
## 4      Arizona  37,238      43,747 37,238             35,733
## 5     Arkansas  16,194      16,233 15,382             15,784
##   Lowest.capacity.a X Highest.capacity.a X.1
## 1             119.7 %              119.7   %
## 2             186.3                 96.3    
## 3              98.0                 98.0    
## 4              96.0                 81.7    
## 5             102.6                 97.2

这个数据集处理起来特别烦人,因为由于某种原因……没有得到正确处理,直到我使用双引号手动复制并粘贴这些值。

将另一个数据框架与州人口关联

*#remove extra columns*
df **<-** df[1**:**51,**-c**(7,9)]

*#Convert NAs to 0*
df[**is.na**(df)] **<-** 0

*#We are going to join our dataframe to this one later*
state_pop **<-** read.csv('statepop1.csv')

*#Correct backslashes in names of jurisdictions*
bad **<-** df[which(str_detect(df**$**Jurisdiction, '[:punct:]')),]**$**Jurisdiction

*#if have slash, then delete last three chars*
df[which(str_detect(df**$**Jurisdiction, '[:punct:]')),]**$**Jurisdiction **<-** str_sub(bad, end **=** -3)

*#this one manually do because had 3 chars after slash*
df[which(df**$**Jurisdiction **==** 'Idaho/e'),]**$**Jurisdiction **<-** 'Idaho'

*#replace commas in numbers*
df[,2**:**ncol(df)] **<-** lapply(df[,2**:**ncol(df)], **function**(x) **as.numeric**(gsub(",", "", **as.character**(x))))

*#make column names the same for joining*
colnames(df)[1] **<-** 'state'

full_df **<-** left_join(df,state_pop, by**=**'state')

*#we'll use the total population of the USA for the federal population*
full_df[1,'pop_est_2014'] **<-** 325000000

*#instead of high and low capacity percentages, we'll average both to get one statistic*
avgcap **<-** full_df **%>%**
  group_by(state)**%>%**
  mutate(avg_cap **=** mean(**c**(Lowest.capacity.a, Highest.capacity.a)))

*#apply to new column*
full_df**$**avg_cap **<-** avgcap**$**avg_cap

现在,我们的人口统计数据有点偏差,因为这些数据包括了 18 岁以下的儿童。为了公平起见,我们将估计 18 岁以上的州居民人数。根据谷歌的数据,美国大约 76%的人口年龄超过 18 岁。因此,我们将把每个州的人口减少 24%。这是我们的“监狱年龄人口”的数字

full_df **<-** full_df **%>%**
  mutate(pop_est_2014 **=** pop_est_2014*****.76)

*#Now compute the % of prison age population in prison*
full_df **<-** full_df **%>%**
  mutate(pop_prison_perc **=** Custody.population**/**pop_est_2014*****100)

州监狱中居民比例最高的 10 个州

full_df **%>%**
  group_by(state)**%>%**
  arrange(desc(pop_prison_perc))**%>%**
  head()**%>%**
  ggplot(aes(reorder(state, pop_prison_perc), pop_prison_perc, fill**=**state))**+**
  geom_col()**+**
  scale_y_continuous(breaks **=** seq(from**=**0, to**=**1, by**=**.1))**+**
  labs(title**=**'States with highest % in state prisons', x**=**'states')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,根据这些数据,阿拉斯加和特拉华州都有近 1%的人口被关押在州立监狱。这不包括监狱人口,因此应该被认为是一个保守的估计。**注意:**一位细心的读者(在阿拉斯加惩教署工作)向我指出,上面的图表可能会有轻微的误导,原因如下。

阿拉斯加与其他州不同,基本上没有监狱系统。在阿拉斯加,等待审判和判决的被告被关押在监狱中,而在大多数其他州,这些人将被关押在监狱中。换句话说,阿拉斯加的数据包括监狱人口。特拉华州可能也有类似的系统,这可能解释了为什么特拉华州和阿拉斯加州在上图中显得异常。

哪个州的平均容量最高呢?

full_df **%>%**
  arrange(desc(avg_cap))**%>%**
  head(10)**%>%**
  ggplot(aes(reorder(state, avg_cap), avg_cap, fill**=**state))**+**
  geom_col()**+**
  labs(title**=**'Top 10 states with most overcapacity prisons', x**=**'State')**+**
  geom_hline(yintercept**=**100, color**=**'red', linetype**=**'dotted', size**=**2)**+**
  coord_flip()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到伊利诺伊州在最拥挤的监狱方面遥遥领先。有人知道为什么那里特别差吗?

这篇文章暗示这是因为伊利诺伊州的量刑法律存在问题。

哪些州的监狱最不拥挤呢?

full_df **%>%**
  filter(**!**state **%in%** **c**('Nevada', 'Connecticut'))**%>%** *#Nevada and Connecticut state data were missing!*
  arrange(avg_cap)**%>%**
  head(10)**%>%**
  ggplot(aes(reorder(state, avg_cap), avg_cap, fill**=**state))**+**
  geom_col()**+**
  labs(title**=**'Top 10 states with least overcapacity prisons', x**=**'State', y**=**'Capacity')**+**
  geom_hline(yintercept**=**100, color**=**'red', linetype**=**'dotted', size**=**2)**+**
  coord_flip()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新墨西哥州和密西西比州的监狱似乎是最不拥挤的。然而,像 T2 这样的报道表明新墨西哥州的监狱人口正在快速增长。请记住,这些是 2015 年的数据。

人们经常提到囚犯的住房/饮食/医疗费用很高。

让我们直观地检查一下成本,看看这是否可能是真的

谷歌告诉我,每个囚犯的平均年成本约为 31,100 美元。这相当于每天 84 美元。我住的大多数酒店价格都比这个低。一些州,如纽约,每年支付高达 60,000 美元来照顾州立监狱的囚犯。

更新我发现各州每年花在每个犯人身上的实际金额相差很大。所以当我们使用真实数量时,这个图表看起来非常不同。(我之前用州平均水平 31000 美元来估算州支出。事实证明,如果你这样做,德克萨斯州的花费是最多的——比加州还多。但实际上,德州在每个犯人身上的花费比加州少得多,所以总支出也更低。)

我们将使用来自 vera.org 网站的数据,那里有一些讨论美国监狱改革的好文章。然后我们将使用 Rvest 包下载表数据并提取数字。

用 Rvest 刮擦

library(rvest)
library(tidyverse)

url **<-** 'https://www.vera.org/publications/price-of-prisons-2015-state-spending-trends/price-of-prisons-2015-state-spending-trends/price-of-prisons-2015-state-spending-trends-prison-spending'

*#read in the website parse the html*
vera **<-** read_html(url)

*#Use the CSS selector to extract table data from the webiste*
html_data **<-** html_nodes(vera,'td')
table_text **<-** html_text(html_data)

*#turn into matrix*
mat **<-** as.data.frame(matrix(table_text, nrow**=**45, ncol**=**4, byrow**=TRUE**), stringsAsFactors **=** **FALSE**)
*#trim strings*
mat[, 2**:**ncol(mat)] **<-** lapply(mat[,2**:**ncol(mat)], stringr**::**str_trim, 'both')

*#replace commas in numbers and dollar signs*
mat[,2**:**ncol(mat)] **<-** lapply(mat[,2**:**ncol(mat)], **function**(x) **as.numeric**(gsub("[\\$,]", "", **as.character**(x))))

*#Rename columns*
mat **<-** mat **%>%**
  rename('state' **=** V1, 'prison_pop' **=** V2, 'prison_exp' **=** V3, 'per_inmate' **=** V4)

现在我们已经处理了刮出的数字,让我们可视化结果

*#inmate spending*
ggplot(mat, aes(reorder(state, per_inmate), per_inmate, fill**=**state))**+**
  geom_col()**+**
  coord_flip()**+**
  scale_y_continuous(labels **=** scales**::**dollar_format())**+**
  theme(axis.text.y **=** element_text(size**=**7))**+**
  labs(title**=**'Actual spending per inmate by state', x**=**'State', y**=**'Avg. annual spending per inmate')*#total expenditures*
ggplot(mat, aes(reorder(state, prison_exp), prison_exp**/**1000000000, fill**=**state))**+**
  geom_col()**+**
  coord_flip()**+**
  scale_y_continuous(labels **=** scales**::**dollar_format())**+**
  theme(axis.text.y **=** element_text(size**=**7))**+**
  labs(title**=**'State expenditure on prisons', x**=**'State', y**=**'total spending in Billions $')*#total population*
ggplot(mat, aes(reorder(state, prison_pop), prison_pop, fill**=**state))**+**
  geom_col()**+**
  coord_flip()**+**
  theme(axis.text.y **=** element_text(size**=**7))**+**
  labs(title**=**'Number of state prisoners', x**=**'State', y**=**'total prison population')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可悲的是,相对而言,德克萨斯州和佛罗里达州有很多囚犯,但他们在每个人身上的花费很少,所以总支出有点低。我不知道他们怎么或为什么能在囚犯身上花这么少的钱。

Vera.org 建议,与其用监狱人口来划分支出,不如用州人口来划分支出可能更有意义。Vera.org 指出,囚犯成本高的州之所以出现,是因为这些州的人员与囚犯比率较低,平均工资较高。

让我们再次制作这个条形图,但这次我们将查看每名纳税人(18 岁或以上)的囚犯支出。

*#join the two tables*
df_join **<-** mat **%>%**
  inner_join(full_df, by **=** 'state')**%>%**
  mutate(per_taxpayer **=** prison_exp**/**pop_est_2014)

*#plot the per taxpayer avg spending per inmate*
ggplot(df_join, aes(reorder(state, per_taxpayer), per_taxpayer, fill**=**state))**+**
  geom_col()**+**
  scale_y_continuous(breaks **=** seq(0,600, 100),labels **=** scales**::**dollar_format())**+**
  coord_flip()**+**
  theme(axis.text.y **=** element_text(size**=**7))**+**
  labs(title**=**'Per resident spending', x**=**'State', y**=**'Prison spending per resident')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这张图描绘了一幅与之前每个犯人的花费截然不同的画面。现在监禁率低的州将会平等。举个例子,犹他州的监禁率和人均支出都很低,因此每个纳税人的支出也很低。回想一下之前,我们看到阿拉斯加和特拉华州都有近 1%的成年人入狱。

由于相对较高的监禁率和每个囚犯的花费,他们的每个纳税人的成本相当高。

最后,支出和产能过剩有什么联系吗?我们会认为更多的支出与更少的拥挤相关,对吗?

df_join **%>%**
  filter(**!**state **%in%** **c**('Federal', 'Nevada', 'Connecticut'))**%>%**
  ggplot(aes(per_inmate, avg_cap, size**=**pop_est_2014, color**=**state))**+**
  geom_point()**+**
  scale_x_continuous(labels **=** scales**::**dollar_format())**+**
  geom_text(aes(label **=** state), vjust **=** -1)**+**
  theme(legend.position **=** "none")**+**
  stat_smooth(method**=**'lm',color**=**'black', se**=FALSE**)**+**
  labs(title**=**'Is there a relationship between spending and overcrowding?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这很有意思。一个州的人均囚犯支出和监狱容量过剩之间似乎没有关系。从本质上说,这意味着大部分囚犯支出并没有用于缓解过度拥挤,尽管这些支出可能会用于提高警卫和医疗服务的工资。

纳税人人均囚犯支出和产能过剩之间的关系如何?

df_join **%>%**
  filter(**!**state **%in%** **c**('Federal', 'Nevada', 'Connecticut'))**%>%**
  ggplot(aes(per_taxpayer, avg_cap, size**=**pop_est_2014, color**=**state))**+**
  geom_point()**+**
  scale_x_continuous(labels **=** scales**::**dollar_format())**+**
  geom_text(aes(label **=** state), vjust **=** -1)**+**
  theme(legend.position **=** "none")**+**
  stat_smooth(method**=**'lm',color**=**'black', se**=FALSE**)**+**
  labs(title**=**'Is there a relationship between per taxpayer spending and overcrowding?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其次,每个纳税人在囚犯身上的支出与产能过剩之间的关系是正相关的。不知何故,每个纳税人花费更多与监狱更加拥挤有关。这非常违背直觉。人均纳税人支出最高的两个州是监禁率相对较高且人口较少的州,这是巧合吗?

国家人口和过度拥挤

full_df **%>%**
  filter(**!**state **%in%** **c**('Federal', 'Nevada', 'Connecticut'))**%>%**
  ggplot(aes(avg_cap, pop_est_2014, size**=** pop_est_2014,color**=**state))**+**
  geom_point()**+**
  geom_text(aes(label **=** state), vjust **=** 2)**+**
  theme(legend.position **=** "none")**+**
  stat_smooth(method**=**'lm',color**=**'black', se**=FALSE**)**+**
  labs(title**=**'Is there a relationship between population and overcrowding?')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总的来说,在一个州的人口和过度拥挤之间似乎确实存在某种联系,尽管相对较弱。也许各州倾向于建造类似数量的州立监狱,而不考虑人口规模,从而导致人口较多的州监狱略显拥挤?

我们发现的总结

我惊讶地发现,伊利诺伊州在过度拥挤的监狱方面领先全国,阿拉斯加州和特拉华州在州立监狱中的公民比例最高,如果你看看每个纳税人的支出,这两个州是全国前两名。

就囚犯人均支出而言,加州是独一无二的。但是如果你从纳税人人均支出的角度来看,加州看起来并没有那么糟糕。所有这些都表明,计算中的细微变化会导致非常不同的结论。如果我想推动监狱改革,我可能会引用一个统计数据,即加州为每个囚犯支付的费用比其他任何州都多。然而,如果我看一下每个纳税人的支出,加州做得更好,现在看来,立即改革并不那么紧迫。

原载于 2018 年 6 月 28 日https://greenet 09 . github . io

数据集介绍:多类道路车辆目标检测数据集 一、基础信息 数据集名称:多类道路车辆目标检测数据集 图片数量: - 训练集:7,325张图片 - 验证集:355张图片 - 测试集:184张图片 总计:7,864张道路场景图片 分类类别: - Bus(公交车):城市道路与高速场景中的大型公共交通工具 - Cars(小型汽车):涵盖轿车、SUV等常见乘用车型 - Motorbike(摩托车):两轮机动车辆,含不同骑行姿态样本 - Truck(卡车):包含中型货运车辆与重型运输卡车 标注格式: YOLO格式标注,包含归一化坐标的边界框与类别标签,适配主流目标检测框架。 数据特性: 覆盖多种光照条件与道路场景,包含车辆密集分布与复杂背景样本。 二、适用场景 自动驾驶感知系统开发: 用于训练车辆识别模块,提升自动驾驶系统对道路参与者的实时检测与分类能力。 交通流量监控分析: 支持构建智能交通管理系统,实现道路车辆类型统计与密度分析。 智慧城市应用: 集成至城市级交通管理平台,优化信号灯控制与道路资源分配。 学术研究领域: 为计算机视觉算法研究提供标准化评测基准,支持多目标检测模型优化。 三、数据集优势 高场景覆盖率: 包含城市道路、高速公路等多种驾驶环境,覆盖车辆静止、行驶、遮挡等现实场景。 精细化标注体系: 采用YOLO标准格式标注,每张图片均经过双重质检,确保边界框与类别标签的精准对应。 类别平衡设计: 四类车辆样本量经科学配比,避免模型训练时的类别偏向问题。 工程适配性强: 可直接应用于YOLO系列模型训练,支持快速迁移至车载计算平台部署。 现实应用价值: 专注自动驾驶核心检测需求,为车辆感知模块开发提供高质量数据支撑。
内容概要:本文介绍了DeepSeek与Mermaid结合实现可视化图表自动化生成的技术及其应用场景。DeepSeek是一款由杭州深度求索人工智能基础技术研究有限公司开发的大语言模型,具有强大的自然语言处理能力,能理解复杂的自然语言指令并生成对应的Mermaid代码。Mermaid是一款基于文本的开源图表绘制工具,能够将简洁的文本描述转化为精美的流程图、序列图、甘特图等。两者结合,通过DeepSeek将自然语言转化为Mermaid代码,再由Mermaid将代码渲染成直观的图表,极大提高了图表制作的效率和准确性。文章详细描述了DeepSeek的发展历程、技术架构及应用场景,Mermaid的基础语法和图表类型,并通过一个电商平台开发项目的实战演练展示了二者结合的具体应用过程。 适合人群:具备一定编程基础和技术理解能力的研发人员、项目经理、数据分析师等。 使用场景及目标:①需求分析阶段,快速生成业务流程图和功能关系图;②设计阶段,生成系统架构图和数据库设计图;③实现阶段,辅助代码编写,提高编码效率;④验证阶段,生成测试用例和测试报告图表,直观展示测试结果。 阅读建议:在学习和使用DeepSeek与Mermaid的过程中,建议读者结合具体项目需求,多实践生成图表和代码,熟悉两者的交互方式和使用技巧,充分利用官方文档和社区资源解决遇到的问题,逐步提高图表绘制和代码编写的准确性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值