TowardsDataScience 博客中文翻译 2021(四百七十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用 ArcGIS 绘制数据科学家的年平均工资

原文:https://towardsdatascience.com/mapping-the-annual-mean-wage-of-data-scientists-with-arcgis-8c0fa6aa8b24?source=collection_archive---------28-----------------------

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

图片由 Freepik 上的用户 11628272 提供

哪个统计区域的年平均工资最高?

使用分析工具为地图增值。

本文将探索 ArcGIS,根据我们从美国劳工统计局收集的数据绘制地图。为了澄清,我们将在这里看到的年平均工资数据包含了“数据科学家和数学科学”职业。

数据从州一级进入统计领域。这些地区被美国联邦政府划分为大都市统计区(MSA)和小城市统计区(μSA)。它们可能与县甚至州重叠。

同样,MSA 也是一个类似城市的区域。它通常有很高的人口密度和经济中心。另一方面,μSA 通常不像大城市那样具有政治和经济上的重要性,但它们在大格局中仍然是重要的。由于我们的数据集的性质,我们可能会将重点放在 MSA 数字的分析上。

需要指出的另一件重要事情是,我们的数据集只有关于美国市场的数据。数据报告截至 2019 年 5 月。

现在我们已经完成了内务处理,让我们来看看我们将在这里涵盖的内容,以及我们希望您获得的预期结果和见解。

1 —我们能制作的最基本的 ArcGIS 地图。

2-演示“热点分析”(这是 ArcGIS 中可用的聚类分析之一)。

3 —从国家级别向下钻取到州级别。另外,结合热点分析和缓冲区分析。

4-了解各州和统计领域的数据科学家的当前或预期薪资。

但是,卢西亚诺,为什么选择 ArcGIS?

在某种程度上,我们确实可以使用其他解决方案,比如 Tableau 或 Power BI。但是,我喜欢 ArcGIS 的一点是,它是为处理多个图层而设计的。是的,您可以合并和组合大量不同的数据,并以有意义的方式排列它们。ArcGIS 中的控件基本上是无穷无尽的,这也是我选择它作为这个特定项目的原因。我是说 ArcGIS 是我们现有的最好的制图工具吗?是,也不是。这完全取决于项目的范围和你必须考虑的其他因素。最好的工具是你成功地用来表达你的观点的工具。

我们应该从一个问题开始这个项目吗?

绝对的!我们可能会提出以下问题之一,但不限于此:

  • 哪些州的平均工资最高和最低?
  • 哪个统计区域的年平均工资最高和最低?

我知道这些问题很简单。但是,如果你目前正在寻找一份数据科学家的工作,这篇文章将为你提供一些数据,以更好地协商你的工资。这不是很有用吗?接下来,我们开始绘制地图来回答这些问题,所以请系好安全带。

映射还是不映射

决定何时使用地图并不总是简单明了的。首先考虑你的观众是一个好习惯。然而,一个常见的问题是,关于信息的呈现,他们经常不知道自己想要什么,或者需要。这有时会令人沮丧,但你会去测试,看看什么对你有效——对他们有效。

对于本文,我们将跳过这个对话,并提出地图。我们相信它们是可视化数据的一种强有力的方式,尽管并不总是被推荐。您将看到如下三个不同的图:

1-基本 ArcGIS 地图。为了澄清并确保我们都在同一页上,这里的“基本”实际上是指显示计数或任何类型数据的地图。在我们的例子中,我们将看到一个显示各州年平均工资的地图。它没有任何花哨的分析工具。

2-在第二张地图中,我们将使用名为“热点分析”的 ArcGIS 工具。这是一种聚类分析。通过这种方法,我们可以看到年平均工资的热点和冷点在哪里。然而,我们不看州一级,而是看大都市的统计区域。这将为我们提供比查看州级别更详细的信息。

3 —最后但同样重要的是,我们将重点分析一个特定的状态。我们将继续在 MSA 级别利用热点分析。然而,我们将展示缓冲区分析如何帮助我们构建一些区域。

如果您有任何问题或意见,请随时联系我。

基本地图

下面我们看到了我们在这里绘制的最基本的地图。我们还在其顶部添加了“前 5 名”部分,以便于理解,并提供一些“正确的”见解。

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

图片 1(来自作者)。美国各州年平均工资地图。

我们上面看到的这张地图通常是我们做的第一张。这个想法是为了获得关于数据的高层次直觉。这里的问题是,你可能认为仅仅搬到,比方说,加州就可能付给你更高的工资。因为整个州都处于“红色”——意味着高年平均工资——你可能会被诱惑搬到加州的任何地方。因此,在下一张图中,我们试图获得更详细的信息。

热点分析地图

有了这张地图,我们可以更好地了解全国工资最高和最低的*。虽然我们没有很多数据点(观察值),但这种类型的分析使我们能够专注于极端情况:低和高。现在你确切地知道去哪里或不去哪里。*

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

图片 2(来自作者)。美国大都市统计区年平均工资图。

热点和缓冲区分析图

现在,我们没有从东海岸到西海岸,而是选择了加利福尼亚来深化我们的分析。这里可以保持我们在以前的地图中使用的相同参数,但现在,我们在旧金山大桥周围添加了一个缓冲区。这有助于我们以英里为单位看到数据科学家在哪里赚了更多的钱——通过 MSA。

显然,我们都知道这是湾区。这不应该是一个惊喜,对不对!?但这里的重点是使用数据来证实我们的假设,并找到一种不容置疑的方式来展示我们的结果。我们希望这个练习能帮助你打开思维,激发你创造新的和令人敬畏的东西。

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

图片 3(来自作者)。加利福尼亚州大都市统计区年平均工资地图。

概括起来

在本文中,您了解了使用 ArcGIS 绘制数据的不同方法。现在,您已经知道 ArcGIS 有一个分析工具可以帮助您增强分析并推动决策制定。

此外,您还获得了有关数据科学专业的英特尔信息。希望你今天至少学到了一件新东西。

我们可以做的使这个项目更好的其他事情是合并不同的数据集,并添加与这些静态地图相反的交互式地图。这些都是很酷的特性,但是请记住,如果您已经学到了一些东西,我们就此打住。干杯!

描绘得梅因农贸市场的游客

原文:https://towardsdatascience.com/mapping-visitors-to-the-des-moines-farmers-market-4419c32a1459?source=collection_archive---------45-----------------------

秋季大学生的回归推动了人口结构的变化吗?

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

Unsplash 上由 Toa Heftiba 拍摄的照片

本文是一个两部分系列文章的第二部分,该系列文章关注的是如何利用来自手机 pings 的客流量数据来分析游客人口统计数据。 第一部分:利用客流量数据对得梅因农贸市场进行人口统计分析 提供了指导本文的重要背景。请在任何社交媒体分享中标记 SafeGraph。

人口统计分析推动零售商、大学、游乐园等的决策。理解你的消费者的重要性不能被夸大。

在上一篇文章中,我们发现得梅因农贸市场——爱荷华州得梅因市中心从 5 月到 10 月的大型每周活动——每年秋天游客的年龄和收入都会下降。**我们假设观察到的人口变化是由大学生返校驱动的。**虽然不是一个统计上严格的测试,但数据可视化通常具有现实世界的价值,映射也不例外。我们将通过绘制农贸市场游客的住宅区来检验我们的假设。

数据

第一部分已经介绍了设置,所以我们将简单介绍一下分析中使用的数据。我们使用 SafeGraph 的邻域模式。从文档中:

SafeGraph 的邻域模式数据集包含按人口普查区块组(CBG)聚合的客流量数据。了解 CBG 在一周中的哪一天最忙,CBG 在一天中的什么时间最忙,在早餐、午餐和晚餐期间停止的设备从哪里出发,以及工作日和周末的人口统计数据如何比较。

虽然我们在第一部分中查看了 2018 年和 2019 年,但本文的范围仅限于 2019 年。此外,我们只分析来自得梅因所在的波尔克县的游客。在继续之前,有一个重要术语:

普查区块组(CBG): 同一普查区域内的一组区块。CBGs 通常包含 600 到 3000 人,是美国人口普查局使用的地理单位。

我们的可视化处于 CBG 水平,这是美国人口普查局发布人口统计数据的水平。

绘图

首先,我们来看一张 2019 年 7 月的地图。

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

2019 年 7 月:波尔克县 CBG 家居得梅因农贸市场的游客量。

得梅因农贸市场由黑色记号笔和深灰色 CBG 显示。德雷克大学和大观大学用蓝色标记表示。

现在,一张 2019 年 10 月的地图。

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

2019 年 10 月:波尔克县 CBG 家居得梅因农贸市场的游客量。

很难看出两者之间有什么大的区别。让我们结合各自的数据来看看从 7 月到 10 月游客的相对变化。为了做到这一点,我们为每个 CBG 取(10 月访问者的数量)/(7 月访问者的数量)。例如,如果给定的 CBG 在 7 月有 100 个访问者,在 10 月有 125 个访问者,相对变化是 125/100 = 1.25,相当于 125%。换句话说,CBG 10 月份的游客比 7 月份多了 25%。

在这张地图中,如果 CBGs 在 10 月份的访客比 7 月份多,我们将把它涂成蓝色。否则,它们将被涂成红色。白色表示每个月的访客数量接近相同。因此,如果我们的假设是正确的,我们预计会在两所大学周围看到一些蓝色(我们假设大多数学生住在校园内/附近)。

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

很难看到,所以让我们放大感兴趣的区域…

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

这是一张比前两张更有用的地图。看起来我们可能会有所发现!德雷克大学所在的 CBG 10 月份的游客数量是 7 月份的 12 倍。你也可以看到 CBG 的平均年龄是 19 岁,平均收入是 35192 美元。

此外,地图的大部分是红色,但每个大学周围都有一簇蓝色的 cbg。有趣的是,在缩小的地图上还有另一个无法解释的蓝色星团…在谷歌搜索后,我发现这个蓝色星团是 Faith Baptist 圣经学院的所在地,这进一步证实了我们的发现。

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

结论

重要的是要记住,相关性不是因果关系,我们的分析有许多潜在的混淆因素。例如,得梅因市中心地区是该市的夜生活热点之一;也许我们观察到的人口变化与市中心酒吧的关系比与农贸市场的关系更大。(注意:我们可以通过使用 SafeGraph 的兴趣点步行交通数据、 SafeGraph 模式 来纠正这一点,但这超出了本笔记本的范围)。再者,SafeGraph 的数据只是整个人群的样本;我们使用原始计数,但最佳实践是将数据标准化,以努力纠正偏差。

然而,我们的发现看起来确实像是某种东西。它们有直观的意义,它们甚至可能有现实世界的意义,一个容易被遗忘的统计意义的表亲。应用到现实世界中,我们的发现具有实际的、可操作的洞察力,这并不像我们在数据科学中希望的那样普遍。例如,Greater Des Moines Partnership(DSM 农贸市场的生产者)可以利用这种类型的分析来优化农贸市场以适应人口变化。像学生折扣、校园班车、社交机会、庭院游戏和免费食物/饮料票这样的事情可以在每个周六早上最大限度地提高出席率。

提问?

我邀请你在 SafeGraph 社区#safegraphdata 频道问他们,这是一个面向数据爱好者的免费 Slack 社区。获得支持、共享您的工作或与 GIS 社区中的其他人联系。通过 SafeGraph 社区,学者们可以免费访问美国、英国和加拿大 700 多万家企业的数据。

规划您的企业数据环境

原文:https://towardsdatascience.com/mapping-your-enterprise-data-landscape-a796374a2afe?source=collection_archive---------31-----------------------

非结构化数据

你知道,有时我太习惯于所有这些数据了,这似乎并不令人兴奋。直到你做了一件让你想起为什么要做的事情。

今天,我要向一家大型机构的高管介绍我们的工作。这是他们第一次听说我们如何掌控他们的整个数据环境。结构化 非结构化数据。这不是一个容易讲的故事。所以你只要从头开始。

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

马库斯·斯皮斯克在 Unsplash 拍摄的照片

一些关于隐私的法律法规要求组织必须知道他们存储个人数据的地方。这不是一个简单的问题。要回答这个问题,您必须协调物理基础设施和业务。许多商务人士更喜欢电子邮件中的附件,而不是共享驱动器的链接。他们不想谈论数据库和文件服务器。

将信息映射到物理数据存储区时,有许多因素需要考虑。从头开始,第一个问题是:你的企业数据源是什么?

  • 系统和应用程序(ERP、CRM、财务、人力资源等)。)
  • 数据库(SQL、Oracle 等。)
  • 电子邮件服务器(即 Exchange)
  • 共享驱动器(网络文件夹、本地驱动器、Sharepoint、OneDrive、团队等。)

列举的例子暴露了这一点,后者是最重的。视行业而定,电子邮件服务器实际上可能包含更多信息。了解这些数据源包含的所有信息,如何开始呢?有人知道关于物理数据库位置的好故事吗?

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

扬·安东宁·科拉尔在 Unsplash 上拍摄的照片

在这个层面上——尽管很模糊——我们在说什么还是很清楚的。企业将了解他们是将信息存储在特定的应用程序中、共享驱动器上还是他们的邮箱中。为了在企业层面上实现这一点,我们必须开始讨论服务器、服务器名称和 IP 地址。对于大量观众来说,这可能很快变得过于专业。

在做这个练习时,也许要评估你的数据有多少是由第三方托管的,为什么。

然而,对理解的追求并没有就此结束。要真正理解数据,需要更深层次的细节。系统和应用程序链接到数据库。数据库被分成数据表。数据表转换成数据属性(列)。文件服务器被分成文件共享。文件共享到文件夹中。文件夹包含数据对象(例如文档或电子表格)。企业数据存在于这些属性和对象中。

最酷的事情是,如果您映射企业数据源中的实际信息,那么您可以将您的发现一直提升到最高级别。您将确切知道哪些应用程序需要额外的安全措施,并相应地保护它们。去年发生了如此多的网络攻击。

但我想以积极的方式结束。这次演习不仅仅关注法律和安全。通过映射您的企业数据源,您不仅可以确定存储个人信息的位置,还可以围绕知识管理的主题来管理内容。嘿,企业告诉我,我们对人工智能了解多少?或用于产品信息管理的产品编号。几乎自我更新的产品信息。很酷的东西。

您如何管理您的企业信息?

马拉松训练:数据透视

原文:https://towardsdatascience.com/marathon-training-a-data-perspective-ba2fc00c912b?source=collection_archive---------22-----------------------

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

(上图)英国约克。卢克·波特在 Unsplash 上拍摄的照片

来自 Strava 的数据分析(通过其 API)

我的第一次马拉松

2018 年末,38 岁的我意识到,我在 20 多岁和 30 多岁时进行的中等水平的体育锻炼已经成为遥远的记忆。生活完全占据了我的业余时间,当我反复思考并不遥远的向 40 多岁的转变时,我知道机不可失,时不再来。

我对任何形式的运动都不感兴趣,并且非常讨厌学校的体育课。当我在 25 岁左右开始定期锻炼时,我认为 3 英里跑已经足够了,10 公里跑是值得筹集赞助费的活动。

现在的问题是:我能找到什么样的挑战来激发足够的兴奋和注意力?什么能把我从久坐不动的麻木状态中唤醒?当一个同事提到他们最近完成了约克郡的马拉松比赛,并且他们度过了一段美好的时光时,答案出现在我面前。

