TowardsDataScience 博客中文翻译 2020(一百九十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Excel 中的业务图表

原文:https://towardsdatascience.com/business-charts-in-excel-d4030b4647aa?source=collection_archive---------29-----------------------

我们应得的“大数据”的一个例子

更新(2020 年 9 月):你现在可以直接获得源代码和现成的插件,达到以下效果,事半功倍;链接:

[## 如何零努力画出 9 种专业图表类型

只需点击一下鼠标,即可获得业务就绪型视觉效果

towardsdatascience.com](/how-to-draw-9-professional-chart-types-with-zero-effort-c9eee6d2a9cc)

介绍

我通常写我们的商业应用:从自动化决策中创造价值。

相反,今天我将把重点放在一个经常不被人喜欢但却至关重要的环节:使用 Excel 从我们处理的海量数据中提取最后一英里的洞察力

虽然每个人都可以做到这一点,但是仍然有太多的人试图掌握这一技能却失败了。

我的观点是磨练关键的 Excel 图表技能意味着释放赋予现代经理的最强大和最廉价的工作负荷!

我们的产品,除了许多其他的东西,也为我们的客户产生自动化的 Excel 图表;我们的产品开发团队使用包括 Excel 在内的多种工具手动审核输出。因此,我对让这个话题变得容易理解产生了专业兴趣。

我们都可以发现“大数据”的视觉秘密,即使只是使用 Excel ,只要做得正确;这篇文章详细介绍了我自己的方法及其基本原理。

为什么在 Excel 中制作图表?

是的,2020 年将会有许多新奇的、先进的图形工具出现……我知道:我们的科学家使用它们,用于特定的目的和产品用例。

但是,在所有核心的分析工作都已经用其他强大的工具完成之后,“大数据”必须变小才能让人理解。

图表是分析的最后一英里,有一个简单的规则:不管选择什么工具,信息清晰是唯一的咒语

当谈到“我们其他人的图表”时,对于像你我这样的人来说,没有什么能比得上微软 Excel 的易用性和强大功能:

  • 为了渲染甚至数百万个数据点:就让 Excel 发挥它的魔力吧,它的渲染引擎的性能是惊人的
  • 添加图表:创建新标签即可
  • 建立开发环境栈:复制文件即可!

Excel 图表制作快速、灵活且便宜。但是启动需要五分钟,掌握它需要一辈子。特别是实现完全自动化的结果,而不是笨重的手工 Excel 工作。

挑战

默认设置是普通用户体验的核心。

但是比尔·盖茨肯定想搞些下流的恶作剧和/或给全球商界带来痛苦的经历: Excel 图表最初是用错误的默认选项设置的。他们中的许多人。

举几个例子吧?

  1. 默认的调色板更多的是狂欢而不是商业
  2. 像插入行或移动数据这样的简单操作可以隐藏任何图表
  3. 负值会破坏多种图表类型
  4. 3D ','瀑布’等类型功能失调
  5. 数据标签很难使用并且相互重叠

(注: 以上每一个默认,还有很多,都可以用一些爱来称呼&固定

我完全避免那些看似花哨的选项,如“图表”或“数据透视表”,它们实际上不够灵活,因此不值得花力气。我唯一关注的是普通工作表中的标准图表。

好消息是

现在,让 Excel 图表工作是可能的,而且相对较快!

读完这篇文章后,有了全新的设置,任何人都可以用有限的努力实现辉煌的自动化结果:

  • 仅 Excel:无外部插件会降低 Excel 的运行速度、增加额外成本并可能停止工作
  • 零代码 : 没有 VBA 或其他有崩溃风险的黑客,很难分享,需要技巧来维护
  • 自动化 : 没有手动步骤,但是图表自动链接到数据,因此无需在每次数据改变时重复额外的特别工作。

接下来的内容最好使用桌面显示器更大的平板电脑来观看。

指导原则

我的主要指导原则是在多年的“大数据”工作中形成的:

  • 数据优先:释放数据本身来完成所有的对话,巧妙地隐藏不必要的干扰,例如轴、网格线、图例、标签、额外的 0000
  • 逻辑排序:使用降序或升序,因为字母(?)或者甚至随机排序可以将消息隐藏在数据中
  • 眼球控制:保持观看者的眼睛在数据上,具有支撑元件和参考的逻辑定位防止前后扫视

视觉数据只有在与其他东西的相对参考进行比较时才有意义。很多吗?还是不够?长得快吗?一套比另一套相对大吗?

一般来说,(任何)定价也是如此,因为我们只能本能地在与其他东西的比较中评估价格— 我们的大脑在后台拼命这样做——我们对图表上显示的任何数据也是如此。

这就是为什么我喜欢用清晰的视觉参考来设计我的图表。

图表类型

有了这些原则,掌握一些图表类型就可以真正拥有 Excel 图表了。即使在“大数据”时代,所有图表中的五大王是:

  1. 线:时间序列
  2. 派&叠:组件
  3. *栏&栏:*频率&项数值
  4. 散点图&气泡图:双向&三维相关图
  5. *箱线图:*分布。

使用这些核心图表类型,并在适当的情况下进行组合,可以传递现代企业经理可能需要的几乎任何信息。

无论任何图表的基础数据集有多大,浏览者的大脑保持不变。

因此,图表必须设计得小而简单:我宁愿用简单的图表来说明复杂的信息,而不是把大量的数据放在大图表上。

设置

Excel 默认设置不可信。

但是一个**库的‘模型图表’**可以成为一个‘模板’,从而像躲避瘟疫一样避开 Excel 的默认图表。

如何开始?

  • 虫警报! *Excel 选项>高级>图表>属性:*究竟为什么会有人想要‘跟随图表数据点’,以及让这些选项默认选中的理由,我都搞不懂;取消选中这两个选项可以防止在基础数据的位置改变时丢失宝贵的格式

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

  • 新图表/图表选项/属性:我不喜欢在插入/删除行时图表的形状发生变化;比起“随单元格移动并调整大小”(默认),我更喜欢“移动但不随单元格调整大小”

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

  • 填充对于数据集,我仍然使用 0.25 磅的薄边框,但透明度为 50%,因此它变得更加微妙,同时仍然引导眼睛

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

  • 阴影:只要不过度,右下阴影**【弹出】**图表,使用预设(‘外’,首选左上)‘距离’减少到 2pt 我很少使用阴影,主要用于整个图表区域,甚至根本不使用,以避免造成混乱和不必要的混乱

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

  • 字体类型:我使用‘Lato’和默认大小 10 作为我的目标外观&感觉;所有文本“浅黑色”(RGB 69/69/69)到防止“黑色闪烁”;图表标题 12pt,粗/粗体

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

  • 线条粗细:所有非数据线&刻度线的粗细为 0.25 磅,这是目前最细的设置;网格线不会增加精确度,但会增加混乱,因此我避免使用网格线,而是使用数据标签,并且只在想要显示精确数据值的时候使用;现在,既然经理们都是讨厌被“大喊大叫”的聪明人,我也保持低调

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

  • 调色板:偏好和公司政策的问题;我可能会使用“evo green”来强调,但通常会发现**“shades of blue”**是最优雅、最有吸引力、最容易阅读的解决方案——毕竟,在世界上任何地方,天空和大海都是蓝色的,越深越暗——直觉上是有道理的……而且对 7%有视觉障碍的男性也有效(尽管在女性中很少见,幸运的是只有 1%的人是色盲),甚至在打印成黑色&白色时也是如此

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

  • *间距:*只要有可能,特别是对于文本&总计,我会删除任何和所有额外的默认填充,与轴的距离为 0 而不是 100,边框为 0 而不是默认的 0.11/0.05

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

  • *标签:*我格式化标签,并将它们作为自己单独的数据集“来自单元格的值”应用,而不是接受来自 Excel 的自动标签,这样在后台我就能够隐藏重叠部分,并自由定义要显示的正确数字/文本类型

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

有了这个初始设置,并使用“命名范围”和“offset()”公式,任何图表类型都可以通过完全自动的调整和清晰的格式以灵活的方式链接到任何数据集——所以,现在终于到了每种图表类型的更具体的细节。

折线图

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

长期趋势。特定设置:

  • 系列标签在左侧,它们的逻辑位置,使用带有不可见点的辅助散点数据集和自动“引导线”(组合图)在需要时区分标签;如果是单个系列,其名称将出现在图表标题中
  • 副标题中的测量单位因为只有一个轴,或者它会位于每个轴的正上方
  • 数千/数百万/数十亿用于防止 000 污染 —使用 Excel 的自定义格式自动生成;标题和副标题是通过与单元格值的直接链接自动生成的
  • y 轴在右侧,带有可选的下划线,它是一个参考标尺,而不是一条位置有任何其他意义的垂直线
  • 负数据下方的轴标签**,交替出现以减少拥挤,刻度线【内侧】指向数据,比标签的文本更重要。**

右上角的可选图例对于更容易阅读的左侧系列标签来说是多余的,但线条可能会重叠,从而留下潜在的残留模糊性;因此,是否添加图例是一个偏好问题。

没有副轴请。我更喜欢图表上下重叠,而不是增加多个度量单位;额外的好处是 X 轴标签通常可以在“上图”中省略。

Excel 逐步呈现每个系列,一个接一个:第一个系列放在每个其他系列的后面;这通常应该是 X 轴,它本身也是一个折线图,因为散点线总是在任何正常的线条系列的上方呈现**,这是不能改变的。**

“刻度线”是完全可控的**“误差线”**。

最重要的序列,在上面的例子中是“今年”,当两个序列交叉时,被渲染到最后**“高于一切”:为了实现这一点,我把它移动到最后一个数据集。**

通常需要额外的虚拟数据集,它们可以快速实现。我的列表可能是这样的,例如:

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

例如,这些虚拟数据集可能以正确的顺序显示 X 轴或图例键,首先显示最重要的数据系列,而不是颠倒,这与逻辑上的建议完全一致。

虚拟数据集也可能显示自动“垂直线”,在我的示例中,用来突出显示公司进行价格变动的具体日期。

饼图和堆积图

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

这些都显示了整体的组成部分。特定设置:

  • 内部和外部的饼图标签需要两个重叠的图表,一个使用副轴——不管这实际上意味着什么。)
  • 旋转和爆炸在上面的图表中以 90 度为中心,由于它的水平方向,眼睛更容易检测到这个切片的日珥;仅部分自动化,需要用户定义的功能或 VBA 来实现完全自动化
  • 堆积百分比图,通常比多个饼图更简洁,是一个普通的柱形图或条形图,其数值在绘制前自动缩放至 100%;纤细的连接线有助于突出显示变化,最好是将焦点放在底部的**“基础数据集”**。

为了显示跨越多行的标签的内容,我使用‘char(10)’作为‘新行’字符,与‘text()’函数一起构建标签字符串。

柱形图和条形图

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

频率和项目值。特定设置:

  • 与其他图表相同:预排序、系列标签、自动引导线和无重叠
  • 间隙宽度 80%而不是默认的 150%
  • 支持/ 瀑布图的不可见数据集
  • 支撑线为“增长”线标注 losenges
  • losen ges 的数据标签形状,例如突出显示 CAGR 的平均增长率。

总计显示在正柱的上方或右侧,显示在负柱的下方或左侧。50%的透明白色填充用于负值总计,以消除轴重叠。

该系列图表中的其他示例:

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

瀑布图中,系列标签位于“总计”的右侧,而不是左侧,并且仅在需要的地方显示,例如一个以上的系列。**“三角形”**用“形状填充”显示——任何东西都可以使用,甚至是树的图像! Mekko 是一个带日期轴的“堆积面积”图。聚类,我不喜欢使用它,因为它往往隐藏其信息,序列重叠设置为 0%。

散点图和气泡图

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

二维和三维相关性。特定设置:

  • 标签为“低”,在图表之外,刻度线为“内”,阴影在左下方
  • 轴标题和每个轴旁边的单位便于阅读
  • 带有细边框和 50%透明填充的气泡,以突出显示不同数据点之间的重叠,&带有 50%透明白色背景的数据标签
  • 重叠时隐藏的数据标签:这是图表,不是数据表!
  • 尺寸代表气泡的宽度,此选项强调了相对差异,因此对人眼来说比面积大小更直观。

为了防止数据标签重叠,我计算了每个角的 X/Y 坐标,然后检查一个矩形是在另一个矩形的上边还是左边。

该系列中的其他相关图表类型:

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

对于**“梯形”**图表:细网格线 0.25 磅,浅灰色 0%透明度。

箱线图

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

分配,例如价格范围。特定设置:

  • 柱形图在底部使用了一个**‘隐形’支撑杆**
  • 上方和下方的误差触须显示顶部/底部四分位数数据
  • 按中线排序,中线是中间的水平线
  • 数据标签依靠 2 个额外的不可见线数据集(“散点图”类型将允许更大的准确性和控制,但代价是需要更长的设置时间)来突出显示最小&最大值,具有 50%的背景透明度;我避免使用自动指引线,尽管标签/方框/轴有重叠的风险,这样可以防止在这个已经相当密集(但非常漂亮)的图表类型中增加更多的复杂性
  • 方框后面的阴影使用与整个图表阴影相同的设置。

对于显示“我们的中间值”的行,我通过编程隐藏应该落在框后面的部分,否则 Excel 会将不需要的部分覆盖在顶部。X 轴也是以编程方式生成的。

结论

这些例子展示了我在 Excel 中实现自动化制图的方法:没有外部工具、VBA 或手工工作。也许有一天,甚至 Excel 的默认设置也会在软件的未来版本中得到修正。

现在,我发现我构建“自制模板”的方法的结果是简洁、易读快速渲染。

如果有任何问题,请不要犹豫让我知道。

制图愉快!

PS 早在 2005 年,在我工作的第一周,吉恩·泽拉兹尼的书《用图表说话:视觉沟通主管指南》启发了我。

即使在今天,这仍然是有史以来最好的图表指南之一。简单扼要。不具体关于 Excel,但如何思考为什么,何时以及如何使用每种图表类型。谢谢基因!

Get free access to your monthly summary of Business Science, new software and University-level learning:[**Free access**](https://evouser.com/register)Any questions? Feel free to connect with me on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)

数据科学家的商业概念

原文:https://towardsdatascience.com/business-concepts-for-data-scientists-352711657f55?source=collection_archive---------32-----------------------

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

尼基塔·卡恰诺夫斯基在 Unsplash 上的照片

我半开玩笑地试图弥合 MBA 和数据科学家之间的鸿沟

T4:巴斯是一群严肃的人。他们喜欢开会,讨论行动项目和关键要点;他们总是试图跳出框框思考,或者寻找真正难以捉摸的东西,比如阿尔法或(竞争)优势。

我知道是因为我有 MBA 学位。我职业生涯的大部分时间都是在定量和定性、数据和业务、盒子里和盒子外之间的线上度过的。因此,我的数据科学家同事,这使我可能是第五个最有资格向你解释商业世界如何运作以及所有商业术语的含义的人 (仅供参考,如果你还没有注意到,这篇文章主要是讽刺性的,带有一点点洞察力) 。今天,我将重点解释最让我恼火的商业概念(这样你就可以和我一起讨厌它们了)。

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

照片由雅各布·欧文Unsplash 上拍摄

蓝海战略

我真的很讨厌这个词。我理解创造者想要表达的意思——不要在现有的竞争市场中竞争,你应该打造一种既新颖、又与众不同(MBA 术语,意思是产品有些独特)又低成本的产品或服务。换句话说,发明一个新的市场,远离那些充斥红海的蹩脚竞争,你将会财源滚滚!如果事情有那么简单,世界充满了蓝色的海洋供我们所有人玩耍(我不是指字面上的意思,是的,我知道地球表面 71%是水)。

事实上,沃伦·巴菲特早就说过——公司应该一直改善他们的经济护城河(给予他们相对于竞争对手的持续优势和相对于客户的定价权)。老实说,仅仅通过阅读巴菲特的股东信,你就可能学到我在 MBA 学到的 99%的东西。

但当我听到这个词时,我不禁回想起我参加的一次会议,会上一个人痛斥另一个人“缺乏商业眼光”。我清楚地记得他说过,“不像你,我是一个蓝色海洋的思考者。”不寒而栗。我其实对那个“蓝海思想者”挺不爽的。我喜欢海洋;但是现在,当我听到蓝色海洋这个词时,我想到的不是鲸鱼、海豚和戳,而是他的脸…

我的想法:拥有更好更便宜的产品是理想的,但并不总是现实的。不是每个公司都可以或者应该去寻找神话中的蓝海。每一个谷歌(由于其巨大的规模,它实际上提供了更好的产品,搜索广告,价格更低),都有几十个克罗格。Kroger 涉足商品市场(所谓的红海)并不意味着它不能盈利(它只需要优先考虑销量,不要做浪费金钱的蠢事)。如果你将盲目追逐蓝海所消耗的金钱与真正的蓝海所创造的价值进行比较,我敢打赌前者要大得多——因此,追求蓝海从总体上来说可能是一种净负面影响。即使是谷歌,尽管一再尝试,花费了数十亿美元,也从未能够复制搜索的蓝海(和成功)。

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

Digvijoy MazumdarUnsplash 上拍摄的照片

破坏和破坏者

几年前可能有一段时间,仅仅在你的投资者推介材料中提到 disrupt 这个词就能保证至少 5000 万美元的资金(来自软银)。如果你能面无表情地解释你的公司基本上是自来水笔的 AirBnB,那你就能再获得 5000 万美元的资金。

由已故的 Clayton Christensen 率先提出的“未启动的颠覆理论”描述了一种情况,即一家较小的公司从其更具(最初)主导地位的竞争对手那里赢得了大量市场份额。它成功地做到了这一点,首先专注于向被忽视和服务不足的买家提供更便宜/更简单的产品(即足够好的**),然后通过改进其更便宜的产品的功能最终转向高端市场。现有企业反应迟缓,因为它们不是为成本竞争而生的。最终,这个颠覆性的新贵不仅拥有成本更低的产品,还拥有功能更全的产品,并最终主导市场份额(直到它自己在某个时候被颠覆)。现在我想起来,颠覆有点像在红海中应用蓝海战略…那么是紫色海洋吗?**

不管是好是坏,冲水时代已经过去了。大多数试图破坏的初创公司最终只会破坏投资在它们身上的资金(通过烧钱)。风险资本的繁荣无疑对消费者有利——它有助于发展像优步、Slack、Flexport、Airbnb 和 Instacart 这样又酷又有用的企业(尽管其中一些企业可能无法在当前的衰退中存活下来)。

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

照片由 Alina KarpenkoUnsplash 上拍摄

但它也催生了一批只能被描述为投资者资本荒谬浪费的公司。想成为房地产颠覆者的 WeWork 可能是最著名的一家。就在去年在我对软件工程师薪酬最高的公司的排名中,WeWork 还高居榜首,因为它准备从华尔街榨取数十亿美元(通过可能是历史上估值最高的 IPO)。现在该公司濒临破产(理应如此)。

一个非常有趣的例子是 Juicero ,这家公司出售了价值 400 美元的剪刀(它实际上是一台机器,唯一的功能是打开一袋同样定价过高的水果泥)。在被嘲笑消失之前,该公司设法筹集了 1.2 亿美元。什么??当 Juicero 的创始人向他们的投资者推销时,我很想成为墙上的一只苍蝇。我想对话大概是这样的:

**VC:** So you're a company that sells expensive juicers?**Juicero:** No, were a cutting edge tech company that's about to disrupt the market for fresh fruit and vegetables.**VC (suffering FOMO from not investing in Uber):** Tell me more.**Juicero:** You know how many people eat fruits and vegetables?**VC:** I would imagine a lot.**Juicero:** EVERYONE eats them EVERYDAY! The TAM (business speak for potential market size) is infinite!**VC:** So you're like Uber but for fruits and vegetables?**Juicero:** Yes exactly.**VC:** I'm liking what I am hearing but just for due diligence's sake, how are you better than say an Odwalla?**Juicero:** Our proprietary deep learning algorithm uses AI and NLP to infuse every juice packet with the optimal combination of flavor, texture, and nutritional value. And we use blockchain technology to ensure that every perfect packet is unique and can only be unlocked by the specific Juicer with the correct private key. It's truly decentralized nutrition for the masses.**VC:** You had me at blockchain!

事实上,Juicero 从未上市让我有点难过。这将是一次惊人的做空(做空是押注股票价格将下跌)。

这个故事的寓意是,颠覆是艰难的。不是几百万甚至几十亿美元就能买到的东西。真正的颠覆通常来自于一家公司在激烈的竞争中拼命求生。这需要耐心、无数次的迭代和对客户需求的深刻理解,才能有机会创造出颠覆性的东西。

困境买家、协同效应和杠杆收购

私募股权(PE)是相当于房产经纪人的公司。他们借了很多钱来收购一家公司,美化它,然后转手给出价最高的人。如果你能得到它,那将是一份伟大的工作——成功的私募股权基金经理能赚到疯狂的钱。

在我们今天讨论的所有 3 个概念中,这是最相关的。私人股本基金坐拥约 1.5 万亿美元的干粉资金(也就是未投资现金)。如果市场在未来几个月再次下跌,他们将开始认真投入所有资金。这就是为什么他们经常被称为困境买家——私募股权基金喜欢收购陷入困境的公司(然后掏空它们)。

你可以打赌,他们已经开始对你附近遭受重创的科技公司穷追不舍了(4 月,Airbnb 从私募股权公司筹集了 20 亿美元的可转换债券;可转换债务是附有转换为股权的选择权的债务)。

私募股权让我很恼火,因为它假装在帮助公司,却在暗中榨取公司的所有现金。在投资行业,我们经常谈论“游戏中的利益”,意思是你的投资是否使你的(财务)利益与公司的业绩完全一致?事实上,私募股权公司在每笔投资中的份额很小。要理解其中的原因,下面是收购一家公司的典型私募股权剧本:

  1. 确定一家目标公司,这家公司的银行账户里有大量现金,并能产生大量现金流。
  2. 用一点自有资金和大量债务,以目标公司的现金流和资产为抵押,收购目标公司。所有这些债务的使用就是这项交易被称为杠杆收购(LBO)的原因。在商业用语中,杠杆和债务是一回事。
  3. 用被收购公司的现金支付股息——基本上是一种无所事事的巨大的财务自我击掌。
  4. 实施大规模裁员(所谓的协同效应),因为被收购的公司现在没有现金,需要支付大量利息(以偿还债务)。哎呀,我想知道现金去哪里了?

因为私募股权公司用了太多的债务(而不是自有资金)来为收购提供资金,并支付股息;到第三步结束时,游戏中剩下的皮肤已经很少了。它最初投资的一小部分股权已经部分收回。

这真是一个冷酷无情的行业。没错,确实有一些私募股权公司离开被收购公司时比当初更好,但它们是例外。更典型的是,私募股权公司(通过新的 IPO)将背负债务、濒临财务困境的公司放归自然。在牛市中,价格上涨和对经济的乐观有助于掩盖不良公司的缺点,他们可以逃脱惩罚。

走向市场的数据科学

原文:https://towardsdatascience.com/business-data-science-a6fe0b27466c?source=collection_archive---------37-----------------------

简单的概念将有助于您的公司跟踪和促进用户增长,保持和盈利能力。

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

图片来源: Unsplash

介绍

T 大多数公司的核心焦点是扩大用户群并将其货币化。肩负这一使命,商业分析数据科学家必须衡量和优化用户增长、用户保持率以及由此带来的盈利能力。

考虑到这一点,本文回顾了您可以采取的具体步骤:

  • 通过测量和优化病毒系数、周期时间和客户获取成本,推动可持续的用户增长
  • 通过建立活跃的用户定义、跨群组和产品行动细分留存率,以及对留存率数据建模,来衡量、改善和预测用户留存率**。**
  • 通过提高每用户收入、降低客户获取成本、延长用户生命周期以及关注高价值用户来推动盈利

1.增长

增长的重点是让人们成为你的产品或服务的新用户。有几个渠道(方案 1)可以给你带来新用户:

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

方案一。推动用户增长的流量来源。

  • 直接。用户在他们的地址栏中手动键入 URL。在实践中,直接流量还包括那些点击嵌入在 Word 或 PDF 文档中或显示在短信中的书签或链接的人。
  • 搜索。谷歌显示的搜索结果是基于关键字匹配的强度,以及通过其他网站的链接衡量的受欢迎程度。搜索引擎优化专注于选择合适的关键词和获得高质量的入站链接。对于应用开发者来说,苹果和谷歌 Play 应用商店也有类似的追求。
  • 付费广告。通常根据点击付费或印象付费来定价,广告可以从搜索、社交和视频平台(如谷歌、脸书、YouTube)或特定网站(如纽约时报)购买。为用户付费时,比较新用户的预期终身价值和他们的获取成本是很重要的(见第 3 节:盈利能力)。
  • 下线。当前用户可以邀请新用户使用您的产品。这种人对人的用户获取手段也被称为病毒式增长。因为人们通常信任他们的联系人,推荐可以成为廉价、高价值流量的良好来源。如下所述,跟踪与病毒式用户增长相关的指标可以促进产品开发。

1.1 病毒增长

Hotmail 的电子邮件签名始于 1996 年,是一个邀请收件人获得自己账户的链接,这可能是所谓病毒式营销的第一个例子。如今,许多公司(例如,优步Square网飞)都提供推荐奖励。

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

病毒系数为 2 的两个生长周期。

借用流行病学的病毒增长模型,对于理解新冠肺炎和其他传播性疾病的传播至关重要,它允许在假设新用户仅由现有用户带来的情况下,预测用户数量随时间的变化。具体来说,任何特定时间的用户总数 U ( t )可以表示为

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

其中 U ₀是起始用户数, t / c 是经过的周期数(对于经过的时间 t 和周期时间 c ),而 k 是病毒系数(流行病学中又称为 R ),或每个现有用户带来的新用户数。在下文中,我将展示这些术语的重要性,并描述您的企业可以采取哪些具体步骤来利用这些杠杆推动病毒式增长。

1.2 病毒系数

病毒式增长模型的关键假设是,新用户通过与现有用户的互动参与到产品中。你可以用
邀请率 ( 发出邀请数**当前用户数)乘以接受率 ( 接受邀请数**发出邀请数)来计算你公司的病毒系数。

例如,如果现有用户平均发送 5 个邀请,40%的受邀者接受,则病毒系数为 5 × 0.4 = 2。在这个场景中,每个当前用户将带来 2 个新用户。许多年轻公司的基本目标是获得一个病毒系数,因为 k = 1 定义了饱和增长和加速增长之间的界限(图 1,左)。

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

图一。根据等式,病毒系数 k 和周期时间 c 对用户群增长的影响。1.( )线性增长结果为 k ≈ 1(注: U 未定义在 k = 1)而 k > 1 和 k < 1 分别产生指数增长和饱和。()缩短周期时间保持生长轨迹形状,但沿 x 方向压缩。

1.3 周期时间

在分析中引入时间,病毒系数 k 被提升到幂 t / c + 1。这里,周期时间 ( c )是一组用户的转化和其被邀请者的转化之间的时间间隔, t/c 则是经过的病毒周期数。按照这个逻辑,对于给定的时间 t ,减少周期时间 c 相当于增加经过的周期数(图 1,右)。

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

方案二。病毒循环。

病毒循环由三个步骤组成:( 1 )传递积极的用户体验,( 2 )用户邀请其他人,( 3 )其中一些邀请被接受(方案 2)。然后,周期时间 c 被计算为一个用户的转换和他们带来的用户的转换之间的平均时间间隔。

1.4 加速增长

等式 1 表明,增加病毒系数 k 和减少周期时间 c 是增加用户增长的病毒成分的两个关键杠杆。我在下面的文章中概述了你可以采取的促进病毒增长的行动。

增加病毒系数

由于 k 是邀请率和接受率的乘积,增加其中任何一个都会增加病毒系数。为了提高您的邀请率(图 2,顶部):

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

图二。通过优化当前用户的邀请率(上图:Dropbox 示例,图片来源)和被邀请的潜在新用户的接受率(下图:脸书示例,图片来源)来提高病毒系数。

  • 增加一个 邀请列表。向用户展示从电子邮件或社交媒体中提取的联系人列表将使当前用户更容易邀请其他人。
  • 奖励 分享。这些可以是单向或双向的,有利于邀请者或邀请者和被邀请者,可以是金钱或其他。这使得发送邀请更有吸引力。
  • 延长用户寿命 *。*这允许更多的共享(另见第 2 节,保留)。一旦用户离开,他们将不会发送邀请。

为了提高您的接受率(图 2,底部):

  • 陈述你的价值主张。将此添加到登录页面有助于转变持观望态度的潜在用户。
  • 减少签约摩擦** 要求尽可能少的输入字段(如姓名、电子邮件、密码)会让那些感兴趣的人更容易转换。

减少循环时间

减少周期时间相当于快进你的生长轨迹,并通过加速方案 2 中所示的病毒周期的每个阶段来实现。考虑执行以下操作:

  • 快速交付关键事件**啊哈时刻把一个新用户从评价带到忠诚模式。优化呈现给用户的导航选项的顺序(转换漏斗),让他们尽快获得积极的体验。
  • 增加一个“分享”功能。无论是在啊哈时刻的旁边还是之后不久,一个满意的用户应该能够在他们记忆犹新的时候邀请朋友。**
  • 推出即将到期的激励措施。通过在有限的时间内提供一些东西来激励当前用户更快地邀请他们的朋友。
  • 减少签约摩擦。除了提高接受率(见上文),最大限度地减少所需的输入字段也将减少用户在这一步花费的时间。

2.保留

虽然增加新用户至关重要,但最终是的活跃用户通过点击广告或购买来增加收入。因此,关注这些用户,将他们从其他用户群中分离出来是非常必要的。活跃用户通常只占累计注册用户的一小部分:例如,普通的移动应用仅在 3 天内就失去了 80%的日活跃用户

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

两个期间的活动用户(蓝色),每个期间的保留率为 0.5。

您的总用户群可以分为新用户、活跃用户和流失用户(方案 3)。如箭头所示,有 5 种可能的转换:

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

方案三。累积注册用户群中的用户包括新用户、活跃用户和流失(流失)用户。新用户要么被保留为活跃用户,要么由于不活跃而流失。活跃用户可以流失,流失的用户可以重新激活。

  • 非用户通过转化成为新用户
  • 新用户通过保持活跃用户
  • 或者那些新用户都流失到
    早期流失
  • 丢失的用户通过复活回到活动状态
  • 活跃用户通过**后期流失成为流失用户,**与早期流失不同,他们在流失之前已经从产品中获得了价值

按照这个逻辑,在给定的时间间隔内你的活跃用户数的变化可以表示为
保留的新用户 + 恢复的失去的用户-在那个时间段内失去的活跃用户

2.1 定义活动用户

活跃用户是指在特定的时间间隔内完成了某些行为的人,这些行为最好与收入产生相关联。活跃用户的定义因公司而异,表 1 中显示了选定的示例。

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

表 1 。所选公司的活动用户定义和计数。参考资料:脸书推特优步广场网飞亚马逊

除了定义操作之外,您还必须规定时间间隔,在该时间间隔内,用户必须采取该操作才能被视为活动的。这通常与用户参与产品的频率有关。例如,每当用户有时间浏览时,社交媒体就会提供免费的个性化内容,而且许多用户每天都会访问。另一方面,打车、电子商务和移动支付平台解决了偶尔的需求,通常需要花钱,因此它们的用户参与频率较低。公司选择主动用户定义来反映核心用户的产品使用频率。

2.2 计算用户留存率

有了活动用户定义和适当的时间间隔,您可以创建一个用户活动日志(表 2 ),显示用户在某一天的状态。然后,通过从日期列中减去每个用户第一次使用的日期,可以将该表转换为以注册为中心的活动日志(表 3)。

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

表 2 。以日期为中心的用户活动日志,显示用户状态(活动= 1)。连字符代表特定用户注册之前的日期。

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

表 3 。以注册为中心的活动日志。“天”列指的是自用户加入以来的天数。根据定义,所有用户在第 0 天都是活动的。连字符表示用户注册后由于最近注册而尚未到达的天数。

以注册为中心的格式表面洞察用户旅程中的里程碑。例如,用户注册后 3 天发送的电子邮件可能会提高第 3 天的活跃用户比例(保留率)。

相反,以日期为中心的格式显示了发生在特定日期的新闻或产品发布的效果(例如,2017 年 1 月的 #DeleteUber 活动)。

2.3 可视化用户留存率

以注册为中心的用户活动日志可用于绘制保留曲线,即活跃用户的比例与自注册以来的天数。这条曲线揭示了用户参与度下降的速度,在哪里趋于平稳,以及用户是否会复活。有三种用户保持模式的原型:下降型、扁平化型和微笑型。

长期来看,当活跃用户数趋向于零时,用户保持率下降(图 3,蓝色轨迹),这表明产品与市场不匹配。获得一群忠诚的核心用户(也就是说,推高y-渐近线)是一家年轻公司面临的最紧迫的任务,并从解决企业或个人面临的一个关键问题开始。一个值得注意的警告是视频游戏行业:长期的客户保持几乎是不可能的。像《Farmville》和《愤怒的小鸟》这样曾经轰动一时的游戏现在只拥有其总用户群的极小一部分。在这种情况下,合理的目标是优化用户增长和降低流失率,以最大化保留曲线下的区域(即活跃用户天数)。

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

图 3 。保留曲线的三个经典例子。

当一部分新用户发现产品的价值并在注册后很长一段时间内保持活跃时,就会看到保持率持平(图 3,橙色轨迹)。大多数成功的企业都属于这一类。然而,并不是所有的扁平化保持曲线都是一样的:保持曲线结束时的值衡量了产品与市场的匹配程度。例如,网飞在流媒体视频领域处于领先地位,在注册一年后保留了三分之二的用户。因为获得一个新客户几乎总是比保留一个现有客户更昂贵,所以通过提高保留率来扩大活跃用户群通常比增加新用户注册更有利可图。

微笑保持是理想的场景:一些不活跃的用户返回(图 3,绿色轨迹)。增加产品类别可以鼓励用户复活:在开始在线图书销售四年后,亚马逊开始销售几乎所有其他的东西,促使不活跃的图书购买者通过不同的产品重新参与进来。网络效应也鼓励复活:随着越来越多的司机注册该平台,优步乘车的等待时间减少了,因此该服务对乘客变得更有价值。同样,随着越来越多的智能手机用户下载 WhatsApp,早期用户看到朋友加入该平台,有理由重新使用该服务。

抛开保留率的波动不谈,有一点是肯定的:从长远来看,每家公司最终都会失去所有的用户。考虑一个最近的例子:在声称占有美国智能手机市场 37%的份额仅仅十年后,黑莓将于 2020 年停止其手机生产

2.4 保留和产品开发

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

表 4 。群组分析:用户注册当月的总保持率。

沿着感兴趣的某个维度绑定保留数据通常很有帮助。根据加入日期对用户进行分组(表 4)是这一概念的一种常见实现,被称为群组分析

群组分析可以揭示跨产品迭代的用户参与度。理想情况下,年轻群体的参与度下降较慢,长期保持率较高。虽然不一定是因果关系的证据,但随着时间的推移,用户参与度的增加与产品市场匹配度的提高是一致的,并且不一定仅从平均留存数据来看是明显的。

与此同时,集思广益可能与保留相关的用户行为可以帮助激发积极的产品变化。在一个众所周知的轶事中,脸书的早期成长团队发现,新用户在平台上的头 10 天里,其留存率与朋友数量之间存在关联。基于这一观察,该公司能够通过将新用户引向关键的“添加好友”行动来提高保留率。

您还可以跨用户人口统计信息
(例如,年龄、性别、地理位置)或获取渠道检查留存率。注意到这些群体之间在保留率上的差异可以提供一个行动号召,也许会激发产品变化来解决不足,或者加倍对符合忠诚档案的潜在用户进行营销。

2.5 建立用户留存模型

在观察到的客户行为的时间范围之外预测留存数据,可以让您了解公司的稳态用户参与度,对于估计客户终身价值至关重要(第 3 节,盈利能力)。

考虑一组真实留存数据来衡量
12 年来的客户参与度(图 4,顶部,蓝色散点)。假设您在第 6 年,并且您想要预测未来几年的保留率。你可能会原谅试图拟合指数,尽管你最终会发现它低估了长期记忆(虚线)。

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

图 4 。用户留存数据(蓝色散点)的指数(点状)和移位贝塔几何(sBG,虚线)拟合。为了说明每种方法的预测能力,模型在数据的前半部分(0-6 年)进行了训练。

指数函数未能捕捉到观察到的保留数据的形状 S ( t )是由于其隐含假设,即从一个周期到下一个周期,逐周期(即瞬时)保留保持不变。

但观察到的瞬时留存,计算为
R(t)=S(t)S(t-1),明显随着客户保有期的增加而增加(图 4,底部,橙色散点)。这是一个混合转变的例子:老一代人已经淘汰了高流失率的用户,留下了忠诚的用户。

移位贝塔几何(sBG) 保留模型通过假设每个客户都有自己的常数瞬时更新概率 r 以及在时间 t 的最终存活概率 rᵗ 来适应这种观察到的瞬时保留增加 R ( t )。在整个客户群中, r 的分布遵循 beta 分布,所有客户的合计瞬时留存率随时间变化如下

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

其中参数 αβ决定了整个客户群中 r 的形状

将此用于 R ( t )的 sBG 表达式拟合到经验瞬时保留数据上(图 4,底部),随后将累积保留函数 S ( t )作为 R ( t )的累积乘积,提供了与观察数据的良好拟合(图 4,顶部,虚线)。相关计算见本笔记本。在计算客户终身价值时,有一个准确的保留预测会很有用(第 3.3 节)。

3.收益性

任何企业的目标都是盈利,或者产生超过成本的收入。本节概述了公司的用户群与其收入、成本和最终盈利能力之间的关系。

3.1 收入

一家公司的收入通常在其用户群中分布不均匀。例如,从广告或一次性产品销售中产生收入的企业有一个几乎连续的和潜在的大范围的每客户收入分布,其形状可以近似为一个偏斜的(例如,伽玛或对数正态)分布(图 5)。这一特征反映了这样一个事实,即一小部分客户为公司贡献了不成比例的收入份额,这在其他社会指标中也可以看到,如家庭收入、城市人口和名字出现频率。

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

图 5 。每个用户贡献的收入的长尾分布。

如果用户分布在全球各地,即使是只有少量定价方案的订阅型企业也能看到每用户可能的收入值。例如,网飞只有三个定价等级,但收取多种货币的订阅费。因此,瑞士的网飞用户每月支付 22 美元,而哥伦比亚的用户每月只需支付 5 美元。

将特定时间间隔内的总收入除以活跃用户数,得出每用户平均收入【ARPU】。表 5 显示了选定公司最近的季度 ARPU 数字。

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

表 5 。选定公司的每用户季度收入(Q1 2020)。参考资料:脸书推特优步广场网飞亚马逊

ARPU 在公司的用户数量和收入之间提供了一个有用的链接。如图 6 所示,增加收入就是增加活跃用户群的规模(参见第 1 节和第 2 节“增长和保持”),增加 ARPU,或者两者兼而有之。在一般情况下,ARPU 可以通过提高平均采购频率** (单位时间内的采购数量)平均订单价值,或者两者同时提高。**

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

图 6 。通过每个用户的平均收入(ARPU)说明了收入和活跃用户数之间的联系,其中 ARPU 细分为以在线广告点击形式收集的收入。

网飞或 Spotify 等基于订阅的企业看到客户收入定期到达。相反,电子商务、物流和社交媒体公司让用户在特定的参与情况下产生收入,必须找到激励用户在给定时间内下更多订单或点击更多广告的方法。

以下是如何提高购买频率的方法:

  • 降价。如果需求有足够的弹性,这将会提高 ARPU:购买频率的大幅增加可以弥补每次购买收入的下降。亚马逊在 2017 年收购全食超市时打了这个赌,并对鳄梨和杏仁牛奶进行了降价。
  • 添加产品类别。这将允许你挖掘未被满足的需求,并从现有客户那里获得更多的购买。例子包括亚马逊扩展到图书销售之外,优步开发 Eats。
  • 创建付费忠诚度计划。利用沉没成本谬误来增加购买频率。购买了 Prime 会员资格后,亚马逊的顾客在网站上的花费比之前多了 150%,也许是为了“证明”会员费用的合理性。
  • 增加广告相关性。对于依赖广告收入的公司(例如,谷歌、脸书、推特)来说,购买频率相当于单位时间内的广告展示次数或广告点击次数。在点击付费定价的情况下(目前占全球广告支出的 63%),购买频率是广告印象和点击率 (CTR)的乘积。出于这个原因,这些公司使用投标价格相关性分数,并考虑预测的 CTR,来确定谁赢得在线广告拍卖。**

相反,你可以通过以下方式增加订单价值**😗*

3.2 成本

每个企业都面临着与创造产品或服务相关的成本。这些费用通常分为固定成本和可变成本,其中可变成本与产量成比例。虽然可变成本对于一家烘烤饼干或洗衣服的公司来说是真实存在的,但那些专注于软件开发的人通常几乎不需要增加成本就可以将他们的体验传递给多一个客户。

在每用户的基础上表达可变成本,而不是每产出单位的成本,可以对成本进行有意义的描述,该成本随着接触到的客户数量的增加而增加(图 7)。在这种情况下,一个公司在一定时期内的总成本是固定成本(工资、建筑、设备等)的总和。)和可变成本包括 顾客获取成本商品销售成本

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

图 7 。以用户为中心的固定和可变成本框架,用户获取来自付费广告。

你可以计算你的客户获取成本(CAC ),用你获取的新用户数除以获取新用户的总花费。如果你是按广告点击付费,你的 CAC 就是每次转换的点击量和相关的每次点击成本的乘积。CAC 提供了营销支出效率的一个重要衡量标准:一个经验法则规定 CAC 应限制在客户终身价值的三分之一以下(见下一节,盈利能力)。

以下是你如何降低客户获取成本**😗*

  • 推动免费用户增长。客户直接进入你的网址,通过有机搜索进入你的网页,或者接受一个现有用户的邀请(见第 1 节:增长)都不会让你付出任何代价。提高你的公司在免费搜索结果中的排名,优化其病毒式增长引擎,将会推动免费新用户的获取,从而降低你的平均 CAC。**
  • 寻找更便宜的付费用户来源。衡量一系列营销渠道或广告活动的每次点击成本和转化率。考虑采用渐进转变从探索资源到开发最便宜的新用户资源,而不是在两个不同的阶段运行测试和展示(参见多兵种土匪问题)。

除了为获得用户而付费之外,你还可以在每次向他们提供产品或服务时付费。这个总数,也就是你卖给每个用户的商品成本(COGS),是你收入中可变成本所占的份额,或者减去你的毛利润。毛利润抵消了固定成本,并决定了业务达到收支平衡所需的活跃用户数量。

这很棘手,但这是我给的大胆建议,降低你的商品成本**😗*

3.3 盈利能力

企业的价值是公司预期现金流(利润)的现值,以反映这些现金流风险的利率贴现。表 6 显示了选定公司的季度收益(利润)数据。

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

表 6 。选定公司的盈利能力(Q1 2020)和市值。参考资料:脸书推特优步广场网飞亚马逊

客户终身价值

类似于公司估值,客户的终身价值(LTV)是新获得的用户将为你的企业贡献的利润的现值。

估算客户 LTV 对于建立您的:

  • 营销预算。花费不超过你估计的 LTV 的三分之一来获得一个新客户。
  • 商业健康。用户数量和 LTV 是决定你公司未来现金流的两个旋钮,从而决定你公司的最终价值。
  • 客户理解。发现哪些用户统计数据和产品行为与高 LTV 客户最密切相关。

客户的 LTV 可以通过将客户的定期(例如每月、每年)现金流(cf₁+cf₂+…+cfn)相加,并应用适当的贴现率 d 来计算:

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

其中现金流是收入减去在 t 期间从客户处收取的 COGS,贴现率 d 与公司的资本成本相关。完全了解客户的购买意图,就有可能计算出他们对你公司的 LTV。例如,在 10%的贴现率下,如果客户在 5 年内每年交付 100 美元的现金流,那么他们的 LTV 就是417 美元

简单的 LTV 估计

当然,你不会提前知道每个客户的现金流时间表。作为替代,您可以通过将预期的单位时间现金流乘以预期的客户生命周期来获得一个粗略的客户 LTV 估计值(图 8)。

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

****图 8。简化的客户 LTV 估算是每期收入(蓝框)、边际贡献和预期客户寿命的乘积。

为了粗略地预测一个客户对你的业务的总价值,估计:

  • 单位时间平均收入。乘以客户的预期订单数量和频率(图 8,蓝色方框)。对于订阅业务,这两者都是在注册时通过合同建立的。对于未锁定合同的客户,使用所有客户的平均历史订单金额和频率,或客户特定细分市场(例如,年龄组、位置等)的平均历史订单金额和频率,估计每单位时间的预期收入。).注意,这种方法忽略了金钱的时间价值。
  • 平均贡献率。也被称为毛利润,这是所有产品销售收入中未被可变成本消耗的平均部分。对软件公司来说,这个数字接近 1,而对那些支付实物投入或劳动力的公司来说,这个数字要低得多。
  • 平均客户寿命。这可以粗略地近似为
    1 ÷流失率,或给定时间段内的客户流失÷间隔开始时的客户。例如,如果每月有 20%的用户离开,那么你的平均客户寿命是 5 个月。该方法源自相关的几何级数的收敛,低估了平均寿命,因为流失概率通常会随着客户任期的延长而下降。

如上所述,这种 LTV 模型有两个缺点:( 1 )如果不贴现现金流,我们会过分强调未来收到的资金的实际价值,而( 2 )通过假设恒定的流失率,我们会低估真正的平均客户寿命。

更好的 LTV 估计

只需多一点努力,就有可能既考虑到资金的时间价值,又降低长期客户的流失率。在这种情况下,认识到预期客户生命周期是保留函数 S ( t )下的区域,客户 LTV 可以表示为贴现现金流和这个客户生命周期的更精确估计的乘积:

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

这简化为

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

要实施这种方法:

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

图 9 。考虑时间折扣的平均客户寿命计算。本例使用了来自的保留数据 S(t),这里是,贴现率为 d = 10%。

  • ****拟合你的实验保留数据, S ( t )(图 9,顶部)。
    参见第 2.5 节。
  • ****将模型化留存 S ( t )除以贴现因子,(1+ d ) (图 9,底部)。
  • 求和**曲线下面积s(t)/(1+d)ᵗ。多亏了贴现因子,总和收敛得很快。

预期 LTV 是曲线下面积(图 9,底部)和每期平均现金流的乘积,参见。参见本笔记本的计算示例。

老练的 LTV 估计

上面概述的方法为您的普通客户提供了一个 LTV 估计。但是你可能希望找到特定客户的 LTV,或者更重要的是,确定你的高价值客户。在这种情况下,贝塔几何负二项分布( BG/NBD )模型会很有用。这种方法将一系列交易数据(例如,客户 id、交易日期、金额)与描述客户购买率和退出率的四个参数相匹配。这种分析为每个用户产生一个预测的货币价值。BG/NBD 模型的全面实现超出了本文的范围,但是您可以查看相关的生命周期 Python 库和参考资料,以获得概念性实践性指导。

以下是你如何增加客户终身价值**😗*

  • 增加现金流量。这可以通过增加收入(3.1 节)、降低成本(3.2 节)或两者兼而有之来实现。
  • 增加客户寿命。这是保留和盈利之间的关键环节。通过提高产品与市场的契合度(第 2.3 节)来减缓客户流失和鼓励复活,将会在 S ( t )中形成y-渐近线,扩大保留曲线下的区域,从而延长客户寿命。**

结论

你有它!从获得和留住用户到最大化他们对你的企业的价值,这篇文章概述了你在建立和维持一个成功的公司的旅程中可能采取的一些步骤。请不要犹豫,联系或者在下面的评论中留下你的反馈。

这篇文章的灵感来自一组优秀的相关文本(精益分析振幅Mixpanel社会资本部落资本红杉资本)和视频(亚历克斯·舒尔茨埃利奥特·施穆克勒迈克尔·赛贝尔)资源。

多亏了本·拉卡尔。

脸书预言家的商业预测

原文:https://towardsdatascience.com/business-forecasting-with-facebook-prophet-b9aaf7121398?source=collection_archive---------33-----------------------

2020 年 6 月更新

在这篇文章中,你将学习如何使用脸书先知库进行可靠的时间序列分析和预测。

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

来源:( @rosssneddon )转自 Unsplash

F 时间序列模型预测可被企业用于多种目的,例如优化销售、改善供应链规划和执行异常检测等。还有许多技术可以使用,从对历史数据的简单推断到更复杂的机器学习模型。一些先进的技术对数据、实施者和分析者都提出了相当高的要求,通常很难提出稳定的预测模型。Prophet 库的好处在于它相当宽容,这意味着它可以生成合理的结果。也就是说,Prophet 最适合具有明显季节性的商业类时间序列,并且您事先知道重要的商业日期和事件。与大多数时间序列工具一样,最好有一个包含几年观察结果的数据集。

最后,Prophet 也很容易通过其可理解的超参数进行调整。此外,它是可扩展的,所以如果你需要添加额外的回归,季节性或特殊事件,你可以很容易做到这一点。

要解决的问题

想象一下,我们在一家自行车租赁初创公司担任数据分析师,让我们称之为 Acme Bikes,我们收集了一些测量人们骑自行车上下班的数据。此外,数据集增加了历史降雨量和温度数据。我们被要求对数据集提供一些见解,并提供一个预测模型来估计任何给定时间范围内的未来通勤。我们还被要求以统计测试的形式提供一些有效性的指示。我们准备好了吗?但是当然。

Prophet 简介—主要概念

Prophet 采用了一种新颖的方法,认为预测主要是一种使用概率技术和来自广义加法模型的灵感的曲线拟合练习。我们不会在这篇文章中深入研究数学细节,但对于那些倾向于此的人,我建议阅读预言家的原始论文。

Prophet library 对于具有明显季节性的商业时间序列以及对数据有重大影响的特殊事件(例如,国定假日、黑色星期五、新产品推出、促销活动等)非常有用。要对时间序列 Prophet 建模,请将信号分成以下附加分量:

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

先知组件

其中:

g(t) 是使用非线性饱和增长模型或分段线性回归模型对非周期性变化进行建模的趋势函数。您可以使用参数对此进行配置。

s(t) 是季节函数(每年、每周和每天),用于模拟时间序列值的周期性变化。这个组件是使用傅立叶变换建模的,如果你愿意,你可以添加你自己的季节性。

h(t) 代表模拟假日和特殊影响事件的函数。您可以添加自己的自定义假日和特殊事件。

εt 是假设正态分布的模型误差/噪声

我认为这是一种直观而新颖的方法,分析师很容易从概念上理解预测是由什么组成的。稍后,我们将验证该模型实际上是按照数学描述的方式工作的。如果你对 Prophet 背后的数学和理论感兴趣,你可以阅读他们的论文,除了深入研究模型的不同组件之外,该论文还很好地描述了构建库背后的基本原理。说够了,我们开始吧!

关于数据的简短说明

对于这个假想的例子,我通过结合来自挪威道路管理局和挪威气象研究所的真实世界数据制作了一个数据集。更具体地说,该数据是在挪威奥斯陆 Ullevå的特定路段上计算自行车通勤者。您可以下载该数据她:https://github . com/pixel bakker/datasets/blob/master/bike rides _ day . CSV

这个计划

在我们开始工作之前,我们做一个简单的工作分解如下:

  • 目视检查数据并控制缺失数据和异常值
  • 如果需要,转换数据
  • 在没有任何调整的情况下制作第一个预测模型并验证该模型。
  • 通过添加特殊事件和日期来调整和测试模型
  • 将降雨量和温度作为额外的回归变量,对模型进行调整和测试。
  • 调谐超参数

首先看一下数据

为了简单起见,我选择提供一个干净的数据集,这样我们就可以把大部分时间花在实际的分析上,而不是挑选出坏数据。

导入库并读取数据和转换日期列

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

清单 1:我们的数据原始框架

Prophet 希望列有特定的名称,ds表示时间部分,y表示值部分。所以我们坚持这一点。

绘制数据以获得我们正在处理的东西的第一印象总是一个好主意。我使用 plot.ly 定制图表——这很好。

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

图一。我们数据的原始图

取消周末骑行

我们可以看到,数据有明显的季节性,可能还有轻微的积极趋势,尽管这很难看到。我们还可以注意到相当多的可变性。一些可变性可能是由于周末人们不通勤上班造成的。让我们从数据中去掉所有的周末,看看它是什么样子。

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

图 2:没有周末通勤的数据

仍有一些可变性,但相当少。希望剩下的大部分可变性可以用季节性、假期和我们额外的天气回归因素来解释:雨和温度。我们很快就会看到。

应用 Box Cox 变换

对于时间序列,对数据进行某种形式的幂变换以稳定方差并使数据更像正态分布通常是有用的。但是使用什么样的转换才能获得最好的结果呢?幸运的是,我们可以使用 Box Cox 变换来评估一组λ系数(λ),并选择实现最佳正态近似的值。我们可以这样做:

应用 Box Cox 变换。

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

图 3:经过 Box Cox 变换后。

我们可以看到,现在差异变小了,尤其是在季节性高峰附近。

绘制天气数据

当我们开始绘图时,让我们也来看看降雨和温度数据。在我们绘图之前,我们将数据标准化,这样我们就可以得到可比较的比例。

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

图 4:游乐设施和天气数据

毫不奇怪,气温与通勤量高度相关。我们看到这种模式在 7 月份被打破,很可能是因为挪威的公共假日。当涉及到下雨时,很难从情节中得出任何结论,但放大来看,有迹象表明下雨可能起了作用。我们走着瞧。

好的,看起来我们准备好出发了。让我们做一些预测。

使用 prophet 进行预测—初次尝试

Prophet 代码流非常简单:首先获得一个 Prophet 实例,并用我们的自行车骑行数据框拟合一个模型。然后,我们创建一个包含预测日期(地平线)的数据框,并将其传递给 Prophet predict 方法,如下所示:

当列出预测数据框时,我们得到:

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

清单 2:第一个预测数据框架

包含预测,然后你有预测的上下波段。尽管预测数据框包含了绘制自己的图所需的所有数据,但 Prophet 也提供了方便的绘制方法。为简洁起见,我们将尽可能使用内置方法,但在需要时,我们将使用 plotly 制作自己的自定义绘图。用 Prophet 绘制我们的预测可以这样做:

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

图 5:使用 Prophet 内置方法的预测图

您还可以将变化点(趋势模型正在变化的地方)添加到图中,如下所示:

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

图 6:有变化点的预测

这个先知剧情没有包含所有的改动点,只包含最重要的。如果您想查看所有这些,您可以使用以下代码:

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

图 7:所有模型的变化点。

如果我们愿意,我们还可以绘制出组成模型的所有组件:趋势、不同的季节和假期——我们将在后面更详细地介绍。现在,让我们用内置的绘图方法来看看组件。

它给出了以下输出:

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

图 8:到目前为止的模型组件。

我们可以看到,我们有一个明显的积极趋势,周一和周二是大多数人通勤的日子。我们也看到了强烈的年度季节性。

验证我们的结果

交互效度分析

为了让我们发现我们的模型表现如何,并知道我们是否正在取得进展,我们需要某种形式的验证。当然,我们可以编写自己的验证代码,但幸运的是我们不必这样做,因为 Prophet 提供了我们需要的大部分内容。

Prophet 库使得将我们的历史数据分为训练数据和测试数据进行交叉验证成为可能。使用 Prophet 进行交叉验证的主要概念是:

  • **训练数据(初始)😗*为训练预留的数据量。该参数位于名为 initial 的 API 中。
  • Horizon: 预留验证的数据。如果不定义周期,模型将符合 Horizon/2。
  • **截止时间(周期)😗*对截止时间和截止时间+时间范围之间的每个观察点进行预测。

得到的数据帧现在可用于计算 yhaty 的误差度量。下面我用一些标记绘制了一个图表,帮助你以更直观的方式理解。在本例中,我们有一年的时间跨度,模型将对每个月(~31 天)进行预测。

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

图 9:显示训练期、截止期和水平期

获取性能指标

所以我们现在对先知图书馆做了第一次预测。但是我们怎么知道结果是否好呢?幸运的是,Prophet 提供了一些内置的性能指标来帮助我们。至于使用哪些指标,我就不赘述了,让您自己决定吧。可用的性能指标有:

  • Mse: 平均绝对误差
  • Rmse: 均方差
  • 平均误差
  • Mape: 平均百分比误差平均值
  • Mdape: 中位数平均百分比误差

验证和收集性能指标的代码如下所示。首先,您需要获得交叉验证数据(我们已经在上面的代码清单中完成了,它是名为cv_df的数据帧),然后我们将交叉验证数据帧放入 Prophet 方法perfomance_metrics,就像这样:

列出性能数据框架可为我们提供以下信息:

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

清单 3:每天的性能指标。

要查看我们的模型在一段时间内的表现,我们可以使用名为plot_cross_validation_metric的内置图表,如下所示:

这给出了下面的图:

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

图 10:随着时间的推移直观地查看交叉验证

我们看到我们得到了每天的天气预报。开始时,我们看到平均百分比误差 (mape)相当大,但几天后它也下降了很多。希望当我们开始调整我们的模型时,我们可以使这个图更有性能。

随着我们继续进行,我们希望比较我们的验证结果,所以我选择在一侧制作一个电子表格来存储中间结果。此外,由于我们使用转换后的数字(还记得 Box Cox),我们只使用百分比误差指标。为了保持跟踪,我们从交叉验证中收集平均聚合数据,如下所示:

df_p.mean()

它给出了这样一个列表:

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

清单 4:交叉验证数据的平均值

第一次运行后,结果电子表格如下所示:

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

图 11:第一次运行后的结果电子表格

在继续改进我们的预测模型之前,我们将添加两个效用函数,这样,如果我们想要测试不同的交叉验证设置,就不需要到处更改数据。它们看起来像这样:

改进我们的预测

添加假日

Prophet 有几种添加假日和特殊事件的方法。最简单方便的就是利用内置的国定假日。Python 中的假日包提供了每个国家的假日。他们的页面上有可用国家的列表,以及要使用的国家名称:【https://github.com/dr-prodigy/python-holidays.】T4 我们需要挪威假期,所以我们这样做:

最后一行代码列出了所有内置的假日,从表面上看,这个列表似乎是正确的,尽管它可能会增加平安夜或新年前夕等日期,但这是一个开始。如果我们想要查看假日回归所做的预测和影响,我们可以这样绘制它:

情节是这样的:

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

图 12:带有假日效应的绘图

如果我们查看交叉验证数据,我们可以看到该模型非常适合 5 月 1 日和 17 日,但 2018 年 5 月 30 日的提升日就不太适合了。此外,2018 年的升天日是在周四,这往往会让挪威人在周五休假。如果我们放大,我们可以在图中看到这一点。

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

图 13。放大五月份的日期

我们对圣诞款也没有什么特别的印象。如果我们放大 2019 年的图表,我们可以看到:

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

图 14:2019 年圣诞节的糟糕预测

幸运的是,先知给了我们添加自己的节日和特殊日期的机会。为了看看我们是否得到一个改进的预测,我们将为模型添加一些额外的日期来考虑。像这样:

对于升天日的日期,我已经设定了upper_window。这意味着这一天的影响会延续一天,这样我们也可以在星期五捕捉到这种影响。对于圣诞节日期,我设置了下面的窗口,这样我们可以赶上挪威平安夜的前一天,上面的窗口可以赶上许多挪威人的整个圣诞节假期。我们现在可以安装一个新的模型,并添加新的节日效果。

新的地块显示出令人印象深刻的改进。下面你可以看到 2019 年圣诞节的剧情,现在已经完美拟合。

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

图 15:圣诞节非常合适

我们暂时离开假期,但在继续之前,让我们收集一些性能数据并更新我们的性能表:

getPerformanceMetrics(m).mean()

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

清单 5:更新的性能表

正如我们所看到的,假日调整具有显著的预测效果。现在,让我们添加一些额外的回归变量。

添加额外的回归变量

如果我们看看这个图,它看起来还不错,但是我们能改进我们的预测吗?记得我们有一些额外的天气数据吗?让我们看看添加那些作为额外的回归变量是否会有任何影响。添加额外的回归量非常简单,但是请记住,如果您要在预测模型中使用一些回归量,您需要事先准备好数据。有了天气数据,这可以通过天气预报来实现。依我看,你可以使用的最简单和最可靠的额外回归变量是你知道的假期和特殊日期,所以我鼓励你在这些方面做一些额外的工作。但是回到天气数据。我们可以像这样将降雨和温度数据作为额外的回归量添加到模型中(注意,只有两行代码发生了变化,但为了便于执行,我将整个清单都留了下来):

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

图 16:使用额外回归变量雨水和温度绘制的图

从图上看,很明显,降雨和气温都对天气预报有影响。让我们收集性能数据并更新我们的性能表:

getPerformanceMetrics(m).mean()

它开始看起来像什么了!我们的平均百分比误差现在低于 10%。

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

清单 6。更新的结果表

调谐超参数

Prophet 有相当多的参数供您调整。我不打算深入研究所有的细节,但下面你可以看到代码,你可以用来测试不同的超参数在一个循环中,然后选择最好的。请记住,如果您选择一次性测试所有参数,排列的数量将会很多,运行时间将会很长。我选择一次调优一个参数,并在注释中留下了我开始时使用的参数数组,供您自己尝试。

为了查看调整是否有任何效果,我们用新的参数集拟合了一个新模式,如下所示:

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

清单 7:更新的结果表

我们看到我们在 mape 指标上有所改进,尽管并没有那么多。从其他时间序列分析中,我看到了更好的结果,所以我想这总是值得一试。

绘制和验证整个模型

请记住,在开始时,我们列出了数学公式,表示我们的预测是趋势、季节性、假日等模型组件的总和。我们实际上可以验证这是真的。让我们首先从绘制所有组件开始。

导致了这个情节:

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

图 17:列出模型中的所有组件

Plotly 做了一个奇妙的图表工作,你可以通过点击右边的图例标签来切换不同组件的视图,以获得更好的可读性。

为了检查模型的预测实际上是其组成部分的总和,我们可以运行以下代码片段:

并得到这样的确认:

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

清单 8:确认模型是其各个部分的总和

进行实际预测

所以,我们暂时结束了。我们最不想做的事情就是做一个实际的预测。请记住,我们还必须对 Box Cox 变换后的数字求逆,方法如下:

确认秤已恢复并可用于现实世界。

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

图 18:用真实世界的数字绘图。

结论

在本文中,您已经学习了如何使用脸书先知库进行时间序列预测。我们已经了解了如何使用 Box Cox 变换,以及如何添加额外的回归变量和调整 Prophet 模型,以使性能越来越好。我们以大约 17%的平均百分比误差开始,以大约 9%结束,这是一个相当大的改进和有用的结果。我希望这篇文章对你有价值,并且你学到了一些可以在你自己的工作中使用的东西。

商业智能与新兴技术的数据工程相结合

原文:https://towardsdatascience.com/business-intelligence-meets-data-engineering-with-emerging-technologies-8810c3eed8b1?source=collection_archive---------14-----------------------

如何用新兴技术和十二种数据工程方法让 BI 变得更好?

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

如今,我们对不断增长的工具和框架、复杂的云架构以及快速变化的数据堆栈有了更多的要求。我听到有人说:“商业智能(BI)需要太长时间来整合新数据”,或者“理解数字如何匹配非常困难,需要大量的分析”。本文的目标是用数据工程领域的技术使商业智能变得更容易、更快、更容易获得。

在之前的一篇文章中,我指出了什么是数据工程,以及为什么它是商业智能和数据仓库的继承者。什么时候需要一个数据工程师,他在做什么。数据工程师工具语言 python 和 ETL 中的变化。在这篇文章中,我将重点关注 BI 中的挑战,以及如何用数据工程来解决它们。

商业智能的目标

但首先,让我们先讨论一下“BI 应该为我们做些什么?”

用我的话来说,BI 应该生成一个简单的业务概览,提高效率,并自动化整个组织的重复性任务。更详细地说:

  • 卷起能力——(数据)最重要的关键绩效指标(聚合)的可视化——就像飞机上的驾驶舱,让你一眼就能看到最重要的信息。
  • 向下钻取的可能性 —从上面的高层次概述向下钻取非常详细的信息,找出某些事情没有按计划执行的原因。切片切割或 从不同角度旋转您的数据。
  • 单一事实来源 —取代了多个电子表格或其他不同编号的工具,该流程是自动化的,并且对所有人都是统一的。员工可以谈论业务问题,而不是每个人都有的各种数字。报告、预算和预测会自动更新,并保持一致、准确和及时。
  • 支持用户:借助所谓的自助 BI ,每个用户都可以分析他们的数据,而不仅仅是 BI 或 IT 人员。

商业智能问题

另一方面,BI 在速度和透明度方面存在一些实质性的问题。我试图总结我在作为一名从事 Oracle 和 SQL Server 工作的 BI 工程师和专家的职业生涯中了解到或听到的问题:

  • 整合额外资源需要太长时间,和 BI 工程师超负荷工作
    —这就是为什么每个部门都使用互不关联的 Excel 电子表格创建数据仓库和分析的原因之一,这些电子表格总是过时,需要大量的操作和协调。
    缺乏速度是一个显著的缺点,可以通过 数据仓库自动化 来缓解。我在一篇关于数据仓库自动化的 Quora-post 或我的系列文章中总结了自动化可以减轻的更多细节。
  • 透明性对于 BI 工程师以外的其他用户来说是个问题。只有他们能够看到转换逻辑的内部,这些逻辑大多隐藏在专有的 ETL 工具中。
  • 商务人员或经理依赖商务智能工程师。没有简单的方法来访问 ETL 或获取任何实时数据。
  • 商务智能部门使得成为变得更加复杂。给人的印象总是它不应该如此复杂。对我们来说,所有的转换都很清楚,业务逻辑清理、星型架构转换、性能调整、使用大数据,等等。但是对于非双语者来说,这很难理解。
  • 处理困难(semi-)非结构化 数据格式如 JSON、图像、音频、视频、电子邮件、文档等。
    —这归结为 **ETL,加载前转换,**传统上是一个数据仓库,而 ELT(首先将数据加载到存储中,并且仅在决定如何处理它之后)—也称为写时模式与读时模式。ELT 为您提供了速度上的显著优势,这是更现代的数据湖或 NoSQL 数据库所能做到的。如果你想知道更多关于数据仓库和数据湖(ETL 和 ELT)的区别,我推荐我之前的帖子
    —另一点是,切片和切块是在聚合数据上完成的,上面提到的非结构化数据实际上做得不好。
    —最重要的是,这些非结构化数据延长了夜间 ETL 作业的时间,因为它们需要更长的处理时间。
  • 一般数据每天只提供一次(传统上)。我们在私人生活中实时获取一切,每个人对现代 BI 系统都有同样的要求。

这个列表无论如何都是不完整的。此外,是否可以通过特殊的解决方案(例如,云解决方案使用 SnowflakeDBVariant 数据类型用于半结构化数据)或不同的方法(使用 data vault 用于快速集成)来缓解任何问题。然而,成见根深蒂固,据我所知,依然存在。

数据工程方法

因为我自己也遇到了这些瓶颈,最近更频繁地,我问自己:“我们如何:

  • 让 BI 更容易
  • 对所有人透明?
  • 毫不费力地更改或添加新数据或转换,但仍然有一些治理和测试?
  • 在即席查询中快速探索和分割您的数据?
  • 有更频繁的数据加载?
  • 简化所有精通数据的人的转换过程,而不仅仅是相关的 BI 工程师?
  • 顺利扩展额外的机器学习能力?

我知道现在发生了很多事情,尤其是围绕开源工具和框架、数据操作和使用容器编排系统的部署等等。

然而,我试图收集一些方法,帮助我使这个复杂的结构更加开放,并减轻整体体验。有些在短期内会变得更加复杂,但随着时间的推移,会变得更加精简和简单。你可以分别应用它们,但是你用得越多,整体的流动就越明显。

“使用数据湖.”

让我们从第一个开始:使用数据湖或湖屋代替数据仓库(DWH)。这为您提供了速度、拥有(半)非结构化数据的能力,并在转换期间定义模式(ELT 而不是 ETL)。同时,它将为你提供高透明度,因为数据被存储到一个开放的数据湖中,供每个人访问或分析。添加新栏目或与同事分享数据很容易。您可以使用广泛的分布式计算,如 Spark SQLPresto 通过即席查询即时探索、连接和转换您的数据。

数据可用性很快,不需要每天晚上进行批处理,因为数据首先会被存入湖中。它可能还不干净,但是您可以直接开始探索并添加转换来实现。一种常见的方法是在数据仓库前面添加一个数据湖。通过这种方式,您可以同时受益于两者,即湖中的即时数据,也可以在数据仓库的末端进行结构化和清理。

一个实际的概述很好地说明了所涉及的组件,这就是从数据湖之上的数据仓库到湖边小屋的演变。要注意的最重要的部分是 ETL,它也是整个数据工程的核心组件。您可以看到,它从隐藏在数据集市后面转移到数据湖体系结构,再转移到一个统一数据块中的主要转换层。

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

摘自“什么是湖畔小屋?” 数据块

你可以在我的 LinkedIn 帖子中找到更多从不同角度体现组件的数据架构,或者,有关数据仓库及其与数据湖的比较的更多信息,请查看我的早期博客帖子

“使用事务处理.”

为了支持数据湖中关系数据库的各种特性,您需要事务处理。幸好 三角洲湖泊 来救你了。 Delta 拥有许多令人敬畏的特性,如 ACID 事务、、保留一个** 事务日志 、SQL API 编写原生 SQL 作为插入、更新、删除甚至合并语句、open-format(【Apache Parquet**)、统一的批处理和流源与汇(no 关于 delta.io 的完整列表和更多信息。此外,查看苹果公司关于大规模威胁检测的优秀客户示例。

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

【2020 年 6 月三角洲湖泊的主要特征( 三角洲 io )

在数据湖中,我们通常有分布式文件,很难对它们进行结构化和整理。尤其是当您想要插入、更新或删除行时。Delta 有不同的 API,除了 scala 和 python,它还给了你 SQL API** (来自 Spark 3.0 on 或 in databricks ),在这里你可以很容易地在你的分布式文件上写一个 update 甚至 merge 语句。由于它由 Spark 提供动力,因此您可以完全规模化地完成这项工作。**

幕后是 rawApache Parquet,优化的柱状存储,高度压缩。这让你能够有效地直接从数据湖中查询数据。那里不需要初始转换。

随着缓慢变化的维度(SCD)在某些情况下仍然是一件事,达美航空有时间旅行来解决这个问题。这类似于我们早期所做的快照。但这一次,与固态硬盘相比,Delta 使用了相当便宜的 blob 存储,而不是每天或每月的快照,Delta 将每一批更改存储为一个单独的版本。这给了你及时回到旧版本的能力,以防你错误地删除了一些东西,或者如果你需要分析指向特定的版本。只要设置了保留时间,就会出现这种情况。

这些更改和快照存储在由 Delta 维护的事务日志中。除了时间旅行,这是一种变更数据捕获(CDC ),根据表跟踪所有变更。您可以看到哪些文件受到了影响,什么操作,谁做的等等,以及每个事务的情况。这是以 JSON 格式单独存储的。事务数据也可能变得很大,Delta 每十次提交就创建一个检查点文件,其中包含表在某个时间点的完整状态,采用 Parquet 格式,对于 Spark 来说读取起来既快又简单。****

“少用代理键,而是回到每个人都理解的业务键.”

在数据仓库中,通常的做法是使用代理键通过单个人工键来寻址一行。当这对于支持维度模型并确保一个行键有一个惟一的 ID 是有意义的时候,在数据湖中你不需要这样做。我认为应该尽可能地减少它让数据读取在理解和交流方面变得更加复杂**。代理键是随机 id,对任何人都没有意义(这也是为什么大多数时候在后台使用或看到的原因)。**

在契约式分布式系统中,随着数据变得越来越大,在整个数据集上拥有唯一的键不再实用。尤其是并行,很难并行化的同时还具有唯一性。最好使用散列键来缓解这个问题。缺点是,它们更长,可读性更差。那么,为什么不回到您的源系统已经为您生成的业务密钥 (BK,也称为自然密钥)呢?业务键已经被每个人所理解,在某种程度上是唯一的(作为源系统中的序列创建),在数据集的生命周期中保持相同的值,因此可以一直追溯到进行跟踪和比较。

当然,代理键有很大的理由。它们在某些方面给了我们很大的优势,但代价是什么呢?我们需要做大量的工作来确保事实的正确粒度,并使用唯一的 ID 作为一行的代表来合并和清理维度。但同样,在数据湖中,我们的规则更少,也更不严格。例如,我们可以首先创建副本,然后只清理和删除它们。

这个话题也与“Kimball 在现代数据仓库中是否仍然相关?”这个问题密切相关和“规格化及其范式?”。至于后者,就存储而言,它不再像 blobs 和类似存储那样重要,但对于分析目的仍然有效。要了解更多细节和见解,我鼓励你去看看西蒙·怀特利关于这个话题的博客帖子

“使用笔记本来打开数据仓库。”

使用笔记本** ( jupyterzeppelindatabricks ) 每个人都可以访问数据,可以探索和编写所有高级统计和数据科学库的分析。设置很简单,不需要安装本地环境或 IDE,它可以与你选择的浏览器一起工作。你可以通过快速分享链接来传播你的观想。也可以在同一个笔记本上一起工作。通过整合降价,你可以自然地向人们解释数字背后的整个故事和思维过程。**

笔记本的 缺点是你的代码会被复制并分散在各处。有点像每个人都有自己的擅长,每个人都会开始自己的笔记本(但当然不同的数据,因为数据是集中存储的)。我建议您围绕笔记本电脑制定严格而明确的规则或管理,并开始将稳定的笔记本电脑集成到您的公共数据管道中。

为了快速平稳地过渡,您应该看看 papermill ,它允许您参数化、执行和分析笔记本。甚至更进一步,使用** dagster ,或者使用笔记本作为你的管道 (dagster 与 papermill 集成)的一个步骤,或者用专用的实体将其完全纳入你的管道。这样,您可以避免代码重复和重用实体。**

“使用 python(和 SQL,如果可能的话).”

**Python 就是这几天数据工程师**的 工具语言 。当然还有 golangjavascriptscala 等流行语言,但是在简单性和多用途能力(数据科学、web 等)方面,python 还是很难被打败的。SQL 再次获得了更多的关注,这是非常受欢迎的。尽管如此,SQL 永远也做不到面向对象编程语言正在做的事情,这就是为什么我认为 python 会在构建数据管道方面停留很多年。

因此使用用 python 编写的框架或工具来编码你的管道**。笔记本已经支持 SQL 和 python,但它们不支持组织或编排。更好的方法是使用像广受欢迎的和众所周知的阿帕奇气流这样的工具。街区里有新的孩子(一如既往),他们很有前途,其中一个就是上面提到的达格斯特。如果你感兴趣的话,在我的 Quora 小回答中有更多关于气流的常见替代品。**

“使用开源工具。”

每个人都可以免费获得开源软件,不涉及任何许可,并且很容易立即开始使用。在购买一个闭源项目或产品之前,不存在需要整个团队讨论的供应商锁定。

另一方面,一个开源工具很少单独出现,要适应和评估开源动物园中你最喜欢的工具和应用程序可能会很累。此外,你需要跟进那些可能出现的对你有价值的永无止境的版本或错误修复。这里的想法是,你可能通过其他公司或一些好的咨询公司的一些建议,知道使用哪些工具。并且对沿途的尝试保持开放,因为你没有被锁定,你可以随时替换或适应稍后的**。学习过程与首先选择正确的工具一样有价值。**

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

大数据与人工智能 2018 年展望作者 马特图尔克 摘自 伟大的力量,伟大的责任

你也可以选择一种中间的方法,像Databricks用于 Spark 和机器学习功能。您可以在瞬间启动并运行,而自己却被锁在半路上。借助 Spark 和笔记本电脑这两种开源技术,您可以随时切换到您的集群。你失去了高级功能和速度,你也可以购买并在以后添加。

我在之前的 帖子 中收集了一个实际例子,其中我使用开源技术构建了一个完整的数据仓库。那次是在 2018 年,当时没有 Delta Lake 和上面提到的其他工具,因为当时没有发布。我用了阿帕奇气流阿帕奇德鲁伊阿帕奇超集

“加载增量和等幂.”

与传统数据仓库的夜间加载相比,我们需要增量加载。这使得你的数据更加模块化和易于管理,尤其是当你有一个星型模式的时候。事实表只能追加,维度只需要扫描最新的事务,而不是整个事实表。****

使用增量方法,您从批处理切换到事件驱动。您的更新和插入是独立的,您可以获得自治的批处理。如果您成功切换,您将获得一个近乎实时的分析解决方案,您可以对这些批次进行扩展和并行处理。

另一种方法是加强幂等性,这对于管道的可操作性至关重要,主要有两方面的帮助。它保证您可以重新运行您的管道,并且每次都会产生相同的结果。另一方面,数据科学家和分析人员依赖时间点快照并执行历史分析。这意味着您的数据不应该随着时间的推移而变化。否则,随着时间的推移,我们会得到不同的结果。这就是为什么管道应该被构建为在以相同的(业务)逻辑和时间间隔运行时再现相同的输出。这被称为幂等性,用于函数式编程,它是幂等性的角色模型。

事件驱动和增量加载的一个很好的副作用是,你可以消除λ架构 一个用于批处理和流的单一数据流,其与三角洲湖完全一致。具有集成选项微批处理Spark 结构化流非常适合这一目的。这样,您可以从两个方面受益,因为您可以进行流式处理,并且可以将延迟设置为 0,但也可以降低处理速度。例如,当您每小时有一个批处理来减少查找维度或特定聚合的开销时,您需要为每个流执行其他操作(这也可能需要时间)。****

“不要以传统的 DDL 方式改变结构.”

每个处理数据的人都知道更改数据类型或重命名列是多么痛苦。有一个完整的依赖链,有很多没有真正价值或影响的工作。使用上面的增量和等幂模式,您可以免费得到它。这意味着您的更改不是重命名或更改某个字段的业务逻辑,最好是添加新字段,并在稍后 更改您的管道和分析,而不破坏任何东西

通过使用 Delta Lake,您还可以获得模式进化乐观并发,这两者都可以帮助您解决这个问题。因为第一个会自动更新模式更改,而不会破坏任何东西。第二个将确保两个或更多的用户可以更新同一个数据集而不会失败,只要不同的列和相应的数据不会被同时更改。

“使用容器编排系统.”

Kubernetes 已经成为云原生应用的事实上的标准,用于(自动)横向扩展(水平而非垂直)和快速部署开源动物园,独立于云提供商。这里也没有锁定。你可以使用开放式换档OKD 。在最新版本中,他们增加了operator hub从今天开始,你只需点击几下就可以安装 133 个项目。安装起来复杂的数据库和机器学习应用程序变得非常简单。

Kubernetes 的更多原因是从基础设施即代码向基础设施即数据的转变,具体来说就是 YAML 。Kubernetes 中的所有资源,包括 pod、配置、部署、卷等。,可以简单地用 YAML 文件表示。开发人员快速编写跨多个操作环境运行的应用程序。可以通过缩减规模(例如使用 Knative 甚至到零)来降低成本,也可以通过使用普通 python 或其他编程语言来降低成本,而不是为 Azure、AWS、Google Cloud 上的服务付费。通过模块化和抽象化,以及使用容器( DockerRocket ),它的管理变得很容易,并且您可以在一个地方监控您的所有应用程序。

“使用声明式管道而不是命令式管道.”

与 Kubernetes YAML 文件一样,你开始描述性地工作,意味着你定义应该做什么而不是如何做。同样,我们应该致力于在数据管道中消除 Dag 中的 how(胶水),只声明 what。工具、框架和平台应该注意如何做。****

统一数据管道解决方案 Ascend 的创始人肖恩·纳普引用道:“声明式编程是一种表达计算逻辑而不描述其控制流的范式……试图通过描述程序必须完成的事情来最小化或消除副作用。”查看他关于智能编排:数据缺失的环节的精彩演讲中的更多细节。

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

陈述性 vs 命令性 by 肖恩·纳普&ascend . io摘自 智能编排

这可能是显而易见的,但很难实现。这就是为什么 Ascend 提供了一个卓越的一体化平台,让你可以做到这一点。它为你理清了所有的方法,而你关注的是什么。

如果碰巧你没有这样的平台,你可能需要一个支持它的架构。我会说,这不是自然而然的事情,你需要围绕这个范式来构建。但是更快的周期和更多的解决问题的方法可能是值得的。

管道编排的演变

快速概述我们在流程编排和管道工具类型方面的进展:

  1. 从所有调度工具之母 cron 到更
  2. 更多的图形 ETL 工具,如 Oracle OWBSQL Server 集成服务Informatica 等等
  3. 以代码为中心的工具,如气流路易吉Oozie
  4. 到 python 框架如提督KedroDagster 甚至完全 SQL 框架 dbt
  5. 到声明管道完全管理到 AscendPalantir Foundry 和其他数据湖解决方案

如果您感兴趣,可以查看 令人敬畏的管道列表 。在我看来,如果你对目前最流行的 Apache 气流的替代品感兴趣,可以看看常见的气流替代品。

“使用数据目录拥有一个中央元数据存储.”

数据目录是一个集中的存储器,里面存放着你所有的元数据数据。现在与元数据存储、数据发现或类似的同义词。这是至关重要的,因为有了数据湖和其他数据存储库,你需要保持一个概览和搜索数据的能力。

Lyft 提供了一个完美的例子。他们在一个名为阿蒙森的数据目录上实现了一个应用程序。Amundsen 不仅显示了可用的数据集,还显示了谁在哪一年创建了它。此外,关于多少行、最小/最大条目等的元数据。如果支持连接的数据库,将显示一个关于表。它甚至整合了一个评级系统,用户可以对一个数据集给出反馈,让你感受一下数据质量以及使用这个数据集的有效性。

最重要的是,Amundsen 将数据集与仪表板和笔记本连接起来,以显示特定数据集在其中的哪些地方被使用过。这避免了重复工作,并且您可以很快找到数据问题的答案。

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

Ammundsen 2019 年 4 月 2 日的一个例子,发布在“ Lyft 的数据发现&元数据引擎作者 Mark Grover

“如果你没有开发人员或时间,就使用闭源软件。”

由于上面提到的并非都是在一天之内构建的,如果没有必要的团队或财务,可能不会如此温和,所以我还包括了封闭源代码的平台即服务(PaaS) 解决方案,这些解决方案会让您付出一定的成本,但会立即提供开箱即用的所有优势。我自己使用的两种解决方案是提到的 AscendPalantir Foundry 。肯定还有更多,如果你知道任何真正的,让我知道。

对于更具体的解决方案,我看到以下几点:

  • 如果使用(slice and dice 即席查询),从 Imply.io 中选择一个托管德鲁伊集群。
  • 如果需要云数据仓库,选择雪花 DB****
  • 如果你已经有许多不同的系统,并且你想把它们整合在一起,选择数据虚拟化解决方案 Dremio ,它使用 Apache Arrow 作为动力。
  • 如果你主要想关注仪表盘和报表,选择 LookerSisense ,这给你一个托管立方体类型的解决方案。

在我之前的帖子中也可以看到一个更完整的列表,其中包含更多替换立方体的选项(尽管从 2018 年 11 月起不再完全更新)。

结论

我们已经看到,商业智能的目标是生成业务和组织范围的概览,以及创建透明、处理非结构化数据格式或实时数据可用性的数据仓库的最具挑战性的问题。然后我们如何用十二种新兴的数据工程技术和方法来解决它们。

我希望这些方法是有帮助的,并将解决您的 BI 系统的一些挑战。或者帮助您构建数据架构,或者降低一些复杂性。做这一切是一项相当大的工作。然而,如果你开始挑选对你最相关的,我想你是在正确的道路上前进。可能也是最大的优势是,您的架构将面向未来,并为大数据和云原生解决方案做好准备。

如果你既没有时间也没有资源,你可以选择一个闭源平台作为服务,就像我们在最后一种方法中看到的那样,这也很好。从长远来看,这将增加您的成本,但是您可以立即开始运行。

要查看实际使用的工具,请查看我的实践帖子在 20 分钟内构建一个数据工程项目。暂时就这样了。让我知道你对此的想法,你有什么工具和框架来解决一些挑战?我将感谢你的评论。

原载于 2020 年 6 月 14 日sspaeti.comT22。

借助 Power BI 实现商业智能可视化

原文:https://towardsdatascience.com/business-intelligence-visualizations-with-power-bi-fcc4ccc5a906?source=collection_archive---------36-----------------------

我准备了一份在 Power BI 中显示可视化的详细指南,Power BI 是数据爱好者的必备工具。

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

照片由 卢卡斯 发自 Pexels

“当一幅画迫使我们注意到你从未想过会看到的东西时,它就获得了最大的价值。”— 约翰·图基

数据可视化是信息和数据的图形化表示。通过使用图表、图形和地图等可视化元素,数据可视化工具为解释和理解数据中的趋势、异常值和模式提供了一种便捷的方式。在大数据和海量信息需要处理的背景下,数据可视化软件应运而生,并成为一种重要的工具,使数据分析师能够以更简单、更快速的方式深入了解他们正在处理的数据。

可用于实现相同目标的其他工具包括编程技能,它允许我们构建更灵活和定制的功能,但代价是在这种个性化的可视化上花费更多时间。如果您对使用编程技巧进行数据可视化感兴趣,可以看看我写的一篇关于这个主题的文章:

[## 用 Python 实现商业智能可视化

我准备了一份详尽的指南来展示漂亮的可视化效果,以增强度量、KPI、预测和其他…

towardsdatascience.com](/business-intelligence-visualizations-with-python-1d2d30ce8bd9)

在这篇文章中,我包含了一个关于如何利用微软提供的商业分析服务 Power BI 来准备我们的数据可视化分析的广泛指南。请和我一起做这个实用的解释!

目录:

1.Power BI 简介。(2 分钟读取)

2.你为什么要用它?(2 分钟读取)

3.绘图类型(5 分钟读取)

1.介绍

Power BI 是微软的一项商业分析服务。它旨在提供交互式可视化和商业智能功能,其界面足够简单,最终用户可以创建自己的报告和仪表板。

本质上,它由一系列软件服务、应用程序和连接器组成,它们协同工作将不相关的数据源转化为连贯的交互式洞察。数据可以存储在 Excel 电子表格、基于云的环境或数据仓库中,并且仍然可以从 Power BI 中访问,以便于分析。

Power BI 由一组协同工作的应用程序组成,让您能够创造和利用业务洞察力。最常用的三种是:

  • 一款名为 Power BI Desktop 的 Windows 桌面应用。
  • 一个叫做 Power BI service 的在线软件服务。
  • 面向 Windows、iOS 和 Android 设备的 Power BI 移动应用

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

使用 Power BI Desktop 创建的示例仪表板

Power BI 中的一个常见工作流是从连接到中的数据源并构建一个报告开始的。之后,继续将该报告从 Power BI Desktop 发布到 Power BI 服务,以便能够与其他业务用户共享,这样他们就可以查看该报告并与之交互。

为了开始使用它,请在此链接中下载 Power BI 桌面应用程序,在选择该应用程序后,您将直接被发送到 Microsoft Store。

2.你为什么要用它?

一旦下载了应用程序,您就可以立即开始使用它。您首先看到的是主画布,其中的数据可以通过拖放系统进行可视化浏览,该系统可以在各种现代可视化中选择绘图类型,并可以轻松地从导入的文件或数据库中选择数据要素。

在下图中,我展示了如何轻松拖动选定的绘图类型,并将确定的要素作为值和标签包含到该绘图中:

画布和条形图示例

Power BI 最有用的特性之一是,它支持从多个来源提取数据并进行连接,这与其他 Microsoft Office 软件包工具(如 Excel 或 PowerPoint)不同,例如

它不仅有几个数据源,而且允许来自不同来源的数据在探索过程中进行交互,以获得进一步的见解。

这可以通过“主页”选项卡中的菜单栏索引,选择获取数据小部件来完成。一些最有趣的信息来源是 excel 和。CSV 文件、Access、Oracle、Azure SQL 和 MySQL 数据库、Spark 和 Hive、Salesforce、GitHub 甚至 Python 脚本来获得与您的脚本的交互:

数据源

如果您有兴趣了解如何将 Python 应用于数据探索性分析,并对您的结论进行手动可视化配置,请查看我写的以下文章:

[## Airbnb 租房——使用 Python 分析纽约

发现最方便的租赁方式,以便继续实施具有良好可视化效果的数据分析。

towardsdatascience.com](/airbnb-rental-analysis-of-new-york-using-python-a6e1b2ecd7dc)

Power BI 的另一个有趣的特性是,它允许自动刷新已经存储的数据,以方便日常分析任务,如内部业务报告。

另一方面,除了提供各种不同的绘图类型,如折线图、条形图、饼图和堆积条形图,Power BI **还包括一个市场,在这里可以获得特定的和更复杂的绘图类型。**看看一些可用的地块:

地块类型

3.地块类型

A.对比图

面积图,也称为分层面积图,是一种绘图类型,以类似于折线图显示数据的方式表示一个或多个量随时间的变化,并增加了变量体积的可视化表示。

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

当您想要显示一个变量随时间变化的趋势,但不太关心显示精确值时,例如公司全年的销售和费用变化,以及员工的生产率,面积图是一个很好的选择。

为了执行该图表,我们必须从可视化面板中选择面积图,并将所需的值和轴拖到画布上:

对比图

B.条形图

这种情节类型在我以前准备的文章中有广泛的解释。在开始实施 Power BI 之前,请随意从概念上回顾它们:

[## 用 Python 实现商业智能可视化—第 2 部分

作为第一篇文章的后续,我准备了一个广泛的指南,向已经…

towardsdatascience.com](/business-intelligence-visualizations-with-python-part-2-92f8a8463026)

为了在 Power BI 中执行这种图表,我们必须从可视化面板中选择条形图

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

条形图示例

一旦我们将所需的值和轴拖到画布上,我们就可以继续处理图像的样式,包括修改标题、标签、背景颜色、条形颜色以及其他功能:

C.组合图

组合图是由折线图和柱形图组合而成的单一可视化图形。当您有一个具有相同 X 轴的折线图和柱形图时,以及当您想要比较具有不同数值范围的多个度量时,它们是一个很好的选择。此外,它们有助于在一个可视化中说明两个度量之间的相关性。

在下图中,我准备了一个样本图表,其中显示了总销售额(左侧 Y 轴以百万计)和每件产品平均价格(右侧 Y 轴以美元计)之间的关系,以及销售链的区别:

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

示例组合图

为了在 Power BI 中执行这种类型的图表,我们必须从 visualizations 面板中选择折线图和堆积柱形图,并完成带有月份的字段,带有突出显示的独特功能的系列,在本例中是带有销售额和平均单价的,以便通过折线图与总销售额进行比较。

D.圆环图

甜甜圈图类似于饼图,它显示了部分与整体的关系。唯一的区别是,中心是空白的,并允许标签或图标的空间。

在下图中,我准备了一个样本图表,其中显示了该品牌现有连锁店的总销售额分布情况:

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

圆环图示例

为了在 Power BI 中执行这种类型的图表,我们必须从可视化面板中选择圆环图,并在几个月内完成图例字段,并将总销售额信息拖动到字段。之后,您可以根据自己的需要或喜好对情节进行定制:

在选择此图表来可视化某个度量值之前,请记住圆环图值的总和必须是 100%,并且太多的类别会使其难以阅读和解释

E.漏斗图

漏斗图是一种图表,通常用于表示流程的顺序连接阶段。最常见的应用程序是销售流程,因为它们显示每个阶段的潜在收入,并有助于确定组织中潜在的问题领域。

每个漏斗阶段代表总数的一个百分比。因此,在大多数情况下,漏斗图的形状像一个漏斗——第一个阶段最大,随后的每个阶段都比前一个阶段小。

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

样本漏斗图

在以下情况下,漏斗图是一个很好的选择:

  • 数据是连续的,至少要经过几个阶段。
  • 预计第一阶段的观察次数将多于后续阶段的观察次数。
  • 我们想分阶段计算潜在收入。

为了在 Power BI 中执行这种类型的图表,我们必须从可视化面板中选择漏斗图,并用流程的不同阶段完成字段,并将总销售额信息拖至字段,以便它们在各个阶段之间进行分配。之后,您可以根据自己的需要或喜好对情节进行定制:

F.径向仪表图

辐射状仪表图有一个圆弧,并显示一个值,该值衡量朝着目标或关键绩效指标 (KPI)的进度。线条(或指针代表目标或目标值,阴影代表朝着目标的进展。弧线内的值代表进度值。

在这种情况下,我代表的是与年平均总销售额相比的年初至今总销售额,年平均总销售额合计为 9000 万英镑,而年初至今合计为 4500 万英镑。

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

样本径向规

径向标尺是显示目标进度、代表百分比度量(如 KPI)或甚至显示单个度量的健康状况的绝佳选择。

为了在 Power BI 中执行这种类型的图表,我们必须从可视化面板中选择仪表图,并填写目标值字段和字段,其中包含要比较的实际数字。

此外,您可以手动设置最小值和最大值。之后,您可以根据自己的需要或喜好对情节进行定制:

结论

根据本文中发布的指南和绘图类型,我希望能够帮助您提高使用 Power BI 创建可视化的技能。

这篇文章是与数据可视化相关的系列文章的一部分,我将准备分享更多的见解和知识。如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!

感谢您花时间阅读我的文章!如果您有任何问题或想法要分享,请随时通过我的电子邮件联系我,或者您可以在以下社交网络中找到我以了解更多相关内容:

用 Python 实现商业智能可视化

原文:https://towardsdatascience.com/business-intelligence-visualizations-with-python-1d2d30ce8bd9?source=collection_archive---------5-----------------------

我准备了一个广泛的指南来展示美丽的可视化,以增强度量、KPI、预测和其他见解。

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

照片由 卢卡斯 发自 Pexels

为什么可视化值几千字?他们有讲述故事和简化信息解读的能力。他们帮助用户检测模式、洞察度量,并因此构建更好的产品和服务。所以它们真的很重要。

可视化是数据分析师或数据爱好者可用的最强大的工具之一。为了方便他们的创作,已经开发了各种各样的软件和语言。也许可视化的有用性与我们的大脑自然给予图像的不同解释有关,而不是大的数据帧、数组或分配有数据的传统表格。

目录:

可视化的重要性。(2 分钟读取)

Python 绘图类型介绍(8 分钟阅读)

1.可视化的重要性

列表数据使结论提取变得复杂。从上下文中分离出来的数字,尽管被相应地组织成列和行,以提供结构和给用户定位,但是很难从中理解意义。另一方面,可视化表示一目了然的值。它们以一种简单的方式显示列表数据,方便快速地比较数值,有助于决策。

更重要的是金融、计量经济学、数据分析和其他数学相关领域的这些技能,在这些领域,决策是基于数字基础的,通常很难向不熟悉金融的团队成员解释清楚。

想象你自己是一个投资委员会的资产经理,解释你的数据驱动的资产配置方法,用机器学习算法创建一个优化的投资组合。作为研究的论证,可视化肯定会派上用场。

大数据和海量数据处理提高了从分析中提取的结论的复杂性。在这种背景下,用户友好的报告和其他定制的演示可以为特定的受众重新创建,具有特殊的价值。

在本文中,我不会将的重点放在专门设计的工具来产生可视化效果,如 Tableau、QlikPower BI 。这一类别的产品因功能和易用性而异,通常可以快速设置,使用户能够从多个来源访问数据。我将主要关注通过应用我们在 Python 中的编码技能,利用 Matplotlib 这是一个二维绘图库,它有一些简洁的工具,可以创建漂亮灵活的图形和可视化效果。

让我们看看数据解释是如何随着数据的使用而得到巨大改善的。看看这个数据图,包括不同类型的茶叶销售:

在下图中,您将看到它是如何通过 Matplotlib 条形图进行可视化显示的。显然,可以很快得出结论,例如销售最好和最差的茶类,中等销售的茶类,以及每种茶类的销售额之间的比较,一目了然:

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

2.Python 绘图类型简介

安装过程非常简单。只需打开您的终端并插入以下命令:

pip install matplotlib

A.线形图

安装完库之后,我们可以开始创建情节了。我们要创建的第一种类型是简单的折线图:

# Begin by importing the necessary libraries:
import matplotlib.pyplot as plt

假设您想使用以下输入数据绘制贵公司一周的支出与前一周的支出的对比图:

# Days of the week:
days = [1, 2, 3, 4, 5, 6,7]
# Money spend one week 1
money_spent = [1000, 1200, 1500, 1080, 1400, 1650, 1350]
# Money spend one week 2
money_spent_2 = [900, 1500, 1200, 1050, 950, 1250, 1000]# Create figure:
fig = plt.figure(figsize=(10,5))
# Plot first week expenses:
plt.plot(days, money_spent)
# Plot second week expenses:
plt.plot(days, money_spent_2)
# Display the result:
plt.title('Company Expenditure Comparison')
plt.legend(['First week', 'Second week'])
plt.show()

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

示例图—作者提供的图像

这个图可以用几行代码做一些很好的样式修改:

# Display the result:
ax = plt.subplot()
ax.set_xticks(range(1,8))
ax.set_xticklabels(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday',' Sunday'])
plt.title('Company Expenditure Comparison')
plt.legend(['First week', 'Second week'])
plt.show()

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

如果你想放大到一个特定的点,你可以使用 plt.axis 命令,输入 X 和 Y 轴所需的坐标:

plt.axis([1,3,900,1600])

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

支线剧情

Matplotlib 库提供了一种在单个图形上绘制多个图的方法。为了在一个图形中创建多个图,一般情况下,为matplotlib . py plot . subplots方法配置以下参数:

# Subplot creation
plt.subplots(nrows=1,ncols=1,sharex=False,sharey=False,squeeze=True,subplot_kw=None,gridspec_kw=None)

如果您没有插入这些默认设置的参数,请确保使用 plt.subplot 方法来指示要配置的子情节的坐标。参数:

  • n 排:图中的数量。
  • ncols :图中的数量。
  • plot_number :图内支线剧情的索引。

例如,假设您希望使用以下输入数据来表示与同一时期的航班销售相关的全年温度,以便找出这些变量之间是否存在任何相关性:

# Temperature and flight sales 
months = range(12)
temperature = [37, 38, 40, 53, 62, 71, 78, 74, 69, 56, 47, 48]
flights = [1100, 1300, 1200, 1400, 800, 700, 450, 500, 450, 900, 950, 1100]# Create figure:
fig = plt.figure(figsize=(12,6))# Display the result - Plot 1:
plt.subplot(1,2,1)
# Plot temperatures:
plt.plot(months,temperature,color='steelblue',linestyle='--')
# Configure labels and title:
plt.xlabel('Months')
plt.ylabel('Temperature')
plt.title('Temperature Representation')# Display the result - Plot 2:
plt.subplot(1,2,2)
# Plot flights:
plt.plot(months,flights,color='red',marker='o')
plt.xlabel('Month')
# Configure labels and title:
plt.ylabel('Flights Summary')
plt.title('Flights per month')
plt.show()

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

示例图—作者提供的图像

B.并排条形图

我将跳过简单条形图的可视化,专注于更多与业务相关的并排图表。条形图使用的基本命令是 plt.bar(x_values,y_values)。

并排条形图用于比较两组具有相同类型轴值的数据。并排条形图可能有用的一些数据示例包括:

  • 一段时间内超过一个国家的人口。
  • 一段时间内多家餐厅不同食物的价格。
  • 男女生分班注册。

我们将使用以下信息来创建图表:

# Values for X axis bar separation:
x_values1 = [0.8,2.8,4.8,6.8,8.8,10.8]
x_values2 = [1.6,3.6,5.6,7.6,9.6,11.6]# Sales by month and labels:
drinks = ["cappuccino", "latte", "chai", "americano", "mocha", "espresso"]
months_sales = ['Jan','Mar','May','Jun','Aug','Oct', 'Dec']
sales_cappuccino = [95, 72, 53, 62, 51, 25]
sales_latte = [62, 81, 34, 62, 35, 42]

情节配置看起来像这样:

# Figure creation:
fig = plt.figure(figsize=(12,8))# Subplot configuration:
ax = plt.subplot()
ax.set_xticks(range(1,12,2))
ax.set_xticklabels(months_sales)# Bar plot creation:
plt.bar(x_values1, sales_cappuccino, color='gray')
plt.bar(x_values2, sales_latte, color='purple')# Display plot:
plt.title("Coffee Sales Comparison")
plt.xlabel("Types of coffees")
plt.ylabel("Pounds sold")
plt.legend(labels=drinks, loc='upper right')
plt.show()

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

C.堆积条形图

如果我们想比较两组数据,同时保留它们之间的总数,我们也可以堆叠条形,而不是并排放置。我们通过使用关键字底部来做到这一点。

例如,假设我们希望在不失去总销售额视角的情况下,按产品评估我们的销售分布情况:

# Product identification & Sales per product:
product = ['Computer', 'Keyboard', 'Headset', 'Mouse', 'Monitor']
sales_c = np.random.randint(1000,3000,5)
sales_k = np.random.randint(1000,3000,5)
sales_h = np.random.randint(1000,3000,5)
sales_m = np.random.randint(1000,3000,5)
sales_o = np.random.randint(1000,3000,5)# Configure bottoms to stack bars:
k_bottom = np.add(sales_c, sales_k)
h_bottom = np.add(k_bottom, sales_h)
m_bottom = np.add(h_bottom, sales_m)# Create figure and axes:
fig = plt.figure(figsize=(10,8))
ax = plt.subplot()# Plot bars individually:
plt.bar(range(len(sales_c)),sales_c, color='#D50071', label=product[0])
plt.bar(range(len(sales_k)),sales_k, bottom=sales_c, color='#0040FF',label=product[1])
plt.bar(range(len(sales_h)),sales_h, bottom=k_bottom, color='#00CA70',label=product[2])
plt.bar(range(len(sales_m)),sales_m, bottom=h_bottom, color='#C14200',label=product[3])
plt.bar(range(len(sales_o)),sales_o, bottom=m_bottom, color='#F0C300',label=product[4])# Display graphs:
ax.set_xticks(range(5))
ax.set_xticklabels(['Monday','Tuesday', 'Wednesday', 'Thursday', 'Friday'])
plt.legend(loc='best')
plt.title('Sales Distribution by Product')
plt.ylabel("Products Sold")
plt.show()

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

D.圆形分格统计图表

如果我们想将数据集的元素显示为整体的比例,我们可以使用饼图。在 Matplotlib 中,您可以使用命令 plt.pie 制作一个饼图,传递您想要绘制的值。

我们还希望能够理解饼的每一片代表什么。为此,我们可以:

  • 使用图例标记每种颜色。
  • 在图表上贴标签。

饼图的另一个有用的标签工具是添加每个扇区占总扇区的百分比。Matplotlib 可以用关键字 autopct 自动添加这个。此外,我将添加 explode 特性,该特性突出显示“饼图”的选定部分。

我将使用以下数据绘制图表:

# Sales and regions:
region = ['LATAM', 'North America','Europe','Asia','Africa']
sales = [3500,5500,4800,4500,2500]# Create figure and plot pie:
fig = plt.figure(figsize=(10,8))
plt.pie(sales, labels=region,autopct='%d%%', colors=colors,explode=explode_values)
plt.axis('equal')
plt.title('Global Sales Distribution', fontsize='20')
plt.savefig('plot_eight.png')
plt.show()

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

E.柱状图

直方图告诉我们数据集中有多少值落在不同的数字集合之间,例如有多少数字落在 0 和 10 之间? 这个问题代表一个可能在 0 到 10 之间的 bin。

直方图中的所有条块始终具有相同的大小:

  • 每个面元的宽度是每个面元的最小值和最大值之间的距离。
  • 每个容器由一个不同的矩形表示,矩形的高度是数据集中落在该容器内的元素数量。

命令 plt.hist 查找数据集中的最小值和最大值,并在默认情况下在这些值之间创建 10 个等距的条柱。如果我们想要 10 个以上的箱柜,我们可以使用关键字箱柜来设置指令。

我们面临的一个问题是,我们的直方图可能有不同数量的样本,使一个比另一个大得多。为了解决这个问题,我们可以使用 normed=True 来标准化我们的直方图。

在下面的例子中,我包括了一个信用评分案例,在这个案例中,我们希望看到分数是如何在两组客户之间分配的。我对直方图进行了裁剪,创建了 12 个区间,而不是默认的 10 个,并将 alpha 或透明度级别设置为 0.5,以便同时看到两个直方图,避免重叠分布。

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

F.堆积图

这种类型的图表在堆积图中绘制表格或时间表的变量,最多 25 个变量。该函数在单独的 y 轴上绘制变量,垂直堆叠。变量共享一个公共的 x 轴。

我将模拟三家公司在过去八年中市场份额的演变情况,并在堆积图中分别显示:

# Insert DataFrames:
year = pd.DataFrame(range(2013,2021),columns=['Year'])
volume1 = pd.DataFrame([1000,1100,1200,1250,1300,1350,1400,1450], columns=['Values 1'])
volume2 = pd.DataFrame([1000,900,800,700,600,500,400,300], columns=['Values 2'])
volume3 = pd.DataFrame([1000,950,900,850,800,750,700,650], columns=['Values 3'])# Create main frame:
frames = [year,volume1, volume2, volume3]
frame = pd.concat(frames,axis=1)# Plot axis, labels, colors:
x_values = frame['Year']
y_values = np.vstack([frame['Values 1'], frame['Values 2'], frame['Values 3']])
labels = ['Company A', 'Company B', 'Company C']
colors = ['skyblue', 'peru', 'gray']# Display plot:
fig = plt.figure(figsize=(10,8))
plt.stackplot(x_values, y_values, labels=labels, colors=colors ,edgecolor='black')
plt.title('Market Share Evolution',fontsize=15)
plt.ylabel('Share', fontsize=15)
plt.legend(loc='best')
plt.show()

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

G.百分比堆积图

该图表也称为百分比堆积面积图,显示每个数值所占百分比随时间或类别变化的趋势。

在这种情况下,我们将绘制与堆积图相同的信息,但会显示每家公司占总市场份额的百分比:

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

结论

根据本文中发布的指南和绘图类型,我希望能够帮助您增强数据分析技能,至少从数据可视化的角度来看是这样的。

这是与数据可视化相关的一系列文章的开始,我将准备分享更多的见解和知识。如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!

参考

感谢您花时间阅读我的文章!如有任何问题、建议或意见,欢迎联系我:herrera.ajulian@gmail.com

用 Python 实现商业智能可视化—第 2 部分

原文:https://towardsdatascience.com/business-intelligence-visualizations-with-python-part-2-92f8a8463026?source=collection_archive---------20-----------------------

作为第一篇文章的后续,我准备了一个广泛的指南来显示已经介绍的情节的定制特性。

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

照片由 卢卡斯 发自 Pexels

“没有信息过载这回事。只有糟糕的设计。”
爱德华·塔夫特

数据可视化越来越被视为任何成功的数据驱动分析战略的必要步骤。此外,正如我在之前的文章中提到的,是数据分析师或数据爱好者可用的最强大的工具之一。因此,我们必须花时间来创建令人惊叹的图表和可视化效果,以仔细清晰地传达我们隐藏在结构化数据中的故事和发现。

上周,我们讨论了数据可视化的重要性,我介绍了不同的绘图类型,例如:

  • 线剧情和支线剧情。
  • 并排条形图。
  • 堆积条形图。
  • 饼状图
  • 直方图。
  • 堆积图和百分比堆积图。

[## 用 Python 实现商业智能可视化

我准备了一份详尽的指南来展示漂亮的可视化效果,以增强度量、KPI、预测和其他…

towardsdatascience.com](/business-intelligence-visualizations-with-python-1d2d30ce8bd9)

**借此机会,我将为您提供更多关于如何使用 PythonMatplotlib**显示定制图表的见解,这是一个绘图库,提供了一些简洁的工具来创建漂亮而灵活的图表。

目录:

1.使用 Python 的其他绘图类型(8 分钟读取)。

2.格式化应用程序(2 分钟阅读)。

1.其他绘图类型

尽管这些图表类型包含在本系列的第二部分Python 商业智能可视化中,但它们的重要性并没有降低,因为它们补充了已经介绍过的图表。我相信你会发现它们比基本情节更有趣!

从本系列开始,我们必须安装所需的库:

# Imports
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

A.带误差线的水平条形图:

条形图是一种图表,使用矩形条呈现数据,矩形条的高度和长度与它们所代表的值成比例。条形图使用的基本命令是 plt.bar(x_values,y_values)。

此图中涉及的附加功能是误差线,误差线是数据可变性的图形表示。它们通常用于表示预期测量中的估计误差。

这一次,我们将使用以下输入数据绘制一个水平条形图:

# Input data for error bars and labels
mean_values = [1, 2, 3]
std_dev = [0.2, 0.3, 0.4]
bar_labels = ['Bar 1', 'Bar 2', 'Bar 3']
y_values = [0,1,2]

现在让我们用 plt.barh 命令绘制条形:

# Create bar plots
plt.yticks(y_values, bar_labels, fontsize=10)
plt.barh(y_values, mean_values, xerr=std_dev,align='center', alpha=0.5, color='red')# Labels and plotting
plt.title('Horizontal Bar plot with error', fontsize=13)
plt.xlim([0, 3.5])
plt.grid()
plt.show()

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

示例图—作者提供的图像

这种图的变化可以通过在条上插入标签或文本来实现。我们将使用以下输入数据来完成这项工作:

# Input data for error bars and labels
data = range(200, 225, 5)
bar_labels = ['Bar 1', 'Bar 2', 'Bar 3']
y_values = [0,1,2,3,4]

继续准备地块:

# Create bar plots
fig = plt.figure(figsize=(12,8))
plt.yticks(y_values, bar_labels, fontsize=15)
bars = plt.barh(y_values, data,align='center', alpha=0.5, color='orange', edgecolor='red')# Labels and plotting
for b,d in zip(bars, data):
    plt.text(b.get_width() + b.get_width()*0.08, b.get_y() + b.get_height()/2,'{0:.2%}'.format(d/min(data)),ha='center', va='bottom', fontsize=12)
plt.title('Horizontal bar plot with labels', fontsize=15)
plt.ylim([-1,len(data)+0.5])
plt.xlim((125,240))
plt.vlines(min(data), -1, len(data)+0.5, linestyles='dashed')
plt.show()

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

示例图—作者提供的图像

B.连续条形图:

我们继续研究柱状图系列,在这种情况下,我们使用了一种变体来横向比较两组数据。创建此图的命令与创建水平条形图的命令相同,但其中一组数据的值为负值。

# Input data for both sets of data utilizing numpy arrays to negate one set:
X1 = np.array([1, 2, 3])
X2 = np.array([3, 2, 1])
y_values = [0,1,2]
bar_labels = ['Bar 1', 'Bar 2', 'Bar 3']

现在让我们用 plt.barh 命令和否定特性来绘制条形图:

# Plot bars
fig = plt.figure(figsize=(12,8))
plt.yticks(y_values, bar_labels, fontsize=13)
plt.barh(y_values, X1,align='center', alpha=0.5, color='blue')
plt.barh(y_values, -X2,align='center', alpha=0.5, color='purple')plt.title('Back-to-back Bar Plot', fontsize=13)
plt.ylim([-1,len(X1)+0.1])
plt.grid()
plt.show()

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

示例图-作者提供的图像

C.带高度标签的条形图:

此图表与前面显示的图表相同,只是它是垂直方向的,并且我添加了高度标签,以便更清楚地显示这种指标。这可以通过命令 ax.text. 来完成

此外,我介绍了 Matplotlib 中包含的方法 autofmt_xdate 来自动旋转标签。看一下代码 :

# Input information:
n_bars = [0,1,2,3]
values = [3000, 5000, 12000, 20000]
labels = ['Group 1', 'Group 2','Group 3', 'Group 4']# Create figure and plots
fig, ax = plt.subplots(figsize=(12,8))
ax.set_facecolor('xkcd:gray')
fig.patch.set_facecolor('xkcd:gray')
fig.autofmt_xdate()
bars = plt.bar(idx, values, align='center', color='peru', edgecolor='steelblue')
plt.xticks(idx, labels, fontsize=13)# Add text labels to the top of the bars
def rotate_label(bars):
   for bar in bars:
      height = bar.get_height()
      ax.text(bar.get_x() + bar.get_width()/2., 1.05 * height,'%d' % int(height),ha='center', va='bottom', fontsize=13)# Labels and plotting
rotate_label(bars)
plt.ylim([0, 25000])
plt.title('Bar plot with Height Labels', fontsize=14)
plt.tight_layout()
plt.show()

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

示例图—作者提供的图像

D.带颜色渐变的条形图:

让我们给等式加点颜色。在下图中,我介绍了名为 colormap 的内置模块,该模块用于为绘制的参数实现直观的配色方案。首先,我将继续导入:

import matplotlib.colors as col
import matplotlib.cm as cm

现在我将插入样本数据来绘制图表。如你所见,色彩映射表是通过scalar maptable类实现的,该类在从给定的色彩映射表返回 RGBA 颜色之前应用数据标准化。

为了澄清前面的陈述, RGBA 颜色与十六进制HSL 一起是一种数字颜色表示形式。十六进制是使用最多和最广为人知的,因为它是 6 位数的简单表示,可以产生红色、绿色、蓝色。十六进制颜色表示的一个例子是 #123456 ,12 是红色,34 是绿色,56 是蓝色。另一方面, RGBA 颜色添加了一个新的因素,alpha,它是遵循相同百分比方案的不透明度或透明度:0%代表绝对透明度,100%代表绝对不透明度,这是我们传统上看到颜色的方式。更多详情在这个网站。

在 Matplotlib 文档的链接中,您将找到更多关于可供选择的不同色彩映射表的详细信息。为了有一个更清晰的视图,请看一下生成图的代码:

# Sample values
means = range(10,18)
x_values = range(0,8)# Create Colormap
cmap1 = cm.ScalarMappable(col.Normalize(min(means), max(means), cm.spring))
cmap2 = cm.ScalarMappable(col.Normalize(0, 20, cm.spring))# Plot bars
# Subplot 1
fig, ax = plt.subplots(figsize=(12,8))
plt.subplot(121)
plt.bar(x_values, means, align='center', alpha=0.5, color=cmap1.to_rgba(means))
plt.ylim(0, max(means) * 1.1)# Subplot 2
plt.subplot(122)
plt.bar(x_values, means, align='center', alpha=0.5, color=cmap2.to_rgba(means))
plt.ylim(0, max(means) * 1.1)
plt.show()

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

示例图—作者提供的图像

E.带图案填充的条形图:

现在,我们将使用条形图和模式填充为我们的数据表示添加一些样式。这可以通过使用 set_hatch 命令或在 plt.bar 配置中包含一个参数 hatch 命令来完成。

# Input data:
patterns = ('-', '+', 'x', '\\', '*', 'o', 'O', '.')
mean_values = range(1, len(patterns)+1)
y_values = [0,1,2,3,4,5,6,7]# Create figure and bars
fig, ax = plt.subplots(figsize=(12,8))
bars = plt.bar(y_values,mean_values,align='center',color='salmon')
for bar, pattern in zip(bars, patterns):
    bar.set_hatch(pattern)# Labeling and plotting 
plt.xticks(y_values, patterns, fontsize=13)
plt.title('Bar plot with patterns')
plt.show()

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

示例图—作者提供的图像

F.简单热图:

热图是数据的图形表示,其中的值用颜色表示。它们使复杂的数据可视化变得容易,并且一目了然。颜色的变化可能是由色调强度引起的,给读者关于所表示的值如何分布的明显视觉提示。

在这种情况下,颜色的变化表示在特定值范围内聚集的观察值的数量,这是通过 Matplotlib 的颜色条功能实现的。此外,该图是用命令 plt.hist2d. 创建的二维直方图绘制的

在下面的代码中,我创建了两个正态分布的变量 X 和 Y,平均值分别为 0 和 5。

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

当你绘制 2D 历史时,你会看到一个 2D 直方图。把它想象成从“顶部”看一个直方图。除此之外,为了更清楚地了解颜色分布,请考虑位于 2D 直方图中心的颜色是淡黄色的,并且对应于颜色条的最高值,这是合理的,因为 X 值应该在 0 处达到峰值,Y 值应该在 5 处达到峰值。

# Input a sample of normally distributed observations centered at x=0 and y=5
x = np.random.randn(100000)
y = np.random.randn(100000) + 5# Create figure, 2D histogram and labels
plt.figure(figsize=(10,8))
plt.hist2d(x, y, bins=40)
plt.xlabel('X values - Centered at 0', fontsize=13)
plt.ylabel('Y values - Centered at 5', fontsize=13)
cbar = plt.colorbar()
cbar.ax.set_ylabel('Number of observations', fontsize=13)
plt.show()

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

示例图—作者提供的图像

G.阴影饼图:

饼图用于将数据集的元素显示为整体的比例。除了传统的 plt.pie 命令之外,我们将利用 shadow=True 布尔特性为饼图的切片带来一些样式。

# Create figure and plot the chart:
plt.figure(figsize=(10,8))
plt.pie((10,5),labels=('Blue','Orange'),shadow=True,colors=('steelblue', 'orange'),
explode=(0,0.15), 
startangle=90,    
autopct='%1.1f%%'
)
plt.legend(fancybox=True, fontsize=13)
plt.axis('equal')     
plt.title('Shadowed Pie Chart',fontsize=15)
plt.tight_layout()
plt.show()

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

示例图—作者提供的图像

2.格式化应用程序

一旦可视化被创建并包含在我们的分析中,是时候学习如何修改我们的图的格式了。我们可以实现各种颜色、线条样式、颜色渐变,甚至标记。

A .颜色格式定义

看一下下面的代码,其中我实现了三种不同的替代方法来显示我们想要的简单线图的颜色,在本例中是红色。

# Input sample data
sample_values = [1,2,3]# Create figure, plots and labels
fig,ax = plt.subplots(figsize=(12,9))
ax.set_facecolor((0.,0.,0.))
plt.plot([0,10], [0,1], lw=3, color=(1.0,0.0,0.0))
plt.plot([0,10], [0,2], lw=3, color='red')
plt.plot([0,10], [0,3], lw=3, color='#f54842')
plt.legend(['RGB values: (1.0,0.0,0.0)',"matplotlib names: 'red'","HTML hex values: '#f54842'"],loc='upper left')
plt.title('3 ways to define colors', fontsize=13)
plt.show()

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

示例图—作者提供的图像

B.Matplotlib 中的可用颜色

另一方面,我们可以利用已经提到的 RGBA 格式显示 Matplotlib 可用颜色的样本,例如以下命令:

# Sample colors
colors = ['blue', 'green', 'red', 'cyan',  'magenta', 'yellow', 'black', 'white']
numbers = [1,2,3,4,5,6,7,8]# Create figure, plots and labels
plt.figure(figsize=(10,8))
for n, col in zip(numbers, colors):
    plt.plot([0, 10], [0, n], label=col, lw=3, color=col)plt.legend(loc='upper left')
plt.title('Matplotlib Sample Colors', fontsize=13)
plt.show()

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

示例图—作者提供的图像

C.渐变颜色

此外,我们可以使用应用 RGBA 格式的渐变颜色样本来执行我们自己的线图:

# Input data
gradients = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]# Create figure, plots and labels
plt.figure(figsize=(10,8))
for i in samples:
    plt.plot([0, 10], [0, i], label='gray-level %s'%i, lw=3,    color=str(i)) # ! gray level has to be parsed as string
plt.legend(loc='upper left')
plt.title('Gray Gradients with RGBA Formatting')
plt.show()

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

示例图—作者提供的图像

D.标记样式

标记样式是 Matplotlib 工具包的另一个有趣的特性,它可以很好地格式化我们的可视化效果:

# Markers
marker_name = ['point', 'pixel', 'circle', 'triangle down', 'triangle up', 'triangle_left', 'triangle_right','tri_down', 'tri_up', 'tri_left', 'tri_right', 'octagon', 'square', 'pentagon', 'star', 'hexagon1','hexagon2', 'plus', 'x', 'diamond', 'thin_diamond', 'vline']markers = ['.', ',', 'o', 'v', '^', '<', '>','1', '2', '3','4', '8', 's','p', '*','h', 'H','+','x','D','d', '|']samples = range(len(markers))# Create figure, plots and labels
plt.figure(figsize=(13, 10))
for i in samples:
    plt.plot([i-1, i, i+1], [i, i, i], label=marker_name[i], marker=markers[i], markersize=11)
plt.title('Matplotlib Marker styles', fontsize=20)
plt.ylim([-1, len(markers)+1])
plt.legend(loc='lower right')
plt.show()

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

示例图—作者提供的图像

E.样式表选择

Matplotlib 的样式包增加了对预定义的易于切换的绘图样式表的支持,例如“ ggplot ”,这是 r 中流行的绘图包的模拟。以下是所有可用样式的列表:

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

设置样式表有两种方法,第一种是通过使用 plt.style.use 函数将其全局设置到我们的编码环境中。

# Setting style globally
plt.style.use('ggplot')# Data input
x = np.arange(10)# Create figure, plots and labels
plt.figure(figsize=(10,8))
for i in range(1, 4):
    plt.plot(x, i * x**2, label='Group %d' % i)
plt.legend(loc='best')
plt.title('Style sheet formatting', fontsize=13)
plt.show()

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

示例图—作者提供的图像

第二种方式是通过上下文管理器,它只将样式应用于特定的代码块:

# Data input
x = np.arange(10)# Create figure, plots and labels with the context manager
with plt.style.context('fivethirtyeight'):
    plt.figure(figsize=(10,8))
    for i in range(1, 4):
         plt.plot(x, i * x**2, label='Group %d' % i)
    plt.legend(loc='best')
    plt.title('Style sheet formatting', fontsize=13)
    plt.show()

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

示例图—作者提供的图像

结论

根据本文中发布的指南和绘图类型,我希望能够帮助您提高使用 Python 和 Matplotlib 创建可视化的技能。

这是与数据可视化相关的一系列文章的第二部分,我将准备分享更多的见解和知识。如果你喜欢这篇文章中的信息,不要犹豫,联系我分享你的想法。它激励我继续分享!

感谢您花时间阅读我的文章!如果您有任何问题或想法要分享,请随时联系我的电子邮件,或者您可以在以下社交网络中找到我以了解更多相关内容:

参考

失败的假设

原文:https://towardsdatascience.com/busted-assumptions-3e224b7706eb?source=collection_archive---------34-----------------------

如何使用 Python 检查回归假设

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

图片由来自 Pixabay 的 Gordon Johnson 提供

资料组

我们将在本教程中使用的数据集来自 Kaggle 的“房价:高级回归技术”竞赛(链接),因为我目前正在提交我的结果。由于这是一个回归问题,我们的任务是预测房价,我们需要检查我们是否满足回归背后的所有主要假设

一般来说,如果你违反了这些假设中的任何一个,那么从你的模型中得到的结果可能会非常误导人。违反某些假设比其他假设更严重,但我们应该非常小心地正确处理我们的数据。

OLS 回归

在检查回归背后的许多假设之前,我们首先要拟合一个回归模型(在我们的例子中是 OLS)。这是因为许多假设检验依赖于计算的残差或我们模型中的误差。残差只不过是实际值和预测值之间的绝对距离。记住这一点也很重要,我拟合到回归模型的数据已经过彻底处理,包括输入缺失值、移除异常值、处理高基数和低基数、转换偏斜(要素和目标)、目标编码分类要素,以及使用 StandardScaler()进行标准化。

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

X = sm.add_constant(X_train_df)
y_train = y_train.reshape(-1,1)
model = sm.OLS(y_train, X)
results = model.fit()
print(results.summary())

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

首先,我们添加一个常数来指定初始截距值。在拟合模型时,我们的 y_train 值需要是 2D 数组而不是 1D。最后,我们拟合数据并打印结果。我不想解释结果表。

回归假设

**线性:**线性回归假设目标与每个独立变量或特征之间存在线性关系。这是最重要的假设之一,因为违反这一假设意味着您的模型试图在非线性数据中找到线性关系。这将导致你的模型严重不符合你的数据。检查异常值也很重要,因为它们会对这一假设产生重大影响。

我们可以对目标和/或独立变量应用变换来纠正问题。在我将注意力转向目标之前,我通常首先转换特征。不幸的是,应用转换的过程本质上是反复试验。应用对数、平方根、指数和 boxcox 变换是我的第一道防线。此外,我发现在添加多项式特征以更好地捕捉非线性关系方面取得了一些成功。

实际值和预测值的散点图通常用于检查线性。我们希望看到实际值和预测值紧密地分散在回归线周围。我们还可以生成一组显示每个特征和目标之间关系的配对图。但是,这种方法非常耗时,而且容易混淆,尤其是当您有许多功能时。我更喜欢先绘制实际值与预测值,如果我发现有大量违反这一假设的情况,我将使用 pairplot 方法来确定哪些特征破坏了我的假设。

def linearity_assum(model, y):

    y_pred = model.predict()plt.figure(figsize=(15,10))
    sns.regplot(x=y_pred, y=y, lowess=True, line_kws={'color': 'red'})
    plt.title('Observed vs. Predicted Values', fontsize=16)# Results is the object which contains the trained OLS model
linearity_assum(results, y_train)

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

😃

**自相关:**在处理时间序列数据时,这一假设经常被违反,因为它指的是变量与自身之间在不同时间点的相关性。例如,在不同时间点测量的股票价格(同一变量)。横截面数据也可能出现自相关。例如,不同社区之间的房价可能是相关的。

不幸的是,我没有太多处理时间序列数据的经验,因此,我不想假定一个修正。然而,在横截面数据的情况下,我发现在拟合模型之前标准化数据有减少自相关的趋势。

我们通常使用德宾-沃森测试来检验这一假设。接近 2 的结果表示没有自相关。然而,当我们接近零(0)时,正自相关的证据就越多,越接近 4,负自相关的证据就越多。

from statsmodels.stats.stattools import durbin_watsondurbin_watson(results.resid)

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

**同方差:**假设回归模型的残差具有相同的可变性或沿回归线分布。如果他们不这样做,这被称为“异方差”。一个被打破的同方差假设会使你的系数不太准确,但不会增加系数的偏差。

在被破坏的同方差假设中,散点图将显示数据点的模式。如果你碰巧在散点图上看到一个漏斗形状,这将表明一个错误的假设。

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

再一次,变换是你最好的朋友来纠正一个失败的同质性假设。首先,尝试改变你的目标(即。y)使用平方根、对数、平方根倒数或倒数变换。我们也可以使用加权普通最小二乘法代替普通最小二乘法来拟合你的数据,当你已经打破了同方差假设。

我们通常使用散点图来检查残差的方差在整个目标上是否恒定。

def homoscedasticity_assum(model):
    y_pred = model.predict() 
    residuals = model.resid

    plt.figure(figsize=(15,10))
    sns.regplot(x=y_pred, y=residuals, lowess=True, line_kws={'color': 'red'})
    plt.title('Residuals vs Fitted', fontsize=16)
    plt.xlabel('Fitted Values')
    plt.ylabel('Residuals')homoscedasticity_assum(results)

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

**残差的正态性:**残差服从正态或高斯分布。幸运的是,人们普遍认为违反这一假设对结果的影响最小。就我个人而言,我尽量确保分布“接近正态”。我这样说是因为中心极限定理表明,随着样本量的增加,样本的均值和标准差将开始接近正态分布。反之亦然,因为样本量较小的数据集很少具有高斯分布,因此,您的残差将不会具有正态分布。

在这种情况下,对目标进行对数或平方根变换有助于使残差更加正常。

也就是说,简单地使用直方图绘制残差将有助于您可视化它们的分布。你也可以使用夏皮罗-维尔克统计。在夏皮罗-维尔克检验中,零假设假设正态分布,因此我们不想拒绝零假设。换句话说,夏皮罗-维尔克检验将产生一个 p 值,我们希望看到 p 值高于 0.05(即。我们不能拒绝零假设)。

def normality_assum(model):
    residuals = model.resid

    plt.figure(figsize=(15,10))
    sns.distplot(residuals)
    plt.title('Residuals Distribution', fontsize=16)normality_assum(results)

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

**多重共线性:**当模型中的要素彼此高度相关时,会出现多重共线性。当相关性达到或超过 0.80 时,我们通常说多重共线性发生。违反这一假设会导致回归系数不可靠。

检查数据多重共线性的主要方法是通过相关矩阵。我们也可以使用“方差通货膨胀系数(VIF)”。高于 10 的 VIF 分数表示可以观察到多重共线性,但是 100 或更高的分数表示明确的多重共线性。

处理这个问题最简单的方法是删除这些功能。我们可以移除具有高 VIF 的特征,或者当比较两个高度相关的特征之间的相关性时,我们移除与目标具有较小相关性的那个。我们还可以进行主成分分析,因为每个成分都是正交的(即与其他组件不相关)。

sns.set_style('whitegrid')
correlation = abs(X_train_df.corr())
mask = np.zeros_like(correlation, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
plt.figure(figsize=(70,40))
plt.xticks(fontsize=20)plt.yticks(fontsize=20)
sns.heatmap(correlation, 
            cmap='coolwarm', 
            annot=True, 
            fmt=".2f", 
            annot_kws={"size": 15}, 
            linewidths=2, 
            vmin=-1.5, 
            mask=mask,
           center=0)

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

如您所见,当要素数量较少时,相关矩阵会很有用。

upper = correlation.where(abs(np.triu(np.ones(correlation.shape), k=1).astype(np.bool)))
to_drop = [var for var in upper.columns if any(upper[var] > .80)]
to_drop

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

我们可以过滤相关性矩阵以获得高度相关的特征,但一定要检查相关对,并查看每对中的哪个特征与目标的相关性最高。与目标高度相关的特征被保留,而另一个被丢弃。

from statsmodels.stats.outliers_influence import variance_inflation_factor as VIFvif = pd.DataFrame()
vif['VIF'] = [VIF(X_train_df.values, i) for i in range(X_train_df.shape[1])]
vif['Features'] = X_train_df.columnsvif_drop = [(feat, num) for num, feat in zip(vif['VIF'], vif['Features']) if num > 5.00]
vif_drop

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

检查 VIF 时,首先删除 VIF 值极高的要素,然后重新计算 VIF。由于删除了这些极端要素,您将会看到剩余要素的 VIF 值有所下降。

摘要

通过验证您的线性回归假设,您可以放心,您的结果是由于要素和目标之间的真实关系而不是处理错误。一旦你修正了任何错误的假设,你还会看到你的模型性能的显著提高。

感谢您的阅读!

但是什么是模型呢?

原文:https://towardsdatascience.com/but-what-is-a-model-58c486cbd40a?source=collection_archive---------30-----------------------

数据科学的维特根斯坦方法

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

1766 年的天文馆,塞奇·罗斯的照片,知识共享

术语模型经常被使用。这个词无处不在,已经失去了意义。仅维基百科页面就显示了 model 这个词的各种用法,包括统计学、天文学、生物学、产品设计、艺术以及概念模型。

模式的词源也很有趣,从法语和意大利语追溯到拉丁语方式,意为“度量、节奏或方式”。

然而,“概念模型”的定义抓住了这个词在任何意义上的最广泛的解释,总是来自维基百科:

概念模型是一个系统的表示,由概念组成,用于帮助人们认识、理解或模拟模型所表示的主题。

这与数据科学有什么关系?

在 Python 中,数据科学家经常使用诸如scikit-learnstatsmodels之类的包对各种数据运行线性回归、聚类算法、随机森林或神经网络,以便进行分类或预测。

与此同时,古希腊人和罗马人使用太阳系的地心说模型来理解他们的宇宙,这一宇宙学模型主导了他们对宇宙的理解,直到 1610 年 12 月,伽利略推断威尼斯相位排除了地心说或托勒密模型,最终验证了太阳中心模型。

单词 model 的这些用法看似无关,但回到我们上面的定义,它们实际上是该单词的相同应用。为什么?我们与 Python 模型的实际交互存在于 Jupyter 笔记本中,在构建模型时(同时祈祷不要出现错误),这个小*就在一个单元格旁边,并在 AWS 或 Heroku 上使用这些珍贵的 prime-F1-score 模型。但是在像scikit-learn这样的地方,到底发生了什么?为什么称之为典范,除了传统?一个腌制的随机森林模型和一个带有金属球的太阳系小玩具模型,或者一个聚苯乙烯泡沫波尔原子模型有什么关系?

因为这些模型实际上是为了表现现实。这是他们团结的原因。这是一个崇高而困难的观点,但这个事实比乍看起来更有意义。

模型、数据科学和维特根斯坦

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

本·理查德摄,公共领域

哲学家路德维希·维特斯坦根的逻辑哲学论文通常被认为是二十世纪最重要的作品之一,这是一篇结合了逻辑、科学和哲学的论文,并以对其自身的神秘反驳达到高潮,在一定程度上也驳斥了哲学。这是一部很棒的作品,由七个首要命题组成,主要陈述如下:

世界存在于关于世界的“事态”或事实中。我们以逻辑命题的形式发展对这些事实的表述,尽管我们永远不能明确地说出一个事实和一个事实的表述有什么共同之处,我们只能展示它们有什么共同之处,这是人类生活的一个本质上神秘的方面,这也使得哲学化,包括这整部作品(《逻辑哲学》)是浪费时间,除了它把你从继续哲学化的冲动中解放出来。

例如,当我们在面对一个孩子时正确地认出一张母亲的脸时,我们到底看到了什么‘共同点’?我们不太能确定:我们看到了家族相似之处,仅此而已。我们看到一些我们不能说的东西,但我们知道这是真的,试图阐明这种共性的努力失败了。

即使我们试图将这种活动简化为一种神经状态,一种基于神经元的面部识别和特征触发类型(这是目前被怀疑的颞叶梭形面部区域的功能),我们实际上并没有在识别本身的行为中使用还原论方法:我们只是简单地这样做,这种形而上学的区别遍及所有人类活动,并且根据维特根斯坦的说法,这是我们的伦理和宗教真理的来源,这些真理必须远离科学事实的领域。

最后,回到模型(和重点):模型就是这样的表示!当使用scikit-learn制作像线性回归模型这样简单的东西时,我们正在使用计算机的计算能力来模拟和编码这个人脑驱动的同构识别的过程。回归模型的系数是对某些特征对某个目标变量相关意图的影响的信念的表达,该意图通常是预测。

但是,关于这些模型的一个令人惊奇的认识是,尽管感觉 Python 模型只是巧妙地捕捉梯度下降驱动的损失函数最小化的 1 和 0 的序列,但是模型建立的过程与人类预测和解释的活动是并行的!人类的大脑,无论是做一个数字心理估计,还是试图用语言描述一个物理事件的记忆,或者在几秒钟内认出一个老朋友的面孔,都是在它的心理表征中挑选出现实的同构特征。主要区别在于 Python 模型缺乏感知:它们仍然是需要人类理解才能有效操作的工具,并且我认为这是数据科学家的工作不太涉及 Python 中的模型构建或 AWS 中的大规模分布式计算,而是涉及产生洞察力、可视化和扩展对某个领域的顶层理解的根本原因。

有趣的是,这也是为什么数据科学是一个如此广阔的领域:模型构建的范围与要模拟的人工任务一样广。用于自然语言处理的单词嵌入、用于图像识别的卷积模型或用于数值预测的回归模型是世界子域的模型,在人类历史的大部分时间里,这些子域都是由人类生成的。

最终的数据科学模型,类似于豪尔赫·路易斯·博尔赫斯短篇小说《科学的精确性》中的完美地图,将会是世界本身!但这种模式过去和现在都过于笨重,难以有效运用。我们制作模型,以可操作的方式简化世界,我相信任何数据科学家都会从这个角度受益。

也就是说,我怀疑资深数据科学家已经有了。感谢阅读!

但是熵是什么呢?

原文:https://towardsdatascience.com/but-what-is-entropy-ae9b2e7c2137?source=collection_archive---------33-----------------------

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

来源:https://pixabay.com/users/tumisu-148124/

这篇文章从不同的角度重新介绍了熵的概念,重点是它在机器学习、概率编程和信息论中的重要性。

这是字典根据谷歌快速搜索对它的定义-

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

来源:谷歌搜索截图

基于这个结果,你可以注意到这里有两个核心想法,起初,它们之间的相关性似乎不是很明显-

  • 熵是热力学中做功所缺少的(或需要的)能量
  • 熵是无序或随机(不确定性)的量度

那么到底是什么——能量缺失,还是一种度量,或者两者都有?让我提供一些观点,希望能帮助你理解这些定义。

倒楣的事情发生了!

把这个令人讨厌的标题换成更容易接受的说法

任何可能出错的事情都会出错——墨菲定律

我们都已经接受了这条定律,因为我们一直在观察和体验这条定律,而这背后的罪魁祸首正是这篇文章的主题——是的,你说对了,这就是熵!

所以现在我让你们更加困惑了——熵不仅仅是缺失的能量和无序的量度,它也是无序的原因。太好了!

就定义而言,我们在这里下不了决心。然而,事实是,在适当的背景下,上述三种观点都是正确的。为了理解这些背景,让我们先看看无序及其与熵的关系。

无序是主导力量

我借助 James Clear(《原子习惯》的作者)的一篇文章中的例子来解释这一点。

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

来源:左图(https://pix abay . com/illustrations/puzzle-puzzle-piece-puzzles-3303412/)右图(图片由李中清Unsplash 上拍摄)+作者注明

理论上,这两种情况都有可能发生,但发生的几率微乎其微。好吧,好吧,称之为不可能🤐!。这里的主要信息如下:

无序的变化永远比有序的多得多!

借用伟大的史蒂芬·平克的智慧:

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

史蒂芬·平克— 哈佛大学心理学系约翰斯通家族教授(图片由作者创建)

我们如何击退熵的浪潮?

付出必要的努力。努力意味着我们应该花精力去对抗熵产生的无序。

在热力学中,熵的观点占主导地位,也就是说,你将必要的(缺失的)能量注入你的系统,使其达到平衡。

由于这是一本机器学习杂志,我不会在这方面(即统计热力学)停留太久,而是提供了一篇精彩文章的链接,这篇文章以一种我永远无法解释的方式进行了解释。

[## 撒旦科学

在伦敦北部这个悲惨的二月天,当我打开暖气时,我非常感激一个基本的自然事实…

plus.maths.org](https://plus.maths.org/content/satanic-science)

你要注意的是,作为无序度量度的熵的公式是什么样子的,就像它在玻尔兹曼的墓碑上显示的那样。

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

来源:【https://www.atlasobscura.com/places/boltzmanns-grave+作者标注

接下来,让我们从信息的角度探索熵,这是机器学习打算从数据中提取的内容。

熵是信息的一种度量

如果你在思考——早先他说熵是无序或随机(不确定性)的量度,现在它已经演变成信息的量度——那么这意味着你在注意。干得好!😃

信息和不确定性确实是相互关联的。耐心点,你很快就会看到的。

“信息”这个词意味着一个人没有的知识。如果你已经知道了,那就不是信息了!

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

来源:谷歌搜索截图

现在信息也可以被看作是一个“惊喜”,尽管你感到惊讶的程度会有所不同。例如,如果我告诉你明天太阳会升起,你会说——哼!毫不奇怪,也就是说,这份声明中没有任何信息,但如果我告诉你明天世界将会毁灭,你会非常惊讶(…至少非常悲伤,我希望!😩)

从惊讶的角度思考的好处是,大多数时候我们对“信息”的思考是二元的——要么我有信息,要么没有,而“惊讶”有助于带来可变性程度的概念。你的惊讶与某个事件发生的概率(几率)成反比。事件越罕见,你越惊讶!概率是什么?….这是对不确定性的衡量!

借助亚里士多德的逻辑,你可以理解我们已经确立了信息(惊奇)和不确定性(概率)之间的关系。接下来,让我们试着用数学公式表示它。

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

来源:作者

上述数学公式有些奇怪。我不知道你怎么想,但我肯定不开心!

当我得到信息(让我吃惊…咄!)大概两个(😲&🤔)独立的事件,总的惊喜将会是附加的(😲+🤔)在性质上与相乘(😲x🤔).

让我们解决这个问题。

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

来源:作者

所以,惊喜与事件概率(随机变量)的对数成反比。对数函数帮助我们把惊喜的附加方面带回家。换句话说,我们可以通过认识到乘法可以通过对相关概率的对数进行处理而被视为加法,来提高我们对计算惊喜函数的直觉——我们的常识会说,惊喜函数必须是事件概率的加法而不是乘积(乘法)。

对我们来说,下一个问题是制定“从长远来看,我会有多惊讶?”

我们为什么对上面的问题感兴趣(这里的关键字是**“长期”)是因为我们在这里的组合中引入了随机变量(因此也带来了不确定性),因此我们需要测量我们的惊喜的中心趋势**。

前一段时间我写了一篇文章叫做“但是什么是随机变量呢?”。如果你对随机变量&分布感到不舒服,不妨去看看。

[## 但是什么是随机变量呢?

对什么是随机变量及其与概率论的联系的清晰而简单的解释。

towardsdatascience.com](/but-what-is-a-random-variable-4265d84cb7e5)

随机变量的期望值(或中心趋势)

当我们处理常规数字时,我们经常使用平均数、众数和中位数来统计这些数字。让我们在这里花一分钟的时间只关注均值。平均值是你的数字集中趋势的一个指标,当你计算它的时候,你给你所有的数字以相同的权重。数学很简单——取所有的数字,然后除以数字的个数。

在随机变量的情况下,在给定的时刻,我们没有属于这个随机变量的所有数字(样本),更重要的是,随机变量都是关于公平的;贡献对他们很重要,因此与传统的数字平均不同,他们不会对所有的可能性给予同等的权重!

我们可以通过考虑**“长期平均值”(也称为随机变量的期望值)来解决上述挑战。**这是你计算平均值的方法(抱歉…期望值)。

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

来源:作者

每一种可能性对中心趋势(期望值)的贡献(x_i)由等于其发生的可能性(概率)的权重给出。

惊喜的期望值(或集中趋势)

如果你理解随机变量的期望值,你就不会对此感到惊讶(双关语😎!)

平均或预期惊喜也应该是所有惊喜的加权平均之和!

运用我们之前学到的知识:

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

来源:作者

正如你所看到的,在简化了上图中的各个步骤后,我们最终得到了预期的惊喜,看起来像熵的公式(来自热力学)。看我标注的玻尔兹曼墓碑的图像。我真的希望他的鬼魂不会因此困扰我!

克劳德·香农在 1948 年的开创性论文《沟通的数学理论》中提出了信息(惊喜)期望值的公式

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

克劳德·香农:信息论之父(图片来源:维基百科)

克劳德·香农的探索是用尽可能少的比特数传输和接收信息。我之前借助惊奇概念推导出的公式,也可以用来告诉你一条消息的最小比特数。为此,您可以使用基数为 2 的对数。让我们也做几个例子。这些例子摘自《信息论的元素一书,并使用张量流概率求解。

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

来源:作者

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

来源:作者

为什么在信息论的上下文中它被称为熵是因为度量(公式)看起来像热力学的公式。它被称为香农熵或信息熵和熵。真的只是熵!

香农的工作也为文件压缩奠定了基础,其核心思想是在不扭曲原始信息的情况下,用更少的比特来表示信息。

使用熵来选择概率分布

首先,习惯性地提及贝叶斯定理。

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

来源:图片来自维基百科+作者标注

你有没有想过应该如何选择先验分布和概率分布?许多统计通常是通过使用正态(高斯)分布来完成的,但通常常规选择并不是最佳选择。

无知比错误更好,不相信任何东西的人比相信错误的人更接近真理——托马斯·杰斐逊

托马斯·杰斐逊的智慧可以成为我们做出这一选择的指导力量。把它转化成我们的问题域,看起来会像这样-

具有最大概率分布的分布是具有最大熵的分布。这也意味着这也是你能做出的信息量最少、最保守的选择。这是最大熵分布原理背后的核心思想。遵循它有助于在我们的计算中不引入任何额外的偏差或假设。

对于无处不在的正态分布选择,一个经常被引用的理由是它遵循中心极限定理。最大熵原理也可以用来证明它的使用。可以解析地证明,如果分布的方差已知,那么正态分布就是具有最大熵的分布。如果你对证明的严谨性感兴趣,我会推荐你阅读这些笔记——https://MTL sites . MIT . edu/Courses/6.050/2003/notes/chapter 10 . pdf

相对熵(KL 散度)

到目前为止,我们一直使用熵作为概率分布信息含量的指标。我们应该问自己的下一个问题是— 我们可以用它来比较两个分布吗?

分布之间的比较可以被视为距离(在某个空间中),然而对于分布来说,该距离本质上是不对称的,即给定 p & q 分布,从 p 到 q 的距离不会与从 q 到 p 的距离相同,当然,除非它们相同。在这种情况下,它是零。这就是为什么我们用另一个术语来描述这种不同,称之为差异。

有几种不同类型的散度,最广泛使用和已知的是由 Solomon Kullback 和 Richard Leibler 创建的一种,用于测量分布之间的相对熵

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

所罗门·库尔巴克 & 理查德·莱布勒KL 发散的发明者(图片来自维基百科)

很明显,熵在计算这种差异时扮演了一个角色,但你必须等一会儿才能看到它。

我们不想把 KL 散度的公式扔给你,我们想要发展一种关于它的起源的直觉,为此,我们从可能性的概念中得到帮助。

假设通过进行一项实验(例如投掷骰子数千次),你观察到了真实的分布,我们称之为 p 。现在假设我们有另一个候选分布(模型)叫做 q ,它可能也适合于描述我们的随机变量。我们比较这两种分布(模型)的一种方法是通过查看它们的可能性比率。这是一种被称为似然比测试的假设测试形式(参见维基百科;解释得真好)。在实践中,我们取似然比的自然对数。

我们可以使用这个对数似然比,并使用在 p 中出现的数据点对其进行加权,这将为我们提供两个分布之间的差异(距离)的期望值。是时候用数学方法来看待它了:

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

来源:作者

正如你看到的,我们的熵公式再次出现,这就是为什么 KL 散度也叫做相对熵。

我们也可以借助惊奇来理解 KL 发散。你本质上要问的问题是—

对于给定的随机变量 X,如果你选择分布 q 而不是参考分布 p 惊喜的相对变化是多少?

使用参考分布近似分布

在机器学习中,KL 散度应用的一个主要领域是在进行变分推理时将其用作损失函数。

变分推断包括使用另一个(联合)分布来近似一个难以处理的后验分布(来自贝叶斯定理),我们有一个可用的分析形式。随着你的神经网络学习最小化 KL 发散损失,你的参考§和目标(q)分布看到相对熵的减少。

交叉熵

我也想涵盖熵的这一方面,因为它被广泛用于机器学习,尤其是分类任务。在某些方面,我们已经看到它隐藏在 KL 背离中。

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

来源:作者

所以 H§是分布 p 的熵(自我信息), H(p,q)是分布 p & q 之间的交叉熵。

我们可以用另一种方式来解读它,更重要的是理解相对熵(KL 散度)和交叉熵之间的区别。我们将尝试从香农对熵的使用来看信息所需的比特数。

比方说,对于编码消息,我们希望使用 q 作为候选(目标)分布,因为它的分析形式而不是真正的分布 p(我们在前面的变分推理部分讨论过)。然而,现实情况是我们的近似并不完美,因此 KL 散度可以被视为 q 编码所需的额外比特的平均数量**。然而,交叉熵可以被视为使用 q 表示信息所需的比特**的平均数量

下面是显示交叉熵和 KL 散度关系的示例代码片段。

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

来源:作者

结束语

熵可能会吓到你,因为许多不同的公式和在不同科学领域的广泛使用,但正如我们在这篇文章中看到的,它们确实是相互联系的。

需要记住的要点是:

  • 熵是信息的一种度量
  • 信息令人惊讶
  • 熵帮助你为你的领域问题选择合适的分布(给定约束)
  • 使用一个分布来近似另一个分布依赖于这些分布之间的相对熵

如果你有问题,需要更多的澄清,请写在评论中,我会很乐意尝试回答他们,如果需要的话,更新文章。

参考资料和进一步阅读

【1】熵:为什么生活似乎总是变得更加复杂?

[2]威尔·库尔特关于 KL 发散的博文https://www . countbayesie . com/Blog/2017/5/9/kull back-lei bler-Divergence-explained

[3]https://plus.maths.org/content/satanic-science的 M. Freiberger 著《撒旦的科学》

[4]信息论要素—https://www . Amazon . com/Elements-Information-Theory-telecom munications-Processing/DP/0471241954

[5]似然比检验—https://en.wikipedia.org/wiki/Likelihood-ratio_test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值