虚拟现实中的数据可视化
探索与创造
介绍
数据可视化,简单来说,就是数据的图形化表示。如今,它已经成为数据科学的重要组成部分。与原始数据相比,关键利益相关者对干净清晰的视觉效果反应更好,因为它们有助于快速有效地理解信息。目前有大量的可视化库在使用,其中最突出的是 matplotlib (Python)和 ggplot2 ®。
然而,这些图书馆还没有在虚拟现实领域取得重大突破。随着技术在虚拟和增强现实领域取得有希望的进展,用户也可以在 AR/VR 中体验数据可视化是至关重要的。考虑到这一点,这个项目的目标是探索和创造虚拟现实中的数据可视化。
网络虚拟现实
目标是让每个人都更容易进入 VR 体验,不管他们有什么设备。正是因为这个原因,WebVR 被选为最佳媒体。WebVR 是一个实验性的 JavaScript 应用编程接口(API),为虚拟现实设备提供支持。它是一个开放的规范,也使得在浏览器中体验 VR 成为可能。体验 WebVR 需要两样东西:一个耳机和一个兼容的浏览器。
a 形框架
A-Frame 是一个用于构建虚拟现实体验的网络框架。A-Frame 基于 HTML 之上,使入门变得简单。但是 A-Frame 不仅仅是 3D 场景图或标记语言;核心是一个强大的实体组件框架,它为 three.js 提供了一个声明性的、可扩展的、可组合的结构。或者,可以创建一个 HTML 文件并在中包含一个 A 帧,如图 1 所示。
Fig 1: Example HTML file with A-Frame | Image by author
D3.js
A-Frame 构建在 DOM 之上,因此大多数库和框架都可以工作。这包括 D3.js,这是一个基于数据操作文档的 JavaScript 库。D3 使用 HTML、SVG(可缩放矢量图形)和 CSS(层叠样式表)帮助数据变得生动。D3 对 web 标准的重视为用户提供了现代浏览器的全部功能,而无需将自己与专有框架捆绑在一起,结合了强大的可视化组件和数据驱动的 DOM(文档对象模型)操作方法。例如,可以使用 D3 从一组数字生成一个 HTML 表,或者使用相同的数据创建一个交互式的 SVG 条形图,具有平滑的过渡和交互。
实施可视化 I
这个可视化的目标是从包含静态 JSON 文件的 URL 中读取数据,并在 VR 中创建一个条形图。相机的初始点将在图表的中心,各种棒线围绕着它。构建这个可视化需要两个文件——一个使用 A-Frame 实体定义页面主体的 HTML 文件,一个在读取数据后执行可视化的 Javascript 文件。图 2 描述了包含要可视化的数据的 JSON 文件。
Fig 2: Static JSON file | Image by author
XMLHttpRequest (XHR)
为了从 URL 中读取类似上面 JSON 文件的数据,有必要使用 XMLHttpRequest。XMLHttpRequest 是一个内置的浏览器对象,允许用 JavaScript 发出 HTTP 请求。尽管名称中有“XML”一词,但它可以处理任何数据,包括 JSON、HTML 或纯文本。人们可以上传/下载文件,跟踪进度,并使用 XMLHttpRequest (XHR)对象与服务器进行交互。用户可以从 URL 中检索数据,而不必进行完整的页面刷新。这使得网页可以只更新页面的一部分,而不会干扰用户正在做的事情。
Fig 3: Code Fragment — XMLHttpRequest | Image by author
在上面的图 3 中,执行以下步骤
- 创建一个 XMLHttpRequest 对象
- 所需的 URL 被分配给一个变量
- 用“GET”方法和指定的 URL 初始化 XHR 对象
- 连接被打开,并向服务器发送请求
- 听完响应后,将读取响应文本
- 使用 JSON.parse 将响应文本从字符串转换为 JSON,并存储在一个变量中
- 变量在处理数据可视化的函数中使用
浏览
在制定可视化函数并将 Javascript 文件与 HTML 文件链接后,仍然会出现错误。原因是代码段的第一行出现了“require”方法。“require”方法用于将模块包含在项目中,并将其用作基于浏览器的 XHR 对象。问题是虽然 Node.js 定义了“require”方法,但浏览器没有。使用 Browserify,可以编写使用“require”的代码,就像在 Node 中使用它一样。为了使用此功能,请遵循以下步骤
- “xmlhttprequest”是使用 npm 从命令行安装的
- 使用 browserify 命令,从 main.js(工作 js 文件)开始,所有需要的模块都被递归地捆绑到一个名为 bundle.js 的文件中
- HTML 文件中包含一个单独的
可视化功能
负责 DOM 操作和数据可视化的函数从 XHR API 获取数据。数据被推入数组,然后进行缩放以适合屏幕。A 帧“A 场景”被选中,“A 立方体”条被附加到它上面。随后,定义了条的各种属性,如高度、宽度、位置和旋转。“鼠标进入”和“鼠标离开”动画也是使用“过渡”方法定义的——这有助于鼠标悬停时扩展和照亮一个工具条。最后,可视化中位于条下面的标签以及所需的属性被组合起来。最终可视化的快照显示在图 4 中。
Fig 4: VR Visualization I | Image by author
实施可视化 II
第一个可视化只能从静态 JSON 文件中读取数据。如果可视化能够读取动态变化的数据,将会更加实用和有用。这是第二个视觉化的目标。它将借用 Visualization I 的基本结构和功能,同时添加实时更新自身的能力。
云 Firestore
在这个可视化中,因为数据不是来自静态 JSON 文件,所以不需要使用 XMLHttpRequest 和 Browserify。相反,这些数据是从谷歌 Firebase 的云 Firestore 获得的。Cloud Firestore 是一个灵活、可扩展的 NoSQL 云数据库,用于 Firebase 和 Google 云平台的移动、web 和服务器开发。它通过实时监听器保持客户端应用程序之间的数据同步,并为移动和 web 提供离线支持,以便用户可以构建响应迅速的应用程序,无论网络延迟或互联网连接如何都可以工作。对于这种可视化,使用具有多个文档的“费用”集合,如图 5 所示。
Fig 5: Cloud Firestore Database | Image by author
对于访问云 Firestore 数据库中的数据的可视化,HTML 文件中包含了一个
Fig 6: Code Fragment — Firebase Initialization | Image by author
下面图 7 中的代码解释了程序如何处理数据的变化。集合中的每个条目都属于“已添加”、“已修改”或“已删除”类型。代码中的 switch 语句通过操作输入数据来处理每一种情况。一旦数据被重新定义,它就被传递给处理可视化的函数。
Fig 7: Code Fragment — Switch Statement for Dynamic Data Manipulation | Image by author
可视化功能
正如前面提到的,第二个可视化的主要设计功能是从第一个借用的。场景、条和标签以相似的方式构造,具有相同的属性。增加的一个特性是,现在条形的颜色是基于条件的——如果值大于 50,则为紫色,否则为蓝色。然而,在这个可视化中添加的关键组件是文本注释,它被设计成每个条形上方的第二个标签。这些注释表示条形的高度,只有当鼠标悬停在条形上时才会出现。这使得查看者能够理解相对值并更有效地可视化数据。
同样的可视化最初是在常规 D3 上创建的,没有使用 A 帧 VR。这样做是为了测试与云 Firestore 数据库的交互,并用作 VR 可视化的参考。2D 可视化显示在图 8 中。
Fig 8: 2D version of Visualization II | Image by author
一旦观察到上述可视化实时更新自身,它就被转换到虚拟现实空间,如下图 9 所示
Fig 9: VR Visualization II | Image by author
结论
这个项目的目标是研究在虚拟现实中可视化数据的可能性。为了实现这一点,需要了解的关键组件是 WebVR、A-Frame 和 D3。WebVR 是用户体验可视化的媒介,A-Frame 提供了设置 VR 场景和实体的工具,而 D3 支持 DOM 操作和各种可视化属性的定义。
在 Visualization I 中,使用 XMLHttpRequest 和 Browserify 从静态 JSON 文件中读取数据,并生成相应的条形图。Visualization II 在基本功能上模仿了第一款,但数据来源于 Google Firebase 的云 Firestore。除了能够从数据库中读取动态数据之外,Visualization II 还具有自定义注释,当鼠标悬停在一个栏上时会出现这些注释。这使得用户能够理解条形的值和相对高度,从而体验数据的有效可视化。因此,可以看出,使用正确的工具和方法,数据可以有效地在虚拟现实空间中可视化。
未来的工作
这个项目只处理使用 A-Frame 的“a-cube”实体的条形图。可以使用各种其他实体构建许多不同类型的可视化。例如,饼图和圆环图可以分别使用“圆柱”和“圆环”实体来制作。当前的可视化是使用本地目录中的 HTML 文件在 web 上演示的。将来,这些可以通过谷歌、GitHub、GoDaddy 等网站发布。这将允许在互联网上共享可视化的能力,也将促进合作。
在这个项目的过程中,人们发现手头上关于这个主题的资料非常少。由于数据可视化还没有真正进入虚拟和增强现实领域,这个研究项目有望在不久的将来推动这一对话。
上述工作是南加州大学 Saty Raghavachary 博士指导下的定向研究项目的一部分。
你可以在这里找到我的项目的 GitHub 库和下面的可视化:-
数据可视化至关重要:对绘制市场数据替代方案的快速回顾
数据可视化在量化交易中被高度忽视。在一个由算法主导的领域,对数据的视觉检查似乎不再相关,它属于自主交易,但事实上,这是正确分析和业余方法之间的关键区别之一。
数据可视化也是一个广泛的领域,它涵盖了几种图表和绘图类型。在金融市场中,有足够的空间来处理经典的直方图和散点图(根据我的经验,这些是最有用的)。绘制这样的图形非常容易,不需要任何特殊要求,因为几乎任何绘图/图表库都可以轻松处理它们。
这篇文章专门讨论市场时间序列图,通常是包括开盘价、最高价、最低价和收盘价的条形图或蜡烛图,加上成交量和/或未平仓合约。金融市场作为纯时间序列的本质创造了其他领域所没有的特殊需求和特殊性。
时间序列图——正如我们提到的,主要是蜡烛图和条形图——在市场投机和投资中起着重要作用。它们规范了我们展示和分析资产价格演变的方式。它特别适用于技术价格分析,因为大部分分析依赖于图表中的特定模式和趋势。
在量化交易中,数据可视化很容易被忽视,因为所有的焦点都放在算法上。这是一个巨大的错误,因为数据可视化在定义和验证策略中扮演着重要的角色。
在这篇文章中,我将介绍显示数据的不同选择。我们将主要回顾标准制图软件包、定制的高级独立制图库和软件包以及低级图形库。对于每个解决方案,我将描述其优点和发现的问题,并强调我认为与建立专业的市场数据分析方法相关的领域。
标准制图软件包
有许多著名的图表平台和软件包可以用来显示和分析市场图表。任何投资者或投机者都会有自己的图表软件,用于定期进行交易决策。大多数活跃的交易者也将使用该软件直接从图表中提交市场订单,这允许容易地设置利润和损失水平,警报,限制订单等。虽然这些图表平台提供了高度的灵活性,但它们通常被设计成处理交互式的、任意的和非标准的数据分析方式。
在小投资者和散户投资者最常用的两个平台中,我们发现了 ProRealTime 和 Metatrader。Metatrader 是一个轻量级的简单工具。尽管它有一定的局限性,而且只在场外交易市场使用,但它已经成为活跃的散户投资者中最受欢迎的工具之一;这可能是因为它已被全球大量零售 OTC 经纪人所采用。
Metatrader 4 is one of the most widely used chartings and trading platform for CFD instruments.
Pro RealTime 是另一个在小散户中广泛使用的工具。能力是比 Metatrader 好得多的功能,用于受监管的市场。它有更多的功能,如订单深度,体积概况和许多分析工具。
Pro RealTime is a well-known platform for regulated markets among retail investors.
这只是行业中众多可用工具中的两个例子。我选择这两个只是因为它们是我更熟悉的,但市场与许多其他知名平台一样重要。
虽然图表软件适用于自由市场分析和交易,但它们更侧重于传统交易,不太适合历史数据分析。他们希望有人在屏幕后面与工具交互,并且他们提供的灵活性是突出的。它是如此的出色,以至于我认为对于定量交易和系统的市场分析来说它是太多了。
复杂图表:多即是少
一个可以做任何事情的制图软件,在每一个可能的范围内,看起来都是一个好的选择,但事实并非如此。每个交易者在技术分析的旅程中都有一个共同的模式。在最初的几个月——当技术指标和方法被发现时——有一种趋势是用多种指标、趋势线、辅助线等进行过度复杂的图表分析。人们很容易认为越多越好,全套指标将导致更安全的操作。这种情况一直持续到复杂性达到稳定水平。从那一点开始,最大限度地简化图表是很常见的。这个过程可能会经历一个巩固反弹期,直到出现一个相当简单的情景。
简化的程度取决于每个人和使用的具体方法,有些人喜欢画一个只有价格和几个支撑位或阻力位的图表,有些人喜欢使用成交量、一两个指标(取决于使用的具体策略)和一些辅助的斐波纳契水平。
我们的目标是只有那些绝对必要的行,但是一些额外的指示器和一些辅助线有时会有所帮助。一些策略,如 Elliott wave 分析,需要更广泛的价格和时间延伸以及目标区域的绘图。常规的价格架构交易通常促进更少的图纸,以避免对价格正在做的事情分心。
更进一步的细节——例如是否使用网格、平均值、很少指标或没有指标等。—仍然更多地取决于每个人的特定偏好。
天平:似乎没人注意它们
灵活性可能成为问题的领域之一是规模。全权交易鼓励灵活处理几乎任何潜在的时间和价格组合,而量化交易鼓励更结构化的方法。而从更科学的角度分析任何事件,都要求测量尺度不变或者以可控的方式变化。用不同的价格尺度来观察市场是没有意义的。同样,在每次分析中使用不同的时间框架是没有意义的(一次半天,一天半秒,三天半三分之一)。此外,当用图表软件可视化市场时,除非你非常了解你正在跟踪的市场——这是必须要做的——否则你将无法理解给定的每日价格波动是否很大,以及这种波动通常发生的频率。
定量分析处理如此多的可能性,以至于需要定义分析发生的边界。在这样做的时候,建议总是用清晰明确的价格尺度来处理相同的时间框架设置。我并不是提倡为每一个分析建立一个单一和固定的设置,而是要使图表的观察方式专业化。
我们可以用制图学来做类比。地图的潜在比例可能有无限多种,但最终,专业制图师会定义一小组可用的比例,在行业中广泛使用,然后为每个特定地图选择更合适的比例。这样做可以更容易地评估每张地图。如果每张地图都使用不同的比例,或者每次分析特定地图都使用不同的比例,制图员就很难理解距离的大小。
任何比例都可以用于地图,但大多数组织已经确定使用几种常用比例
使用标准的制图软件通常会促进这种不同的比例场景,用户可以选择任何潜在的价格和时间比例,而科学方法则鼓励相反的情况:限制查看图表的方式。
我个人的制图方法是用价格变动直方图确定价格变动,然后在有限的范围内选择适合每个图表的比例。我没有统计数据或证据证明这种方法降低了风险或增加了利润,但这听起来像是一种公平的方法。
关于时间尺度,我也喜欢处理特定的、固定的时间段。日内是 24 小时——我最近倾向于使用美国东部时间来反映美国股市对全球市场的深刻影响——48 小时来应对超过一天的较大波动,5 天来应对每周波动,然后是双周、每月和每年。如果需要更长的时间,我会使用标准的图表软件。
这种固定时间段的方法显然与图表软件的灵活性相矛盾,在图表软件中,时间段通常由条形宽度、屏幕大小和缩放来定义。它们基本上显示尽可能多的信息。这可能被视为一种优势,但它基本上改变了你每次想要观察一个物体或事件的视角和距离。确实不是一个非常系统的方法。
历史数据:标准的图表软件不能很好地处理它
虽然图表软件可以很好地分析最近发生的事情——或者如果你绘制的是更长时间的图表,则不是最近发生的事情——但它通常是一个非常糟糕的工具,无法系统地观察更长时间内一天内发生的事情。获得两年前某一天发生的事情并不像人们想象的那么容易,而且很可能根本不可能,因为制图软件依赖于经纪人提供的实时数据,而经纪人通常会限制当天可用数据的数量。通常情况下,您将无法检索超过两周的信息。在一些图表工具中,在时间上向后导航图表实际上是非常困难的;它们是用来作为交易平台的工具,而不是历史和策略分析平台。
使用现有库定制图表
这些情况导致许多参与定量分析、密集回溯测试或历史分析的人最终不得不使用定制的图表软件。
尽管可以通过现有制图软件的 API 来利用这些软件,从而节省开发时间,但这种方法有很大的局限性,它将我们的软件和方法与第三方平台紧密结合在一起,而第三方平台可能会在未来改变其 API 或许可条款。
解决这个问题的最初方法是使用许多现有的图表库或已经可用的模块化软件包中的一个。虽然这似乎是一个好方法——并且通常是您要解决的第一个方法——但是它有局限性,最终很容易得出结论,利用现有的软件包是不够的。我为此专门测试了 Gnuplot 和 Matplotlib。
如果有一个众所周知的老派绘图软件,那就是 Gnuplot 。它是在 30 多年前设计的,至今仍是将绘图功能融入项目的最简单、最容易的方法之一。
Gnuplot 完美地遵循了 UNIX 的理念,即作为一个独立的工具,可以在操作系统级别与我们的软件进行管道连接或集成。它简单、功能强大、易于集成并且有据可查。作为一个特定的图表工具,它非常容易使用和集成,但是它的交互选项非常少。
虽然将鼠标和键盘事件与外部程序集成是可能的——Gnuplot 可以在事件上启动外部命令,并从标准输入控制台获取命令,这有效地实现了基本的接口实现,但是这种集成既不自然也不简单。它缺乏实现复杂的用户界面所需的速度和灵活性,并且将其与外部软件正确集成极其笨拙。
在我的测试中,我原型化了一个简单的 Gnuplot 实现。显示包含所有数据的图表很容易,但实现一个交互式用户界面来绘制趋势线或斐波纳契曲线被证明是复杂而缓慢的。事件处理很难,因为需要在您的软件和 Gnuplot 之间实现一个硬权重接口。它只是表现不好,并且在其操作中缺乏平稳性。规模也是一个问题。
发现 Gnuplot 等孤立的工具缺乏实现最小用户界面所需的集成—在绘制图表时,我们希望至少能够绘制趋势线、斐波纳契线和支撑位/阻力位—第二层复杂性是使用绘图库。Matplotlib 是一个完善的库,它有所有主要编程语言的包装器,并有更丰富的 API 来处理鼠标和键盘事件。
Matplotlib 作为绘图库在数据科学中被广泛使用和推荐,但它同样缺乏实现复杂用户界面的速度。
Matplotlib prototype implemented using Python wrapper showing an intraday chart for Telefonica stock (SIBE TEF ES0178430E18).
一个复杂的用户界面需要嵌入 Tkinter——或者任何其他更低层次的小部件工具包——如图所示。
我使用 Tkinter 实现了一个原型,虽然可以显示图表,但我再次发现处理鼠标和键盘事件并不容易。
Tkinter 也不使用 GPU 硬件加速,这将在复杂的图表中造成性能问题。此外,在处理布局时,使用 Matplotlib 会造成一定程度的复杂性,因为您处理的是一个嵌入式库,它并没有真正设计为与小部件工具包集成。
还值得一提的是,Matplotlib 有一个特定的财务扩展,可以即时绘制蜡烛图。然而,这种扩展不再被维护,并且实际上比常规的 Matplotlib 条形图更难使用(条形图可以垂直偏移,因此很容易用条形图和折线图的组合来绘制烛台)。我的建议是远离这个扩展,根据我的个人经验,它已经过时,功能性差,缺乏适当的文档,并且在最近的版本中不受支持。
低级图形库
一旦我们发现图表库对于静态图表来说很棒,但是它们的交互能力却远远没有用上,很明显我们需要一个底层的库,并且我们的实现必须覆盖基本的方面,比如缩放。在这方面,我尝试了两种方法:Cairo Graphics 和 Java2D/AWT。
我们不包括 Tkinter,因为我们包括了使用 Matplotlib 的原型,尽管另一个选项是在 Tkinter 中使用 Canvas 小部件直接实现图表。这意味着实现所有图表功能。由于没有仿射变换,并且 Tkinter 不使用 GPU 硬件优化,我们将发现性能更慢,编程更困难,因为我们需要在 Tkinter 中完全实现缩放。当前的硬件可以处理性能损失,但是增加代码复杂性可能是一个问题。我还制作了这个选项的原型——事实上这是我很久以前制作的第一个原型——我发现它太复杂了,没有用。
我们量化项目的最后一个原型测试包括 Cairo 和 Java2D。我们发现 GPU 的使用是必需的,并且从理论上来说 Cairo 看起来是一个不错的候选,但是在发现在 Windows 计算机上运行 Cairo 的复杂性之后,我在开始评估的同一天放弃了这个想法。让它运行起来是极其复杂的,我们认为这将是以后的发行和维护问题。
Java2D/AWT
对于新的开发,不推荐使用 AWT,它已经过时了,是在 90 年代包含在 Java 中的。Swing 是作为一种现代的替代品出现的,最近 JavaFX 是新开发的推荐方式。这个建议对于常规用户界面可能是有价值的,但是当处理财务图表时,我们将花费更多的时间处理面板和画布,而不是实际的小部件。由于 Swing 和 JavaFX 体积较大,使用 Java2D 和 AWT 是一个非常有效的解决方案,即使它们是有点过时的库。
Java2D 使用硬件加速,并且支持仿射变换。仿射变换的使用简化了实际价格和条形图的处理,有效地将我们的软件与窗口/设备尺寸分离。
Java2D/AWT prototype showing an intraday chart for CME GLOBEX 6E future contract.
我们的第一个原型是成功的,在不同的类中分离功能相对容易,实现的性能也很好。原型还允许堆叠底部和左侧面板。
我们计划将该原型进一步扩展为一个完整的工作解决方案,包括功能的完整封装、用于绘制辅助线和标高的自定义用户界面,以及提供体积轮廓和可选指示器/面板的能力。
摘要
尽管现有的图表软件有许多功能和灵活性,但它在定量交易和系统回测中的使用并不是最好的选择,建议使用定制的解决方案。
在面临的挑战中,我们可以强调需要简化图表中的信息,需要适当和一致的尺度(价格和时间),以及系统分析历史数据的复杂性,特别是当这些数据作为专有存储库存储时。此外,这些环境通常需要一定程度的自动化,这使得标准软件的使用变得复杂。
当只需要显示静态图表时,利用现有的绘图库或模块化软件(如 Matplotlib 或 Gnuplot)似乎是一个不错的选择,但它们的用户界面功能远非完美,并且这些库不是为金融时间序列图表的特性而构建的。
使用 Cairo 和 Java2D 等低级库是一个很好的选择,因为我们可以完全定制图表的呈现方式,尽管它们需要更多的开发工作,但它们的功能简化了开发,并且它们提供了硬件加速。使用仿射变换能力的可能性减少了开发时间,因为可以毫不费力地管理价格和时间尺度。
在这两个选项中,我发现 Java2D 是处理这种需求的最简单的选项,尽管肯定会有其他的选择。Java2D 的一个优点是它真正面向用户空间的 2D 矢量图形,这是您在处理这种图表时真正需要的。
我们没有介绍基于网络的库(如 TechanJS ),因为此时我们正在寻找一个桌面解决方案,但它们与标准绘图库一样复杂。它们的定制、集成和开发时间一点也不简单——它们通常建立在标准绘图库之上。如果 web 用户界面对您的项目有任何好处,那么它们显然是一个不错的选择。实现这一目标的另一个选择是使用 SVG,这是一种强大的图形语言,它使管理比例和用户界面像在网络上一样简单。SVG 没有被广泛使用,但是它非常容易使用,并且可以很容易地与 jQuery 和 Javascript 集成。
用 Tableau 实现优步游乐设施的数据可视化
这件作品的灵感来自于纽约优步游乐设施的演示样品。但我们将在 Tableau 中完成,无需编写任何代码。
你可以在我的 Tableau 页面这里找到我的作品。
该可视化创建了 2014 年 4 月至 5 月纽约市的优步游乐设施的视图。它旨在为消费者提供关于在一个月的不同天的不同时间段内,在不同的纽约市街区,优步乘坐次数如何变化的见解。
我们使用地图来显示乘坐次数的地理分布,使用柱状图来显示一天中不同时段的乘坐次数分布。
步骤 1:导入数据
我们将使用由 FiveThirtyEight 提供的数据。
你可以在这里找到如何将数据源链接到 Tableau 。
第二步:第一页—地图
1.画地图
将Lat
和Lon
从Measures
拖动到Columns
和Rows
绘制地图。
2.地图图层
我们想为我们的地图创建一个黑暗的主题,就像大多数地图可视化一样。
2.1.选择Map
->-
2.2.将Background
样式改为Dark
。
2.3.在图层中选择Streets, Highways, Routes
、Cities
。
地图现在显示了更多的地理信息。
3.颜色
3.1.将Date/Time
从Dimensions
拖动到Marks
->-
3.2.在Marks
部分点击Date/Time
右侧的下拉按钮,选择More
->-Hour
3.3.点击Color
->-Edit Color
,选择调色板Green-Gold
,点击Assign Palette
3.4.点击Color
->-Effects
->-Border
->-None
现在,高对比度的颜色使地图更加清晰。
4.过滤器
我们想在地图上添加过滤器,让用户选择特定的日期和时间。
4.1.将Date/Time
从Dimensions
拖动到Filters
,选择Month/Day/Year
,点击All
4.2.在Filters
部分点击MDY(Date/Time)
右侧的下拉按钮,点击Show Filter
4.3.点击表单上MDY(Date/Time)
右侧的下拉按钮,选择Single Value (drop down)
现在,我们完成了地图图表。
步骤 3:第 2 页—直方图
打开一个新工作表来创建直方图。
1.绘制直方图
1.1.将Date/Time(Hours)
从Dimensions
拖至Columns
,将Number of Records
从Measures
拖至Rows
。
1.2.点击轴名Number of Records
,取消选择Show Header
1.3.点击工作表中的轴名Date/Time
,选择Hide Labels
2.颜色;色彩;色调
我们将使用与地图相同的颜色主题。
2.1.将Date/Time(Hours)
从Dimensions
拖动到Marks
->-
2.2.将记录数从措施拖到Marks
->-Label
2.3.右击直方图,选择Format
->-Lines
->-Grid Lines
->选择None
2.4.右击直方图,选择Format
->-Shading
->-Worksheet
->选择黑色
我们完成了直方图。
第四步:仪表板
现在我们想创建一个仪表板来同时显示地图和直方图。
点击仪表盘,点击Format
->-Dashboard
->-Dashboard Shading
->-Default
->选择黑色
将工作表 1(地图)和工作表 2(直方图)拖到仪表板上,直方图位于底部。
分别在工作表标题上点击右键,点击Hide Title
1.工作表格式
1.1.点击Month, Day, Year of Date/Time
过滤器,点击应用到工作表,选择All Using Related Data Sources
。这样我们可以删除工作表 2(直方图)的Date/Time (Hours)
图例。
1.2.点击Month, Day, Year of Date/Time
滤镜,取消选择Show Title
1.3.点击工作表 1(地图)的Hour of Date/Time
图例,取消选择Show Title
1.4.点击表 1(地图)的Hour of Date/Time
图例,选择Floating
1.5.移动地图右侧的Hour of Date/Time
图例,调整地图大小以适应图例
2.添加文本描述
我们想添加一些描述,让用户更好地理解。
2.1.标题:将文本框拖到仪表板上,键入
UBER RIDES IN NYCApril - May 2014
2.2.说明:将文本框拖到仪表板上,键入Select the legends on the map or bars on the histogram to section data by time.
2.3.描述:将文本框拖到仪表板上,键入
TOTAL RIDES:SOURCE: FIVETHIRTYEIGHT
2.4.总乘坐次数
为了显示基于日期和时间过滤器的动态TOTAL RIDES
文本,我们需要添加一个新的工作表。
2.4.1.将Number of Records
从Measures
拖动到Marks
->-T20。纸张上应显示一个数字。
2.4.2.右击数字,点击Format…
->-Font
->-Worksheet
->白色
2.4.3.右击号码,点击Format…
->-Shading
->-Worksheet
->黑色
2.4.4.将新工作表拖到仪表板上
2.4.5.点击新建工作表->选择Hide Title
2.4.6.点击新建工作表->选择Floating
。拖动TOTAL RIDES
文本旁边的数字。
2.5.添加空白
在仪表板的必要位置添加空白,让文本垂直居中对齐。
现在我们完成了可视化。
参考
数据可视化提示(Power BI)-将分类变量转换为虚拟变量
除了进行数据可视化,如绘制图表和显示 KPI,Power BI 还可以通过编写 DAX 语法来执行一些计算功能。但是,您可能会发现数据集中存在分类变量,这可能会对您计算某些值造成障碍。可能没有像 R 或 Python 中那样简单的代码将分类变量转换成哑变量。如果数据量很小或者只有 2 到 3 个类别,您仍然可以通过编写 if-else 查询或编辑查询中的条件设置来逐个转换变量。本文是为那些想在 Power BI 中快速完成一些简单的数据转换的人准备的。在本文中,我将向您展示一个分步指南,帮助您将分类变量转换为哑变量。
数据准备
我们将使用下面的足球数据作为演示。请下载并在您的 Power BI 文件中输入数据。
数据: 足球数据(2018/2019 赛季)来自 football-data.co.uk
导轨
首先,在将数据加载到 Power BI 中之后,转到“编辑查询”。
然后,选择分类列(选择列“FTR”进行演示),并单击“透视列”。
并选择适当的值列。
** Power BI 不允许您选择相同的列,即“FTR”列作为值列,但这可以在以后手动更改。*
之后,您将看到虚拟列出现在最右端。
但是,当您再次检查整个数据集时,您会发现列“Div”消失了,它是 Pivot 列设置中使用的值列。
如果你想保留这个栏目或者只是使用“FTR”作为“值”栏,请转到“高级编辑器”。
将“Div”改为“FTR”。这是将透视表列的值列设置更改为“FTR”,
最后,您成功地将分类变量转换为虚拟变量。
编辑的话
写一篇教程文章既不容易又费时。如果你喜欢阅读它,并且觉得它很有用,请分享给你的朋友。未来,我们会发布一系列的教程文章,敬请关注!=)
还有,如果你有兴趣了解更多的窍门和技巧,欢迎你浏览我们的网站:https://cydalytics.blogspot.com/
领英:
黄洋-https://www.linkedin.com/in/yeungwong/
卡丽洛-https://www.linkedin.com/in/carrielsc/
其他文章
- 用 Python 制作一个让孩子学英语、玩得开心的游戏
- 中文异形字云(Python)
- 数据科学基础®:从 Excel 导入数据— readxl
- 数据科学基础®:从文本文件导入数据— textreadr & readtext
- 数据科学基础®:导入&导出 Excel 中的数据— xlsx
数据可视化—我应该使用哪些图表?(Seaborn 示例)
Photo by Luke Chesser on Unsplash
如何可视化数据的简单指南
每天使用数据集使我更容易阅读和理解表统计信息。然而,虽然数字统计可能会为您提供数据的本质,但图表或可视化可以揭示数据集中潜在信息的全新维度。
当涉及到展示数据时,尤其是向客户展示数据时,使用可视化工具总是好的,它可以帮助展示您工作的范围和目的。你不希望只显示数据文件或代码,而是一组整洁的图表,使你的故事看起来更合理和清晰。
然而,为任何一组数据创建散点图并不意味着就可以了。当可视化数据时,理解三件事很重要。
- 您可以使用哪些不同类型的地块?
- 你应该用多少?你如何解释它们?
- 你能用这些情节讲一个故事吗?他们告诉你什么了?
下面,您将找到可视化类型、不同种类的图,以及何时使用和何时不使用它们。我试着尽可能地包括例子,但是如果你有任何问题没有回答,请在评论中自由发表。另外,如果你想完善数据可视化的艺术,你需要对不同的可视化类型和情节有深刻的理解。我会在这篇文章的末尾为感兴趣的人添加一些资源。
可视化类型
时间可视化
通常用于一维数据,显示数据点之间的某种线性关系。这种数据集通常将时间作为独立变量,因此,时间序列数据以这种方式可视化。
**绘图类型:**散点图、甘特图、时间线、时间序列折线图。
网络可视化
顾名思义,网络可视化就是将多个数据集相互连接起来,并显示它们在每个变量相连的网络中是如何相互关联的。
**绘图类型:**节点连接图、矩阵图、冲积图&依赖图。
分层可视化
当数据集包含相互连接的有序变量时使用。它可以用来显示父变量和子变量之间的关系,特别是当数据可以在不同的类别下聚集时。
**绘图类型:**树形图、树状图、旭日图、环形图。
多维可视化
当有多个维度时使用这些类型的绘图,并且在某些情况下可以创建 3D 图。尽管多维图本身可能很复杂,但它们可以承载大量的数据(和见解)。
策略类型: 2D/三维直方图、2D/三维散点图、饼图、条形图、折线图。
地块类型
条形图
由于通过它们易于理解数据,所以通常被使用。这可能是呈现数据的最基本的方式,但它有助于通过简单明了获得结果。下面是一个如何在 seaborn 上创建柱状图的例子。代码的正下方是输出。
Import Seaborn as sb
ds = {'Day':['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], 'Hours':[8,7,11,9,6]}
dx = pd.DataFrame(ds)
sb.barplot(x='Day', y='Hours', data=dx)
Barplot output for seaborn.
何时使用: ——将同一类别或数据集中的几个变量与相似的变量进行比较。
-跟踪几个(1 或 2 个)变量随时间的进展。
不用时: -3 类以上变量
-可视化连续数据。
线形图
线图也很常见。当比较股票价格或分析一段时间内的视频视图时,线图几乎随处可见。主要的好处是它们非常直观,读者可以立即掌握结果。
sb.relplot(x='Day', y='Hours', kind='line', data=dx)
何时使用:
——跨时间跟踪比较几个变量。
-分析趋势和变化
-预测未来值。
何时不使用:
-获得数据的总体概述。
-分析单个组件或部分。
散点图
散点图也有多种应用,就像上面提到的其他两种图类型一样。它们可用于描述关系、查看数据的各个部分以及描述数据的分布。
scatplot = sb.relplot(x="RAM", y="Screen_size", data=data)
何时使用:
-分析单个点
-离群点分析和理解波动
-获得变量的总体概况。
不用的时候:
-找精度
-一维数据。
-非数字/分类数据。
面积图
面积图可能是这个列表中最接近线形图的东西,然而,两者之间也有一个关键的区别。面积图能够突出不同变量之间的差异或距离,让我们看到不同项目如何相互比较以形成一个整体。
x=range(0,5)
y=[ [0,5,6,1,2], [4,2,1,8,4], [9,6,3,2,4] ]
plt.stackplot(x,y)
何时使用:
-分析一个时间序列中整体的各个部分如何进展
-线形图的大多数用例
何时不用:
——单个周期内呈现整体的部分。
其他情节
https://upload.wikimedia.org/wikipedia/commons/8/87/Sample_Pie_Chart.png
- 饼图
当时:比较整体的部分或相对值。
当不在时:比较没有加起来形成一个整体的数据。
Heatmap generated using random numbers
热图
ud= np.random.rand(10, 15)
sb.heatmap(ud)
当时:两个变量之间的关系。
非时:个别变量。
x = np.random.normal(size=60)
柱状图
np.random.normal(size=60)
sb.distplot(x)
当时:几个变量或数据集跨时间变化。
非时:超过 3 个变量或数据集。
https://upload.wikimedia.org/wikipedia/commons/9/94/Normality_box-plot.png
- 箱线图
When :分析或比较数据集的分布。
不在时:分析单个数据集。
https://upload.wikimedia.org/wikipedia/commons/d/d8/Benin_English.png
- 树形图
When :比较分类数据中的变量。
当不时:非分类数据。
本文中没有提到许多其他的情节类型。这是为了涵盖常用地块类型的主要部分。希望这些信息对你有用!
资源
在某个时候,你可能已经看过、接触过或者制作过条形图。条形图是这样一个…
www.klipfolio.com](https://www.klipfolio.com/resources/articles/what-is-data-visualization) [## 研究指南:数据可视化:多维工具
有两类多维可视化。第一种着眼于类别比例;或类别…
guides.lib.k-state.edu](https://guides.lib.k-state.edu/c.php?g=181742&p=1196067) [## 选择正确的图表:在 14 种图表类型中选择
如果你想避免创建这样的图表,这是一篇完美的文章…或者这个…尤其是…
365datascience.com](https://365datascience.com/chart-types-and-how-to-select-the-right-one/)
关注 Rohan Gupta 了解更多关于数据科学的内容!
面向初学者的 D3.js 数据可视化
D3.js 可视化数据入门
你有没有走进一个拥挤的体育场或一场音乐表演,并试图猜测有多少人围着你?你错了吗?分析大量数据可能会让人不知所措。但是,当你把抽象的数据点转换成精确的、可观的视觉效果时,你将能够通过分析来看待事物。
Photo by Carlos Muza on Unsplash
这是一个信息时代,我们有足够多的数据,但只有少数人知道如何处理这些数据。人们对视觉的依赖远远超过其他任何东西。这就是为什么直观呈现的数据比简单的数字更有说服力。优秀的可视化可以抓住人们的注意力,而无尽的列和行的数字只能混淆他们。为了使这些可视化和分析成为可能,我们需要现有语言的框架或库。这就是 D3.js 发挥作用的地方。
D3 代表数据驱动文档。如果你计划在网络上创建自定义的可视化效果,很可能你已经听说过 D3.js 。一个基于 web 的可视化库,具有大量的 API 来处理在 web 上创建高级、动态和漂亮的可视化内容的繁重工作。
D3.js 是一个基于数据操作文档的 JavaScript 库。D3.js 帮助您使用 HTML、SVG 和 CSS 将数据变得生动。D3 对 web 标准的重视使您可以获得现代浏览器的全部功能,而无需将自己束缚于专有框架,将强大的可视化组件和数据驱动的 DOM 操作方法结合起来。
D3 完成的主要任务是,它允许将任何类型的数据绑定到 DOM,然后对其进行数据驱动的转换,从而在应用程序中轻松构建交互式数据可视化。
如果你有兴趣深入研究,D3 的 Github 库和 D3 使用的 API 文档也是很好的资源。
现在开始用 D3.js 吧。你可以打开你的 IDE 或编辑器,创建一个名为 index.html 的文件,只是为了玩玩 D3.js。在我们的应用程序中使用这个库就像直接添加链接来获得你在 index.html 创建的最新版本一样简单:
<script src="https://d3js.org/d3.v5.min.js"></script>
所以现在您已经准备好在您的示例应用程序中使用 D3.js 及其所有特性。
元素的选择
选择意味着从名称或 css 选择器中选择 html 元素。(例如:h2,p)然后在选择了元素之后,我们可以使用 D3 来操作和转换这些 html 元素。选择允许文档对象模型(DOM)的强大数据驱动转换:设置属性、样式、属性、 HTML 或文本内容,等等。使用数据连接的进入和退出选择,您也可以添加或移除元素来对应数据。
想象我们有一个简单的 html 页面如下。
<html>
<head>
<title>My sample HTML page</title>
</head>
<body>
<h1>D3.js</h3>
<p>I'm using D3.js here !</p>
<p>We all are using D3.js here !</p>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
d3.select('h1').style('color', 'green');
d3.selectAll('p').style('font-size', '30px');
</script>
</body>
</html>
这里有几件重要事情需要注意。所以这里用了两个关键词。这两种方法都使用元素名作为参数。第一个 d3.select() 方法返回与给定参数匹配的 DOM 元素的第一个选择。所以在上面的例子中会是*
D3 . js*。第二个方法是 d3.selectAll() ,它返回对应于给定参数的所有 html 元素。如果它没有找到任何< p >标签,它将返回一个空选择。在给出的例子中 < p >我这里用的是 D3.js!< /p > 和 < p >我们这里都在用 D3.js!< /p > 两者都会返回。
此外,您还可以看到在选择 DOM 元素之后所做的操作。我们可以改变样式,甚至改变显示的文本。因此,在我们的示例中,当它被呈现时,标题“D3.js”将是绿色的。
你可以点击查看选择的更多细节。
动态属性和数据绑定
D3 的另一个主要概念是以动态方式将一组数据映射到 DOM 元素。在这里,我们可以引入一个数据集,然后我们可以使用这些数据集实时更新、附加和显示 DOM 元素。
let dataset = [1,2,3,4,5]
d3.selectAll(‘p’) //Select 'p' element
.data(dataset) //data()puts data into waiting for processing
.enter() //take data elements one by one
.append(‘p’) //for each data item appending <p>
.text(‘Sample text’); //add sample text to each
这将在前端呈现文本“样本文本”5 次。这只是一个简单的例子,说明我们可以使用数据来动态和实时地操纵元素。使用同样的概念可以做很多事情。
数据可视化
既然我们现在对 D3 的基本概念已经很熟悉了,我们可以开始学习数据可视化组件,它包括各种类型的图表、数据表和其他可视化。
可缩放矢量图形(SVG)是一种在 DOM 中呈现图形元素和图像的方法。因为 SVG 是基于向量的,所以它是轻量级的,可伸缩的。D3 使用 SVG 来创建所有的视觉效果,比如图表。使用 SVG 的好处是我们不必担心缩放视觉效果时的失真,这与其他格式不同。基本上,D3 帮助我们弥合数据和相关可视化之间的差距,为用户提供有意义的信息。
让我们从使用 D3.js 创建一个简单的条形图开始。你需要两个名为 index.html 的文件,script.js 和 style.css,如下所示。
index.html
<html><head><link rel=”stylesheet” href=”style.css”><title>My sample D3.js App</title></head><body><h1>Bar Chart using D3.js</h1><svg width=”500" height=”800" class=”bar-chart”></svg><script src=”https://d3js.org/d3.v5.min.js"></script><script src=”script.js”></script></body></html>
script.js
var dataset = [28, 40, 56, 50, 75, 90, 120, 120, 100];var chartWidth = 500, chartHeight = 300, barPadding = 5;var barWidth = (chartWidth / dataset.length);var svg = d3.select(‘svg’).attr(“width”, chartWidth).attr(“height”, chartHeight);var barChart = svg.selectAll(“rect”).data(dataset).enter().append(“rect”).attr(“y”, function(d) {return chartHeight — d}).attr(“height”, function(d) {return d;}).attr(“width”, barWidth — barPadding).attr(“fill”, ‘#F2BF23’).attr(“transform”, function (d, i) {var translate = [barWidth * i, 0];return “translate(“+ translate +”)”;});
style.css
.bar-chart {background-color: #071B52;}
最终的条形图类似于这样。
这显示了可视化,但是除了趋势之外没有精确的信息。因此,我们的下一个任务是添加一些标签,以便每个条形的值将是可见的,从而在视觉上提供更多的信息。
为此,您可以在 script.js 文件的末尾添加以下代码片段。
script.js
var text = svg.selectAll(“text”).data(dataset).enter().append(“text”).text(function(d) {return d;}).attr(“y”, function(d, i) {return chartHeight — d — 2;}).attr(“x”, function(d, i) {return barWidth * i + 10;}).attr(“fill”, “#A64C38”);
这将产生如下所示的结果。
现在我们要做的是给我们的图表添加缩放比例。数据集中可以有不同的值;有些可能非常小,有些可能非常大。因此,为了更好地显示一致性,在图表中进行缩放是很重要的。
如果我们重新排列数据集,如下图所示,您可以看到条形图是如何呈现的。
var dataset = [2, 4, 5, 5, 7, 9, 12, 9, 10];
这样我们几乎看不到图表中的条形。所以我们必须根据图表的高度放大它。如果数据集中有较大的值,则不会显示给定图表高度内的准确高度。因此,解决方案是相应地扩展。为此,我们可以使用这样的定标器,并改变条形图。
script.js
var dataset = [2, 4, 5, 5, 7, 9, 12, 9, 10];var chartWidth = 500, chartHeight = 300, barPadding = 5;var barWidth = (chartWidth / dataset.length);var svg = d3.select(‘svg’)
.attr(“width”, chartWidth)
.attr(“height”, chartHeight);var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset)])
.range([0, chartHeight])var barChart = svg.selectAll(“rect”)
.data(dataset)
.enter()
.append(“rect”)
.attr(“y”, function(d) {
return chartHeight — yScale(d);})
.attr(“height”, function(d) {
return yScale(d);})
.attr(“width”, barWidth — barPadding)
.attr(“fill”, ‘#F2BF23’)
.attr(“transform”, function (d, i) {
var translate = [barWidth * i, 0];
return “translate(“+ translate +”)”;
});var text = svg.selectAll(“text”)
.data(dataset)
.enter()
.append(“text”)
.text(function(d) {
return d;})
.attr(“y”, function(d, i) {
return chartHeight — yScale(d) — 2;})
.attr(“x”, function(d, i) {
return barWidth * i + 10;})
.attr(“fill”, “#A64C38”);
所以现在很明显我们的图表中遗漏了轴。因此,使用 D3.js 向我们的图表添加轴非常简单。您可以使用 D3.js 中的 x-scale 和 y-scale 创建 x 轴和 y 轴。您可以使用以下代码片段创建带有标签的缩放图表。
script.js
var dataset = [2, 4, 5, 5, 7, 9, 12, 9, 10];var chartWidth = 500, chartHeight = 300, barPadding = 6;var barWidth = (chartWidth / dataset.length -14);var svg = d3.select(‘svg’)
.attr(“width”, chartWidth)
.attr(“height”, chartHeight);var xScale = d3.scaleLinear()
.domain([0, d3.max(dataset)])
.range([0, chartWidth]);var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset)])
.range([0,chartHeight — 28]);var yScaleChart = d3.scaleLinear()
.domain([0, d3.max(dataset)])
.range([chartHeight — 28, 0]);var barChart = svg.selectAll(“rect”)
.data(dataset)
.enter()
.append(“rect”)
.attr(“y”, function(d) {
return chartHeight — yScale(d) — 20;})
.attr(“height”, function(d) {
return yScale(d);})
.attr(“width”, barWidth — barPadding)
.attr(“fill”, ‘#F2BF23’)
.attr(“transform”, function (d, i) {var translate = [barWidth * i +55, 0];
return “translate(“+ translate +”)”;});var text = svg.selectAll(“text”)
.data(dataset)
.enter()
.append(“text”)
.text(function(d) {
return d;})
.attr(“y”, function(d, i) {
return chartHeight — yScale(d) — 20;})
.attr(“x”, function(d, i) {
return barWidth * i + 70;})
.attr(“fill”, “#A64C38”);var x_axis = d3.axisBottom().scale(xScale);var y_axis = d3.axisLeft().scale(yScaleChart);svg.append(“g”)
.attr(“transform”, “translate(50, 10)”)
.call(y_axis);var xAxisTranslate = chartHeight — 20;svg.append(“g”)
.attr(“transform”, “translate(50, “ + xAxisTranslate +”)”)
.call(x_axis);
style.css
.bar-chart {background-color: beige;}
就像上面的简单条形图一样,我们可以创建我们想要的多种类型的图表。这里最好的事情是我们对自己创造的东西的控制。不像其他现成的图形,它们是有限可定制的,我们可以自由地使用 D3.js 中的 SVG 创建我们自己的图形。
D3 解决了问题的原因:基于数据的文档的有效操作。这避免了专有表示,提供了非凡的灵活性,展示了 HTML、SVG 和 CSS 等 web 标准的全部功能。以最小的开销,D3 非常快,支持大型数据集和交互和动画的动态行为。
您可以在 D3.js 图库中查看已经创建的复杂且有吸引力的图形。
https://www.d3-graph-gallery.com/
鉴于大多数人将 D3.js 称为数据可视化库,它不是。D3 更像是一个由不同部分组成的框架,比如 jQuery 部分(帮助我们选择和操作 DOM 元素)、Lodash 部分、动画部分、数据分析部分和数据可视化部分。
用 D3.js 尝试数据可视化,并与我分享结果!
使用 Python follow Maps 实现数据可视化
关于数据科学,我最喜欢的事情之一是数据可视化。我喜欢创建和利用视觉辅助工具来支持我的数据中的故事和趋势。python follow library 是我利用地理空间可视化分析能力的有用资源。换句话说,地图!
地图允许我在一个可视化视图中跨多个维度分析我的数据。在最近的一个项目中,我分析了 293 个美国城市,以确定哪些城市适合试点自行车和踏板车共享计划。通过使用 OLS 回归,我确定,在其他特征中,一个城市的拥堵程度(通过在交通中花费的驾驶时间百分比来衡量,从 INRIX.com 获得)与一个城市的“骑行能力”(通过 walkscore.com 的自行车评分来衡量)正相关且显著。虽然这一结果似乎有悖常理,但有理由认为,在更拥堵的城市,人们有骑自行车出行的动机(想想:“我不想坐在车流中,所以我要戴上头盔,骑着自行车去上班”)。
那么,我如何将“骑行能力”和拥堵之间的关系形象化呢?一个简单的 seaborn regplot 显示了自行车分数和交通流量之间的正线性相关性(通过交通中所花费的驾驶时间的百分比来衡量)。
sns.set(style = 'white')
sns.regplot(data=df, x="traffic_index", y="bike_score", ci = None)
plt.xlabel('Percentage of driving time spent in traffic', size = 16)
plt.ylabel('Bike score', size = 16)
plt.title("City bike score and overall traffic level", size = 20, weight = 'bold')
More bike-friendly cities are also more congested
但是如果我想在这两个维度上可视化城市的地理空间分布呢?嗯……使用地理空间分析,我可以创建一个地图,显示交通流量和自行车得分较高的城市。更好的是,改变地图标记的颜色和大小等属性意味着我可以使用一个图形来可视化所有三个维度。
为了创建这个地图,我首先安装了 Python 的 follow 库。
!conda install -c conda-forge folium=0.5.0 --yes
import folium
import webbrowser
我想展示的第一个维度是地理定位。我根据简单的谷歌搜索“美国经纬度”的结果设置了地图的经纬度。然后,我定义我的地图(巧妙地命名为 traffic_map)在这些坐标上初始化。默认缩放设置为 5(我不得不摆弄这个参数,直到我找到一个好的显示)。
latitude = 37.0902
longitude = -95.7129traffic_map = folium.Map(location=[latitude, longitude], zoom_start=5)
第二个维度是交通拥堵。我将我的流量变量(“流量指数”)分成四分位数:
df['traffic_index_quartile'] = pd.qcut(df['traffic_index'], 4, labels=False)
接下来,我为我的马克笔的颜色创建了一个字典。我决定了从浅蓝色(0)到红色(3)的一系列原色。我希望最高的四分之一(即最拥挤的城市)用醒目的红色突出,最低的四分之一(即最不拥挤和最不可行的候选城市)或多或少地消失在基本地图中。
colordict = {0: 'lightblue', 1: 'lightgreen', 2: 'orange', 3: 'red'}
**边注:**我从这个栈溢出帖子中找到了可行的颜色名称:
https://Stack Overflow . com/questions/36202514/foil um-map-module-trying-to-get-more-options-for-marker-colors。我已经尝试了列出的大多数颜色,它们都准确地显示了它们的名字,除了“浅红色”,它要么导致错误,要么显示为黑色。
我的地图上的第三个也是最后一个维度是城市“骑行能力”。为了可视化这个维度,我将城市标记的大小设置为城市 bikescore 的 0.15 倍(这是我必须反复试验直到它“看起来”正确为止的另一个参数)。
最终地图的完整代码如下:
for lat, lon, traffic_q, traffic, bike, city in zip(df['latitude'], df['longitude'], df['traffic_index_quartile'], df['traffic_index'], df['bike_score'], df['city']):
folium.CircleMarker(
[lat, lon],
radius=.15*bike,
popup = ('City: ' + str(city).capitalize() + '<br>'
'Bike score: ' + str(bike) + '<br>'
'Traffic level: ' + str(traffic) +'%'
),
color='b',
key_on = traffic_q,
threshold_scale=[0,1,2,3],
fill_color=colordict[traffic_q],
fill=True,
fill_opacity=0.7
).add_to(traffic_map)traffic_map
通过这种地理空间数据可视化,我们可以快速看到关于城市和自行车的两个事实。首先,“骑行能力”与交通拥堵正相关。其次,高交通流量和“骑行能力”(即大红色标记)的城市更有可能出现在美国东北部、加利福尼亚州和太平洋西北地区(有几个明显的例外)。
在这里 查看我关于完整项目 的帖子。欢迎在评论中留下反馈或想法!
使用 Seaborn 和 Plotly_ 人均 GDP 和预期寿命数据集的 Python 数据可视化
当社会和经济科学与数据科学和谐一致时。
Photo by Lukas Blazek on Unsplash
本教程旨在帮助您快速入门并使用 python 数据可视化库。我选择 seaborn 和 plotly,这是最常用和最棒的工具,用来可视化完全交互的图,并使数据看起来很棒。
你也会发现经济和社会因素之间的关系。我们将在此图中处理的数据集是世界各地的人均 GDP、社会支持、健康预期寿命、选择自由、慷慨程度等。
我用 jupyter 笔记本,你可以从 Anaconda 包中获得访问权限。
Seaborn 简要概述
Seaborn 是一个基于 matplotlib 的可视化库,它与 pandas 库配合得非常好。
使用 seaborn 的原因之一是它可以生成漂亮的统计图。认识到 seaborn 是 matplotlib 的补充而不是替代是非常重要的。
要安装 seaborn,您可以在命令行或终端使用 pip 或 conda ,其中包括:
!pip install seaborn
or
!conda install seaborn
- 导入库
让我们从导入几个库开始,numpy(数字 python 库),pandas 用于数据帧和数据系列,seaborn 和 matplotlib 用于可视化。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline #use it to show plot directly below the code
2。使用熊猫读取数据
该数据在 csv 文件格式中称为“2019.csv”。这就是我们将在本教程中使用的数据集。
head()函数返回数据帧的前 5 行,如下所示:
df= pd.read_csv('2019.csv')
df.head()
分布图
1.距离图:
我在这里做的只是使用 SNS . distplot(dataofsinglecolumn)绘制数据框架(人均 GDP)中单个列的分布。
要删除核密度估计图,您可以使用 kde=False 。
bins = 30 表示定义直方图形状的 bin 数量,我在左侧图中使用了 8 个 bin,在另一个图中使用了 30 个 bin,这样您就可以看到差异。
sns.distplot(df['GDP per capita'], bins=8)
out[5]sns.distplot(df['GDP per capita'], **kde = False** , bins = 30)
out[6]
****
2.联合策划:
Seaborn 的 jointplot 显示了两个变量之间的关系。
此处使用散点图和直方图显示了数据中 x 和 y 两列的图。
sns.jointplot(x=df['GDP per capita'], y= df['Healthy life expectancy'],data=df) #two ditribution
您可以在下面添加要绘制的绘图类型,例如,kind='reg '表示绘制带有回归线的散点图,kind='hex '表示将数据分成六边形,在空白处绘制直方图。
你可以看到人均 GDP 和健康预期寿命是正相关的。意味着如果人均 GDP 高,健康的预期寿命也会高。
sns.jointplot(x=df['GDP per capita'], y= df['Healthy life expectancy'],data=df,kind='reg') #plot in the right sidens.jointplot(x=df['GDP per capita'], y= df['Healthy life expectancy'],data=df,kind='hex') # plot in the left
****
sns.pairplot(df)#relationship entire datasets
令人惊讶的是,一行简单的代码给了我们整个情节!
这代表了整个数据集之间的关系。直方图允许我们看到单个变量的分布,而散点图显示两个变量之间的关系。
分类图:柱状图
柱状图用于绘制分类变量示例性别男/女…
在这里,我使用国家作为类别,并使用 head()函数绘制前 3 个国家的人均 GDP。
sns.barplot(x=df['Country or region'].head(3),y=df['GDP per capita'],data=df)
矩阵图
我在这里所做的是选择 4 列数据,并使用 corr()函数来查找所选数据之间的相关性。
# Matrix form for correlation data
data_select = df[['GDP per capita','Social support','Healthy life expectancy','Perceptions of corruption']]
data_select.corr()
您可以在这里看到一个矩阵形式,它表示某种值,这些值代表相关程度,相关程度通常在-1 到 1 之间。
如果 corr 值接近 1,这意味着变量有很强的正相关性。
sns.heatmap(df_select.corr(), cmap='coolwarm')
在这里,热图真正做的是根据某种梯度标度将数据相关值表示为图表中的颜色:
您可以通过添加 cmap= '…‘来更改颜色地图,例如’绿色’,‘蓝色’,‘凉爽温暖’…对于所有的颜色地图,请查看:http://matplotlib.org/users/colormaps.html
非常简单的概述
Plotly 是一个数据可视化库,可以用来创建不同类型的交互式图表、地图和绘图…
你能做的第一件事就是安装 plotly 和袖扣库。
袖扣与熊猫有着紧密的联系,除非安装了袖扣,否则你无法从数据框中绘制出情节。
!pip install plotly
!pip install cufflinks
要连接 chart_studio,您可以到主页 plotly 注册并在设置帐户中获取您的 api_key。
由于 plotly 是一个在线平台,必须输入登录凭证才能在在线模式下使用。
chart_studio.tools.set_credentials_file(username='XXXX, api_key='xxxxxxxxxx')
加载库
下面导入 jupyter 笔记本上的 plotly 和袖扣,还有 chart_studio、plotly 工具和 graph 对象。
cf.go_offline()
cf.set_config_file(offline =False , world_readable= True)
在本文中,我们将使用在线模式,这对于 Jupyter 笔记本来说已经足够了。
折线图
首先,我选择数据集中的两列;健康的预期寿命和人均 GDP,然后我为标题名和 xaxis / yaxis 名创建了一个字典,并将它们放在布局对象中。
我用 dict()函数举例;dict(a=8,b=10)代替{“a”: 8," b": 10 }
要将 dataframe 绘制为折线图,您只需调用 dataframe 对象的 iplot 方法。
cufflinks 和 plotly 允许使用语法 data.iplot 绘制数据,然后传入文件名和创建的布局。
data= df[['Healthy life expectancy', 'GDP per capita']]layout = dict(title = 'Line Chart From Pandas DataFrame', xaxis= dict(title='x-axis'), yaxis= dict(title='y-axis'))data.iplot(filename='cf-simple-line-chart', layout=layout)
散点图
mode 参数应该总是设置为" markers ,默认情况下 plotly 会在数据点之间绘制线条。所以如果你想要没有线条的点,你需要确保设置绘图模式为标记。
就像前面的例子一样,我们需要一个 fig 对象,它应该是一个 dictionary 对象,包含两个字典,一个用于数据,一个用于布局。
在数据字典中,我们定义了两组要绘制的 x 和 y 变量,在两个图中,x 变量将是相同的,这允许比较与国家列相关的人均 GDP 和健康预期寿命。
然后,我使用 data.go 语法创建包含 data1 和 data2 的数据对象,并将其赋给 mydata 变量。
还要创建布局对象,并传入散点图的标题。
**data1**=go.Scatter(x=df['Country or region'],y=df['GDP per capita'], name="GDP per capita", **mode="markers"**) **data2**=go.Scatter(x=df['Country or region'],y=df['Healthy life expectancy'],name="Healthy life expectancy",**mode="markers"**)mydata = go.Data([data1, data2])mylayout = go.Layout( title="GDP per capita vs. Life expectancy")fig = go.Figure(data=mydata, layout=mylayout)chart_studio.plotly.iplot(fig)
这就是我们使用 chart_studio 包绘制的图!
这里相同的代码,但我使用模式=“线+标记”,它将连接数据点作为线,同时显示散点图。
创建条形图
这里展示了如何在 plotly 中自定义颜色。
这里我们需要使用一个名为 color_theme 的字典对象,我们将生成一个颜色列表,其中包含我们要在条形图中使用的颜色的 RGBA 代码。
color_theme = dict(color=['rgba(169,169,169,1)', 'rgba(255,160,122,1)','rgba(176,224,230,1)', 'rgba(255,228,196,1)',
'rgba(189,183,107,1)', 'rgba(188,143,143,1)','rgba(221,160,221,1)'])
现在我将向你展示如何使用 plotly 创建条形图。
这里我们使用 trace 对象来指定我们想要的图表类型。所以在这种情况下我们使用 go。Bar() 函数然后我们传入两个变量 x 和 y,分别代表 7 个国家的人头数据和健康预期寿命,还传入我们已经定义好的 color_theme。
现在,让我们指定我们的布局参数,在这段代码中,我只使用一个参数来命名我们的绘图标题,您可以添加 x 轴和 y 轴名称。
最后,使用 iplot()函数绘制它,然后传入我们的数据。
trace0 = **go.Bar**(x=df['Country or region'].head(7), y=df['Healthy life expectancy'], **marker=color_theme**)data = [trace0]layout = go.Layout(title='Healthy life expectancy')fig = go.Figure(data=data, layout=layout)chart_studio.plotly.iplot(fig, filename='color-bar-chart')
箱形图
通常在统计学中使用的箱线图,它通过测量数据集的中值、平均值和众数,为我们提供了有关数据如何分布的更多信息。
在下面的代码中,我们只选择了 2 列数据,然后我们使用 iplot 方法,并传入一个参数来指定绘图的类型,然后我们给出了箱线图的文件名。
df_select = df[['GDP per capita','Healthy life expectancy']] df_select.iplot(kind='box', filename='box-plot')
圆形分格统计图表
在这里,我使用 10 个国家的指数作为标签创建了一个简单的饼图,并绘制了每个国家的人均 GDP 值。
然后使用 go 创建一个 gragh 对象。Pie()并填写标签和值变量。最后,使用 iplot()函数绘制这个图。
labels = df['Country or region'].head(10).value_counts().index
values = df['GDP per capita'].head(10).values
trace = go.Pie(labels=labels, values=values)chart_studio.plotly.iplot([trace], filename='basic_pie_chart')
等值区域图
使用 plotly 是用 python 生成地图的最简单的方法。
我们有两种主要类型的绘图对象;数据对象和布局对象。****
首先,我们需要数据传入字典,并为地图中的数据设置参数。让我们从传递 choropleth 类型开始,这意味着我们希望 plotly 生成什么类型的地图。然后定义我们的色阶,反转色阶,黄色向下,紫色向上。我们将位置设置为数据帧中的国家,z 变量由地图中的颜色表示。最后,我们将传入文本参数来定义在地图上移动时显示的文本。
其次,创建一个布局字典来设置我们地图的标题。然后创建一个包含数据和布局对象的新字典,我们称之为 fig。
为了绘制它,我们只需在 fig 对象上调用 iplot 方法,然后给出一个文件名。开始了…
data = dict(
**type = 'choropleth'**,
colorscale = 'Viridis',
reversescale = True,
locations = df['Country or region'],
locationmode = "country names",
z = df['GDP per capita'],
text = df['Country or region'],
colorbar = {'title' : 'GDP per capita_world'},
)
layout=dict(title_text = '2019 GDP per capita by State')
fig = go.Figure(data=data,layout=layout)chart_studio.plotly.iplot(fig, filename='choropleth')
结论
数据可视化是一个很好的工具,可以让数据更具可读性,并为您在现实世界中发现更多见解创造了巨大的机会。
这篇文章的所有代码都是 GitHub 上的 。图表都是交互式的,可以在查看,这里 。****
我欢迎反馈。我可以在 Linkedin 这里找到我。
数据仓库|维度建模|用例研究:电子钱包
通过用例解释技术概念总是更有意义。
基于我以前作为数据工程师和分析师的经验,我将使用一个电子钱包案例研究来解释数据仓库和维度建模。——马诺基
数据仓库
数据仓库是与业务相关的历史数据的大型集合,可用于制定业务决策。
- 数据仓库存储聚合的事务性数据,这些数据经过转换和存储后用于分析目的。
- 数据仓库存储来自多个来源的数据,这使得分析更加容易。
简单地说,数据库(运营)系统是你放入数据的地方,而数据仓库(商业智能)系统是你取出数据的地方—拉尔夫·金博尔
维度建模
维度建模是设计数据仓库的广泛使用的技术,主要是因为它同时解决了以下两个需求:
- 提供业务用户可以理解的数据。
- 提供快速查询性能。
Core elements of the Kimball DW/BI architecture
该图显示了从操作数据源到分析工具构建数据仓库所涉及的主要组件,以通过 ETL(提取、转换、加载)过程支持业务决策。
现在让我们以电子钱包的用例为例,使用维度建模技术构建一个数据仓库。
用例
背景
这家在线零售公司的特色之一是电子钱包服务,这种服务可以用来支付在该平台上购买的产品。
用户可以通过三种不同的方式获得积分:
- 当已付款的产品购买被取消时,退款作为取消信用。
- 用户可以获得礼品卡积分作为礼物。
- 如果用户具有差的服务体验,则可以提供 soo-sorry 信用。
如果是礼品卡信用和 soo-sorry 信用,电子钱包中的信用将在 6 个月后过期,但如果是取消信用,则在 1 年后过期。
要求
公司的财务部门希望在电子钱包服务上建立报告和分析,以便他们可以了解公司的钱包负债程度。
他们想要回答的一些问题如下:
- 电子钱包服务的每日信用余额是多少?
- 下个月会有多少贷款到期?
- 特定月份的信贷结果是什么(即已用百分比、过期百分比、剩余百分比)?
解决方案设计
在维度模型的设计过程中做出的四个关键决策包括:
1.选择业务流程。2.申报粮食。3.确定尺寸。4.确定事实。
让我们写下电子钱包案例的决策步骤:
**1。假设:**设计是基于给定的背景(业务流程)开发的,但也要考虑到灵活性。假设所有必填字段都可以从公司的交易数据库中获得。
2。粒度定义: 原子粒度是指给定业务流程捕获数据的最低级别。
在这种情况下,可以捕获的最低级别的数据是电子钱包交易,即电子钱包上的所有信用和借记交易。
3。维度: 维度提供了围绕业务流程事件的“谁、什么、哪里、何时、为什么和如何”的上下文。
尽管可以添加大量的描述性属性,但设计维度仅限于当前的业务流程,但该模型可以根据需要灵活地添加任何更多的细节。(以 Dim 为前缀的表名)
维度表:
-
DimWallet
-
DimCustomer
-
DimDate: 该维度包含所有与日期相关的解析值,如日期中的月份、日期中的星期、星期几等。这将非常方便地获得基于时间的报告。
4。事实: 事实是来自业务流程事件的度量,并且几乎总是数字。
事实被设计成关注具有完全可加性的事实。即使一些业务流程需求想要非累加的事实(已用百分比、过期百分比、剩余百分比等)。这些值可以通过单独计算附加事实来有效地获得。事实表中的每一行都代表了物理上可观察到的事件,而不仅仅关注于所需报告的需求。
事实表:
- FactWallet
星型模式模型
下面是电子钱包服务的维度模型的逻辑图。
eWallet — Star schema Dimensional Model
Ralph Kimball 是数据仓库技术的先驱,他总是在他的书中展示商业价值的重要性。星型模式比雪花型模式更受青睐,因为它具有更强的分析能力。
参考
[1] Ralph Kimball,Margy Ross,《数据仓库工具包,第二版,维度建模完全指南》
使用 Pandas 库的数据争论
在本文中,我们将看到一些最有用的技术,用于清理和处理熊猫图书馆的数据。
数据科学涉及数据的处理,以便数据可以很好地与数据算法一起工作。数据角力是处理数据的过程,如合并、分组和连接等。Pandas 库提供了有用的函数来支持数据争论任务。
因此,如果你问任何数据分析师、数据科学家或统计学家,他们把大部分时间花在哪个任务上,答案将是数据清理或数据争论和数据操纵,而不是编码或运行使用数据的模型。
与 Python 争论数据的目标:
- 从众多来源收集数据以揭示更深刻的情报。
- 及时向业务/数据分析师提供可操作的准确数据。
- 减少收集和整理的时间。简而言之,在数据被使用之前对其进行清理。
- 让数据分析师和科学家专注于数据分析,而不是争论。
- 帮助组织中的高层领导做出更好的决策。
我们将在本文中讨论以下主题。
- 数据探索
- 查找缺失值
- 过滤数据
- 整理
- 合并和串联
数据探索
在对数据进行任何操作之前,第一步是定位文件(csv、excel 和 xlsx 等)。),然后通过内置的 Pandas 函数读取它。在我的例子中,我将*train.csv*
文件存储在我正在处理的同一个目录中。
import pandas as pd
df = pd.read_csv('train.csv')
df.head()
Top 5 rows
df.dtypes
Output
从上面的代码摘录中,我们探索了我们的数据及其类型。现在我们通过*describe()*
函数来描述数据。
df.describe()
Statistics of data
*describe()*
给出了关于数据的见解和一些有用的统计数据,如平均值、最小值和最大值等。
处理缺失值
你的数据集可能包含许多缺失和重复的值,因此在对它们应用任何机器学习算法之前,我们(数据科学家)有责任处理它们。如果我们为我们的机器学习模型提供尽可能多的干净和准确的数据,那么我们训练的模型就会预测尽可能多的准确预测。
我们可以将总缺失值总结如下:
df.isna().sum()
Sum of missing values
我们已经确定了数据集中缺失的值,现在我们有几个选项来处理它们,要么我们可以删除那些包含缺失值的行,要么我们可以计算平均值、最小值、最大值和中值等。如果缺失值的行数占百分比很大(大约。20% — 30%),那么放弃它们将不是一个好的选择。所以你的工作是检验各种技术并明智地采取行动。
从上面的输出可以看出,*Embarked*
列中缺失值的数量只有 2,但是*Cabin*
和*Age*
列的数量很大,所以我们不能忽略它们。首先,我们将删除包含列*Embarked*
中缺失值的行,然后计算列*Age*
的平均值,并用平均值填充它们,并从数据集中删除列*Cabin*
。
# fill in the missing values in 'Age' column
age_mean_value=df['Age'].mean()
df['Age']=df['Age'].fillna(age_mean_value)
拆下立柱*Cabin*
df.drop("Cabin",axis=1,inplace=True)
Dataset after dropping Cabin Colum
过滤数据
下面这段代码对年龄大于 40 的整个数据集进行筛选,这意味着它将只包含那些列年龄大于 40 的行。
filtered_age = df[df.Age>40]
filtered_age
Filtered by age>40
如您所见,最初有 891 行,按年龄过滤后,只剩下 150 行。
整理
*sort_values*
功能可以帮助你对数据帧进行升序或降序排序。默认情况下*sort_values*
函数使用*quick sort*
算法进行排序,如果您想使用*heap sort*
或*merge sort*
等。然后可以使用*kind*
关键字。
# let's sort the column Name in ascending order
sorted_passengers = df.sort_values('Name',ascending=True,kind ='heapsort')
# now print the sorted data
sorted_passengers.head(10)
在这里,我根据*Name*
对数据集进行了排序
Sorted Dataset
合并和串联
Pandas 有*merge*
函数来合并两个数据帧,这是一个非常简单的函数。我已经从数据集中提取了上面两行和下面两行,并通过*Pandas*
*merge*
函数将它们组合起来。
*head()*
和*tail()*
函数分别返回顶行和底行,而*outer*
帮助合并两个不常用的行。
merged_df = pd.merge(df.head(2),df.tail(2),how='outer',indicator=True)
merged_df
Merged two dataframe
结论
我们已经看到了如何使用 Pandas 库处理和清理数据集,以及如何执行各种技术来清理数据集。
如果你对这篇文章有任何疑问,请随时问我,我会尽力解决你的疑问。
要获取我的 Jupyter 笔记本和数据集,请点击这里。
我希望你喜欢读这篇文章,你也可以访问我的 网站 ,在那里我会定期发布文章。
订阅 我的邮件列表,直接在您的收件箱中提前获得我的文章,或者关注我自己在 Medium 上发表的文章The Code Monster以完善您的技术知识。
了解你的作者
希曼舒·维尔马毕业于印度勒克瑙的 APJ 阿卜杜勒·卡拉姆大学博士。他是 Android & IOS 开发人员、机器学习和数据科学学习者、金融顾问和博客作者。
数据存储
Photo by @kxvn_lx
获取数据的有趣方式
拉一个社会成员(通常被科技公司称为用户提交他们的数据的过程正在成为一种常见的做法。一个吸引你的有趣活动与未经明确同意的用户数据销售形成鲜明对比。在这篇文章中,我建议对这个过程使用简写短语 databaiting 。
当你加入一项服务或购买一件产品时,谁购买你的数据通常不是你所知道的,而是一个发现的过程。激动人心的用户之旅?
在写这篇文章时,我无意冒犯,而是想让你更加意识到你提供的数据是如何被使用的。如果你开始质疑你提供数据的公司,首先质疑数据是什么,那也很好。我们或许可以谈论负责任的数据贡献,但我不确定这在实践中如何发挥作用。
在定义这个术语之前,让我们看几个简短的例子,当然是为了好玩,看看你是怎么想的。
23andMe 和祖先 DNA
乐趣:看看你从哪里来,哇!和你的亲戚联系。
数据:来自唾液和家谱的基因数据。
购买者/合作者示例:基因药物研究。
iRobot 物联网家居产品
有趣的是:一个打扫你房间的机器人!
资料:私宅地图。
购买者/合作者示例:谷歌广告。
亚马逊 Alexa 智能音箱
乐趣:命令演讲者做事!
数据:语音数据和行为数据。
买家/合作者:供亚马逊内部使用和/或最高出价者。
宜家智能照明
乐趣:控制你的灯光!
数据:来自连接到你手机的家庭的行为数据。
买方/合作方:内部使用和电话公司,如小米。
可能还有更多例子可以举出。这些例子被过分简化和简化了,也许太多了,但这仅仅意味着作为一个说明性的思路的粗略描述。
什么是数据报?
让我们从检查我放在一起的两个词开始,看看它是一个有用的术语还是不足以描述这种现象。首先是数据,然后是诱饵。
数据是收集在一起用于参考或分析的事实和统计数据。它是关于定性或定量变量的主体的一组值。对于我遇到的大多数处理数据的公司来说,人们的感觉是数据是可以衡量和量化的,这是一种主流观点。越来越多的人开始谈论将数据货币化,这个术语被比作石油等原始资源的。这指的是原始数据(未处理的)可以被处理以获得价值的想法。一些人甚至谈论新的淘金热,并将数据比作矿物。数据可以用于许多方面,从帮助治疗癌症、优化物流和训练算法,到学习如何应对给定的情况或背景。我们可以说它不是中立的,是由收集数据和解释数据的人塑造的。
诱饵在这种情况下引诱某人。对诱饵的一种理解是引诱鱼或动物。人类是在动物界中被提出的,而不是超越自然或其他动物,所以我们也容易受其影响。有些人会想到的上下文可能与捕鱼有关。当与人类有关时,作为诱饵的受害者的人通常会感到受伤和困惑。据说某些东西会引起情绪反应,从而导致行动,即使有人知道他们被引诱,也很难知道如何处理。
数据发送我的建议是:通过引发情绪反应来诱使某人提交数据。
受害者通常不知道他们的数据是如何被使用的,当他们发现时可能会受到伤害。您的数据可以用于为保险公司、武器制造商或电子商务公司训练监控数据集。你可能不知道这个。你知道公司可能会出售你的数据,而不是卖给谁,你被一个能改善你生活的产品或服务所吸引。因此,你提交自己(你的数据)作为交换,而没有意识到后果。这是我自己多次做过的事情。
知情同意
一个奇特的现象是挪威和世界其他地方的烟盒上的图像。你经常会发现这样的信息:“吸烟致命,”,它可能伴随着一幅可怕的图片,与你经常吸烟可能导致的一系列疾病有关。
我并不认为使用软件服务或硬件收集数据会杀死你,但是它可能会以你意想不到的方式影响你的生活。
我不知道这有多大帮助。我们仍然可以想象这样的场景:科技公司收集你的数据,并将其用于你不知道的目的,并给予了你极其诚实的知情同意。
这可能不会在不久的将来发生,但它提供了一个有趣的思想实验。我不确定这是不是解决方案,但是我们可以想象以下荒谬的情况:
- 警告:该产品可能作为行为数据出售给你最近的商店。我们可能会把它卖给汇总数据的人,而我们自己可能不知道它去了哪里,因为法律不够透明,而且你的数据非常难以追踪。不过我们尽力了。
- 感谢您提交您的 DNA 样本!要知道,它可能被用来为世界上一些最大的制药公司生产一两种药物。我们认为应该提到这一点,因为我们重视诚实。
- 通过提交您的心理测量信息来换取更大的社交网络,我们希望您意识到后果。我们可以为您提供更合适的产品,但我们会更好地引导您购买。
- 您刚才提供的信息既可用于向您销售产品/服务的公司,也可用于政治家联系您,只要他们付费,我们不会有太多歧视。此外,我们扩张得如此之快,以至于我们经常缺少在特定国家讲该语言的员工来监控可能的侵权行为。在我们有员工的国家,发布的内容量往往过高。正如你可能知道的,我们正在迅速扩张。
- 如果你滚动得太多,并且把自己和你的朋友比较,你可能会有更高的机会变得沮丧,所以如果可能的话,限制你的滚动。记住这项服务是会上瘾的,必须小心使用。我们使用您的行为数据,让您在该平台停留更长时间,以销售更多广告。
清爽吧?
数据经纪人
除非你从事信息行业,否则你可能从未听说过数据经纪人,但他们听说过你。今年早些时候(2019 年),史蒂芬·梅伦德斯和亚历克斯·帕斯捷尔纳克写了一篇关于《快公司》数据经纪人的文章。这项法律要求那些买卖数据的人进入注册中心。另一方面正如文章所说:
就连上个月生效的佛蒙特州首个此类法律也不要求数据经纪人披露谁在他们的数据库中,他们收集了什么数据,或者谁购买了这些数据。它也不要求经纪人让消费者访问他们自己的数据或选择退出数据收集。
这篇文章展示了一个有趣的图表。
Types of consumer data and data companies. Some companies included in the chart may not be covered by the Vermont law. Image by Cracked Labs an Institute for Critical Digital Culture.
《快速公司》文章中的图表让我看到了 Cracked Labs 内部的关键数字文化研究院。 Cracked Labs 是一家位于奥地利维也纳的独立研究机构和创意实验室。它调查信息技术的社会文化影响,并在数字文化领域发展社会创新。它是一个非营利组织,成立于 2012 年,旨在加强信息和通信技术的参与性和自主使用,以及自由获取知识和信息——独立于商业或政府利益。
下面两张大图摘自文章日常生活中的公司监控。
Different levels, realms and sources of corporate consumer data collection by Cracked Labs an Institute for Critical Digital Culture
隐性创收的商业模式
2019 年 1 月马克·扎克伯格发布了一篇关于脸书商业模式 的帖子。作为其中一部分,他写道:
我相信每个人都应该有自己的声音,并且能够沟通。如果我们致力于为每个人服务,那么我们需要一种每个人都负担得起的服务。做到这一点的最好方法是免费提供服务,这正是广告让我们能够做到的。[……]尽管如此,有些人对这种模式的复杂性感到担忧。在普通交易中,你向一家公司支付他们提供的产品或服务。在这里,你可以免费获得我们的服务——我们与广告商单独合作,向你展示相关的广告。这种模式让人感觉不透明,我们都不信任自己不了解的系统。有时这意味着人们认为我们做了我们没有做的事情。例如,我们不出售人们的数据,尽管经常有报道说我们这样做。事实上,向广告商出售人们的信息会违背我们的商业利益,因为这会降低我们的服务对广告商的独特价值。我们有强烈的动机保护人们的信息不被其他任何人访问。
这当然是半真半假或者根本不是真的。让我们检查一下陈述:*“…我们不出售人们的数据…”*是的,你做了标记。尽管广告商为对客户的洞察付费,但这种洞察是基于你的数据。尽管有复杂的技术基础设施和系统,但这并不是一项复杂或不透明的交易。你收集数据,将数据转化为具体的客户洞察,然后卖给广告商。这不像我去一家卖带肉汉堡包的商店,却被告知他们不卖肉,他们只卖汉堡包。这将使我严重质疑这种情况。
我们可以看看谷歌母公司 Alphabet 第一季度给投资者的最新投资者声明,并检查几份声明。他们正通过 Calico 进入生命科学领域,真正了解寿命和健康数据。它有义务显示任何未决诉讼,如果我们稍微多搜索一点,反垄断诉讼有一些有趣的陈述。谷歌因违反反垄断法被罚款创纪录的 24.2 亿€元(约 27.3 亿美元)。
“十多年来,谷歌的搜索引擎在决定我们大多数人在线阅读、使用和购买的内容方面发挥了决定性作用。如果不加以检查,这种看门人的权力就没有多少限制。谷歌可以部署其阴险的搜索操纵做法,在它选择的几乎任何在线领域霸占最大份额的流量和收入,在这个过程中悄悄地摧毁竞争、创新和消费者选择。”
TechCrunch 援引欧盟委员会 2017 年 6 月 27 日。
与亚马逊在购物相关领域的竞争升级被用作谷歌行为的正当理由。欧盟委员会的决定对€处以 43 亿欧元(截至 2018 年 6 月 30 日为 51 亿美元)的罚款,并指示终止“某些安卓分销行为”的争议行为。谷歌桑德尔·皮帅首席执行官于 2018 年 7 月 18 日发表博客评论这一决定:
快速创新、广泛选择和不断下降的价格是激烈竞争的经典标志,而 Android 实现了所有这些。今天的决定拒绝了支持 Android 的商业模式,这为每个人创造了更多的选择,而不是更少。我们打算上诉。
开放的 Android 系统是一个可以在多种系统上使用的操作系统。在一篇名为*的文章中,谷歌从你的 Android 手机中追踪的数据量令人震惊:“*谷歌收集了关于你的惊人数量的数据,尤其是从你最常用的设备,你的 Android 手机。这一切都可能在你不知情的情况下发生。”声明提到了 Quartz 的一份报告,该报告试图了解发送给谷歌的数据包括:
- 根据可能性,列出你的手机认为你可能在做的动作类型。(例如,步行:51%,骑自行车:4%,乘火车:3%)
- 大气压力
- 无论您是否连接到 wifi
- 您所连接的 wifi 接入点的 MAC 地址(这是唯一的标识符)
- 附近每个 wifi 接入点的 MAC 地址、信号强度和频率
- 每个附近蓝牙信标的 MAC 地址、标识符、类型和两个信号强度测量值
- 手机电池的电量以及手机是否正在充电
- 你的电池电压
- 你手机的 GPS 坐标及其准确性
- GPS 高程及其精度
- 作为整理照片的交换,你可以让谷歌通过收集附近蓝牙信标和 wifi 网络的信息,记录你在什么商店购物,在什么餐馆吃饭。
- 你多久去跑步一次
- 用蓝牙追踪你,尽管蓝牙已关闭
可能还有我不知道的其他数据点。关键是,通过了解你在一系列平台和服务上使用的关键词,谷歌可以比其他公司更清楚地知道你想要什么。这些信息就是正在出售的东西。声称谷歌是无可争议的数据测试冠军并不是没有根据的。
当然,收集的洞察力对使用谷歌的人来说是积极的,使他们更容易得到正确的东西;到达正确的地方;或者找到合适的服务或产品。
最后的免责声明
话虽如此,我确实很欣赏其中一些公司正在创造的服务和产品。很难想象没有谷歌和脸书的生活。这两家公司都让我的生活变得更好或更糟。这似乎是一个奇怪的说法,但是我的批评是建设性的,而不是对这些公司的极端抗议。
让我们持批评态度,参与关于数据共享作为公民责任的辩论。在我们的社会中如何处理数据有很大的影响。
写这篇文章是因为看到一个名为直立姿势的初创公司的广告活动。他们的口号是:“庆祝生命,自由和追求姿态。”直立姿势训练器用一个小粘合剂贴在你的背上,当你每次没精打采时,它会立即振动,提醒你纠正姿势。
Upright Campaign website retrieved the 7th of July 2019
当我看到该产品时,我的第一个想法是:这些数据会卖给谁?我发现自己也是这么想的,这种思路让我意识到这是科技公司的一种普遍做法。
尤其令人着迷的是这些可以被称为生物反馈设备的新型可穿戴设备,至少我在 2017 年的一篇期刊文章中看到它提到了由廖大银撰写的关于 协作、社交网络姿势训练以及姿势监测和生物反馈 。当公司离你的身体这么近时(苹果手表等。)我们可以开始谈论生物勘探。
**生物勘探:**是基于生物资源的新产品的发现和商业化过程。然而,这些生物资源不是植物或动物,而是你和你的数据。这可能看起来像是一个批判的开始,让人想起米歇尔·福柯(法国社会理论家)或者被认为是马克思主义者(有阶级关系的社会经济学),也许确实如此。
对数字文化的批判性研究并不是我所知道的一个领域,然而它引起了我的兴趣,因为我对社会科学、计算机科学,尤其是人工智能以及可持续发展感兴趣。我很可能会继续这篇文章,尽我最大努力去理解关键数字文化研究院所涵盖的研究领域。
作为一名挪威人,我将以一张我在一家名为 Swedish Posture 的公司看到的图片来结束这篇文章。姿势校准是未来吗?我无法预测未来,但是人类的人体工程学在这个健康科技领域看起来非常光明,所以我能说的就是保持正直。保持直立!
数据发送 : 通过引发情感反应来诱使某人提交数据。
你认为数据留白是描述这种情况的一个有用的词吗?请在下面的评论区告诉我。
这是#500daysofAI 的第 35 天,请关注我关于 AI 的每日更新。
非常感谢您的阅读!
什么是#500daysofAI?
我在挑战自己,用#500daysofAI 写下并思考未来 500 天的人工智能话题。这是我发明的一个挑战,来保持对这个话题的思考,和大家分享我的话。
解释了数据库规范化
通过设计和修改示例数据库模式来了解数据库规范化!
规范化是一种在数据库中组织数据的技术。对数据库进行规范化以最小化冗余(重复数据)并确保每个表中只存储相关数据是很重要的。它还可以防止由数据库修改(如插入、删除和更新)引起的任何问题。
组织的阶段被称为范式。在本教程中,我们将为一家建筑公司重新设计一个数据库,并确保它满足三种范式:
第一范式 ( 1NF ):
- 数据存储在表中,表中的行由主键唯一标识
- 每个表中的数据以最简化的形式存储在各个列中
- 没有重复的组
第二范式( 2NF ):
- 来自 1NF 的一切
- 每个表中只存储与表的主键相关的数据
第三范式(3NF):
- 来自 2NF 的一切
- 每个表中的列之间没有表内依赖关系
请注意,实际上有六个级别的规范化;然而,第三范式被认为是大多数应用程序所必需的最高层次,所以我们将只讨论前三种形式。
我们开始吧!
本教程改编自 Next Tech 的数据库基础课程,该课程带有一个浏览器内 MySQL 数据库以及需要完成的交互式任务和项目。这里可以免费上手!
我们的数据库:科迪的建设
Codey’s Construction’s database schema with a new table that causes the database to violate the rules of normalization.
我们将在本教程中使用的数据库是为 Codey 的建筑公司(Codey 是一个有用的编码机器人,在前面提到的课程中与您一起工作)。从上面的模式可以看出,数据库包含了表projects
、job_orders
、employees
和project_employees
。最近,添加了customers
表来存储客户数据。
不幸的是,这个表的设计没有满足三种形式的规范化…让我们来解决这个问题!
第一范式
第一范式与表和列中数据的重复和分组有关。
Codey 的构造的表customers
违反了 1NF 的全部三条规则。
- 没有主键!数据库用户将被迫按公司名称查找公司,但不能保证公司名称是唯一的(因为唯一的公司名称是在各州注册的)。
- 这些数据不是最简化的形式。列
contact_person_and_role
可以进一步分为两列,如contact_person
和contact_role
。 - 有两组重复的列— (
project1_id
、project1_feedback
)和(project2_id
、project2_feedback
)。
以下 SQL 语句用于创建customers
表:
Example data for customers
table.
通过修改一些列,我们可以帮助重新设计这个表,使它满足 1NF。
首先,我们需要添加一个名为id
的主键列,数据类型为INT(6)
:
使用这个语句,我们添加了一个自动递增的主键作为表中的第一列。
为了满足第二个条件,我们需要拆分contact_person_and_role
列:
在这里,我们简单地将其重命名为contact_person
,并在它后面紧接着增加了一列contact_person_role
。
为了满足第三个条件,我们需要将包含项目 id 和项目反馈的列移动到一个名为project_feedbacks
的新表中。首先,让我们从customers
表中删除这些列:
然后创建project_feedbacks
表:
下面是数据库模式现在的样子:
Modified schema that now satisfies 1NF.
如您所见,在project_feedbacks
表或customers
表中不再有重复组。我们仍然知道哪个客户说了什么,因为project_feedbacks.customer_id
引用了customers
表。
现在我们的customers
表满足 1NF!让我们继续第二范式。
第二范式
要实现第二范式,数据库必须首先满足 1NF 的所有条件。此后,满足 2NF 要求每个表中的所有数据都直接与表的主键标识的记录相关。
我们违反了 2NF,因为contact_person
、contact_person_role
和phone_number
列跟踪的数据与联系人有关,而不是客户。如果客户的联系人发生变化,我们将不得不编辑所有这些列,这样做的风险是,我们将更改其中一列中的值,但忘记更改另一列。
为了帮助 Codey 的构造修复这个表以满足 2NF,应该将这些列移动到包含联系人数据的表中。首先,让我们删除“客户”中与我们的主键无关的列:
请注意,我们保留了contact_person_id
,因此我们仍然知道应该联系谁。现在,让我们创建新表contact_persons
,这样我们就有地方存储每个联系人的数据了。
Codey’s Construction 的数据库模式现在如下所示:
Modified schema that now satisfies 2NF.
现在,如果客户的联系人发生变化,建筑公司只需在contact_persons
表中插入一条记录,并更改customers
表中的contact_person_id
。
第三范式
对于处于第三范式的数据库,它必须首先满足 2NF(因此也是 1NF)的所有标准。
然后,每一列必须非传递依赖于表的主键。这意味着表中的所有列都应该依赖于主键,而不是其他列。如果column_a
依赖于主键,也依赖于column_b
,那么column_a
过渡依赖于主键,所以表不满足 3NF。
你读那个会不会头疼?放心吧!下面会有更多解释。
这是我们满足 1NF 和 2NF 后的customers
表:
Example data for modified customers
table.
该表当前有依赖于传递的列。过渡依赖关系在city
和zip
之间。客户所在的城市依赖于客户,所以这满足了 2NF 然而,城市也取决于邮政编码。如果客户搬迁,我们可能会更新一列,而不更新另一列。因为存在这种关系,所以数据库不在 3NF 中。
为了修复我们的数据库以满足 3NF,我们需要从customers
中删除city
列,并创建一个新表zips
来存储该数据:
Modified schema that now satisfies 3NF.
就是这样!发现违反 3NF 的问题可能很困难,但是确保数据库能够抵御仅部分更新数据所导致的错误是值得的。
我希望你喜欢这篇关于数据库规范化的教程!Codey’s Construction 的数据库现在满足三种形式的规范化。
如果你想继续学习数据库,Next Tech 的 数据库基础 课程涵盖了你入门数据库和 SQL 所需的所有知识。通过帮助一个名为 Codey 的交互式编码机器人,您将学习如何创建和设计数据库,修改数据,以及编写 SQL 查询来回答业务问题。这里 可以免费上手 !
Databricks:如何在本地计算机上将数据框保存为 CSV 文件
Photo credit to Mika Baumeister from Unsplash
当我从事处理大型数据集的 Python 项目时,我通常使用 Spyder。Spyder 的环境很简单;我可以浏览工作目录,维护大型代码库,检查我创建的数据框架。然而,如果我不对大数据进行子集化,我会不断地面临内存问题,并与非常长的计算时间作斗争。为此,我偶尔会使用数据块。Databricks 是一个微软 Azure 平台,在这里您可以轻松地将大量数据解析到“笔记本”中,并执行基于 Apache Spark 的分析。
如果您想使用 pyspark 处理数据框和运行模型,您可以很容易地参考 Databricks 的网站了解更多信息。然而,在处理 Databricks 时,我注意到将文件保存为 CSV 格式并不是很简单。在接下来的部分中,我将分享如何在本地计算机上将数据框从数据块轻松保存为 CSV 格式。
1。探索数据块文件系统(DBFS)
从 Azure Databricks 主页,你可以进入“上传数据”(在常见任务下)→“DBFS”→“文件存储”。
DBFS 文件存储是您创建文件夹并将数据框保存为 CSV 格式的地方。默认情况下,FileStore 有三个文件夹:导入阶段、图和表。
2。将数据帧保存到文件存储中的 CSV 文件中
Sample.coalesce(1).write.format(“com.databricks.spark.csv”).option(“header”, “true”).save(“dbfs:/FileStore/df/Sample.csv”)
使用笔记本上的上述代码,我创建了一个文件夹“df ”,并将一个数据框“Sample”保存到 CSV 中。使用 coalesce(1)很重要,因为它将数据帧保存为一个整体。在本文的最后,我还将演示当代码中没有包含 coalesce(1)时会发生什么。
将数据框转换为 CSV 格式后,转到文件存储。您将看到您创建的文件夹和文件。“part-00000”是我必须下载到本地计算机上的 CSV 文件。我为步骤 3 复制了 /FileStore/ 之后的路径。
3.在本地计算机上下载 CSV 文件
为了在本地计算机上下载位于 DBFS 文件存储中的 CSV 文件,您必须将突出显示的 URL 更改为以下内容:
https://westeurope.azuredatabricks.net/files/df/sample . CSV/part-00000-tid-8365188928461432060–63d 7293d-3b 02–43ff-b461-edd 732 f 9 e 06 e-4704-c000 . CSV?o= 3847738880082577
正如您所注意到的,以粗体显示的 CSV 路径(df/sample . CSV/part-00000-tid-8365188928461432060–63d 7293d-3b 02–43ff-b461-edd 732 f 9 e 06 e-4704-c000 . CSV)来自步骤 2。号码( 3847738880082577 )来自原网址。
当您如上所述更改 URL 并按 enter 时,CSV 文件将自动下载到您的本地计算机上。
dbutils.fs.rm(“/FileStore/df”,True)
如果您想删除 FileStore 中的文件,只需使用上面的代码即可。一旦被删除,你会得到评论“真”。
如前所述,下面是代码中不包含 coalesce(1)时的细节。
默认情况下,Databricks 将数据保存到许多分区中。Coalesce(1)将所有文件合并成一个文件,解决了这个分区问题。但是,当您处理非常大的数据集(> 1TB,低速)时,使用 coalesce (1)或 repartition (1)并不是一个好主意,因为它会将所有数据传输到单个工作线程,这会导致内存不足问题和处理速度缓慢。在这种情况下,建议按列解析或分发给多个工作线程。
另外,还有另外两种方法可以将数据框保存为本地计算机上的 CSV 文件:
- 使用“下载完整结果”
这个方法是最简单的。然而,Databricks 最多只能下载 100 万行。因此,如果您的数据框超过 100 万行,我建议您使用上述方法或如下所示的 Databricks CLI。
2.使用 Databricks CLI
Databricks CLI (Databricks 命令行界面)构建在 Databricks REST API 之上,与 Databricks 工作区和文件系统 API 交互。Databricks CLI 需要一些设置,但您也可以使用此方法将数据框下载到本地计算机上。有关更多详细信息,请参考 Databricks CLI 网页。
感谢您的阅读!如果你喜欢我所做的,不要犹豫,在 GitHub 上关注我,在 Linkedin 上与我联系。
另外,请随意查看我的其他文章:
如何获得关于货币汇率的 Twitter 通知:网络抓取和自动化
DataFrame.transform —火花函数合成
Photo by 嘉淇 徐 from Pexels
让您的 Spark 代码更具功能性,可读性更好
如何从转换方法中返回容易组合的函数
随着组织迁移到 Spark 上并在 Spark 上创建新的数据处理逻辑,最终的软件会变得非常大,大到需要考虑我们应用于其他软件项目的所有可维护性。
虽然有许多关于编写性能逻辑的全面而有价值的资源,但关于结构化项目的资源就不一样了,这些资源创建了可重用的 Spark 代码,并最终降低了长期维护这些项目的成本。
在这篇文章中,我们来具体看看 Spark Scala DataFrame API,以及如何利用 数据集[T]。转换 函数来编写可组合代码。
注意:data frame 是 Dataset[Row] 的类型别名。
这个例子
有一些特定金额的交易,包含描述付款人和受益人的“详细信息”列:
Note that this DataFrame could be a Dataset[Transaction], but it’s not useful to the examples
没有。改变
让我们创建两个函数来处理事务:
- sumAmounts :对一列或多列的合计值求和
- extractPayerBeneficiary:将付款人和受益人从一列分离成两个新列
使用这些方法来回答以下问题:“哪些受益人在哪些天的总金额超过 25?”
这是一个简单的例子,但是读起来不太好。将其与Dataset
功能的典型用法进行比较:
df.select(...).filter(...).withColumn(...)...
我们将一些逻辑分解到方法中,这有助于我们分别对每一部分进行推理,但是代码的可读性变得更差了。
使用。改变
transform 函数是 Dataset 类的一个方法,它的目的是添加一个“简洁的语法来链接定制的转换
*def* transform[U](t: Dataset[T] => Dataset[U]): Dataset[U] = t(*this*)
它采用了一个函数,从Dataset[T]
, T(数据集中的行类型)到Dataset[U]
, *U(结果数据集中的行类型)——*U 可以与 T 相同
一个函数DataFrame => DataFrame
符合这个签名——如果我们解开类型别名,我们得到Dataset[Row] => Dataset[Row]
,其中 T 和 U 都是Row
。
使用您之前定义的方法并简单地切换到使用.transform
是一个很好的起点:
更进一步
sumAmounts
和extractPayerBeneficiary
方法不太适合.transform
。这是因为这些方法返回的是一个数据帧,而不是一个函数DataFrame => DataFrame
,所以为了返回一个可以在.transform
中使用的函数,你需要不断地使用下划线来代替数据帧参数。
您可以重写这些方法来返回签名的函数:DataFrame => DataFrame
,以精确匹配.transform
参数类型:
Only the signature had to be changed and a “df =>” added!
现在,您不再需要“下划线”,可以用不同的方式组合这些功能:
您所有的自定义转换现在都返回DataFrame => DataFrame
,因此您可以使用类型别名来更好地描述返回值:
type Transform = DataFrame => DataFrame
例如def sumAmounts(by: Column*): Transform
摘要
- 自定义转换方法可以重新排列以返回类型为
DataFrame => DataFrame
的函数。 - 返回函数使得组合转换和使用它们变得更加容易。
- 类型别名可用于显式定义“转换”。
你可以在这个要点里找到我的 build.sbt 和上面的代码
企业级的数据运营和数据科学
苹果 | 谷歌 | SPOTIFY | 其他
Sanjeev Sharma 在 TDS 播客
编者按:这是迈向数据科学播客“攀登数据科学阶梯”系列的第 11 集,由 Jeremie Harris、Edouard Harris 和 Russell Pollari 主持。他们一起经营一家名为sharpes minds的数据科学导师创业公司。可以听下面的播客:
如果你没有在超大型公司做过数据科学家,你可能不会意识到的一件事是,企业规模出现的问题(以及解决这些问题所需的技能)与你在初创公司可能遇到的问题完全不同。
规模是一件好事,原因有很多:它意味着访问更多的数据源,通常还意味着更多的计算和存储资源。但是,大公司只有通过促进大团队之间的成功合作才能利用这些东西(这真的非常非常困难),并且必须应对独特的数据卫生挑战,如果不彻底改造几乎整个数据科学生命周期,这些挑战就无法解决。
所以我想说,我们为今天的专题节目请到了德尔福数据现代化和战略副总裁 Sanjeev Sharma,这是一件好事。Sanjeev 的专长是帮助拥有大量技术债务的大公司更新和升级他们的数据管道,他在企业范围内了解数据科学的来龙去脉的时间几乎比任何人都长。以下是我们从聊天中获得的最大收获:
- 企业规模的公司背后往往有并购的历史。因此,他们必须集成来自完全不同数据源的大量不同的数据集。确保来自所有这些不同来源的数据以一种让每个需要的人都能轻松访问的方式进行汇总是一项独特的挑战。
- 如果你想在一家企业公司找到一份工作,有一点要记住,没有一种特定的工具或一套工具会决定成败。上面提到的数据源的多样性意味着您最终会遇到世界上所有的数据库类型和管道架构。因此,如果你试图进入企业数据科学,Sanjeev 的建议是专注于你的基础知识,而不是专注于学习框架 X、Y 和 z。
- 过去,开发人员会构建应用程序,而“It 人员”会负责将这些应用程序部署到生产环境中。但大多数公司后来都认识到,将应用程序和部署步骤集成到一个统一的流程中(称为“DevOps”)是确保最终产品一致性的一个好方法。同样,“数据操作”(即完整数据生命周期的集成)正在成为大公司的普遍做法。你可以在这里阅读 Sanjeev 关于 DataOps 的帖子。
- 当谈到更广泛的数据科学时,Sanjeev 认为计算和架构改进的速度是定义数据科学角色未来如何发展的主要因素之一。更多计算意味着更有能力进行试错、搜索参数和超参数空间,甚至自动化模型选择。例如,过去的情况是,数据科学家必须理解他们的模型,以便能够做出聪明的有根据的猜测,即哪些超参数最适合他们的情况。当然,这在某种程度上仍然是正确的,但是计算能力和 AutoML 工具的可用性已经大大削弱了手动超参数调优的价值。正如 Sanjeev 所说,“几年前是一项技能的东西,今天却成了商品。”
- 由于计算和基础设施的改进,越来越多的数据管道变得自动化和优化,业务知识、产品直觉和领域专业知识的重要性只会增加。机器将能够告诉我们什么样的超参数最适合给定的数据集,但在我们实现全面的 AGI 之前,它们仍然需要具有商业意识的人类来决定,例如,要删除或包含哪些离群值以及为什么要删除,如何从可用的数据集中进行采样以建立训练和验证集,等等。
你可以在推特上关注桑吉夫,网址是 @sd_architect,或者点击查看的网站。
我们可以使用数据科学预测石油和天然气工程项目的成本超支吗?
Photo by Dean Brierley on Unsplash
我们的调查涉及对发生在 15 个石油和天然气海上项目中的重大漂移因素的分析。漂移因素是可能的功能失调点,会导致项目绩效下降,然后在面临有害后果之前实施纠正或预防措施。然后从 15 个石油和天然气项目中收集了 720 个事件。
第一部分:探索性数据分析
首先,我将使用 python 编写一个经典 EDA,在第一步中,我导入经典库并上传文件:
Author’s creations
该数据库包含有关石油和天然气海上工程项目中过度成本的以下信息:
**项目:**项目名称。
执行时间:财年:年季月日。
主要类别和类别详细说明导致项目成本过高的工程问题。
主要原因和原因详情与项目管理相关的问题相关原因。
comments 列中描述的这四个列之间有一个链接。一些问题被判断为“仅仅是工程问题”,而另一些问题被判断为“工程和项目管理问题”,这种区别是基于处理该问题并完成数据库的人给出的描述。
金额是每一个问题造成的金钱损失总额。
根本原因是问题可能的主要原因。
下一步是浏览数据库,以检查无效值:
Checking for missing values and NaNs (Author’s creations)
“根本原因”一栏几乎是空的,我将删除它。comments 列对于 NLP 分析,以及与类别或原因建立关系非常有用。
然而,在第一个例子中,我将保持简单,这个探索不需要评论栏。
下一步将探究每个项目中损失的金额。
Table 1. Author’s creations
金额以千美元为单位。
当绘制(见下图)损失金额和项目名称时,我们可以看到“负金额”,这意味着采取了一些措施来纠正错误并挽回部分损失。
Amount of losses per project. (Author’s creations)
因为我只对正的“损失”感兴趣,所以我只保留金额的正值。我定义了一个名为 Overcost 的新数据集:
Author’s creations
Table 2.Author’s creations
现在,我可以检查每个项目中产生的实际超额成本。
与上表相比,这些数字更高。
然而,有一些项目仍然有“小”的数字,我会放弃它们,以便专注于更大的项目。
按类别分类的结果是:
Amount of losses per project by category (Author’s creations)
因为所有的项目与项目的规模相比都有不同的损失,所以很难比较每个类别的重要性。
为了提高可视化效果,并获得所有项目的相似视图,我将每个项目行中的损失金额除以项目的总损失,对该数据进行归一化处理:
Author’s creations
该图显示了各个项目的相对损失额。它还显示了一些可以丢弃的异常值(例如,数量> 30 的值):
Author’s creations
最后一幅图显示了最重要项目按类别划分的标准化损失的比较分布。
最后,我们可以探索其他列。例如具有接合图。但在此之前,有必要将分类数据(如详细原因和月份)转换成数字(浮点型)。因此,我创建了下一个映射:
结果,该图给出了原因细节和月份之间的关系。举例来说,我们可以看到原因 5“设备故障”在第 2 个月和第 10 个月左右有很大影响
Impact of causes of project losses by month (Author’s creations)
第二部分。使用贝叶斯网络预测成本超支
研究石油和天然气项目常见问题原因的顾问选择了之前列出的原因(原因从 1.4 到 5.2)。此外,我们采访了六位行业专家。他们被提供了一个被评估项目的主要漂移因素的列表,以检查原因是否有意义以及是否与他们所属的领域一致。由于被评估的项目属于同一个行业,它们共享特定的漂移因子。我们的因果模型具有有限数量的经验定义的漂移因子。
下表显示了所研究项目中最常见的漂移因素。为了证实我们的研究,该表还显示了 PM 文献的来源,其中相同领域(石油和天然气建设)的项目试验了相同的漂移系数。
Table 3. Selected Drift Factors. (Author’s creations)
我们调查的下一步是通过从数据库中提取知识来了解漂移因素对项目过度成本的影响。假设所有漂移因子都收敛到目标节点(没有任何其他中间节点)。标记项目集分为训练集(数据集的 90%)和测试集(数据集的 10%)。
**数据结构化:**我们调整了数据库,以获得一个适应贝叶斯网络的表,同时使用足够的行来使模型可靠。我们获得的数据如表 4 所示。对于每个项目,我们都有由于特定问题而损失的金额。
Table 4. Raw data format (Author’s creations)
然后,我们必须将问题转化为项目中反复出现偏差的原因。这项工作也是在专家的帮助下完成的,他们根据对数据库中事件描述的理解来定义重复发生的原因。表 5 显示了与我们的第一个数据结构化相当的结构化:每个单元格显示了由于每个漂移因素(列)导致的每个项目(行)的资金损失量。
Table 5. Data including drift factors. Real losses by drift factor by project (Author’s creations)
接下来,有必要对漂移因素的影响进行标准化。因此,我们建议将表 5 转换为另一个数据库,其中的衡量标准由每个项目的费用的相对资金损失组成,即每个项目的每个漂移因素造成的损失的百分比,如表 6 所示。
Table 6. Data including drift factors. Percentage losses by drift factor by project (Author’s creations)
然而,该表没有足够的数据来训练贝叶斯算法。因此,我们应用了另一种数据配置策略,即按照日期以及月份和年份的分段来分离事件。数据库已重组,如下表所示。在该表中,每个单元格总结了给定月份(行)与漂移因子(列)相关的所有事件造成的资金损失百分比。这个新表格有 720 行,对应于在 48 个月内评估的 15 个项目。
Table 7. Final structured data format. (Author’s creations)
我们进行了几次模拟,直到我们得到一个好的特征来训练算法。在每个测试中,我们修改了超参数(输入/输出节点的数量、数据库的结构、合成节点的状态数量、输出节点的状态数量)。我们尝试了几次模拟,直到我们得到一个标准化的有用的超参数组合来训练算法。
选择和优化超参数是一项艰巨的任务,如果你有兴趣了解这个主题的更多信息,我推荐以下帖子:
在这段历史中,我们讨论了在基于贝叶斯理论建立模型时要考虑的结构标准
towardsdatascience.com](/the-hyperparameter-tuning-problem-in-bayesian-networks-1371590f470)
表 8 总结了超参数的值。我们选择了如表 7 所示的数据库结构。该数据库使算法学习漂移因子和成本超支百分比之间的关系。它支持为目标节点构建 CPT。每一列对应一个超参数;每行显示这些超参数可以取的值。不同的 bn 可以从上述超参数的组合中构建。在表 8 中,绿色和带下划线的值表示我们在模型中采用的超参数组合。
Table 10. Overview of the Hyperparameters, and their possible values. (Author’s creations)
我们测试了几个超参数,以获得可接受的组合数量。学习算法计算合成节点和目标节点 CPT 之间的关系。
我们将学习算法应用于数据库。该算法生成与目标节点的 CPT(project over cost)相对应的值。最终模型是使用 GeNie 软件创建的。过度成本(目标)节点的类别可以理解如下:
**P1 _😗*被评估项目有 0% 的概率发生相当于不到 1%费用的超额成本。即 P(Overcost) < 1% = 0。
被评估项目有 2% 的概率发生相当于项目费用 1%到 10%的超额成本。即 1% ≤ P(过度成本)< 10% = 0.02。
**P1 _ 100:**被评估项目有 61% 的概率发生相当于项目费用 10%至 100%的超额成本。即 10% ≤ P(过度成本)< 100% = 0.61
P_100_: 被评估项目发生大于项目费用 100%的超额成本的概率为 37% 。即 P(过度成本)≥ 100% = 0.37
下图显示了完整的贝叶斯网络。在这个网络中,输入节点对应于漂移因子的子原因。漂移因子对应于节点 D1 到 D12。
The complete Bayesian network (Author’s creations)
**模型的测试。**然后我们用新数据测试了因果模型。我们用与项目数据库中包括的项目相对应的信息来实例化每个成熟度级别,但是不在训练数据集中。注册目标节点中每个状态的相应过度开销。为每个状态值计算精度。下图显示了该模拟的结果。训练数据和测试数据之间的相对误差小于 6%。
The complete Bayesian network (Author’s creations)
**改进建议。**首先,我们进行分析,以检测哪些漂移因素对因果网络影响更大。这种第一次分析允许选择具体评估项目的问题的主要原因。下图显示了该示例的反向传播分析。结果表明,节点 D1、D7、D8、D9 对项目的超额成本有很大的影响。因此,应该使用与这些节点(S_Pa、R_Pa、I_Mr、R_Mf)相关联的成熟度标准来构建建议场景,因为决策者可以对最有影响力的节点上的工作进行优先级排序。
Backpropagation analysis for the given example (Author’s creations)
第二,决策者模拟了达到所选成熟度标准的新成熟度级别的假设。然后运行新的 BN 使他/她能够计算新的成熟度等级将如何改善项目超额成本的概率分布。下图显示了模拟的结果。将所选成熟度标准的节点状态从“否”更改为“是”会在项目过度成本节点中产生重大变化。用户可以决定这个结果是否足够好,或者是否需要对流程进行另一次迭代以获得更好的结果。
Performance prediction based on recommendations for the given example. (Author’s creations)
下图显示了此场景流程的摘要。第一列显示了模拟之前每个项目的项目超额成本概率的结果,即基线项目管理成熟度评估。第二列提出了主要的建议,这些建议被写成成熟度标准的改进,并且每一个改变都假定了一系列要付诸实践的行动。第三列显示了应用这些建议后的模拟结果。
Simulation results for an improvement scenarios (Author’s creations)
由于建议与 IB2M 命名法(S_Pa、R_Pa 等)一致,因此应该将它们转化为最佳实践。当然,这些建议并不详尽,其中一些可能超出了范围。专家根据项目的具体情况对它们进行调整,并采取他/她认为必要的其他行动来支持它们。我们可以对该建议解释如下:
**从 3 级到 5 级的 S _ Pa:**改善社会/计划活动,如资源调度,从在一个项目中使用到在整个组织中使用。
**从 2 级到 5 级的 R _ Pa:**改进项目计划中使用的成本和时间活动(任务调度、成本/收益分析、成本估算、自上而下估算等)。)从已定义的级别(知道它们的存在,有时会使用它)到在整个组织中使用的程度。
**R_Mr 从 3 级到 5 级:**改进项目控制中使用的成本和时间监控工具(控制图如甘特图、S 曲线、因果图等。)从在单个项目中的使用到在整个组织中的使用。
**从第 4 级到第 5 级的 R _ Mf:**提高整个组织使用监控工具(如上所述)的频率,例如,通过改进基线计划。
如果你想阅读这篇文章的完整研究链接,请点击下一个链接:
提出了一种建立项目管理成熟度和项目超额成本之间因果关系的方法
www.sciencedirect.com](https://www.sciencedirect.com/science/article/pii/S0166361519309480?dgcid=author)
如果访问受限,您也可以尝试此链接:
感谢阅读!!!
如果你想继续阅读这样的故事,你可以在这里订阅!
如何利用地理信息设计要素
理论和真实数据科学示例
Photo by Марьян Блан | @marjanblan on Unsplash
每一个销售商品或服务的企业都有一个实际地址。毫无疑问,地理位置可以决定一家企业的成败。对于数据科学家来说,提取测地特征,即与地球几何形状相关的特征,可以提供清晰的见解,并显著提高机器学习模型的性能。
在本文中,我们将使用 Yelp 数据集,特别是[business.json](https://www.yelp.com/dataset/documentation/main)
文件来提取依赖于位置的特征。
我们还将从布朗施泰因、塞门迪亚耶夫、穆西奥尔、穆利格(链接到 PDF )的数学手册和简菲利普马图切克的摘要中汲取经验
数据概述
Yelp 文档很好地概述了这些特性,下面是一个简短的片段。
{
// string, 22 character unique string business id
**"business_id": "tnhfDv5Il8EaGSXZGiuQGg",**
// string, the business's name
**"name": "Garaje",**
// string, the full address of the business
**"address": "475 3rd St",**
// string, the city
**"city": "San Francisco",**
// string, 2 character state code, if applicable
**"state": "CA",**
// string, the postal code
**"postal code": "94107",**
// float, latitude
**"latitude": 37.7817529521,**
// float, longitude
**"longitude": -122.39612197,**
// float, star rating, rounded to half-stars
**"stars": 4.5,**
// integer, number of reviews
**"review_count": 1198**
某些地区往往高度发达,有很多企业。此外,相似的企业往往聚集在一起。
例如,上面的商店位于旧金山的 SoMA 社区(有很棒的鳄梨色拉酱),周围聚集了许多其他餐馆。
我们将使用纬度和经度来查询其周围企业的数据框架。为此,我们需要一个地理复习员。
球面坐标系
地球是一个不完美的球体,半径大约为 6357 公里。地理坐标系是一种允许在球体上定位点的方法,在土地测量以及其他专业中经常使用。
我们将纬度定义为从赤道零度到两极 90 度的角度。相反,经度从一极到另一极,范围从 0 度到 180 度。下图在一个球体上说明了这两个概念。
Source: https://en.wikipedia.org/wiki/Geographic_coordinate_system
查询邻域中的点
现在我们已经定义了坐标系,我们需要一种方法来定义感兴趣点周围的边界框,并抓取它周围的定界区域中的所有点。
球面上的两点
作为第一种方法,我们可以计算半径为R
的球体上两点P(lat1, long1)
和Q(lat2, long2)
之间的顺行距离:
这种方法非常慢,因为它意味着计算数据集中所有点与所有其他点之间的距离。
角半径
一个更好的方法是用角半径来描述从给定的角度看一个球体或圆有多大。例如,如果我们想在半径为R
的球体上覆盖距离d
,那么角半径r
为:
包围盒
然后,我们定义完全包围由角半径捕获的区域的节点。沿着纬度移动意味着我们可以沿着子午线移动,保持经度不变。因此,边界纬度定义为:
沿着纬度圈移动以找到边界经度的方式与上面的方式不同。在下图中,点T1
和T2
分别具有最大和最小经度。它们与兴趣点M
不在同一纬度圈上,而是更靠近极点。
Source: Jan Philip Matuschek
T1
和T2
的纬度是:
因此,极限经度计算如下:
其中:
数学到 Python
我们可以用 python 代码来解释上面的方法:
在 Garaje 的示例中,我们的代码将返回一个 dataframe,列出 Garaje 半径范围内的所有企业,如下图所示:
Source: https://www.mapdevelopers.com/draw-circle-tool.php
特征工程
给定一个像我们这样的数据帧,我们可以编写一个代码来返回一个地理上有界的数据帧的副本(注意:不是视图)
我们能从这些信息中提取什么?事实证明,我们可以学到很多东西:
- 附近有多少商家(密度
- 价格范围比较
- 星级比较
- 审核计数
- 等等…
进行比较时,缩放特征通常是个好主意。例如,在比较价格时,我们可以通过使用查询数据框架的平均值和标准差来标准化 ( z 得分标准化)价格。
星级评定
作为第一个特征,我们可以绘制每个条目相对于其最近邻居的标准化星级。这似乎是一种高斯分布,一个街区的大多数企业在评级方面都相当同质。
价格幅度
价格比较似乎是双峰,更详细的分析可能会使查询更严格,只包括相同类型的企业。
密度计数
我们将密度定义为有界框内的企业数量。这个特性不需要做任何标准化。
请注意,根据查询半径和该地区的开发量,下图会有很大变化。
结论
适当的特征工程可以为您的机器学习模型提供更好地执行所需的优势。通过考虑地理因素,我们可以推导出依赖于位置的特征。
在 Yelp 数据集的情况下,当插入大地测量特征时,每个模型的 AUC 至少提高了 5% 。在所有算法中,它们在最重要的前 5 个特性中至少出现过一次!
面向大规模偏好聚合的数据集融合
Image by Author
对于很多问题,我们有强大的机器学习算法,在给定足够数据的情况下,可以达到前所未有的性能。然而,拥有大量通用和高质量数据的条件并不容易满足。
对于需要人工输入的问题来说尤其困难。让人们直接参与数据采集过程既费钱又费时。此外,对于某些问题,需要专业知识(如医学样本评估),或受控环境(如食品质量、视觉实验)。由于这些要求和约束,创建的数据集可能非常小且非常具体。
一个很大的问题领域,其中很难建立数据集是引发规模,因为人类的判断。结果数据集包含我们正在标记的对象和感知比例之间的对应关系。例如食物的味道(酸奶有多甜?)、图像质量(有噪声的图像离参考有多远?)或者甚至是人的年龄(照片中的人的感知年龄是多少?).
怎么才能解决问题?
有两种方法可以解决数据不足的问题——投入大量资金从零开始收集数据集,或者更聪明一点,将已经收集的数据集融合在一起——重用收集的知识。
在这篇文章中,我将讨论分级和评级,以及如何在一个图像质量评估的例子中将这两种协议混合在一起。收集的数据通常用于训练客观图像质量指标,这些指标应与人类感知密切相关。
文章的 MATLAB 代码在这里可用,Python 代码在这里可用。
这篇文章是基于这篇论文——如果你想看更多的细节和对这个问题的严谨方法,不要错过。
如何引出一个尺度?
在构建量表时,我们试图恢复潜在的分数。这种量表有两种构建方式——评级或排名。
Figure 1: Rating and ranking protocols. Image by Author.
等级
我们可以成对或成组地排列对象。在这里,我将集中讨论成对比较,因为它们简单并且能够将集合比较的结果转换成成对比较。
在成对比较实验中,受试者根据某种标准选择两个条件中的一个。答案被记录在矩阵 C 中,其中每个条目 c ij 是条件 Ai 被选择超过条件 Aj 的次数。
为了将这个比较矩阵转换成一维尺度,我们可以使用布拉德利-特里或瑟斯通模型。在实践中,这两个模型产生了类似的规模,但布拉德利-特里使用不对称 Gumbel 分布(累积逻辑函数)和 Thurstone 使用对称高斯分布。这里我就说说瑟斯通案 V 模式。其他病例(I、II、III、IV)的描述可在原始论文中找到。
Figure 2: From conditions to the quality scale. Image by Author.
瑟斯通案例五模型首先将观察者的答案映射到一个条件比另一个条件更好的概率上。然后概率被转换成距离。这种从概率到距离的映射是通过逆正态累积分布实现的。该分布的标准偏差(sigma)定义了映射。通常将 0.75 的一个条件被选为更好的概率映射到一个单位距离的条件之间的差异(图 3),然后构建的尺度被称为恰好不良差异(JOD)尺度。
Figure 3: Mapping from distance to probability of a condition selected as better. Image by Author.
然后,构建量表的问题转化为降维问题。在这里,对于每一个条件 Ai 和 Aj ,我们通过二项式分布将它们的质量分数差异与 Ai 被选择超过 Aj 的次数联系起来(反之亦然):
其中 n ij — 在 i 和j之间的比较总数然后我们使用最大似然估计来推断质量分数。由于质量是相对的,我们将第一个条件的质量设为 0 ( q1 = 0)。关于成对比较的更多细节,请看这里的和这里的和。图 2 给出了从成对比较中得出比例的途径。
评级
分级实验可以是:(I)分类的——受试者选择一个条件所属的类别;(ii)基数—为条件分配数值的主体。然后汇总所有科目的分数,得出平均值。这个平均值被称为平均意见得分(MOS)。
我们现在通过评级转向建模质量 q 。评级实验中使用的标度范围由实验指挥设定,可以是从 0 到 10、从 1 到 100 等任何值。为了结合范围和偏差,我们引入两个变量 a 和b。我们进一步假设从评级测量中得出的质量遵循正态分布。对于条件 i (q i )的每个潜在质量,我们有:
其中 m ik 是由第 k 个观测器分配给第 i 个条件的分数,而 c 定义了相对于固定观测器噪声σ的标准偏差的大小。将以上展开,代入正态分布公式:
观察评级矩阵的可能性,条目 m ik 如上则由下式给出:
融合数据集
融合成对比较数据集很简单——在数据集中选择一些条件,将它们与成对比较联系起来(进行一些实验,并输入 Thurstone/Bradley-Terry 模型)。类似地,对于评级分数,从不相交的数据集中选择一些条件,在联合实验中测量这些条件的投票,并基于新测量的条件的相对质量来重新调整原始数据。但是我们如何继续融合具有成对比较和评级分数的数据集呢?
就不能把收视率数据扔在一起吗?
嗯…人类参与者可能会被问及稍微不同的问题,或者实验可以在稍微不同的环境中进行,所以一个数据集中的寿司多汁性 4 可能对应于另一个数据集中的 3,仅仅因为它是相对于当天品尝的其他寿司进行评级的。
模型
我们定义了一个最大化问题,其中我们试图找到潜在的质量分数 q 和参数 a、b 和 C,在给定矩阵 M 和 C 以及观察者模型 sigma 的标准偏差的情况下,将两两比较和评级测量相关联。
我们可以看到一些熟悉的术语——即 P(C|q)和 P(M|q)的定义如上。然而,这里我们也有 P(q)-高斯先验,包括以加强凸性。
请注意,现在潜在的质量分数是使用来自平均意见分数和成对比较的信息找到的。参数 c 有它的含义——如果 c 大于 1,成对比较对实验更好,如果小于 1,则更差。然后可以用最大似然估计来找到模型的参数。
测试模型
让我们考虑一个玩具的例子。这里我们有两个数据集,DS1 和 DS2,每个都有成对比较和评级测量
DS1 有四个条件。成对比较矩阵 C1 因此是 4x4。请注意,条件 3 在成对比较中没有与其余条件相关联,但是这不是问题,因为它是在评级实验中测量的。DS1 的其他条件进行了 6 次比较。评级测量结果收集在 4x4 矩阵 M1 中,即由 4 名观察者对条件进行评级。
Image by Author.
DS2 有 5 个条件,在评级实验中由 5 个受试者测量。在这个数据集中,条件 2 也很突出—它没有被评级。然而,通过成对比较,它与其余的联系在一起。
Image by Author.
有两个不相交的数据集,我们希望通过成对比较将它们连接在一起。下面是一个矩阵 C 。 C 包括原始数据集的成对比较数据(红色和绿色),以及为将两个数据集链接在一起而收集的附加比较数据(蓝色)。类似地,矩阵 M 包含来自 DS1 和 DS2 的评级实验的组合数据。
Image by Author.
我们现在可以将 DS1 和 DS2 一起进行缩放,以获得最终的缩放比例。
Image by Author.
这里,真实分数是用于生成矩阵 C 和 M 中的分数,而预测分数是通过将来自 C 和 M 的数据混合在一起而获得的分数。MOS 分数是平均等级测量,而成比例的成对比较是仅从成对比较中获得的质量分数。请注意,结果的准确性取决于数据的质量和数量。为了获得更好的结果,我们可以收集更多的成对比较或评级测量。
进一步阅读
这是文章中提到的来源的汇总:原始论文、代号、特斯通模型原始论文、布拉德利-特里原始论文,缩放两两比较数据:论文 1 和论文 2 。如果你想从另一个角度来看融合评级和排名测量,这两篇论文将会很有帮助:论文 1 ,论文 2 。
喜欢作者?保持联系!
我错过了什么吗?不要犹豫,直接在 LinkedIn 或 Twitter 上给我留言、评论或发消息吧!
如何配对玩家,以便在尽可能少的游戏中知道排名,同时游戏体验质量…
towardsdatascience.com](/active-sampling-for-pairwise-comparisons-476c2dc18231) [## 贝叶斯优化的超参数调整或者我如何用木头雕刻船
超参数调整通常是不可避免的。对于一个参数,网格搜索可能就足够了,但如何处理…
towardsdatascience.com](/bayesian-optimization-or-how-i-carved-boats-from-wood-examples-and-code-78b9c79b31e5) [## 你能做得更好吗?抽样策略,重点是吉布斯抽样,实践和代码
提供了通用采样策略的概述,重点是 Gibbs 采样、示例和 python 代码。
towardsdatascience.com](/can-you-do-better-sampling-strategies-with-an-emphasis-on-gibbs-sampling-practicals-and-code-c97730d54ebc)