我立即进入。毕竟,还有将近一年的时间,这肯定是足够的时间来恢复身材。在通知我妻子后,我最初的动力感被第一反应“你要死了”所阻碍,但我还是坚持了下来。

为了提高我的生存几率,我加入了当地的一个跑步俱乐部,令我震惊的是,这个俱乐部对待 10 公里跑就像我对待休闲散步一样。但这种心态的转变正是我所需要的,几个月后,这样的距离已经成为了家常便饭。值得庆幸的是,我住在一个小村庄里,周围的路线都很宜人(见下图),所以在夏季的几个月里,训练通常都很愉快。

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

(上图)一次训练中的场景(图片由作者提供)

我花了 3 个月的时间准备马拉松,尽我所能训练。我画出路线,试图遵循一个基本的计划,尝试营养,穿破我的鞋子。我的配速完全是随意的,而且经常是快,因为在我的天真观点中,更快等于更健康!

在重要的一天,我设法绕过了全程,但它花了我比我希望的更长的时间(4 小时 35 分钟),我不得不在最后的 4 或 5 英里慢下来步行 3 次。几个星期后,我决心做得更好,再次参赛。

由于新冠肺炎,2020 年的比赛变成了 2021 年的比赛,在这个大日子的 3 个月前,我的训练又开始了。这一次,我决定阅读耐力跑的科学知识,这让我想到了心率训练的概念。

心率区

我读到的基本要点是,有 5 个不同的心率区,不同区域的锻炼适合不同类型的训练。这些是,

  • **1 区:**非常轻。最大值的 50–60%。心率
  • **二区:**光。最大值的 60–70%。心率
  • **第三区:**中度。最大值的 70–80%。心率
  • **4 区:**硬。最大值的 80–90%。心率
  • **第 5 区:**最大值。最大值的 90–100%。心率

你需要做的就是确定你的最大心率来计算出这些区域(或者像 Strava 这样的应用程序会帮你计算出来)。解决这个问题的近似公式是,

最高。心率= 220 —年龄

这使我的最高心率达到了 182。我将它插入到 Strava 中,并检查了我最近几次跑步的区域百分比。我完成的最后一次跑步是 10 公里,Strava 告诉我,我将在 5 区花费超过 90%的时间。这是不可能的(5 区是你最快的冲刺。想想被一群疯狗追着跑!).我还准备了一些批评上述公式的文章,所以我寻找一种替代技术。

相反,我所做的是找到一个跑步的地方,我在一个陡峭的山上冲刺,寻找我的峰值心率,结果是 200。然后我把它插入 Strava,我所有的区域突然变得有意义了(我的快速 10 公里现在大部分是第 4 区)。据我所知,这不是最科学的方法(特别是使用腕部心率监测器,而不是胸部心率监测器),但这是我能做到的最好的方法,看起来差不多没问题。

对于马拉松训练,我找到的文章建议主要在 2 区训练,在这里和那里有少量的 4 区。对我来说,2 区是每分钟 120-140 次。我记得我第一次在 2 区跑步。我不得不走得很慢,感觉就像在走路一样。结果,我的跑步训练似乎要花很长时间,因为我试着一周跑 4 次,而两年前是一周 3 次(不够),所以我很快就没时间了。

过了一段时间,我决定唯一能让我适应训练的方法就是跑得快一点(但还是比两年前慢)。那就只好这样了!

然后大日子又来了。问题是,由于我希望有更好的训练方法,我能更快地适应吗?我会不停地四处走动吗?还是我现在已经大了 2 岁的事实会让我退缩?我们来看数据!…

培训分析

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

(上图)训练路线图(图片由作者提供)

首先,简单看一下马拉松前 3 个月的距离,

  • 2019 年总训练距离:493 公里(306 英里)
  • 2021 年总训练距离:559 公里(347 英里)

好的,那么在 2021 年再往前一点。出于兴趣,左边的图片显示了我在 2021 年训练期间的主要路线。

现在让我们更仔细地看看一些数据,从两个不同年份的每月运行次数开始,

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

(上图)作者图片

注意,马拉松是在每年的十月中旬举行的。这里我们可以看到,2019 年,7 月到 8 月有一个大的跳跃,然后我实际上在 9 月份跑得更少了。相比之下,2021 年显示出在 10 月之前的 3 个月中逐渐增加。

心率呢?下图显示了我的心率在训练期间的重叠直方图,其中显示了平均心率(虚线),

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

(上图)作者图片

按照计划,我的平均心率在 2021 年降低了。我每年运行超过 30 次(这是有效的 t 检验的近似经验法则最小值,由于中心极限定理),所以我对上述数据运行一次(特别是单尾测试,寻找 2019 年大于 2021 年),

Welch Two Sample t-testdata:  marathon_all_training$average_heartrate[marathon_all_training$Year == "2019"] and marathon_all_training$average_heartrate[marathon_all_training$Year == "2021"]
t = 6.0937, df = 68.361, **p-value = 2.868e-08**
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 7.420702      Inf
sample estimates:
mean of x mean of y 
 167.2844  157.0682

微不足道的 p 值!换句话说,如果零假设(均值之间没有差异)是真的,那么极不可能看到这样的数据。

这是分解心率数据的另一种方法,

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

(上图)作者图片

有趣的是,2019 年的中值心率(盒须图中较粗的水平线)在整个训练期间没有真正的模式,在 2021 年,随着我开始休息,心率稳步上升,然后在 10 月份下降。这也可以从平均速度分解中看出,

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

(上图)作者图片

这表明我的训练受到了更多的控制,并且我遵循了一个正确的计划!

上面我展示了我 2021 年的总距离比 2019 年多。我想知道这在长跑(我定义为超过 16.1 公里(10 英里)的任何东西)方面意味着什么。在下面的图中,彩色条表示长距离,灰色条表示小于该距离的距离。

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

(上图)作者图片

2019 年 13 个,2021 年 11 个,所以实际上第一次会更多。然而,你可以在 2021 年看到更好的终点减量(即马拉松前的休息),4 次更短的跑步,而 2019 年只有 2 次。

重要的日子

我两次马拉松的完成时间是,

  • 2019 完成时间: 4 小时 35 分钟
  • 2021 完成时间: 3 小时 58 分钟

我真的很高兴我用了不到 4 个小时的时间(我没想到会这样!).事后看来,看着上面的数据,我相信多一点距离,随着时间的推移控制和稳定地增加训练距离,再加上训练期间较慢的配速(因此平均心率较低)都是造成差异的原因。

这是我在约克郡马拉松比赛中的一张照片,

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

又一个情节。这是我每场马拉松比赛当天的心率。你可以看到 2019 年的 3 个点,我在那里短暂地放慢了脚步。我完全筋疲力尽了,尽管我的心率(和步速)比 2021 年还低。与此形成鲜明对比的是,在 2021 年,你可以看到更高的心率(因为我更舒适地推动自己),接近尾声时没有下降。

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

(上图)作者图片

如果这篇文章启发了任何人考虑马拉松,我可以强烈推荐约克郡的马拉松。它相对平坦,组织良好,人群很大,你可以跑过北欧第二大哥特式大教堂(约克大教堂)。请参见此处的了解参赛详情和更多信息。

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

(上图)约克大教堂。由理查德·格伦丹宁Unsplash 上拍摄的照片

附录—关键包和链接

互联网最不需要的就是更多的代码向你展示如何用 R 语言创建一个情节,所以我在这篇博文中省略了细节。但是,请参见下面的一些说明和软件包的关键链接。我在这个分析中使用的主要工具是 rStrava。请随时给我发信息了解更多细节。

三月版:温暖而模糊的数据科学

原文:https://towardsdatascience.com/march-edition-warm-and-fuzzy-data-science-9d3cfaa1905e?source=collection_archive---------40-----------------------

月刊

数据科学不需要像数学看起来那样冷漠和遥远

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

照片由波格丹一世·格里西克派克斯拍摄

随着您对数据科学的了解和实践,避免抽象变得越来越难——通常是以特定编程语言编码的算法的形式,或者是一个想法的数学特征。我想在这里强调的是,数据科学及其组成学科(统计学、机器学习等。)的起源与我们感知和思考世界的方式密切相关。我想邀请您将您遇到的每一个数据科学原则或重要想法与您的生活联系起来:*给定的学习算法与您自己的学习方式之间有哪些相似之处?*无论是有监督的还是无监督的,甚至是强化学习,这些范式及其底层技术都不需要像我们可能描述的那样抽象。

做到这一点的方法之一是寻找机会,以一种与广大受众非常相关的方式谈论数据科学概念。在我作为一名数据教育工作者的经历中,我经常发现思考简单场景的需要和愿望,这些场景完美地描述了数据科学中一个潜在的令人生畏的想法。

例如:我经常在网球(或任何其他 1-1 运动)的背景下描述泛化的概念。比方说,一个人选择在一所学院训练网球比赛,只和同一个教练一起训练,几年都没有和其他人一起比赛过。过了一段时间,这个人开始不断地击败他们的教练,并决定加冕自己为世界上最好的网球运动员。这个标题有多现实?我们敢说这个人代表了过度拟合数据问题吗?毕竟,在和他们的教练玩了这么多之后,他们一定会记住他们的模式并加以利用。如果我们让这个人和另一个学院的球员比赛会怎么样?我们的选手击败对手的可能性有多大?

即使你自己不练习一项运动,我相信你一定能权衡与不同对手比赛的好处。你可以训练重复性的动作和技术,但是在压力面前制定策略、做出反应和执行的能力最好是通过在测试你的能力时不断面对不同的对手来激发。这就是我所说的学习中的良好概括。

勇往直前,挑战自己,用简单而又有意义的正确方式解释抽象概念。试着向朋友或同事解释,评估他们的兴趣和同意程度。自己拿这个反馈,努力成为更好的数据科学传播者。毕竟,清晰而吸引人的沟通是现代数据科学家最容易被忽视的技能之一!

你能想到其他更容易沟通的概念吗?探索 vs 剥削?偏差-方差权衡?概率上的独立?正规化?合奏?梯度下降?在下面分享你的想法吧!

你可能感兴趣的来源:
-https://arxiv.org/pdf/1702.07800.pdf
-https://www . frontiersin . org/articles/10.3389/fevo . 2020.00082/full
-https://link.springer.com/article/10.1007/BF02478259
-https://archive.org/details/in.ernet.dli.2015.226341

Sergio e . betan court《走向数据科学》的编辑助理

去吧,改变我的想法

代理作为人工智能公平辩论中缺失的成分。

由文森特·万霍克——4 分钟阅读

用 5 个步骤训练你的思维进行递归思考

如何轻松解决递归问题

萨拉·a·梅特沃利(Sara a . Metwalli)——6 分钟阅读

向任何人解释版本控制的简单故事

让我们一起盖房子吧…用 git。

由朱莉娅·迪鲁索 — 6 分钟阅读

AlphaZero 和人工智能之美

自我学习人工智能如何重新定义我们的创造力概念

由曼努埃尔·布伦纳 — 11 分钟读完

如何在面试中解释每个机器学习模型

从回归到支持向量机再到 XGBoost 的模型综述

特伦斯·申 — 6 分钟阅读

聪明是什么感觉?

探索人类意识的深处

由 Aki Ranin — 25 分钟阅读

意识,自由意志&人工智能

为自由意志辩护,它是如何与意识紧密相连的,以及为什么它对人工智能至关重要

由米格尔·平托——12 分钟阅读

PyTorch + SHAP =可解释的卷积神经网络

学习如何用 PyTorch 和 SHAP 解释卷积神经网络的预测

达里奥·拉德契奇 — 4 分钟阅读

水晶般清晰的强化学习

强化学习的综合简明概念

By 白加延塔罗伊 — 31 分钟阅读

新播客

我们也感谢最近加入我们的所有伟大的新作家立花雄一郎利恩·特兰斯蒂芬妮·a .济托·雷洛娃尼科洛·卢切西拉克什米·阿贾伊法鲁克·坎卡亚维奥莱塔·梅泽克列娃胡安·安德烈斯·马拉 卡梅隆·特罗特陈·卡尼劳拉·戈里埃里普拉蒂克·卡马斯约翰·比卡詹妮弗·布兰德奥斯卡·达利亚斯·普拉斯西亚纪尧姆·波特弗兰基·坎西诺施特莱彻·劳亚历山大·彼得罗夫努里亚·科雷亚·马尼亚斯托梅尔·罗嫩瓦西里·丑石艾蒂安·迪洛克布鲁斯·阮塔尔·巴拉姆斯文·哈里斯蒂姆·卢博士【特 我们邀请你看看他们的简介,看看他们的工作。

使用凸优化框架的利润最大化

原文:https://towardsdatascience.com/margin-maximization-using-a-convex-optimization-framework-69824c4c1084?source=collection_archive---------40-----------------------

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

不需要计算能力的封闭方法

老实说,我是优化的忠实粉丝,每当我看到强大的优化器支持的新深度学习算法的出现,我的信念就变得更加坚定。但在这篇博客中,我不会触及任何随机优化过程,而是将重点放在简单而优雅的凸优化解决方案,可以在任何利润最大化问题中利用。这种方法的一个优点是其封闭形式的性质,不需要任何计算能力来解决甚至是大规模的问题。无论规模如何,您只需要一个计算器就可以在一分钟内实现这个解决方案。此外,该方法是领域不可知的,可以应用于大范围的优化问题。记住这一点,让我们开始吧。

问题陈述

假设我们想向客户发送关于个性化报价的信息。现在,我们可以根据我们的预算向每个人发送 n 次随机消息。但是,我们也希望收到基于我们发送的消息的最大响应。为了简单起见,我们不会在业务问题的复杂性上花费太多时间,而是开始简单地描述问题。

让我们假设我们有 k 个特征,这些特征通过这样的交流影响了客户产生的收入。如果我们开发一个乘法模型来捕捉响应曲线,它将如下所示:

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

这里 comm 是捕获历史发送的通信数量的特征, b(comm) 表示该特征的系数。

现在保证金可以定义为:

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

这里 c 是指每次通信的固定成本。

现在,如果我们试图计算发送给客户的最佳通信数量,以最大化利润,我们可以简单地进行一阶导数,得到以下结果:

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

现在,我们将得出最佳通信数量,如下所示:

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

这里的 comm*是发送给客户的最佳通信总数,以实现利润最大化。问题的第一部分到此结束。现在,我们必须计算要向单个客户发送多少信息。因此,如果我们总共有 N 个客户,并且每个客户都由 i 索引,那么在这种情况下最大化利润将如下所示:

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

我们需要解决上面的优化问题。现在如果我们能证明目标函数是凸的,这将使我们的工作更容易。可以证明,如果,

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

目标函数将是凸的。让我们努力实现上述问题的封闭形式的解决方案。

对于带有等式约束的凸函数,我们可以应用拉格朗日乘子来求解最优化问题。让我们写出拉格朗日函数:

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

为了解决这个问题,我们将采取如下方法。

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

如果我们求解上述方程,我们将得到以下结果:

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

闭合形态看起来有多美。事实上,它与一些直觉产生了共鸣。本质上是其他驱动因素对有个客户的的收入的贡献与所有客户相比的比例。事实上,您可以使用上面的公式在简单的 excel 中计算最佳通信计数(当然,您需要在优化之前首先估计响应曲线的参数)。

如果你看看到目前为止的公式,这里唯一重要的部分是确保我们的响应函数的凸性。公式的其余部分与业务问题的领域或上下文无关。现在不考虑任何领域,如果我们可以将利润最大化问题转化为上述形式的凸优化,我们将能够在任何用例中利用它的力量。

在我的下一篇文章中,我们将推广这种方法,并设计一种算法来解决大量的优化问题。

大麻消费:一个数据故事

原文:https://towardsdatascience.com/marijuana-consumption-a-data-story-6ea73317027f?source=collection_archive---------30-----------------------

丹佛市的药房活动:总体趋势和季节性分析

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

糖蜂Unsplash 上拍摄的照片

注: 这是关于丹佛酒类商店和药房指标的系列文章中的第二篇。第一篇文章涵盖了丹佛酒类数据的总体、月度和季度分析,并得出结论,丹佛的酒类商店在夏季和春季更受欢迎。

人类总是深入研究醉酒作为现代生活负担下的一种娱乐方式。自从酒精被发现以来,它就被当作一种休息和放松的工具,人类已经将饮酒作为一种社会联系的形式。在历史上,将大麻用于娱乐经常被看不起,但这种趋势现在正朝着对这种物质更积极的观点转变。2012 年,这两种主要的娱乐物质在丹佛市开始发挥作用,因为这一年大麻在科罗拉多州合法化。随着两种大型娱乐性药物在该市的出现以及自大麻合法化以来一百多家药房的兴起,分析丹佛市这些药物的消费趋势似乎是合乎逻辑的。这篇文章是一系列文章中的第二篇,旨在分析丹佛的酒和大麻流行情况,并且只涉及丹佛药房,对于丹佛酒类商店数据的趋势分析,请查看本系列的第一篇文章。

在我们的分析中,我们将使用 Safegraph 模式数据以及来自丹佛市的数据。SafeGraph 是一家数据提供商,为数百家企业和类别提供 POI 数据。它向学术界免费提供数据。在这个特定的项目中,来自模式数据集的关于访问和流行度指标的数据将证明对我们的分析非常有帮助。模式数据的模式可以在这里找到:模式信息

与烈酒数据一样,第一步是加载和可视化 SafeGraph 模式和丹佛药房数据

丹佛的药房数据是这样的:

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

让我们分析许可证类型的价值计数,看看在美国哪些地点可以合法销售大麻:

print(dispo_df[‘License Type’].value_counts())plt.bar(dispo_df[‘License Type’].unique(), dispo_df[‘License Type’].value_counts())

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

出于本文的目的,我们将只查看零售大麻商店类型的许可证。下一个片段将作为地址列的格式和扩展,以便在连接两个数据集时更好地满足我们的需求:

dispo_df = dispo_df.where(dispo_df[‘License Type’] == ‘Retail Marijuana Store’).dropna()dispo_df[‘index’] = range(1, len(dispo_df) + 1)dispo_df[‘Facility Street Number’] = dispo_df[‘Facility Street Number’].astype(int)dispo_df[‘Address’] = dispo_df[[‘Facility Street Number’, ‘Facility Street Name’,’Facility Street Type’]].apply(lambda x: ‘ ‘.join(x.dropna().astype(str)),axis=1)dispo_df.head(5)

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

以下是安全图模式数据的外观:

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

因此,现在我们有两个独立的数据集,一个来自官方城市丹佛,包含位置坐标和酒类许可证类型等信息,另一个来自 SafeGraph,包含关于访问和受欢迎程度的信息。问题是,我们如何连接这两个数据集。答案可以在 Placekey 生成的概念中找到。

Placekey 通过为所有感兴趣的点生成唯一的标识符并将生成的值用作连接列,解决了地址匹配概念带来的许多问题。创建地点键的过程非常简单,在这里可以找到这个过程的详细步骤。

patterns_18_m_path = ‘/content/drive/MyDrive/UpWork/safeGraph/Data Projects/Project1/Patterns Data M/year sep/patterns_2018_m.csv’patterns18_m_df = pd.read_csv(patterns_18_m_path)#{‘city’, ‘iso_country_code’, ‘query_id’, ‘location_name’, ‘longitude’, ‘postal_code’, ‘region’, ‘latitude’, ‘street_address’}def get_df_for_api(df, column_map = {“index”: “query_id”, “Entity Name” : “location_name”,”Address” : “street_address”,“Facility City”: “city”, “region”: “region”, “Facility Zip Code”: “postal_code”}): df_for_api = df.rename(columns=column_map) cols = list(column_map.values()) df_for_api = df_for_api[cols] df_for_api[‘iso_country_code’] = ‘US’ return(df_for_api)dispo_df[‘index’] = dispo_df[‘index’].astype(str)dispo_df[‘region’] = ‘CO’df_for_api = get_df_for_api(dispo_df)df_for_api[‘postal_code’] = df_for_api[‘postal_code’].astype(int).astype(str)df_for_api

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

data_jsoned = json.loads(df_for_api.to_json(orient=”records”))print(“number of records: “, len(data_jsoned))print(“example record:”)data_jsoned[0]

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

responses = pk_api.lookup_placekeys(data_jsoned, verbose=True)df_placekeys = pd.read_json(json.dumps(responses), dtype={‘query_id’:str})df_placekeys.head()

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

这个代码片段获取这些生成的 Placekeys 并将它们连接到丹佛药房数据:

def merge_and_format(loc_df, placekeys_df):   
    lr_placekey = pd.merge(loc_df, placekeys_df, left_on=”index”,
    right_on=”query_id”, how=’left’)    lr_placekey =
    lr_placekey.drop(‘error’, axis=1)
    lr_placekey[‘address_placekey’] = df_placekeys.placekey.str[:3]+
    df_placekeys.placekey.str[-12:]    
    lr_placekey = lr_placekey[[‘placekey’,‘address_placekey’]
    +list(loc_df.columns)]   
    return(lr_placekey)
loc_placekey=merge_and_format(liquor_df,df_placekeys)def merge_with_patterns(patterns_df, loc_res_placekey):
    patterns_df[‘address_placekey’] patterns_df.placekey.str[:3]+patterns_df.placekey.str[-12:]
    df = loc_res_placekey.merge(patterns_df.drop(‘placekey’,  axis=1), how=’inner’,on=’address_placekey’)
    df = df.reset_index().drop(‘index’,axis=1)
    return(df)df = merge_with_patterns(patterns18_df, loc_placekey)cols = list(df.columns)cols.pop(cols.index(‘address_placekey’))df = df[[‘address_placekey’] + cols]print(df.shape)liquor_GS_df = df

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

现在我们已经有了格式化的数据,我们可以开始分析它了。

丹佛药房:植物 2 的成功

当查看药房数据的总体平均受欢迎程度和访问量时,我们看到以下趋势:

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

在这两种情况下,2018 年最受欢迎的药房记录对应于 Canosa Properties and Investments LLC,但如果你并排查看这些指标的箱线图,你会发现一个有趣的变化。

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

访问者指标没有将该记录的值显示为异常值,这与我们在之前的白酒分析中看到的数据有着奇怪的区别。在酒类分析过程中,如果一个记录是访问者指标的异常值,它也是流行指标的异常值。这是一个有趣的变化,我们可以继续寻找这个潜在的趋势,现在,让我们看看这个特定药房成功背后的原因。

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

当在谷歌上对商标名 BOTANICO 2 进行快速搜索时,我们看到评级非常好,在 Weedmaps 上为 3.9,在 Leafly 上为 4.7。这可能是一个证据,说明这家药房做得这么好的原因是它提供了这么好的服务和高质量的产品。

这个特定药房的评级与同一邮政编码的其他药房的评级相比如何?

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

我们可以看到,在这个邮政编码有两个药房,只有 Botanico 有连续良好的受欢迎程度评分,另一个药房的评级不是很好,其他药房的低质量可以归因于 Botanico 2 的成功。

这种特定药房受欢迎的背后是否还有其他原因,比如它周围的当地商店?让我们检查一下与这些记录相关的本地品牌:

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

由此我们可以看出,没有品牌与药房的知名度相关联。这种相关性可能归因于大量与药房相关的食品品牌和杂货店,但这不会得到数据的很好支持,因为与酒店和五金店等位置的相关性高于与食品和杂货店的相关性。

让我们分析药房数据的每月数据,看看这是否有助于找到 BOTANICO 2 受欢迎的原因

丹佛药房数据的月度分析:寒冷的月份与药房更受欢迎相关吗

与之前的月度趋势分析一样,这里的代码块将比较 2018 年每个月的受欢迎程度和访问指标。在本节中,该代码将不包括在内,因为它重复了每月的白酒分析。要自己研究代码和处理数据,请不要犹豫,去看看笔记本

一月:

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

二月:

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

三月:

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

四月:

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

五月:

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

6 月:

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

七月:

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

八月:

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

九月:

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

十月:

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

十一月:

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

十二月:

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

月度分析显示了一个有趣的模式。似乎随着天气越来越冷,2018 年丹佛的药房的受欢迎程度和访问指标都在增加。这当然与酒精消费量的见解形成了鲜明的对比——随着天气变暖,这些指标也会增加。这也与我个人的预期有点矛盾,四月份是这些药房受欢迎的月份。似乎就像节假日酒类销售增长对数据整体结果的最小影响一样,4 月 20 日的大麻销售对该月整体消费的影响非常小,因此 4 月份在该列表中的排名不是很高。现在让我们用季节分析来证实我们关于药房受欢迎程度的理论。

药房数据:季节性分析

这个代码片段将以前每月分析的数据汇编到一个表中,并添加了季节性信息:

Season_Df = pd.DataFrame(data = {‘Monthly_avg_visits’: [2.645161,1.571429,2.258065,2.5,1.741935,1.633333,1.419355,1.354839,2.166667,2.612903,2.466667,2.516129],’Monthly_avg_pop’: [13.958333,6.125,8.291667,8.291667,6.541667,7.125,5.5,4.958333,7.125,8.541667,7.458333,9.333333],‘Season’: [‘Winter’,’Winter’,’Spring’,’Spring’,’Spring’,’Summer’,’Summer’,’Summer’,’Fall’,’Fall’,’Fall’,’Winter’]})Season_Df.head()

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

这些数据提供了以下图表:

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

从这些图中,我们首先可以看到访问者和受欢迎程度指标之间的相关性是线性的,这一发现也与线性数据相同。仔细观察,我们可以发现冬季和秋季比其他月份更受欢迎。这与之前的酒类数据形成鲜明对比,之前的数据显示,在较温暖的月份,酒类商店的人气有所上升。让我们将同样的分析应用于整个数据集,而不仅仅是月平均值,看看趋势是否成立

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

从这些趋势我们可以看出,当使用完整的数据时,受欢迎程度和访问之间的相关性仍然存在。此外,我们可以再次看到,显示最受欢迎的季节是冬季和秋季,从而支持我们的假设。

结论:

就来访者而言,按季节划分,诊所接待来访者最多的月份是 1 月、10 月、11 月、12 月和 3 月。这令人惊讶,因为随着 4 月 20 日的到来,大麻消费成为一个受欢迎的日子,4 月份成为最受欢迎的月份更有意义。但就像酒类数据一样,一个月中某一天产品受欢迎并不能抵消整个月的平均总访问量。目前的趋势是,随着天气变冷,诊所就诊人数增加。

至于受欢迎程度,药房最受欢迎的月份是一月、十二月、十月、三月、四月和十一月。这似乎很有趣,因为它与就诊的季节性趋势相关——较冷的月份往往显示药房受欢迎的程度增加。目前的一个趋势是,4 月份的受欢迎程度大幅上升。这很有趣,因为访问和流行趋势之间的变化。这可能是因为 BOTANICO 2 药房通过在线销售实现了大部分销售。这可能是受欢迎程度增加但访问量没有增加背后的原因。

提问?

我邀请你在 SafeGraph 社区#safegraphdata 频道问他们,这是一个面向数据爱好者的免费 Slack 社区。获得支持、共享您的工作或与 GIS 社区中的其他人联系。通过 SafeGraph 社区,学者们可以免费访问美国、英国和加拿大 700 多万家企业的数据。

使用 Plotly Express 的 Marimekko 图表

原文:https://towardsdatascience.com/marimekko-charts-with-plotly-express-you-can-also-lie-with-charts-4ee98a30ed66?source=collection_archive---------31-----------------------

你也可以用图表撒谎

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

由 Unsplash 放大的图像

数据可视化

假设你参加了一个商业计划竞赛。你需要展示一个令人信服的商业案例,因为投资者会根据你的讲述做出决定。

你必须包括视觉上有趣的图形和图像。但是在这里我们可能会犯双重错误 : 1)观众会看到我们的数字并立即理解我们展示的想法;2)即使在专业环境中,观众也可以接收到一系列重要的复杂可视化,并以我们选择的方式掌握趋势、模式、相关性、比例、分布。

记住:数据可视化是一种交流工具。所以,我们必须经常问自己:我表达清楚了吗?我是否使用了一种不容置疑的数字?如果我们使用可变宽度条形图,这些问题尤其重要。

可变宽度条形图

有不同类型的可变宽度条形图,但有两种是最流行的:1)条形图;2) Marimekko 图(Marimekko 是芬兰的纺织品牌,有大而多样的形状图案,也有简单明亮的颜色和风格)。

它们在以下方面有所不同:一个条形图 (BMc)类似于一个“标准”条形图,但是它的条形宽度是可变的; Marimekko 图 (Mc)类似于 1 00%堆积条形图 t,但其条形宽度可变,它是一个条形宽度可变的标准化柱形图。

两个图表都用于显示数据集中每个类别的两个数值变量**;目标是在类别之间进行比较,而不是在数字变量之间进行比较。它们广泛用于仪表板或营销、销售和业务演示中。**

纵轴有一个数字刻度(在 Marimekko 图上为 100%),代表一个定量变量。横轴可以是数字,也可以是类别。如果是数字**,每个矩形的宽度与第二个定量变量**的值成比例,有不同的颜色,并有一个图例来标识它。如果是分类的,每个条形的宽度也表示第二个定量变量的值。

与标准条形图不同的是,在条形之间没有留出空间(注意不要将麦可图与直方图混淆)。)在 BMc 和 Mc 两者中,水平轴的整个宽度被占据

Mekko 条形图是传统条形图的替代产品,可让您减少商业演示中图表的数量。为了实现这一点,图表通过条形的高度对一个数字变量进行编码,通过条形的宽度对另一个数量变量进行编码。

Marimekko 图表簇状条形图(分组条形图)的替代物,允许减少其在商业展示中的数量:它们显示与主要类别内的子组或子类别相关的数字信息。

不要混淆 Mcs 和 spineplots 。根据其最严格的定义, spineplot 是一个一维的水平堆积条形图,用于显示列联表中两个交叉分类的分类变量的频率、比例或百分比。这种混乱是因为一些 spineplots 可视化工具允许垂直方向,他们称之为马赛克图。这个术语也被错误地归因于 Marimekko 图表,但应该保留给那些允许通过可变宽度矩形检查两个或更多分类变量之间关系的图表。

带有 Plotly Express 的 Marimekko 图表

总部位于加拿大蒙特利尔的计算公司 Plotly 开发了 plotly.py,这是一个用于 Python 的交互式开源可视化工具。2019 年,该公司发布了 Plotly 4.0,其中包括 Plotly Express ,这是一个与 Plotly 生态系统的其余部分完全兼容的高级包装器。

Plotly 提供了一组名为的图形对象的类,可以用来构造图形。 plotly.graph_objects 模块包含了 Python 类的层次结构。是初级类。有一个数据属性和一个布局属性。数据属性有 40 多个对象,每个对象引用一个特定类型的图表( trace) 及其相应的参数。布局属性指定图形的整体属性(轴、标题、形状、图例等。).

我们使用了从 Kaggle 下载的数据集。该数据集包含从 VzCharts 收集的与视频游戏销售和游戏评级数据相关的记录。我们特别选取了三个 csv 文件:1)索尼[1]关于 Playstation 4 平台上视频游戏销售的 1031 条记录;2) 422 条关于微软 Xbox One 主机【2】上视频游戏销售的记录;3) 11563 条关于来自不同发行商【3】的视频游戏 销售的记录。我们想知道不同平台的销售额在全球几个地区的分布情况。

首先,我们导入 Plotly Express 为 *px,*模块 plotly.graph_objectsgo ,库 Numpy & Pandas 分别为 nppd

import plotly.graph_objects as goimport plotly.express as pximport numpy  as npimport pandas as pd

然后,我们使用 read_csv 函数将逗号分隔值( csv )文件读入它们对应的数据帧。

df1 = pd.read_csv(path + 'XboxOne_GameSales2.csv', 
                  index_col =False, header = 0, 
                  sep = ';',   engine='python')df2 = pd.read_csv(path + 'PS4_GamesSales2.csv', 
                  index_col = False, header = 0,
                  sep = ';', engine='python')df3 = pd.read_csv(path + 'Video_Games_Sales.csv', 
                  index_col = False, header = 0,
                  sep = ';', engine='python')

下面的截图显示了名为 df1 的数据集的前十条记录(对应 XboxOne):

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

名为 df2 的数据集具有与 df1 相同的列数和名称,但是df3(Video _ Games _ Sales)具有非常不同的布局:

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

对于我们的计算,我们只需要存储四个感兴趣地区(北美、欧洲、日本和世界其他地区)销售额的列。在 df1df2 中,我们简单地选择相应的四列,但是 df3 r 需要预处理来均衡数据。预处理任务只包括选择 Nintendo sales 并重命名四个选定的列:

df1 = df1[['North America', 'Europe', 'Japan', 'Rest of World']]df2 = df2[['North America', 'Europe', 'Japan', 'Rest of World']]df3 = df3.drop(df3[(df3.Publisher != 'Nintendo')].index)df3 = df3[['NA_Sales', 'EU_Sales', 'JP_Sales', 'Other_Sales']]df3 = df3.rename(columns={'NA_Sales': 'North America', 
                          'EU_Sales': 'Europe',
                          'JP_Sales': 'Japan',
                          'Other_Sales' :'Rest of World'})

然后,我们将函数 sum() 应用于三个数据帧。记住函数 sum() 返回所请求的轴的值的总和。

同样,df3 需要预处理,因为在应用函数 sum() 之前,我们必须使用 *pd.to_numeric,errors = ’ compete '将存储为 object 的列数据转换为数字。选项错误= ‘强制’*将非数值转换为 NaN

最后,我们将这三个文件连接起来,并在一个名为 df4 的新数据帧中计算各自的百分比。

sum_1 = df1.sum(axis = 0, skipna = True)sum_2 = df2.sum(axis = 0, skipna = True)df3 = df3.apply(pd.to_numeric, errors='coerce')sum_3 = df3.sum(axis = 0, skipna = True)list_df = [sum_1, sum_2, sum_3]df4 = pd.concat(list_df , axis = 1).reset_index()df4.columns = ['region', 'xbox', 'ps4', 'nint']df4['perc_xbox'] = (df4['xbox'] / ( df4['xbox'] + df4['ps4'] + 
                    df4['nint'])) * 100df4['perc_ps4']  = (df4['ps4']  / ( df4['xbox'] + df4['ps4'] + 
                    df4['nint'])) * 100df4['perc_nint'] = (df4['nint'] / ( df4['xbox'] + df4['ps4'] + 
                    df4['nint'])) * 100

为了绘制一个可变宽度条形图,我们使用一个名为 data 的字典进行堆栈排序,使用另一个名为 colors 的字典进行条形颜色排序,并使用一个系列(width和一个变量( width_x )来指定水平轴上条形的宽度:

data = {"Nintendo": df4['perc_nint'],
        "Xbox"    : df4['perc_xbox'],
        "PS4"     : df4['perc_ps4']
        }colors= {"Nintendo": 'blue',
         "Xbox"    : 'green',
         "PS4"     : 'darkred'
        }widths  = sum_3
x_width = sum_3.sum()

plotly.graph_objects 的概念思路是使用。 add_trace(去。(bar())创建图然后添加等方法。更新 _ 布局(),。update_xaxes,。更新 _yaxes 来操作图形。最后,我们用导出图形。write_image()渲染。显示()。

注意 add_trace(go。Bar()) 根据我们在名为 data 的字典中决定的顺序,位于 for 循环内部。

我们用 update.layout 更新了图表:设置标题文本、标题字体和图例字体,并设置图形尺寸(宽度和高度)。 barmode = ‘stack’ 确定条堆叠在另一条的顶部

然后我们更新了 x 轴和 y 轴(文本、字体、tickfont)。将 y 轴范围设置在 0 到 100%之间,将 x 轴范围设置在 0 到 x_width 之间。

fig = go.Figure()
for key in data:
fig.add_trace(go.Bar(name = key,
                     y = data[key],
                     x = np.cumsum(widths) - widths,
                     width = widths, offset = 0,
                     marker = {'color' : colors[key]},
                     customdata = data[key],
                     texttemplate = "%{y:.2f}",
                     textposition = "inside",
                     textangle = 0,textfont_color = "white",
                     textfont_size = 30))fig.update_layout(title_text ="Sales of Consoles per Region",
                  barmode = "stack",
                  title_font_size  = 40,legend_font_size = 30,
                  width = 1400, height = 1400)fig.update_xaxes(title_text=
                 'Width of each bar=Sales of Nintendo in MM',
                 range = [0, x_width],  
                 title_font_size = 30,                   
                 tickvals = np.cumsum(widths)-widths/2,
                 ticktext =["%s<br>%d"% l, w)for l,w 
                            in zip(labels, widths)],
                 tickfont = dict(family='Calibri', 
                                color='black', size=25))fig.update_yaxes(title_text = 'Percentage (%)',
                 range = [0,100],
                 title_font=dict(size=35,
                                 family='Verdana', color='darkred'))fig.write_image(path + "figmarimekko1.png")fig.show()

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

图 1:作者用 Plotly Express 制作的 Marimekko 图。

图 1 在一张图表中描述了任天堂视频游戏在不同地区的累计销售额,以及不同游戏机对应的百分比。可以看到 Marimekko 图的特征要素:一个矩形区域被分成宽度不同的小矩形;垂直堆叠的矩形;占据图表整个宽度的水平轴;带有百分比刻度的垂直轴;特定品牌(任天堂)的总销售额在较低的基线上;不同的条形宽度允许计算每个地区对总销售额的相对贡献。

但是堆叠顺序的选择完全是任意的。那么,如果我们改变顺序会发生什么呢?我们只需要对代码做一些简单的修改:

data = {"Xbox"    : df4['perc_xbox'],
        "PS4"     : df4['perc_ps4'],
        "Nintendo": df4['perc_nint']
        }
widths  = sum_1
x_width = sum_1.sum()

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

图 2:作者用 Plotly Express 制作的 Marimekko 图。

在图 2 中,不同宽度的矩形是由感兴趣地区的不同 XboxOne 销售情况给出的。虽然不同游戏机之间的销售百分比保持不变,但观众会收到非常不同的信息,尤其是在日本。

如果横轴按 PS4 控制台销售进行细分,情况也是如此:

data = {"PS4"     : df4['perc_ps4'],
        "Nintendo": df4['perc_nint'],
        "Xbox"    : df4['perc_xbox']
        }
widths  = sum_2
x_width = sum_2.sum()

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

图 3:作者用 Plotly Express 制作的 Marimekko 图。

这是 Marimekko 图表的主要缺点:它们不仅难以阅读和解释,因为它们是基于观众通过比较区域来解码数字信息的能力,而且它们还会误导观众得出错误的结论

正如 Alberto Cairo 明智地指出的那样4: “正如我们可以用统计数据撒谎一样,我们也可以用图表撒谎”

如果你对这篇文章感兴趣,请阅读我以前的(https://medium.com/@dar.wtz):

带有 Plotly Express、趋势线和分面的散点图

带有 Plotly Express、主题和模板的直方图

参考文献

【1】:https://www.kaggle.com/sidtwr/videogames-sales-dataset?select=PS4_GamesSales.csv

[2]:https://www.kaggle.com/sidtwr/videogames-sales-dataset?select = Xbox one _ gamesales . CSV

[3]:https://www.kaggle.com/sidtwr/videogames-sales-dataset?select = Video _ Games _ Sales _ as _ at _ 22 _ Dec _ 2016 . CSV

使用 Python 的 Matplotlib 制作 Marimekko 图表

原文:https://towardsdatascience.com/marimekko-charts-with-pythons-matplotlib-6b9784ae73a1?source=collection_archive---------12-----------------------

可视化分组和分段比例的好方法

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

Marimekko 图表—图片由作者提供

通常被称为马赛克图,脊柱图,或只是 Mekko。在其他应用程序中,该图表通常用作市场地图,以可视化按客户类型、地区和许多其他变量划分的行业。

本质上,它们只是一个堆叠的条形图,其中的条形宽度用于显示另一个变量,通常是整个组占总数的比例。

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

Marimekko 图表—图片由作者提供

比例对于发现模式和比较不同规模的群体非常有用。本文将探讨如何用 Matplotlib 中的 Marimekko 图表来改进我们可视化它们的方式。

为什么要使用 Marimekko 图表

我们将通过一个 Marimekko 图表的快速示例来说明它们的可用性,最后,我们将看到如何更系统地绘制它们。

首先,我们将导入我们将使用的库。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

在我们公司,部门 A 的 30 人和部门 B 的 20 人希望继续远程工作。

y = np.array([.3, .4, .7, .8]) * np.array([100., 50., 100., 300.])
x_label = ['a','b','c', 'd']
plt.bar(x_label, y)
plt.show()

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

条形图—作者提供的图片

光是这些信息是没有帮助的,而且可能会产生误导,因为我们不知道每个部门有多少人在工作。分析比例会更有见地。

y = [.3, .4, .7, .8]
x_label = ['a','b','c', 'd']plt.bar(x_label, y) # bottom bar
plt.bar(x_label, np.ones(len(y))-y, bottom=y) # top barplt.ylim(0,1)
plt.yticks([0, 0.25, 0.5, 0.75, 1], ['0%', '25%', '50%', '75%', '100%'])plt.show()

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

百分比堆积条形图—图片由作者提供

但是,假设我们也想把所有部门想象成一个整体。上面的图表可能也会误导我们。我们可以说这是一个整体“分裂”的意见;一半部门在 50%以上,另一半在 50%以下,这是不对的。

为了从整体上了解各个部门,我们需要多种可视化或不同的方法,如树状图和 Marimekko 图表

fig, ax = plt.subplots(1)
y = [.3, .4, .7, .8]
x = [100, 50, 100, 300]
x_label = ['a','b','c', 'd']
width = [i/sum(x) for i in x]# calculate x coordinates based on the width of the previous bars
# same as: [0, width[0], width[0] + width[1], width[0] + width[1] + width[2]]
adjusted_x, temp = [0], 0
for i in width[:-1]:
    temp += i
    adjusted_x.append(temp)# Marimekko chart
plt.bar(adjusted_x, y, width=width, align='edge', edgecolor='black')
plt.bar(adjusted_x, np.ones(len(y))-y, bottom=y, width=width, align='edge', edgecolor='black')# x and y ticks (%)
ax.set_yticks([0, 0.25, 0.5, 0.75, 1])
ax.set_yticklabels(['0%', '25%', '50%', '75%', '100%'])
ax.set_xticks([0, 0.25, 0.5, 0.75, 1])
ax.set_xticklabels(['0%', '25%', '50%', '75%', '100%'])plt.ylim(0,1)
plt.xlim(0,1)# twin y-axis to draw x-ticks at the top
axy = ax.twiny()
axy.set_xticks([(width[i]/2)+ v for i, v in enumerate(adjusted_x)])
axy.set_xticklabels(x_label, fontsize=14)plt.show()

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

Mekko 图表—图片由作者提供

这种可视化帮助我们毫不费力地将部门内的比例以及每个部门占总数的比例可视化。

我们可以清楚地看到,我们公司的绝大多数人都希望继续远程工作,但我们仍然注意到,较小的部门似乎不太热衷于这一想法。

数据集

现在,为了更系统地使用 Marimekko 图表,让我们尝试使用 Pandas 数据框。这样,我们可以更容易地在列、行和数据集之间切换。

我将使用的数据集来自世界银行公开数据。我想将一些指标的比例形象化,如农村人口用电识字率。但我也想说明这些国家占总人口的比例。

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

人口数据框-图片由作者提供

世界银行数据集可能包含一些区域、次区域、社会经济群体等行,但我们希望将国家与其他国家进行比较。我们需要一些国家的列表来清理我们的数据框架,例如所有国家拉丁美洲&加勒比海欧盟等等。

我们还需要考虑,我们不会给每个国家贴标签;那就太杂乱了,所以我们还需要选择一些国家来突出显示。

由于这些内容广泛,我将在这里 留下这部分代码 的链接。

现在,让我们创建一些字典,以便更容易地与所有这些列表和值进行交互。

var_dict = {'Rural Population':
             {'file':'API_SP.RUR.TOTL.ZS_DS2_en_csv_v2_2166125.csv',
              'label':'Rural Pop. (%)',
              'legend':['Rural Population', 'Urban Population'],
              'min_year':1960,
              'max_year':2019}, 

            'Access to Electricity':
             {'file':'API_EG.ELC.ACCS.ZS_DS2_en_csv_v2_2164123.csv',
              'label':'Access to Electricity (%)',
              'legend':['Access to Electricity', 
                        'No Access to Electricity'],
              'min_year':1990,
              'max_year':2018},

            'Literacy':
             {'file':'API_SE.ADT.LITR.ZS_DS2_en_csv_v2_2163525.csv',
              'label':'Literacy Rate (age +15)',
              'legend':['Literate Pop.', 'Illiterate Pop.'],
              'min_year':1970,
              'max_year':2018},

            'Unemployment':
             {'file':'API_SL.UEM.TOTL.ZS_DS2_en_csv_v2_2163385.csv',
              'label':'Unemployment (ILO Estimate)',
              'legend':['Unemployed', 'Employed'],
              'min_year':1991,
              'max_year':2019}}countries_dict = {"All":all_countries,
                  "European Union": eu, 
                  "Latin America & Caribbean": la_c,
                  "East Asia and Pacific": eap,
                  "Europe and Central Asia": eca,
                  "Middle East and North Africa": mena,
                  "North America": na,
                  "South Asia" : sa,
                  "Sub-Saharan Africa": ssa,
                  "Custom":False}highlights_dict = {"All":highlight_all,
                  "European Union": highlight_eu, 
                  "Latin America & Caribbean": highlight_la_c,
                  "East Asia and Pacific": [],
                  "Europe and Central Asia":[],
                  "Middle East and North Africa":[],
                  "North America":[],
                  "South Asia" : [],
                  "Sub-Saharan Africa":[],
                  "Custom":[]}

我们已经做好了一切准备,可以更有效地与数据集进行交互。现在让我们设置变量并开始清理。

year = 2018
countries_select = "All"
indicator = 'Rural Population'
countries = countries_dict[countries_select]
highlight = highlights_dict[countries_select]

无论我们绘制什么指标,人口数据框架都是一样的。尽管如此,指标数据框架将取决于我们从以前的代码中选择,在这种情况下,农村人口。

pop_file = 'API_SP.POP.TOTL_DS2_en_csv_v2_2163507.csv'df = pd.read_csv('../data/'+pop_file)
var_df = pd.read_csv('../data/'+var_dict[indicator]['file'])df = df.merge(var_df, 
              left_on='Country Name', 
              right_on='Country Name', 
              suffixes=['_pop', '_var_df'])

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

合并的数据框-作者提供的图片

合并后的数据框将为人口和变量指标的每一年提供一列。

清洁

我们将删除不在列表中的国家,删除没有值的行,并按指标值对行进行排序。

# remove non-countries
df = df[df['Country Name'].isin(countries)]# remove rows with empty values for the indicator or population
df = df[(df['{}_var_df'.format(year)].notna() & df['{}_pop'.format(year)].notna())]# sort rows by the indicator values 
df.sort_values('{}_var_df'.format(year), inplace=True)

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

经过清理和排序的数据框-图片由作者提供

准备数据

接下来,我们需要定义 Y,这是每个国家的指标值。

条形的宽度就是人口数量。X 是宽度的累积和。

# get y
y = df['{}_var_df'.format(year)]/100# get the width of the bars (population / 1mi)
width = df['{}_pop'.format(year)].values / 1000000# calculate the x position of each country
# x is the cummulative sum of all previous widths
x = [0]
temp = 0
for i in width[:-1]:
    temp += i
    x.append(temp)

我们将定义的最后一个变量与 x 记号和国家标签相关。我们将使用高亮列表来绘制记号,获取国家的 X 和一半宽度来定位标签。

# create lists with the x ticks positions and labels
# based on a list of countries we want to highlight
xticks_pos = []
xticks_labels = [] 
for i, v in enumerate(df['Country Name']):
    if v in highlight:
        xticks_pos.append(width[i]/2 + x[i])
        xticks_labels.append(v)

厉害了,我们有 XY宽度x 刻度位置标签

绘制 Marimekko 图表

我们完成了函数的第一部分。现在我们可以开始绘制条形图,并使用变量来绘制 Marimekko 图。

默认情况下,Matplotlib 在 x 位置的中心对齐条形,我们需要它们在边缘。我们还需要给每个条形添加一个轮廓,这样我们就可以区分它们。

fig, ax = plt.subplots(1, figsize=(24,12))# plot proportions
plt.bar(x, y, 
        width=width, 
        align='edge', 
        edgecolor='w', 
        linewidth=0.5, 
        color='#559A65')# plot ones - proportions at the top
plt.bar(x, np.ones(len(y))-y, bottom=y, 
        width=width, 
        align='edge', 
        edgecolor='w', 
        linewidth = 0.5, 
        color='#477C91')

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

Marimekko 图表—图片由作者提供

接下来,我们需要修改 x 和 y 的限制来删除空白,并用一些适当的值替换 x 和 y 记号。

要在 x 轴上绘制百分比和标签,我们需要写第一个,设置一个双 y 轴,然后写另一个。

fig, ax = plt.subplots(1, figsize=(24,12))plt.bar(x, y, 
        width=width, 
        align='edge', 
        edgecolor='w', 
        linewidth=0.5, 
        color='#559A65')plt.bar(x, np.ones(len(y))-y, bottom=y, 
        width=width, 
        align='edge', 
        edgecolor='w', 
        linewidth = 0.5, 
        color='#477C91')# xy limits
plt.xlim(0, x[-1]+width[-1])
plt.ylim(0,1)# xy ticks
plt.xticks(xticks_pos, xticks_labels, fontsize=14)
plt.yticks(np.arange(0,1.1,0.25), 
          ['{:.0f}%'.format(i*100) for i in np.arange(0,1.1,0.25)],
          fontsize=14)# twin y-axis to draw x-ticks at the top
axy = ax.twiny()# max value on the x axis
max_x = (x[-1] + width[-1])# get the values for 0%, 25%, 50%, 75%, and 100%
x_ticks_percent = np.arange(0, max_x+1, max_x/4)# set ticks and labels
axy.set_xticks(x_ticks_percent)
axy.set_xticklabels(['{:.0f}%'.format(i*100) for i in x_ticks_percent/max_x],fontsize=14)plt.show()

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

Marimekko 图表—图片由作者提供

就是这样。我们需要添加一个图例,标题,一些注释,并在一个函数中获得所有这些代码,以方便地切换指标和国家。

def marimekko(countries_select, indicator, 
              year, countries, highlight): ##################
    ###### DATA ######
    ##################
    pop_file = 'API_SP.POP.TOTL_DS2_en_csv_v2_2163507.csv'
    df = pd.read_csv('../data/'+pop_file)
    var_df = pd.read_csv('../data/'+var_dict[indicator]['file'])
    df = df.merge(var_df, 
                  left_on='Country Name', 
                  right_on='Country Name', 
                  suffixes=['_pop', '_var_df'])

    # remove non-countries
    df = df[df['Country Name'].isin(countries)] # remove rows with empty values for the indicator or population
    df = df[(df['{}_var_df'.format(year)].notna() & df['{}_pop'.format(year)].notna())] # sort rows by the indicator values 
    df.sort_values('{}_var_df'.format(year), inplace=True) # get y
    y = df['{}_var_df'.format(year)]/100 # get the width of the bars (population / 1mi)
    width = df['{}_pop'.format(year)].values / 1000000 # calculate the x position of each country
    # x is the cummulative sum of all previous widths
    x = [0]
    temp = 0
    for i in width[:-1]:
        temp += i
        x.append(temp) # create lists with the x ticks positions and labels
    # based on a list of countries we want to highlight
    xticks_pos = []
    xticks_labels = [] 
    for i, v in enumerate(df['Country Name']):
        if v in highlight:
            xticks_pos.append(width[i]/2 + x[i])
            xticks_labels.append(v)

    ##########################
    ########## PLOT ##########
    ##########################
    # define figure and axis
    fig, ax = plt.subplots(1, figsize=(24,12)) # bars
    plt.bar(x, y, align='edge', 
            width=width, edgecolor='w', 
            linewidth = 0.5, color='#559A65')
    plt.bar(x, np.ones(len(y))-y, bottom=y, 
            align='edge', width=width, edgecolor='w', 
            linewidth = 0.5, color='#477C91')

    # Add notes (Total population and Year)
    total_pop = df['{}_pop'.format(year)].sum()
    if total_pop > 1000000000:
        total_pop = '{:.2f} bi'.format(total_pop/1000000000)
    elif total_pop > 1000000:
        total_pop = '{:.2f} mi'.format(total_pop/1000000)
    else:
        total_pop = '{:.2f}'.format(total_pop) notes = 'Total population: {} | Year: {}'.format(total_pop,
                                                     year)
    plt.text(x[-1], 1.07, notes, ha='right', fontsize=20) # title and legend
    plt.legend(var_dict[indicator]['legend'], 
               ncol=2, loc='upper left', fontsize=20,
               frameon=False, bbox_to_anchor=(0,1.11))
    plt.title('{} by Country\n\n'.format(var_dict[indicator]['label']), 
              loc='left', fontsize=24)

    # xy limits
    plt.xlim(0, x[-1]+width[-1])
    plt.ylim(0,1) # xy ticks
    plt.xticks(xticks_pos, xticks_labels, fontsize=14)
    plt.yticks(np.arange(0,1.1,0.25), 
              ['{:.0f}%'.format(i*100) for i in np.arange(0,1.1,0.25)],
              fontsize=14)
    # twin y-axis to draw x-ticks at the top
    axy = ax.twiny()
    # max value on the x axis
    max_x = (x[-1] + width[-1])
    # get the values for 0%, 25%, 50%, 75%, and 100%
    x_ticks_percent = np.arange(0, max_x+1, max_x/4)
    # set ticks and labels
    axy.set_xticks(x_ticks_percent)
    axy.set_xticklabels(['{:.0f}%'.format(i*100) for i in x_ticks_percent/max_x], 
                        fontsize=14) plt.savefig('chart.png')

太棒了,让我们试试我们的新功能。

year = 2018
countries_select = "All"
indicator = 'Rural Population'
countries = countries_dict[countries_select]
highlight = highlights_dict[countries_select]marimekko(countries_select, indicator, year, countries, highlight)

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

Marimekko 图表—图片由作者提供

year = 2000
countries_select = "European Union"
indicator = 'Unemployment'
countries = countries_dict[countries_select]
highlight = ['Belgium', 'Czech Republic', 'France', 'Germany', 
             'Italy', 'Poland', 'Portugal', 'Spain', 'Sweden']marimekko(countries_select, indicator, year, countries, highlight)

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

Marimekko 图表—图片由作者提供

太好了!我们有一个很好的可视化工具,可以让我们检查国家的比例和整体的比例。所有这些都在一个函数中,因此我们可以轻松地在不同的指标和国家组之间切换。

现在就看你的了。您可以改进设计,增加交互性,或者在笔记本或脚本中使用它。

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

用 Python 生成并用 Pixlr 编辑的元素—图片由作者提供

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

Streamlit 打造的数据探索 app 图片由作者提供

上述例子的代码可以在这里找到。

更多 Python DataViz 教程

感谢阅读我的文章。希望对你有帮助!

降价:从描述性到规定性

原文:https://towardsdatascience.com/markdowns-from-descriptive-to-prescriptive-ec729c4cce82?source=collection_archive---------10-----------------------

商业科学

3 种分析方法来回收价值和防止浪费

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

**降价和浪费。**照片由约翰·卡梅隆Unsplash 拍摄

描述性的、预测性的和规范性的:这三种方法你可以用分析来解决任何商业问题。例如降价。

降价幅度很大:如何处理过剩的库存?

我最近的文章中的一些统计数据:仅在美国就有超过 2 万亿的库存——20,400 亿美元——每销售 1 美元就有 1.43 美元的库存。那么,当这 43%的过剩库存达到报废时,该如何处理呢?

当一个产品用尽了销售的可能性,降低它的价格是一个合理的方法,试图清理剩余库存:残值,防止浪费。

降价有 3 种主要方法,展示了三种主要的分析策略:描述性、预测性和规范性。在进入细节之前,先了解一下背景。

背景:产品金字塔

像任何以产品为中心的分析问题一样,降价需要浏览复杂的产品层级,并在每个层级使用适当的方法。

产品金字塔的一个例子可能如下所示,以名为 Event Network 的公司为例,该公司是北美体验式零售的领先运营商:遍布美国和加拿大的标志性文化景点和生活方式场所的商店*,例如博物馆、动物园、水族馆。*

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

产品金字塔。图片来源: Evo 定价 (CC 带归属)

产品金字塔的不同层次需要不同的预测方法。

例如,在最底层的是特定产品,或称库存单位(简而言之,SKU):一件印有黄色三藩市图案的 S 码绿色 t 恤。我知道,这是一个奇怪的调色板,也许去另一个 SKU?蓝色印花的中号灰色连帽衫。好了,你明白了。

在这种粒度级别,销售相对较少,因此有必要进行详细的预测。沿着产品金字塔向上,汇总销售更频繁,因此可以应用汇总预测方法。

最后,所有的方法必须匹配,这样各部分的总和与总数相符,例如预测总和必须与预测总和相匹配。

请参见以下视觉摘要以供参考:

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

降价临近。图片来源: Evo 定价 (CC 带归属)

降价的三种方法

在浏览产品金字塔的复杂性时,您可以使用三种方法来设置最佳降价,使用不同数量和类型的数据:

  • 描述性:仅使用历史数据
  • 预测:使用价格弹性数据
  • 规定性:使用尽可能多的数据。

每种方法都需要不同数量的数据、业务流程,当然还有分析策略。

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

降价过程取决于方法。图片来源: Evo 定价 (CC 带归属)

描述性方法的构建和维护相对简单,它只需要很少的数据。毫不奇怪,这种方法只允许自上而下的推荐,因此效率相对较低,下面我会进一步说明。

另一方面,规范的方法相对更难构建和维护,并且需要更大的数据集。然而,这种方法允许做出完全自下而上的建议,并且可以提供显著的财务收益。

描述性方法介于两者之间,我将在后面介绍。

所以让我先从基线方法开始:描述性的!

方法 1:描述性降价

第一种也是最直接的方法是选择降价的产品,它依赖于一个简单的经验法则:

库存比销售额多的折扣产品。

直觉是用覆盖率,或 天的库存 ,作为问题大小的代理。计算步骤:

  1. 某产品的历史销量:比如一个月 100 件
  2. 现有库存:比如 1000 件
  3. 覆盖率比率,例如,在本例中为 10 个月:1,000/100 →如果销售继续保持历史平均水平,则需要 10 个月才能将当前库存销售一空
  4. 每件产品花费的降价预算=*额外%折扣 X 库存单位成本 X 现有库存件数。*阅读下面的例子。
  5. SKU 排名:从最高覆盖率往下。

在这一点上,挑选前 N 个产品,直到所有可用的降价预算都花完!

一种产品降价预算的简单示例:

  • 打八折;现在要打五折,所以额外打三折
  • 10 美元的单位库存成本
  • 1 万件现有库存

→花费的 30k 美元降价预算= 30% x 10k 美元。

明白这是怎么回事了吗?

按降序排列 SKU,您可以轻松挑选:根据降价百分比和可用预算,您可以轻松确定降价的 SKU(覆盖率最高的那些)。

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

描述性降价。图片来源: Evo 定价 (CC 带归属)

优势:

  • 简单的笔和纸的方法,可以做 100%在一个电子表格,如微软 Excel
  • 让首席财务官的生活变得轻松,因为对花费的预算有 100%的把握,事实上这是他们一开始的决定!
  • 植根于任何人都容易理解的关于库存和销售的简单客观事实。

缺点:

  • 完全无视结果:无法保证影响、销售加速或投资回报,因为产品可能对价格不敏感
  • 不清楚如何验证预算水平的选择,因为没有迹象表明对多少产品(或多大程度)进行折扣是合适的
  • 最终,推动决策的原型是经理驱动的,而不是客户驱动的(拉动)。

简而言之,100%推送决策,Excel 友好。描述性降价没有错,但也没那么好。让他们成为我们的基准模型。

第一个,几乎是显而易见的,尚未回答的问题是:产品对价格有多敏感?当我把它们标下来的时候,我能期待什么样的加速度?

输入预测降价中使用的价格弹性概念。

方法 2:预测性降价

价格的变化,比如降价,会对销售产生什么样的预期影响?

常规答案是使用价格弹性:相关的 Wikipedia 文章对此解释得相对较好,因此我不会在此重复所有内容。

卡罗教授和加林在 2010 年写了一篇优秀的免费可得的科学论文,详细介绍了快时尚零售商 Zara 使用回归技术进行弹性降价的方法。

价格弹性高的折扣产品。

什么是价格弹性?长话短说,从价格的某个%的变化中,我能期望销售额有什么%的变化?例如,如果我的“价格弹性”是-2,那么-10%的价格变化(负号:这是折扣/降价)预计将产生+20%的销售量增长(-10% X -2 = +20%)。诸如此类。

为了计算这个系数,一种传统的方法是在适当的粒度级别上对历史价格运行历史销售量的回归。例如:按类别按商店按周。

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

弹性计算示例。图片来源: Evo 定价 (CC 带归属)

基于弹性,你现在可以通过应用任何降价百分比或价格变化来计算预期回报。

好处?例如,如果价格降低 10%,弹性系数为-2,你的销售量就会增加 20%。因此,如果我们以每件 10 美元的价格销售 100 件产品,收入为 1,000 美元,那么现在你将以每件 9 美元的价格销售 120 件产品(+20%)(-10%)。因此,您的新收入将为 1,080 美元,正收益+8%。

遍历弹性为-2 的所有可能组合的数学:

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

预测降价,弹性= -2 的例子。图片来源: Evo 定价 (CC 带归属)

这张图表简单地展示了如何根据预期影响选择最佳降价

  • 如果你想要最大的收益,那么-35%的降价是最佳选择
  • 如果你想要最大的利润,那么-15%的降价是最理想的
  • 如果你想两者兼得,那么降价 15%到 35%是最佳选择,这取决于收入和利润目标的相对重要性。

这种方法的问题是,虽然系数的 t 值相当好(价格确实影响销售),但模型的 R 平方并不太好。

当销售量很高时,所得到的价格弹性收敛到 0:量价关系的一维回归非常嘈杂。

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

弹性计算。图片来源: Evo 定价 (CC 带归属)

因此,与描述性模型相比,这种方法既有一些优点,也有一些明显的缺点。

优点:

  • 相对简单的方法,至少它的简单版本可以在像 Microsoft Excel 这样的电子表格中部分完成
  • 根据历史价格弹性,就降价投资的预算水平和预期影响提供指导
  • 植根于需求的价格敏感性数据,这增加了以客户为中心的流程的数量。

缺点:

  • 预测能力差:这些方法的 R 平方相对较差,因此该模型不完全符合目的
  • 预测仅在中间聚集级别可行,如商店/类别,因为项目级别的弹性通常无法确定
  • 有限的输入信号,因为价格不是影响销售的唯一因素,并且产品价格具有相互关联的影响,例如由于同类相食。

简而言之,50–50%的推动决策,对 Excel 有些友好。比描述性降价好得多,但在指导决策的能力方面仍然有限。

此时,下一个需要回答的问题是:如何考虑更复杂的输入信号?如何建立一个具有更大影响潜力的系统?

输入机器学习和说明性降价。

方法 3:指令性降价

由于价格不是影响销售的唯一因素,基于价格弹性的传统预测模型无法通过准确性测试。

向问题扔更多的数据怎么样?规定方法需要使用更先进的技术,如机器学习和自动化优化

在合适的时间给合适的产品打折。

当添加数据集时,回归和时间序列等传统方法在最初的几个数据集上表现出初步的性能提升,但当添加更多数据集时,它们会遇到共线性和噪声等问题,使它们越来越不适合使用。

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

R 的平方来自降价中的数据使用。图片来源: Evo 定价 (CC 带归属)

具体来说,在多达 7 个变量的情况下,回归模型的表现优于机器学习。

当数据的数量和种类增加时,机器学习胜过回归,实现更大的粒度和准确性。

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

附加输入数据集的增量贡献。图片来源: Evo 定价 (CC 带归属)

在降价方面,使用机器学习方法时的%预测误差,以及因此更大的数据集,明显更低。

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

规定降价的误差。图片来源: Evo 定价 (CC 带归属)

与总是简单的描述性方法的基线模型相比,这反过来释放了显著的财务收益。

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

规定降价的影响。图片来源: Evo 定价 (CC 带归属)

因此,与其他两种方法相比,这种方法提供了最多的优点,但也有一些缺点。

优点:

  • 更好的性能:更大的经济效益、准确性、输入信号的广度
  • 自学系统降低运营风险,在市场偏离预期时自动调整未来建议
  • SKU/商店级别的推荐粒度,有机会根据需要集成自定义规则和人工输入。

缺点:

  • 相对复杂的设置:需要更多的数据和专业知识来使用更先进的技术
  • 需要非常大的数据资产,以便能够自学和快速响应市场情况
  • 最终,一个先进的模型,在跨其他过程的更广泛的能力的背景下有意义,而不仅仅是降价。

简而言之,一个 0%的推,纯拉的决定;一点都不 Excel 友好。比描述性和说明性降价都好得多,即使只适用于注重分析的组织。

通过数据以客户为中心

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

通过数据以客户为中心。图片来源: Evo 定价 (CC 带归属)

归根结底,任何数据都是关于客户的。无论是直接的,如客户年龄、性别等数据,还是间接的,如天气、竞争等数据。

数据将客户注入到日常管理决策中。

使用的数据越多,管理决策就越以客户为中心。规范方法利用机器学习,以尽可能最好的方式使用最多的数据。

总结:三种方法

现在,您已经看到了使用数据的三种不同方法:描述性的、预测性的、规范性的。

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

分析方法的演变。图片来源: Evo 定价和【neuraldesigner.com】T4(CC 带归属)

发展您的分析方法需要勤奋和良好的以客户为中心,但最终可能价值数百万美元的日常影响。

快乐大减价!

PS 更多商业科学来自我的写作:

</94-perfect-the-surprising-solution-to-the-200-billion-inventory-problem-b6ba0bc1417a>

Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)

使用 PySpark 的购物篮分析

原文:https://towardsdatascience.com/market-basket-analysis-using-pysparks-fpgrowth-55c37ebd95c0?source=collection_archive---------5-----------------------

用 PySpark 的 FPGrowth 进行数据挖掘

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

由克莱姆·奥诺杰胡在 T2 拍摄

动机:

你想学习如何分析顾客购物篮中经常一起购买的商品吗?如果你愿意和 PySpark 的 FPGrowth 一起工作,就别再找了。

解决方案:

首先,让我们看看我们的数据框架(数据存储在我的 github 库)。如果你想使用谷歌的 Colab,你首先需要安装你的谷歌硬盘:

# To be able to use your data stored in your Google Drive you first need to mount your Google Drive so you can load and save files to it.from google.colab import drive
drive.mount('/content/gdrive')#You'll need to put in a token which Google will generate for you as soon as you click on the link.

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

输入令牌后,您的 Google Drive 就安装好了。

现在,我们将数据加载到我们的数据框架中,并查看:

import pandas as pd
import numpy as np
data = pd.read_excel(‘/content/gdrive/MyDrive/DDDDFolder/DDDD.xlsx’) 
data.head()

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

这就是我们的数据帧最初的样子。

因此,我们得到的是每个销售日的销售额、客户(例如,客户代码 0 是一个特定的客户)、销售项目(类似于客户,销售项目 0 是一个特定的销售项目)和销售交易 ID。

我们将分析与每个销售交易 id 的销售项目相关的市场篮。其他列对我们的数据挖掘不感兴趣。

要在 Colab 中安装 PySpark,我们必须使用我们的超级用户权限:

%%capture!sudo apt-get update --fix-missing!apt-get install openjdk-8-jdk-headless -qq > /dev/null!wget -q https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz#!wget -q https://downloads.apache.org/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz!mv spark-3.0.0-bin-hadoop3.2.tgz sparkkk!tar xf sparkkk!pip install -q findspark

之后,我们可以开始我们的 Spark 会话:

import osos.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"os.environ["SPARK_HOME"] = "/content/spark-3.0.0-bin-hadoop3.2"import findsparkfindspark.init()from pyspark.sql import SparkSessionspark = SparkSession.builder.master("local[*]").getOrCreate()spark = SparkSession \.builder \.appName('fpgrowth') \.getOrCreate()spark

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

当一切正常运行时,您会看到这条消息。

与熊猫不同,在 Spark 中创建数据帧,我们必须使用 Spark 的 CreateDataFrame:

from pyspark.sql import functions as F
from pyspark.ml.fpm import FPGrowth
import pandas
sparkdata = spark.createDataFrame(data)

对于我们的购物篮数据挖掘,我们必须将销售交易 ID 转换为行,因此每一行代表一个销售交易 ID,包括购买的销售项目。首先,我们确保每个销售事务 ID 对于其销售项目是唯一的(这就是为什么要删除重复项)。然后,我们按销售交易 ID 分组,并使用聚合函数的 collect_list 接收每个销售交易 ID(行)的所有销售项目:

basketdata = sparkdata.dropDuplicates(['SalesTransactionID', 'SalesItem']).sort('SalesTransactionID')basketdata = basketdata.groupBy("SalesTransactionID").agg(F.collect_list("SalesItem")).sort('SalesTransactionID')

结果现在看起来像这样,并且已经准备好供 FPGrowth 的算法使用:

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

现在,我们将计算市场篮子指标,如支持、提升和信心。请注意,MinSupport 等参数设置是非常具体的数据:

#Frequent Pattern Growth – FP Growth is a method of mining frequent itemsets using support, lift, and confidence.fpGrowth = FPGrowth(itemsCol="collect_list(SalesItem)", minSupport=0.006, minConfidence=0.006)model = fpGrowth.fit(basketdata)# Display frequent itemsets.model.freqItemsets.show()items = model.freqItemsets# Display generated association rules.model.associationRules.show()rules = model.associationRules# transform examines the input items against all the association rules and summarize the consequents as predictionmodel.transform(basketdata).show()transformed = model.transform(basketdata)

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

结果看起来就是这样。

这已经是我们的 FPGrowth 结果了。如果您想将其导出为 Excel 文件,您可以这样做:

# Convert the Spark DataFrame back to a Pandas DataFrame using Arrowresult_pdf = items.select("*").toPandas()
result_pdf.head()

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

result_pdf.to_excel('result_pdfItemsFreq.xlsx')

规则也类似:

rules_pdf = rules.select("*").toPandas()
rules_pdf.head()

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

rules_pdf.to_excel('rules_pdfAnteConseConfLift.xlsx')
transformed_pdf = transformed.select("*").toPandas()
transformed_pdf.head()

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

transformed_pdf.to_excel('transformed_pdfSalesTransactionIDCollectListPred.xlsx')

恭喜你,你已经成功地使用 FPGrowth 进行了数据挖掘技术!也许你已经发现了上一个截图中的列预测?这个“预测”为推荐系统搭建了一个非常好的桥梁。如果你有兴趣,请阅读我的相关文章。

非常感谢您的阅读!希望这篇文章对你有帮助。请随时在 LinkedInTwitter工作室与我联系。

https://jesko-rehberg.medium.com/membership

最初发表在我的网站 DAR-Analytics 。我的 Github 存储库中也有 Jupyter 笔记本和数据文件:https://Github . com/DAR-DatenanalyseRehberg/DDDD _ Data-Driven-deadlines-Development/blob/main/Market _ Basket _ DDDD . ipynb

由深度学习驱动的市场情报

原文:https://towardsdatascience.com/market-intelligence-powered-by-deep-learning-bb63dae49481?source=collection_archive---------72-----------------------

【tensorflow 能增加自由职业者赢得项目的几率吗?

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

克里斯托弗·高尔Unsplash 上拍摄的照片

根据最近的一份报告,美国有 5900 万自由职业者。自由职业者是全球性的,竞争非常激烈;人才供给高于工作需求。您可以在此财务业绩报告中了解更多关于不断变化的全球市场和 covid 影响的信息。

自由职业者面临多重挑战,其中两个挑战是:

  • 研究对他们技能/服务的需求
  • 寻找和赢得项目的难度

Freelancer.com 有一个优秀的 API,可以用来提取项目细节。它是一个丰富的数据集,有着令人尊敬的历史(超过 5 年);它既包含竞赛,也包含项目,虽然我只会涉及后者。

上述报告包含大量有用的信息(自由职业者简介、每个项目的平均出价、市场总量趋势等)。).在这篇文章中,我将尝试回答以下问题:一个项目被授予的概率能被准确地确定吗?

鉴于广泛的模式,我一直关注 2 个主要组件:

  • 项目详情
  • 用户详细信息

诚然,深度学习被视为解决当前许多问题的灵丹妙药,但围绕它有很多宣传。还有一种倾向(我也有这种倾向)是关注工具。在这篇文章中,我将重点关注深度学习可以增加的价值;具体来说,深度学习能否准确地帮助一个自由职业者只专注于那些将被授予的项目?最终,这不仅会节省自由职业者的时间,还会节省金钱,因为出价不是免费的;浪费在未中标项目上的投标将不予退还。

此时,您可能会问自己:在发布的所有项目中,有多少项目获得了奖励(我称之为项目奖励率)。根据我的计算(并在本分析的背景下考虑这一点),项目奖励率约为 30%。这看起来很有希望,但这个市场竞争非常激烈,因为每个项目平均有 45 个投标。因此,专注于将被授予的 30%的项目将节省时间和精力。当然,深度学习模型将为你提供一种可能性,这仍然是一种强大的洞察力。

所以我建立了一个 tensorflow 模型来预测一个项目是否会获奖。我只提取了 16 个工作/技能的项目和用户细节;一些例子:

  • 机器学习
  • 数据挖掘
  • 数据科学
  • 深度学习

以下是关于如何开发模型的一些高级步骤:

  • 提取和拆分数据
  • 使用 tensorflow keras 预处理归一化输入。例如,下面是货币的代码片段。在这种情况下,ds_train 是训练数据集
def get_category_encoding_layer(name, dataset, dtype, max_tokens=200): index = preprocessing.StringLookup(max_tokens=max_tokens) feature_ds = dataset.map(lambda x, y: x[name]) index.adapt(feature_ds) encoder = preprocessing.CategoryEncoding(output_mode=”binary”, max_tokens=max_tokens) feature_ds = feature_ds.map(index) encoder.adapt(feature_ds) return lambda feature: encoder(index(feature))currency_norm = get_category_encoding_layer(“currency”, ds_train, ‘string’, max_tokens=25)
  • 在模型中包括预处理。连接所有层和输入。我只有两个深层次的单位基于超参数调谐与keras-调谐器
currency_input = tf.keras.Input(shape=(None,), name=”currency”, dtype=’string’)currency_layer = currency_norm(currency_input)all_layers = tf.keras.layers.concatenate([ currency_layer, # rest of layers …])dense_layer_1 = tf.keras.layers.Dense(units=hp.Int(‘dense_layer_1’, min_value=2014, max_value=8048, step=64), name=”dense_layer_1", activation=’elu’)(all_layers )dense_layer_2 = tf.keras.layers.Dense(units=hp.Int(‘dense_layer_2’, min_value=1024, max_value=1024, step=32), name=”dense_layer_2", activation=’elu’)(dense_layer_1)award_pred = tf.keras.layers.Dense(1, name=”award”)(dense_layer_2)
  • 培训和测试
  • 将预测(概率)整合到图表中
app.layout = html.Div([dash_table.DataTable(columns=[{"name": i, "id": i} for i in df.columns],style_header={ 'backgroundColor': 'white','fontWeight': 'bold'},data=df.to_dict('records'),fixed_rows={'headers': True},filter_action="native",sort_action="native",sort_mode="multi",style_table={'height': '900px'},style_cell_conditional=[{'if': {'column_id': 'currency'}, 'width': '40px'},# rest of columns
]),html.Div(id='datatable-interactivity-container')])

除了上面详述的货币列,我还有以下变量作为输入(请注意,我包括数字、分类和文本):

  • 工作/技能类别(例如工程和科学)
  • 项目名称
  • 项目描述
  • 项目类型(每小时或固定)
  • 预算(最低和最高)
  • 平均出价
  • 投标计数
  • 雇主国家
  • 雇主历史/整体声誉
  • 雇主评论
  • 付款已验证
  • 存款已存入

以上是一小部分,自由职业者 API 提供了更多的细节。

训练数据集并不庞大(只有关闭状态的项目)。大约是 90K 记录。

我们通过为 1 个时期训练模型来回答这个问题:75%的准确度。

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

下面你有几个活跃的项目例子以及预测的概率。

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

如何提高模型 75%的准确率?几个领域:

  1. 添加所有项目(有 14M 个项目;我只用了 90K 左右)
  2. 添加更多变量(尤其是获奖者的详细信息)
  3. 调整模型架构

总而言之,这种模式的附加值可能是:

  • 自由职业者可以节省时间和金钱,因为他们可以专注于那些很有可能中标的项目
  • 启用平台公司(如自由职业者、upwork 等。)到:
  1. 确定并支持那些拥有高预算项目且中标概率较低的雇主

2.在高级会员计划中包含这些类型的见解

让我知道你的想法。

营销分析可视化— WordCloud

原文:https://towardsdatascience.com/marketing-analytics-visualization-wordcloud-c32bec445cae?source=collection_archive---------30-----------------------

PYTHON。数据可视化。分析。营销。

通过 Python 生成 WordCloud 可视化

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

作者图片

WordCloud 显示文本中使用最频繁的单词,其中文本的大小与其在文本中的使用频率成比例;字体越大,该单词在文档中出现的次数就越多。

因此,对于探索性的数据分析,WordCloud 可能会提供一些有趣的见解来跟进或调查

在这个练习中,让我们试试 Tripadvisor_Hotel_Review 数据集。这个可以从 Kaggle 下载或访问。

预赛

如果你还没有安装 WordCloud 软件包,你可以打开你的终端,输入:

pip install wordcloud

以下是我们的准备工作:

#Preliminaries
from wordcloud import WordCloud, STOPWORDS#For Data Manipulation
import pandas as pd#For cleaning the texts
import re#For the Mask
from PIL import Image
import numpy as np
import urllib
import requests#For Visualization
import matplotlib.pyplot as plt
%matplotlib inline

输入数据

df = pd.read_csv('data/tripadvisor_hotel_reviews.csv')
print(f'The row and column sizes, respectively of the table are {df.shape}')
df.head()

请注意,在本练习中,我们将只使用 review 列。

数据预处理

为了处理我们能产生的最好的词云,下面是我们在预处理阶段需要做的步骤:

  • 将所有文本组合成一个字符串
  • 将所有文本转为小写(不同大小写字母的计数不同)
  • 删除停用词

预处理—合并文本并转换为小写

这可以用一段简单的代码来完成:

text = df['Review'].str.cat(sep=', ').lower()

预处理—停用词

WordCloud 提供了一个不错的停用词列表,我们已经可以使用了。这包括经常使用的词,如“the”、“a”、“or”等,这些词可能会使我们的词云变得混乱

有一些方法可以发现比预期出现频率更高的潜在单词,我们可以随时将它们添加到我们的词云排除的停用词列表中。

虽然人们可以拆分文本并进行数值计算,但我选择先简单地生成 WordCloud,并简单地删除那些我们不想成为图像一部分的内容。

因为我已经看到了输出,所以我只想删除一个词:“n,t”。

# Adding to the list of stopwords
stopwords = list(set(STOPWORDS)) + ["n't"]

形象化

WordCloud 包的使用非常简单,参数也很简单。

wordcloud = WordCloud(width = 800, height = 800,
                background_color ='white',
                stopwords = stopwords,
                min_font_size = 10).generate(text)#After generating the WordCloud object, enter this to a plotting function# plot the WordCloud image                       
plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)

plt.show()

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

作者图片

这就是我们的基本词云。

可视化—屏蔽

对于那些想通过添加一些遮罩来改善这一点的人,我们可以通过选择 PNG 图像来实现。我对酒店图标不太满意,所以让我们选择一架飞机,因为它也是一个与酒店和旅游业相关的图标。

在选择蒙版时,选择带有白色背景的 png 或 jpeg 图像。计算机将彩色背景视为独立的对象,因此它可能无法捕捉到我们想要的形状。

我们可以得到一个免费使用的面具或图标。现在,在遮罩功能中,图像的白色部分的值应该是“255”,而不是 0。值 255 与白色相关联是更常见的(而黑色是 1),但为了以防万一,人们应该查看“遮罩”对象以防万一。阵列中的数字代表像素的强度。

mask = np.array(Image.open(requests.get('[https://www.freeiconspng.com/uploads/airplane-icon-image-gallery-1.png'](https://www.freeiconspng.com/uploads/airplane-icon-image-gallery-1.png'), stream=True).raw))

让我们选择一架飞机作为我们的图标,因为酒店住宿通常与旅行联系在一起。

目测遮罩对象:

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

图片由作者提供;像素值数组

因为我们的蒙版似乎用 255 作为白色值,我想我们可以用这个。

关于遮罩的注意:不是所有的东西都工作良好,你需要检查遮罩是否产生了我们想要使用的容器的预期形状。这个问题对于 3D 比 2D 更普遍。

可视化-将 2D 和 3D 遮罩从 0 转换为 255 的功能

如果您选择的掩码是 2D,并且您想将 0 值转换为 255,您可以使用以下函数:

def transform_format(val):
    if val == 0:#000080
        return 255
    else:
        return val# Transform your mask into a new one that will work with the function:
transformed_mask = np.ndarray((mask.shape[0],mask.shape[1]), np.int32)for i in range(len(mask)):
    transformed_mask[i] = list(map(transform_format, mask[i])

对于 3D 遮罩:

# Transform your mask into a new one that will work with the function:
transformed_mask = np.ndarray((mask.shape[0],mask.shape[1]), np.int32)for i in range(len(mask)):
    for y in range(len(mask[i])):
        transformed_mask[i][y] = list(map(transform_format, mask[i][y]))

带遮罩的 WORDCLOUD

处理完掩码后,我们现在可以将它用作 WordCloud 函数的参数输入:

wordcloud = WordCloud(background_color ='white',
                mask=mask,   
                stopwords = stopwords,
                min_font_size = 10,
                width=mask.shape[1],
                height=mask.shape[0],
                contour_width=1, 
                contour_color='#000080').generate(text)plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)

plt.show()

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

作者图片

理想情况下,我们选择的面具与我们视觉化的主题有关。另一个我们可以尝试的是星级面具,因为酒店是以星级的形式来评定的:

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

作者图片

单词云的颜色功能

单词云的一个有趣的输入是颜色函数。color function 参数接受一个函数,然后根据每个单词的特征输出一种特定的或不同的颜色(方案)。

去这个网站挑选你想要的颜色组合:https://hslpicker.com/

少数专业人士更喜欢使用单调的颜色,而不是绘图软件的默认配色方案。因此,我们可以编写一个函数来完成这个任务:

def one_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None):
    h = 204 #0-360
    s = 100 #0-100
    l = random_state.randint(30, 70) #0-100 As we want to randomize it per color, let's randomize this

    return f"hsl({h},{s}%, {l}%)"

使用此函数作为输入:

wordcloud = WordCloud(background_color ='white',
                mask=mask,   
                stopwords = stopwords,
                min_font_size = 10,
                width=mask.shape[1],
                height=mask.shape[0],
                color_func=color_func,
                contour_width=1, 
                contour_color='#000080').generate(text)plt.figure(figsize = (8, 8), facecolor = None)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.tight_layout(pad = 0)plt.show()

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

作者图片

用我们所知道的再玩一点,让我们尝试一个红色函数和一个心形的家用面具:

def red_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None):
    h = 0 #0-360
    s = 100 #0-100
    l = random_state.randint(30, 70) #0-100 As we want to randomize it per color, let's randomize this

    return f"hsl({h},{s}%, {l}%)"

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

作者图片

结束语

WordCloud 是一个优秀的数据探索工具,用于查看文本对象中最常用的单词。因此,它们是营销分析和情感分析的绝佳工具。

作为一个 EDA 工具,人们应该尝试探索可能从生成的可视化中产生的问题和见解。

最后,有许多方法可以定制,并使观众的视觉效果更加强大。数据科学家应该始终努力使用可视化工具,同时兼顾细心和创造力。

让我知道你的想法!

参考

https://www . data camp . com/community/tutorials/word cloud-python

https://towards data science . com/create-word-cloud-into-any-shape-you-want-using-python-d0b 88834 BC 32

营销自动化:客户流失预测

原文:https://towardsdatascience.com/marketing-automation-customer-churn-prediction-6001cf91d8ae?source=collection_archive---------18-----------------------

防止客户流失的最好方法是预测他们是否会离开你。这些分析和预测技术可能有助于防止或尽量减少客户流失。

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

内森·杜姆劳Unsplash 上拍摄的照片

客户流失是企业需要追踪的最重要的数据点之一。客户流失分析有助于您识别客户旅程中人们流失的关键阶段,让您能够精确定位特定策略,以改善他们与您的品牌的互动,并提高品牌忠诚度。

什么是客户流失?

客户流失率是客户离开你公司的比率。这可能是由多种原因造成的,例如转向竞争对手,由于糟糕的客户服务而取消订阅,由于接触点太少而停止与某个品牌的所有联系,等等。客户流失分析非常重要,原因显而易见:**客户流失意味着收入的直接损失。**为了了解业务损失的数量,我们可以使用流失率指标。

什么是流失率,如何计算?

流失率是一项业务指标,计算在给定时间内离开产品的客户数量除以剩余客户总数。了解客户流失对企业的健康和粘性至关重要,但实际计算它可能会不必要的复杂。

流失率公式的计算方法是,流失率除以客户总数:

客户流失数量/客户总数

其中,流失客户的数量是指在这段时间内,你拥有的客户总数中有多少人离开了你的服务。

如何定义流失?

正如您在这里看到的,我们可能会遇到一个问题,即如何定义客户。

对于有订阅的企业来说,这非常容易—我们只需要那些没有续订订阅的客户,我们可以将这些客户定义为流失客户。当然,可能会出现这样的情况,一些客户在结束后没有立即续订,或者由于使用的具体情况而在一段时间后续订,但一般来说这是很清楚的。

如何定义零售中的流失?对我来说,有点难。我们不能将客户定义为“不良者”,因为他们停止购买我们的产品已经有一段时间了。他们可能会因为不同的原因停止购买:

  • 季节性的
  • 产品的使用时间

对于这种情况,我们可以像前面的情况一样使用一些业务规则。例如,我们可以使用频率指标(客户购买/使用我们产品的频率,以天/周/月为单位)。那么,怎么用呢?

首先,我们需要计算某段时间内的频率度量,而不是交易量。这很简单,公式如下:

  1. 选择测量频率的时间长度。
  2. 用事件发生的次数除以时间长度。

下一步,我们需要定义业务规则——必须跳过多少“频率”,我们才能将客户定义为流失。

例如:

顾客 A 每周购买一次我们的产品。我们定义,如果跳过 2 个频率,客户就会被搅动。在我们的例子中,这意味着,如果我们的客户 A 连续两周没有购买,我们会将其定义为流失客户。

这个方法很简单,但他只是陈述了客户流失的情况。

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

不幸的是,原创迷因需要许可证(图片由作者提供)

我们可以计算一下我们的损失,然后试着退回一部分。这种策略比留住客户的成本更高。客户保留是指公司将客户转化为回头客并防止他们流失的能力。

以下是我们从数据中获得的信息示例(参见之前的分析):

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

基于规则的客户流失分析(图片由作者提供)

我们也可以计算平均货币损失。要做到这一点,我只需将平均购买量乘以他们必须购买的时间。

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

规则库收入损失(作者图片)

要使用这种策略,我们需要定义有流失风险的客户,在这种情况下,我们需要预测未来一段时间的流失概率。这样的策略让我们有时间对有风险的客户采取一些行动,以防止他们流失。

数据科学的时代到了。

第一种方法,我想称之为买到死

购买到死(BTYD)类统计模型旨在捕捉非合同客户的行为特征,或者当公司无法直接观察到客户何时不再是某个品牌的客户时。目标通常是对客户流失和客户终身价值进行建模和预测。

BTYD 模型共同模拟两个过程:

  1. 重复购买过程,解释了客户在“活着”时购买的频率;
  2. 流失过程,模拟客户在任何给定时间段内流失的可能性。

BTYD 模型的常见版本包括:

在我的实验中,我将使用 lifetime 的包。

我将训练 BG/NBD 模型来估计给定时间段内的预期销售额,例如未来半年(180 天)。

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

未来 6 个月的预期购买数量(图片由作者提供)

因此,我们可以看到未来 6 个月预期销售额的下降趋势。我们来分析一下每个时间段的存活(流失)概率。

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

活着的概率(图片由作者提供)

同样的情况——我们的客户存活的可能性在下降。这个指标在动态分析中非常有用,因为在两个时间段之后,我们可以找到这个指标下降的地方,并开始采取一些措施来保持客户端。

比如我们拿两个客户来做这样的分析。

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

两个不同客户的存活概率(图片由作者提供)

橙色顾客存活的概率会略微下降,但蓝色顾客存活的概率会大幅下降。我们可以对 CRM 中的每个客户进行这样的分析,并配置一个触发器,在降幅巨大时向我们发出信号。

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

CRM 中的 Alam 示例(图片由作者提供)

更重要的是 CLTV。顾客终身价值是指顾客作为付费顾客的整个过程中会给你的品牌带来多少钱。一目了然,CLTV 告诉你一个客户对你的品牌有多大价值,并让你洞察他们的整体价值。从那以后,你会更好地理解你应该在留住客户上投资多少。

客户终身价值提示你是否可以期望某些客户成为回头客。如果他们的客户终身价值很高,他们很可能是你品牌的粉丝,会继续购买你的产品。如果没有,他们可能只是一个被动的客户,只购买了一次,需要付出额外的努力才能再次参与进来。

让我们分析一下 CLTV 分布。

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

CLTV 各时期的密度图(图片由作者提供)

我们可以看到,我们失去了 CLTV,这意味着我们失去了他们对我们品牌/商店的忠诚度。

我们可以为每个客户分析同样的事情:

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

客户的 CLTV 分析(图片由作者提供)

正如你所看到的,BTYD 算法非常好,它可以提供基于新近性、频率和货币的广泛的客户分析,但这也是这种方法的弱点。

让我们使用一些机器学习算法来预测未来 6 个月的客户流失。在这个实验中,我将使用 sci-kit-learn 中的 XGBoost。

因此,我可以分析变量的重要性,这将有助于我确定为什么客户想要离开。

我有在客户细分期间准备的所有数据,这将是我的特征,1- P(活跃)将是我的标签。以下是我在模型训练期间使用数据以避免数据泄漏的策略。

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

用于训练的数据(图片由作者提供)

同样,让我们检查我们的特征和目标之间的相关性。我将展示直接和间接相关的 10 大特征。

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

间接相关(图片由作者提供)

这些特征告诉我们,这些特征越大,我们流失的可能性就越小。这只是线性依赖,但有时很有趣。

例如,在这张图表上,你可以看到顾客在每个男包上花费的金额越大,流失的可能性就越小。

让我们分析同样的,但直接相关。

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

直接相关(图片由作者提供)

最有趣的是,在我们的案例中,只有一些城市与客户流失有直接关联。

好了,让我们建立模型并分析特征的重要性。

我将训练 XGBoost 回归模型来预测下一期的流失概率。这将是一个非常简单的模型,只显示功能和最有趣的特性的重要性。

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

XGBoost 功能重要性(图片由作者提供)

通常,重要性提供了一个分数,该分数指示每个特征在模型内的增强决策树的构造中有多有用或有价值。在决策树中,一个属性被用来做关键决策的次数越多,它的相对重要性就越高。

一个更有趣的方法是用 SHAP 值计算重要性。

在 Xgboost 中计算特性重要性的方法是使用 SHAP 包。它与模型无关,并使用博弈论中的 Shapley 值来估计每个特征对预测的贡献。

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

对模型输出幅度的平均影响(图片由作者提供)

这将获取整个数据集的 SHAP 值的平均值,并将其绘制为一个简单的条形图。

让我们继续,让 SHAP 总结剧情。

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

SHAP 摘要图(图片由作者提供)

我们没有使用典型的要素重要性条形图,而是使用每个要素的 SHAP 值的密度散点图来确定每个要素对验证数据集中个体的模型输出的影响程度。要素按所有样本的 SHAP 量值总和排序。有趣的是,关系特征比资本收益特征具有更大的总体模型影响,但是对于那些资本收益很重要的样本来说,它比年龄具有更大的影响。换句话说,资本收益对少数预测的影响很大,而年龄对所有预测的影响较小。

请注意,当散点不在一条线上时,它们会堆积起来以显示密度,每个点的颜色代表该个体的特征值。

此外,我想绘制 SHAP 瀑布。

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

SHAP 瀑布(作者图片)

瀑布图旨在直观地显示每个特征的 SHAP 值(证据)如何将模型输出从背景数据分布下的先前预期移动到给定所有特征证据的最终模型预测。当模型中的要素数量超过 max_display 参数时,要素按其 SHAP 值的大小排序,最小大小的要素组合在一起,位于图的底部。

好的,正如你所看到的,我的模型非常简单,所以很少有关于特征重要性的见解。为了使这种分析更有趣,我们需要一个更复杂的模型和更广泛的特性。

结论

因此,正如你所看到的,这些方法是一个强大的工具,可以帮助你预测客户流失,并且解释为什么你的客户流失。

识别对提供的解决方案不满意的客户的能力使企业能够了解产品或定价计划的弱点、运营问题以及客户的偏好和期望,从而主动减少客户流失的原因。

最后,再一次说明客户流失的重要性:

首先,一个被激怒的顾客很可能是一个不快乐的顾客。除了损失他们的消费,你还可能受到负面口碑、差评的影响,从而损害你的整体品牌价值。仅仅因为这个原因,就有必要联系那些处于危险中的客户,尝试修复关系。

其次,人们常说,保持现有客户比获得新客户成本更低,价值更高。关于这一点的统计数据和数字各不相同,有些人认为客户终身价值比获得或保留等单一成本维度更重要,但无论从哪个角度看,维持现有关系通常比放弃并从头开始更有意义。

你能在 Git 仓库中找到的所有代码— 链接

营销自动化——客户细分

原文:https://towardsdatascience.com/marketing-automation-customer-segmentation-5924b45556b5?source=collection_archive---------14-----------------------

你了解你的顾客吗?客户分析变得至关重要。这些见解推动了企业的销售、营销和产品开发工作,研究表明,使用客户分析的公司利润更高。

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

阿列克斯·多罗霍维奇在 Unsplash 上的照片

顾客可以随时随地获得信息,包括去哪里购物、买什么、付多少钱等等。这使得利用预测分析和数据来预测客户在与品牌互动时的行为变得越来越重要。

客户分析的目标是创建一个单一的、准确的客户视图,以决定如何最好地获取和保留客户,识别高价值客户并主动与他们互动。对顾客的购买习惯和生活方式偏好了解得越多,预测行为就变得越准确,顾客的旅程就变得越好。如果没有大量准确的数据,从分析中得出的任何见解都可能非常不准确。

在本文中,我将展示如何创建客户分析仪表板,以及如何在现实生活中使用这些信息。对于这个实验,我将使用 Kaggle 数据集— 零售店案例研究数据集

首先,我们来做探索性的数据分析,把我们的数据从不同的垃圾中清理出来。

该数据集包含以下表—客户、交易和产品。事务表包含以下列:

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

交易表头

  • transaction_id —事务标识符;
  • 客户标识—客户标识符;
  • 交易日期—交易的日期;
  • prod_subcat_code —产品子类别标识符;
  • prod_cat_code —产品类别标识符;
  • 数量——产品数量;
  • 费率——产品价格;
  • 税费—本次采购的税费;
  • total _ amount—采购价值+税;
  • Store_type —进行购买的商店的类型;

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

交易表信息

我在事务表中有将近 23K 的记录没有空值。它是一个玩具数据集,但在现实生活中,我们必须在使用前仔细检查和清理。

客户表包含以下列:

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

客户表格标题

  • customer_Id —客户标识符;
  • DOB——客户生日;
  • 性别—客户性别;
  • city_code —客户在商店中注册的城市;

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

с客户表信息

customer 表有 5647 个不同的客户,看起来有些客户没有关于性别和城市代码的信息。如何处理这样的问题,我将在后面说明。

产品表包含以下列:

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

产品表格标题

  • prod_cat_code —产品类别标识符;
  • 产品类别名称;
  • prod_sub_cat_code —产品子类别标识符;
  • prod_subcat —产品子类别名称;

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

产品表信息

product 表有 23 个唯一的子类别,没有空值记录。

让我们加入我们的表,并对我们的事务表进行深入分析。我想检查以下信息—日期变化、交易表中有多少客户,以及他们购买了多少最受欢迎的产品。

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

完整数据集分析

下一个分析将是我们的数量、价格、税收和价值列,以分析一些汇总统计数据。

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

汇总统计数据

正如我所写的,这是玩具数据集,所以我们没有任何异常值,我们唯一拥有的是负值,但这意味着我们已经获得了有关з购买回报的信息,我们将在进一步的分析中使用。

我们开始做客户细分吧。第一个是 RFM 分析。对我来说,这是了解你的客户最简单快捷的方法之一。那么,什么是 RFM 分析呢?

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

作者的 RFM 形象

RFM 是一种用于分析客户价值的方法。它通常用于数据库营销和直接营销,在零售和专业服务行业受到特别关注。

RFM 代表三个维度:

  • 最近度 —顾客购买了多久?
  • 频率——他们多久购买一次?
  • 货币价值——他们花了多少钱?

这种技术还有其他变体:

RFD新近度、频率、持续时间是 RFM 分析的修改版本,可用于分析观众/读者/冲浪导向的商业产品的消费者行为。

RFE新近度、频率、参与度是 RFD 分析的一个更广泛的版本,其中参与度可以定义为包括访问持续时间、每次访问的页数或其他此类指标。

RFM-I近期、频率、货币价值—互动是 RFM 框架的一个版本,修改后用于说明与客户营销互动的近期和频率(例如,控制非常频繁的广告活动可能产生的威慑效应)。

RFMTC新近性、频率、货币价值、时间、流失率由 I-Cheng 等人(2009)提出的一个扩展的 RFM 模型。该模型利用概率论中的伯努利序列,并创建公式来计算客户在下一次促销或营销活动中购买的概率。该模型已由 Alexandros Ioannidis 在输血和 CDNOW 数据集等数据集上实现。

我们需要做的第一件事是计算一段时间内数据集中每个客户的三个值— 最近度、频率、货币。我想以过去 3 个周期的半年为基础进行计算。

下一步是根据客户的近期、频率和货币价值创建三个不同的组,这将有助于我们命名我们的客户群。RFM 分数是最近值、频率值和货币值的简单总和,这个总和是 10、9、8 等整数值的结果。该分数将表明 RFM 分数的价值,它将允许我们对业务产品或客户做出决策。这是一个非常重要的指标,因为未来的决策过程涉及到用户或客户。

在最后,我们有三个时间段的 RFM 分析。

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

作者的 RFM 分析

但是,你会问——它是如何使用的?首先,我们可以计算不同时期的一些全局,并对其进行动态分析。

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

RFM 得分分析

这很有趣,但让我们用我们的 RFM 分数命名值。

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

RFM 分数名称分析

这里我们可以看到,在过去的 1.5 年里,我们增加了顶级客户的数量。

让我们分别深入探讨 RFM 价值观,并对其进行动态分析。

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

新近动态分析

我们延长了购买间隔时间,这表明客户参与度有所下降。

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

频率动态分析

降低中低消费群体的平均购买数量。

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

货币动态分析

在这里,我们可以看到高收入群体的收入略有增加,中低收入群体的收入有所减少。

为了得出一些结论,我们需要知道的下一步是对每个客户端进行深入分析,这有助于我们了解组之间的流量。

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

RFM 等级流程图

在这里,我们可以看到在过去半年中从一个组迁移到另一个组的用户数量。

正如你所看到的,RFM 分析很容易实现,但是为我们分析它提供了大量的变量。我展示的那部分,只是 RFM 能告诉你的关于你的客户的一小部分。

我们接着做进一步的分析。下一步是队列分析。我想对 2011 年做这样的分析。这种分析仅仅基于日期值。定义群组是群组分析的第一步。让我们试着根据每个客户进行第一笔交易的月份(由于发票日期而收到发票号)来创建每月分组。为了建立适当的群组,下一步是计算每个客户交易的时间偏移。这将允许我们以适当的方式报告每个群组的指标。为了创建时间偏移,我将创建一个函数,将日期拆分为年、月、日列。这将有助于根据时间日期轻松进行计算。

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

留存率图表

客户保持率是一个非常强大的指标,可以用来了解有多少客户仍然“活着”(或活跃)。在此之前,留存率向我们显示了活跃客户占总客户的百分比。

行为分析和客户分析的另一个有用指标是计算客户在商店购买的产品的平均数量,并将其可视化在类似的群组表中,如上面的留存分析。

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

顾客购买产品的平均数量

正如你在玩具数据集中看到的,我们全年的顾客行为基本没有变化。

现在是时候利用数据科学算法的力量来构建客户群了。首先,在开始构建模型之前,我们需要对数据进行预处理。我将向您展示数据预处理步骤中使用的几个概念和其他注意事项。在构建和预处理管道之后,我将向您展示如何构建称为 K 均值聚类的流行机器学习算法,该算法将基于我们计算的 RFM 分数和我们稍后计算的其他因素。这将有助于我们根据用户的客户行为指标来明确和识别用户。

什么是 K-Means 聚类,为什么使用这种算法?

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

收敛k——意为

  • K-Means 是识别不同模式的最流行的无监督学习方法之一
  • K-Means 简单快速
  • 适用于大型数据集

在构建 K-Means 算法之前,有一些关键的假设:

  1. 所有变量必须对称分布,不应有偏差。
  2. 所有变量应该具有相同或几乎相同的平均值。
  3. 所有变量应该具有相同的方差水平。

好了,让我们创造一些额外的因素,使集群更丰富和有趣。Ler 从客户的社会人口统计信息开始。我有我想使用的关于生日、性别和城市的信息。对于出生日期,我将在最大交易日期计算用户的年龄、性别,以及我将使用 One Hot Encoding 技术转换的城市。因此,我得到了下面的客户表,我将把它加入到 2014 年 12 月 2 日进行的最后一次 RFM 分析中。

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

客户建议的表格

下一个功能将建立在类别和交易信息的基础上。这将是每个客户按类别购买的平均值。

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

类别/交易特征

这就是我想在这个实验中使用的所有功能,但是数量和多样性只取决于您的业务需求和工程师的幻想。

由于算法限制,需要时间来预处理所有这些数据。我们可以使用一些提示和技巧:

  • 我们有几种方法来消除数据的偏斜。第一个是对数变换。但是对数变换只适用于正值。
  • 另一种消除偏斜的方法是广泛使用的 Z 变换,它对数据中的混合(正负)值很有效。

此外,我将在工作中解释不同的方法。这里有足够的信息来深入研究这项工作。

进一步的数据探索任务是识别偏斜度。偏斜度是对称(或缺乏对称)的度量。如果数据集在中心点的左侧和右侧看起来相同,则数据集的分布是对称的。直方图是显示数据偏斜度的有效图形技术。

通常,有 3 种类型的偏斜度:

  1. 左偏数据
  2. 正态分布数据
  3. 右偏数据

我将使用 z 变换,因为我得到了一个负值,我想在我的分析中使用。

我们需要做的下一件事是确定集群的数量。如何识别集群的数量?在 KMeans 算法中,有几种方法可以确定聚类数:

  • 目测法——所谓的弯头法(或弯头标准等)。)
  • 这种定量方法叫做轮廓系数
  • 实验和想象

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

肘形图

我有太多的因素,所以为了使我的分析有意义,我需要建立许多集群。我想留下 20 个微团做进一步分析。

此外,我想向您展示如何计算基本指标来确定 Kmeans 算法的“适合度”。

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

属性的相对重要性

这样的图表可以帮助你分析属性的相对重要性。

此外,还有一个更有用的图表——蜘蛛图,它可以帮助我们分析聚类之间存在差异的因素

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

蜘蛛图

在这里,我们可以看到,这四个分类的最大区别在于客户在自己的分类中购买的商品类别。

这就是我想在这个分析中展示的全部,现在是下结论的时候了。

结论

因此,正如你所看到的,这些方法是一个强大的工具,可以帮助你更好地了解你的客户。

细分可以让企业更好地利用营销预算,获得相对于竞争对手的竞争优势,更重要的是,展示出对客户需求的更好了解。它还可以帮助:

  • 营销效率——将庞大的客户群分解成更易于管理的部分,从而更容易识别目标受众,并使用最相关的渠道向最相关的人发起营销活动。
  • 确定新的市场机会——在将客户分组的过程中,您可能会发现您已经确定了一个新的细分市场,这反过来可能会改变您的营销重点和策略。
  • 更好的品牌策略——一旦你确定了客户的关键激励因素,如设计、价格或实际需求,你就可以恰当地给你的产品打上品牌。
  • 改善分销策略—确定客户在哪里购物以及何时购物可以为产品分销策略提供信息,例如在特定的商店销售什么类型的产品。
  • 客户保留——通过细分,营销人员可以识别出需要额外关注的群体、流失迅速的群体以及潜在价值最高的客户。它还可以帮助创建有针对性的策略,吸引客户的注意力,并为您的品牌创造积极、高价值的体验。

所以,不要害怕,开始让你的营销策略更有效率和利润。

你能在 Git 仓库中找到的所有代码— 链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值