数据分析中哪种建模工具最赚钱?
很多时候我们发现自己的业务数据看似不错,但最终的转化量却很低,这说明业务转化率是有问题的。在数据分析中,有一个至关重要的建模工具可以很好的解决这个问题。它是漏斗分析模型。你可能已经从我的上一篇文章 数据分析中的五大思维方法 s 中知道了这一点。今天我就来详细介绍一下这个漏斗模型。
1.什么是漏斗分析?
漏斗分析模型,简单来说就是营销产品的一个过程。而我们需要观察这个过程中每一步的转化和损失。
关于实际应用场景中的漏斗模型,人们期望的不外乎两点:
- 大量转换
- 最终转化率高
对于这两个目标,可行的措施是:
- 增加初始流量
- 提高每个关键点的保留率
2.漏斗分析的关键是什么?
一般来说,漏斗分析是有顺序的,这种顺序体现在关键节点的路径上。在有序的漏斗中,路径越来越窄。换句话说,每一步留下的数据量不能大于前一步留下的数据量。如果不满足这个条件,说明关键路径的流程顺序可能有问题,我们应该调整路径顺序。
3.如何进行漏斗分析
3.1 目标
和任何数据分析一样,漏斗分析的第一步也是设定目标,即了解自己到底想做什么,想得到什么结果。例如,在商业营销活动的漏斗模型中,目标是实现业务和盈利。并且为此目的确定以下五个步骤。
- 第一步:投放广告。提高用户对品牌的认知度。
- 第二步:看广告。增加用户对产品的兴趣。
- 第三步:评估产品。用户将根据他们对品牌的认知和对产品的兴趣来决定是否购买。
- 第四步:为产品付款。用户将在评估后购买他们感兴趣的产品,并达成交易。
- 第五步:重复购买。一些用户会继续购买。他们也可能向亲戚朋友推荐该产品。
3.2 变量
变量是能够影响漏斗分析结果的因素。它们分为自变量、因变量和中介变量。
在组织行为学中,因变量是要测量的行为反应,自变量是影响因变量的变量。
在上面的模型中,因变量是广告观看率、产品支付率、再购买率等。以及广告渠道(如电视、报纸、杂志、地铁、网站等。),观看广告的用户的年龄,用户的位置,他们的爱好和他们的经济条件是影响因变量的自变量。
中介变量 因变量和自变量中引起中介。它们减少了自变量对因变量的影响。中介变量的存在使得自变量和因变量之间的关系更加复杂。
中介变量是我们需要干预的变量。我们要无限解构它来影响自变量。
From Neil Patel
在上面的传统漏斗模型中,假设我们的品牌是高端奢侈品,我们需要分析独立变量,如广告渠道、用户年龄和广告服务区域。我们最终发现我们的广告区域太广,成本太高。
然后我们盯着广告区。我们看到偏远地区的广告比例比较高。这个时候,我们发现问题了吗?我们可以缩小广告投放区域。在大城市重点做广告会不会更好?
理想的情况是,我们可以一步步解构问题,找到唯一的变量。然后我们就能准确定位问题并解决,这就带来了用户的增长。
3.3 关系
一旦我们确定了目标和影响我们目标的各种变量,我们需要研究变量之间的关系。
在确定变量之间的关系时,要谨慎判断哪个是原因,哪个是结果。不能因为两个变量之间的统计关系,就说两个变量之间有因果关系。
比如我们说用户增长,更多说的是获取客户。我们并没有考虑如何提高现有用户的转化率和激活率。我们真的需要思考如何让用户成为忠实用户。只有忠实的用户才不会流失,带来更多的收益。
通过漏斗分析,可以还原用户转化的路径,分析每个转化节点的效率。
- 从头到尾的整体转化率是多少?
- 每一步的转化率是多少?
- 哪一步我们失去的客户最多?为什么?那些客户符合什么特征?
4.谈到大数据,您使用什么工具进行漏斗分析?
说到大数据,用 Excel 等工具很难做到高效的漏斗分析。一般的做法是使用类似 FineReport 这样的专业数据分析工具搭建一个 仪表盘 ,在这里我们可以很方便的进行漏斗分析。下图是 FineReport 漏斗模型的两种形式。(这个工具的个人版完全免费。)
FineReport 的漏斗图也有自动排序功能。
当我们进行业务分析时,也有很多使用漏斗分析的场景。
保险仪表板
From FineReport
旅游仪表盘
From FineReport
投资仪表板
From FineReport
外卖销售仪表盘
From FineReport
专业数据分析工具的优点是方便。工具本身有各种漏斗模型。你只需要拖拽就可以完成漏斗分析,这是用 Excel 很难实现的。所以建议使用专业软件。如果你有兴趣,可以阅读这篇文章2019 年 6 大数据分析工具 。
您可能也会对…感兴趣
原载于 2019 年 4 月 30 日http://www.finereport.com*。*
超越演讲时间:民主党总统辩论分析
使用真实世界数据进行预测建模的数据准备和特征工程
Source: This LA Times article
随着我们在严重的政治两极分化的气氛中步入新的一年,我意识到我从来没有像过去一年这样关注这个国家的政治——这意味着我现在每天早上都听每日播客,甚至完整地观看了两三场直播的民主党初选辩论。
每次辩论后的第二天,我的新闻订阅源就会被评论、镜头和对候选人谈论的以及他们谈论了多少*的分析所淹没。但是我注意到缺少关于他们在辩论台上如何谈论的信息。*****
当我们举杯庆祝 2010 年代的最后一年,以及定于 12 月 19 日举行的第八次也是最后一次民主党总统候选人辩论时,我认为通过一点探索和数据分析来弥合这一差距是不错的。
在这篇文章中,我将:
- 简单概述一下我是如何预处理从互联网上搜集的原始文本的。
- 用熊猫对候选人的话语进行比较分析,看看谁最以自我为中心,谁最面向未来,谁说话最华丽。
12 月 12 日之后(这是候选人必须满足所有捐助者和投票要求的最后日期,以便有资格参加下一场辩论),我将获得我需要的所有信息:
- 使用 scikit-learn 建立一个分类模型,仅使用本文中确定的语音特征来预测谁将有资格参加 12 月 19 日的辩论。敬请关注!(而且现在是这里。)
快速浏览原始文本
截至今天(2019 年 12 月 7 日),我们已经为 2020 年大选完成了总共八场民主党初选辩论:
Source: https://en.wikipedia.org/wiki/2020_Democratic_Party_presidential_debates_and_forums
我从一个来源收集了辩论记录,《华盛顿邮报》(从 2019 年 6 月到 2019 年 11 月)。这里有一个的例子,里面看起来是这样的:**
文本的每个 块 (例如,上面用灰色突出显示的部分)对应于 HTML 源代码中的一个<p>
标记,您可以通过突出显示文本的一部分并右键单击“Inspect”来找到它。注意,每个说话人的边界都由一个 说话人标签 表示,这是说话人的姓,全部大写(“BIDEN”、“COOPER”等)。).我将每个块中扬声器标签后面的部分称为 段 。由于只有第一个连续的相同说话者块包含一个说话者标记,因此有必要将原始文本的每个块重新整形为一个标记段对,如下所示:
**# block 1
**Speaker tag**: BIDEN
**Segment**: Look, my son's statement ... no potential conflict,# block 2
**Speaker tag**: BIDEN
**Segment**: My son made a judgment ... we should be focusing on.# block 3 **Speaker tag**: COOPER
**Segment**: Senator Sanders, your response?**
到达那里可不是一件简单的事情。事实上,我认为我在这个早期预处理步骤上花的时间比这个项目的任何其他部分都多,但是花费必要的时间将您的数据转换成分析所需的精确格式,并建立一个简化的预处理管道以便在将来轻松接收和转换任何新数据总是值得的。以下是这一早期但重要的步骤的一些主要组成部分:
1.提取<p>
块
2.将原始文本转换为说话者片段元组
3.把所有东西放进一个数据框架
输出:
Transcript text in a dataframe
我们现在准备好了一些严肃的乐趣——提取特征来用数字表示候选人的演讲。在下面的分析中,我删除了所有包含版主(如 Cooper)发言片段的行。我没有排除像(APPLAUSE)
和(CROSSTALK)
这样的转录,如果它们与候选之一相关,以防它们在以后成为重要的特征。在这之后,我有了 4069 行。
**# subset the dataframe based on speaker info
df = original_df[original_df['speaker'].isin(CANDIDATE_NAMES)].reset_index(drop=True)df['speaker'].value_counts().sum() #4069**
候选人语音比较
为了比较候选人的话语,有必要将这些片段转换成数字表示。我用空间到写规则来提取下面的大部分特征。我将在下面的代码块中强调其中的几个,但是你可以在这里查看完整的脚本。
⏳谁说得最多?
拜登和沃伦在segment length
(所有辩论的总票数)和number of sentences
两个方面发言最多。值得注意的是,在我们的顶级竞争者中,桑德斯发言最少,略微落后于哈里斯**、布克、 Buttigieg 和**克洛布查尔。这些发现似乎与候选人的发言时间 相关。
****
顺便说一句,这篇文章中的大部分条形图都可以用类似这样的图形来表示:
**import matplotlib.pyplot as pltmean_df = original_df.groupby('speaker').agg('mean')
mean_df[['segment_length']].sort_values('segment_length', ascending=False).plot(kind='bar')**
**另一个要考虑的长度特性是mean sentence length
,它是通过将标记(单词)的总数除以每个片段的句子数并在所有片段中取平均值来计算的。该图显示了 **Gabbard、O’Rourke、和 Steyer 设法使符合其句子中的最大字数:
同样的三个候选人在句子长度上也表现出最大的差异,这是由standard deviation of sentence length
(在标记中)确定的。换句话说,他们很好地混合了长句和短句(这可能是你的高中英语老师希望你在作文中出现的)。
图表右端的候选人,包括斯威尔和德莱尼**,在他们的演讲中并没有改变太多的句子长度。事实上,结合上图,我们可以推断两个候选人一致地说出短句。**
将文本转换为空间Doc
提供了一种简单的方法来提取这些长度特征:
🤹谁说得最详细?️
也就是说,谁的演讲表现出最大程度的句法复杂性?我用了两个特征来衡量这个:number of complex clauses
和number of words before the main verb
。
我将复句定义为在论元结构(“主语”、“宾语”等)方面比简单的及物或不及物句子更复杂的任何句子级结构。),包含状语从句修饰,和/或包含嵌入从句。例如:
- 与格结构包含两个内部论元,一个直接宾语和一个间接宾语:“我把钱给他了。”
- 从句:“如果你想改变世界,你必须每天早上整理床铺。”
- 从句补充道:“我从未想过她会这么早退出竞选。))
在一个句子中有一个或多个这样的属性会增加它的整体句法复杂性。
Number of words before the main verb
专门衡量动词前结构的复杂程度。主动词前的文本越长,越有可能包含从句修饰词(和/或主语修饰词)。这是对句法复杂性的一个非常粗略的度量,但是它很快给了我们一些有用的东西。
在下面的标准化图表中,我们看到 Gabbard 和 Steyer 的演讲在这两个方面都表现出最大程度的复杂性。在光谱的另一端, Bennet 和 Inslee 表现出最少的句法复杂性,这可能表明他们坚持使用非常简单的句子形式(即主语-动词-(宾语)),并且缺少条件“if”语句或并列短语等从句修饰语。
Swalwell 表现出了一种有点反常的模式:他在 T1 上得分最低,T1 衡量了说话前和说话后的复杂性(但主要是后者),但他在另一项衡量指标 T2 上仅略高于中间水平。这种复杂性轨迹的不对称性表明,虽然他的主要动词后面的部分往往简单而简短,但他在如何打开句子方面却相当一般(即,在主要动词之前)。
值得注意的是,已经有资格参加 12 月 19 日辩论的六名候选人中的四名——桑德斯、沃伦、拜登和哈里斯**——表现出相对较低的句法复杂度,这表明他们在辩论舞台上的发言相当简单。**
以下是用于提取这两个句法特征的基于空间的函数:
Two functions used to extract syntactic features
🧸,他的演讲对五年级学生来说是可以理解的?
与句法复杂性密切相关的一个范畴是可读性。我使用了 textstat ,这是一个 Python 库,提供了多种统计数据来衡量一段文本的可读性。网站上描述了不同的衡量标准,但由于怀疑其中一些是相关的,我创建了一个快速关联矩阵,采用了这里的实现:
**import seaborn as snsREADABILITY_FEATURES = ['n_difficult_words',
'automated_readability_index',
'coleman_liau_index',
'dale_chall_readability',
'flesch_kincaid_grade',
'flesch_reading_ease',
'gunning_fog',
'linsear_write_formula',
'smog_index',
'text_standard']corr_matrix = df[READABILITY_FEATURES].corr().abs()
fig, ax = plt.subplots(figsize=(9,5))
sns.heatmap(corr_matrix)**
Correlation matrix of readability features
在浅色像元处相交的特征高度相关,例如gunning_fog
和linear_write_formula
,在较小程度上还有flesh_flesch_kincaid_grade
和flesh_reading_ease
,以及text_standard
和gunning_fog
。
根据 textstat 网站的描述,text_standard
是一种综合衡量标准,它根据所有其他测试返回理解文本所需的估计分数水平,所以我选择在这里绘制这个图表:
**df.agg('mean')['text_standard']
6.077291717866798**
平均来说,大多数演讲者的水平是六年级学生能够理解的。Steyer 和 Gabbard 说话的水平略高,八年级及以上的学生可以理解,这与他们表现出的最高水平的句法复杂性相吻合,如上所述。
这两个候选人在number of difficult words
(每段)上得分最高,这是另一个可读性指标,它与其他任何指标都不相关。请注意,我们的领跑者之一沃伦在每段发言中使用的难词最少。(她也是text_standard
上得分最低的人之一,如上图所示。)
Mean number of difficult words per segment
🦚:谁在演讲中最以自我为中心?
*(我用这个术语来描述一种言语行为模式,这种行为模式的特点是大量的口头指称自己。它不应该被解释为可能带有更负面含义的其他术语的同义词,如“自恋”或“自私”。)
在这个专题中,我探索了代词的使用,以此来衡量候选人在与他人和美国公众交谈时,将自己视为个人还是群体的一部分。特别是,我认为:
- 第一人称单数代词“我”、“我的”、“我的”、“我的”、“我自己”的数量
- 第一人称复数(1pl)代词的数量:“我们”、“我们的”、“我们的”、“我们的”、“我们自己”
- 两个数字之间的差异
所有的双栏会显得有点拥挤,所以我将视觉效果分成两个图表:一个是符合 12/19 辩论资格的候选人群集,另一个是不符合资格的候选人群集(或在 12/7 时处于风口浪尖):
******
Pronoun use by candidate group (qualified vs. not qualified/on the cusp)**
快速浏览这些图表可以发现,从绝对意义上来说,克洛布查尔在她的演讲中是最以自我为中心的,每段使用的“我”代词比任何其他候选人都多。在那些没有资格参加 12 月辩论的候选人中,卡斯特罗是最自我的,紧随其后的是吉利布兰德**。但是我们也看到 Klobuchar 比其他两个使用了更多的“我们”代词——这意味着,在相对于而言,卡斯特罗和吉利布兰德可能更以自我为中心,这取决于你如何看待它。**
相比之下,杨无论从绝对角度还是相对角度来看都是最不自我的,平均每段使用 1.64 个“我们”代词,而“我”代词只有区区 0.58 个。对杨来说,这两组第一人称代词的区别比其他任何候选人都要明显得多。这可以通过下图更容易地可视化,该图显示了“我”代词和“我们”代词之间的差异(“我”代词减去“我们”代词)。
Difference between number of 1sg and 1pl pronouns per segment
这种差异越积极,候选人使用的“我”代词就越多。回到之前的观点,我们从这张图表中确认,尽管 Klobuchar 在每个片段中使用了最多的“我”代词,但与吉利布兰德和卡斯特罗相比,她在“我们”代词中使用的比例更适中,他们在两组代词中表现出最大的差异。
特征提取器:
🔮谁的演讲最有未来感?
从某种程度上来说,一个候选人表达其未来计划和战略的能力可以被视为对其“面向未来”的一种衡量,我认为语言可以提供一种有趣的方式来发现一个候选人是否具有一个有远见、前瞻性的领导人的品质——这是选民可能希望他们未来的总统具有的品质。
使用 spaCy 标签,我对片段中的以下单词/短语进行了计数,作为对未来导向性的粗略衡量:
- 未来情态助动词(“将”、“将”)
Going + to + non-finite clause
建筑- 像“明天”和“未来”这样的词
以下是每位候选人使用的面向未来的表达总数:
Total number of future-oriented expressions across all debates
沃伦和哈里斯在他们的演讲中使用了最多的面向未来的词汇。这很有趣,但我们必须记住,他们也是总体上发言最多的候选人之一。因此,为了控制这一点,我对所有部分中面向未来的表达式的比例(%)求和。
**proportion_future_oriented = (df4['n_future_oriented_words'] / df['segment_length']) # segment_length == number of tokens per segmentdf['proportion_future_oriented'] = proportion_future_orienteddf[['speaker', 'proportion_future_oriented']].groupby('speaker').agg('sum').sort_values('proportion_future_oriented', ascending=False).plot(kind='bar', color='navy')**
即使做了这样的调整,我们仍然看到哈里斯和沃伦在他们的演讲中仍然大量使用面向未来的表达。
⚔ ️Who 提到川普最多?
哈里斯在所有八场辩论中提到川普最多,其次是杨和布克:
Total number of Trump mentions by candidate
但是,我们必须再次记住,哈里斯是总体上发言最多的人之一,因此,我再次将特朗普提及的比例总和(%)用于所有片段的片段长度。
**proportion_trump_mentions = (df4['n_trump_mentions'] / df4['segment_length'])df5['proportion_trump_mentions'] = proportion_future_orienteddf5[['speaker', 'proportion_trump_mentions']].groupby('speaker').agg('sum').sort_values('proportion_trump_mentions', ascending=False).plot(kind='bar', color='orange')**
调整后,我们看到哈里斯仍然是提及特朗普最多的人(即,即使是相对而言)。然而,对于杨来说,尽管在这些辩论中提到特朗普超过 30 次,但他的特朗普在演讲中的比例相对较低,与所有其他候选人相比,不超过平均水平。
Sum of proportions of Trump mentions by candidate
在这一点上,我急切地想知道是否有一条清晰的分界线,区分那些进入下一场辩论的候选人和那些没有进入辩论的候选人。我们可能已经在这篇文章中看到了一些迹象,但是一旦我们有了所有的信息,我可能需要更彻底地核实一下。
到目前为止,拜登、Buttigieg、Klobuchar、沃伦、桑德斯、施泰尔和哈里斯都符合条件(尽管最后一位已经退出)。杨和加巴德还没有达到所有的要求,但我们将在 12 月 12 日或之前查明他们是否达到了要求。
请继续关注后续的帖子,我将使用这篇帖子中描述的功能来建立一个机器学习模型,以回答最终的问题:演讲特征(单独)能否预测候选人有资格参加下一场辩论的可能性——因此,很有可能,他们当选总统的可能性?
数据科学家应该先学习哪种编程语言?
r,Python,SQL 还是别的?
当我开始我的第一份真正的工作时,在 21 世纪初,我是一名毕业的精算分析师,我的老板做的第一件事是递给我一本关于 SAS 的小册子,并告诉我自学 SAS。
在我的工作中,我需要能够争论数据并使统计模型适应数据,如果我不会编程,我就不会走得很远。
当谈到数据科学时,几乎是一样的,但有一个小而重要的区别。在数据科学领域,没有人会走到你的办公桌前,递给你一本关于如何编程的书。
即使是入门级,数据科学家也应该能够从第一天开始编程。
但是并不是所有的编程语言都是平等的,有些语言比其他语言更受雇主的重视。此外,就像口语一样,真正学习一门编程语言需要时间,大多数人在刚开始时没有时间学习一门以上的编程语言。
因此,如果您正试图在数据科学领域获得突破,并且没有多余的时间,那么为了最大化您的就业机会,您应该首先学习哪种语言呢?
数据科学的三大编程语言
我最近检查了 2019 年 4 月 22 日至 2019 年 5 月 5 日期间在 LinkedIn 上发现的 100 份数据科学招聘广告,这些广告来自四个英语国家(澳大利亚、加拿大、英国和美国)。这些招聘广告被选择来代表雇主类型、规模、行业和工作级别的广泛代表性,而纯粹的管理角色没有被考虑。
之前,我使用这一分析来确定数据科学雇主寻求的顶级技能,不包括编程语言和技术(你可以在我的博客文章中读到这一点:如何成为数据科学三重威胁)。
这一次,我采取了相反的方法,根据数据科学招聘广告中提到它们的比例,确定了数据科学的 10 大编程语言。这些显示在下表中:
由此可以看出,Python、R 和 SQL 是目前为止数据科学中需求最大的三种语言。没有真正的惊喜。
然而,有趣的是,如果我们进一步分析,并考虑工作级别对每种语言的需求。
在我提取的 100 个数据科学招聘广告中,有 15 个是入门级角色(定义为标题中带有“初级”、“研究生”、“实习生”或类似名称的角色);44 人担任中级职务;41 个是高级职位(定义为头衔中有“高级”、“主要”、“领导”或类似的职位)。
下面的图表显示,随着工作资历的增加,能够用 Python 或 R 编程变得更加重要。然而,能够用 SQL 编程变得不那么重要了。
这表明,从长远来看,学习 R 或 Python 比学习 SQL 要好得多。
但是为什么会这样呢?为什么高级数据科学家能够用 SQL 编程不重要?
SQL、R 和 Python 之间的主要区别
r 和 Python 都是通用编程语言,带有附加包,允许用户执行数据科学的大多数技术要求,包括统计分析和机器学习。
随着工作级别的提高,能够执行机器学习和统计分析变得越来越重要,因此有理由认为,了解执行这些任务所需的语言也变得更加重要。
另一方面,SQL 是一种专门为在关系数据库中查询和操作数据而设计的数据库语言。
雇主通常要求 SQL 技能,因为他们将数据保存在关系数据库中,并希望他们的数据科学家能够访问这些数据。然而,一旦您访问了给定任务所需的数据,SQL 的作用也就差不多到此为止了。
尽管所有级别的数据科学家都应该能够提取和争论他们自己的数据,但随着工作资历的增加,这些技能变得(相对)不那么重要了。在一个足够大的组织中,一名高级数据科学家甚至可以让更多的初级数据科学家为他们提取和准备数据,这样他们就可以专注于他们有潜力增加最大价值的任务,如模型开发。
因此,R 和 Python 可以被视为数据科学的两种真正的语言,而 SQL 只是提供支持(顺便说一句,有多个为 Python 和 R 编写的包允许用户从这些语言中运行 SQL 查询)。
R 队还是 Python 队?
如果你计划在数据科学领域建立职业生涯,那么理想情况下,你应该学习 Python、R 和 SQL 这三种语言。
学习这三种语言不仅可以最大化你的就业前景和与其他数据科学家互动的机会,还可以让你利用每种语言的不同优势,并始终选择最适合工作的语言。
然而,如果您正在寻求向数据科学转型,并希望尽快获得您的第一个数据科学职位,那么您最好掌握一种语言,并学习如何使用它来有效地执行广泛的任务,而不是学习如何使用多种语言执行较小的任务集(或相同的任务集,但不太好)。
此外,支撑大多数编程语言的原则(如函数、for 和 while 循环、if/else 语句和变量类型)或多或少都是通用的,所以一旦你掌握了一门语言,你会发现以后再回头学习第二门(或第三门)语言会容易得多。
根据前几节的讨论,如果你必须选择一种语言开始,那么雇主的需求建议你选择 Python。
然而,在为数据科学选择编程语言时,雇主的需求并不是唯一要考虑的事情。在做出最终决定之前,你应该问自己的其他问题包括:
- 其他人都在用什么编程语言?
- 你打算用这种语言做什么?
- 未来呢?
- 你最喜欢哪种编程语言?和
- 专有语言呢?
我在博文中详细讨论了这些问题:团队 R 还是团队 Python?
结论
编程语言时好时坏,对于数据科学家来说,它们真的只是达到目的的一种手段。然而,你也可以对汽车说同样的话,就像大多数人没有汽车(或者至少没有优步)无法生活一样,除非你会编码,否则你不会在数据科学方面走得很远。
在本文中,我们将编程语言的选择范围缩小到 R 和 Python 中的一个,并列出了在两者之间进行选择时要考虑的一系列因素,但是到最后,如果您仍然不能做出决定,就选择一个(如果需要的话,抛硬币)并接受它。
因为归根结底,R 和 Python 都是数据科学的优秀语言*,而且我不认为它们中的任何一种会很快消失。*
吉纳维芙·海斯博士是一名数据科学家、教育家、人工智能和分析专家,拥有 吉纳维芙·海斯咨询 。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向希望最大化其数据和数据团队价值的企业。
想要发掘企业数据的价值,但不知道从何入手? 下载免费的数据科学项目探索指南。
应该使用哪种促销来增加销售额?一家快餐连锁店的营销活动案例研究
使用 Parsnip R 软件包的线性建模方法
在向市场推出新产品时,一个常见的问题是什么样的促销对销售有最大的影响。一家快餐连锁店试图通过在几个随机选择的市场推出新产品来测试这一点。每个地点都采用不同的促销方式,并记录前四周的周销售额。
我通过这个链接从 IBM Watson 网站收集数据。以下分析的关键问题是:**是什么推动了销量上千?**为了回答这个问题,我们将从研究数据开始,并通过应用多元线性回归来确定哪种促销或市场规模的投资回报率最高。
这篇文章将使用一些现代的 R 包,包括 parsnip 用于建模, cowplot 用于组合图,标尺用于评估模型性能,以及配方用于特征工程。
数据集的描述
我们的数据集由 548 个条目组成,包括:
- AgeOfStores:以年为单位的商店年龄(1–28)。商店的平均年龄是 8.5 年。
- LocationID:商店位置的唯一标识符。每个位置由一个数字标识。门店总数为 137 家。
- 促销:测试的三种促销之一(1,2,3)。我们并不真正了解每次促销的具体情况。
- 以千为单位的销售额:特定 LocationID、促销和周的销售额。平均销售额是 5.35 万美元。
- 市场规模:市场规模有三种类型:小型、中型和大型。
- 周:进行促销的四周中的一周(1–4)。
所有这些变量对于建模过程都是有益的。我会把销售额以千为单位定为我们的目标变量,分析一下哪些变量对销售额的贡献最大。
首先,我导入数据集,然后根据需要安装或加载包。
marketing <- read_csv("WA_Fn-UseC_-Marketing-Campaign-Eff-UseC_-FastF.csv",
col_types = cols(MarketID = col_skip())) # removed MarketID because it's not needed.library(simpleSetup)# Load packages, install if needed
packages <- c('tidyverse',
'readr',
"recipes",
"magrittr",
"rsample",
"viridis",
"caret",
"parsnip",
"yardstick",
"broom")
library_install(packages)
探索性可视化
这个可视化阶段对于查看数据集中的模式和做出假设以测试建模部分是必不可少的。
The density plots of numeric values in the dataset
密度图类似于直方图,因为它们都显示变量的分布。这里的区别是 y 轴代表 x 轴上每单位的概率。然而,在这里,我更喜欢使用密度图,因为它们产生平滑版本的直方图,使它们看起来更美观,可读性更强。
这两个图显示了以千为单位的商店年龄和销售额的密度分布。大多数商店都很年轻,从 1 年到 10 年不等,而销售额最高的是每周 5 万美元。
The violin plots of categorical variables in the dataset. Every point is also visualized to make it easier to see the pattern.
这里的小提琴图显示了市场规模、周数和促销的分布,这些是与销售额相关的因素变量。
与其他促销相比,促销 1 具有更高的平均销售额和更多异常值,这意味着更高的销售额。较大的市场规模也显示了更高的销售额,同时分销范围也更广。第一周没有显示任何特定的高销售额模式,但是较胖的分布显示更多的人在第一周购买食物。
从这些可视化中,我可以做出如下假设:
市场规模大,促销 1 是销量提升的驱动因素。
建模过程将帮助我们确认这一点。
下面是上面两个图的代码:
marketing_trnformed <- marketing %>%
mutate(
Promotion = as.character(Promotion),
Promotion_factor = as_factor(Promotion),
week = as.character(week),
Week_factor = as_factor(week)
) %>%
select(-c("week", "Promotion", "LocationID"))# plot violin
marketing_trnformed %>%
select(Promotion_factor, Week_factor, MarketSize, SalesInThousands) %>%
distinct() %>%
group_by(Promotion_factor, SalesInThousands, MarketSize, Week_factor) %>%
summarise(sales = sum(SalesInThousands)) %>%
ungroup() %>%
select(-SalesInThousands) %>%
gather(x, y, Promotion_factor:Week_factor) %>%
ggplot(aes(x = y, y = sales)) +
facet_wrap(~ x, ncol = 1, nrow = 3, scales = "free") +
geom_violin(aes(x = y, fill = sales), alpha = 0.5) +
coord_flip() +
geom_jitter(width = 0.1, alpha = 0.5, color = "#2c3e50") +
ylab("Sales in Thousands") + xlab(NULL) +
theme_bw() <- promotion_plot#continuous variables: ageinstores and salesnum_vars_plot <- marketing_trnformed %>%
select(AgeOfStore, SalesInThousands) %>%
gather(x, y, AgeOfStore:SalesInThousands) %>%
ggplot(aes(x = y)) +
facet_wrap(~ x, ncol = 2, nrow = 1, scales = "free") +
geom_density(color = "skyblue", fill = "skyblue", alpha = 0.5) +
theme_bw()
建模
这篇文章在建模过程中使用了线性回归,因为这些特性很简单,只需要小小的调整就可以让它们适合建模。以下是关于线性回归需要注意的一些要点:
- 线性回归旨在从一个或多个输入 X 预测结果 Y。该算法背后的假设是 X 和 Y 之间存在线性关系。
- 线性模型(lm)试图通过最小化最小二乘准则来产生最佳拟合线性关系。通过找到最小的误差平方和来找到最佳拟合线。
- 较小的 p 值表明由于随机的偶然性,不太可能观察到实质性的关系。因此,如果观察到一个小的 p 值,我们可以很有把握地认为 X 和 Y 之间的关系是存在的。
为了说明这种多元线性回归模型,我们将线性建模方程定义如下:
y =截距+ c1 x 促销 1+ c2 x 促销 3+C3 x MarketSize _ Medium+C4 x MarketSize _ Large
其中:
- **截距:**是所有预测的起点。在这种情况下,是 5 万美元。
- 模型系数(c1 到 c4): 估计调整模型中的特征权重。
特征工程
为了使我们的建模过程更有效,我们需要将数据转换成适当的格式。这里我们概述了一些转换步骤:
- 促销现在是一个数字变量,需要为每种类型的促销模拟成列。
- 对于每种类型的市场规模,使用一键编码来转换市场规模。
如果这些解释变量是分类的,这个过程也使得线性回归模型是可解释的。为此,使用一键编码。
下面的代码就是这样做的。我首先将变量推广和周转换成因子,并使用包 rsample 来分割数据集,70%的数据将用于训练,另外 30%用于测试。包配方也用于上述特征工程过程。
set.seed(3456)split <- rsample::initial_split(marketing_trnformed, prop = 0.7)split %>% training()split %>% testing()train <- training(split)
test <- testing(split)recipe <- recipe(SalesInThousands ~ Promotion_factor + MarketSize, data = train) %>%
step_string2factor(MarketSize) %>%
step_dummy(MarketSize, Promotion_factor, one_hot = TRUE) %>%
prep(data = train)recipetrain_recipe <- bake(recipe, new_data = train)
test_recipe <- bake(recipe, new_data = test)
一旦特征工程过程完成,建模过程使用 parsnip 包,这简化了建模过程,使其易于分析和可视化。
linearModel <- linear_reg(mode = "regression") %>%
set_engine("lm") %>%
fit(SalesInThousands ~ Promotion_factor_X1 +
Promotion_factor_X3 +
Promotion_factor_X2 +
MarketSize_Large +
MarketSize_Medium +
MarketSize_Small, data = train_recipe)
估价
为了评估模型如何拟合数据,我们测量拟合优度。使用标尺指定重要的度量标准:
linearModel %>%
predict(new_data = test_recipe) %>%
bind_cols(test_recipe %>% select(SalesInThousands)) %>%
yardstick::metrics(truth = SalesInThousands, estimate = .pred)## .metric .estimator .estimate
## rmse standard 10.5
## rsq standard 0.579
## mae standard 8.69
其中:
- rsq (Rsquared):这显示了我们的输入解释了多少差异。在这种情况下,我们的输入可以解释数据集中 58%的可变性。
- rmse(均方根误差):这量化了平均平方残差*(即实际值和预测值之间的差异)*。该模型显示 rmse 等于 10.5,而销售范围是 20-100。
- mae(平均绝对误差):rmse 的问题在于,由于它对残差求平方,因此会受到较大残差的影响。Mae 取而代之的是平均残差的绝对值。在这种情况下,模型显示 mae 等于 8.69。
衡量模型的业务影响的另一种方法是可视化模型的每个变量的功能重要性,并评估它对销售的贡献大小:
linearModel$fit %>%
broom::tidy() %>%
arrange(p.value) %>%
mutate(term = as_factor(term) %>% fct_rev()) %>%
ggplot(aes(x = estimate, y = term)) +
geom_point() +
ggrepel::geom_label_repel(aes(label = scales::dollar(estimate, accuracy = 1)),
size = 3) +
scale_x_continuous(labels = scales::dollar_format()) +
labs(title = "Linear Regression: Feature Importance",
subtitle = "Looks like large market size, promotion 1 and 2 contribute most to sales") +
theme_bw()
下图显示了从最高 p 值(Promotion_factor_X1)到最低 p 值(MarketSize_Large)排列的重要要素列表。促销 1 (11,000 美元)和大市场规模(14,000 美元)对销售额的贡献最大,正如我们上面展示的探索性可视化所预期的那样。
然后,我们可以通过添加系数来解释模型:
y = 50+ 14 x (1) + 11x (1) = 75
所以如果我们在大市场规模中使用促销 1,我们平均可以赚 7.5 万美元/周。与综合其他变量相比,这是最高的销售额。
限制
数据集很小,只有 508 个观察值。这使得一些变量,如促销 _ 因素 _X2 和市场规模 _ 小不包括在我们的模型结果中。当观察值较少时,模型决定不包括这些变量。
结论
为了增加销售额,快餐连锁店应该使用促销手段,以大市场为目标。
线性回归因其简单而给了我们解释的能力。特性重要性图能够显示每个变量的业务影响,这使得它对于利益相关者或非技术人员来说是容易的和相关的。这里的教训是,如果数据集不太复杂,简单模型比复杂模型更受欢迎。
我了解到的资源:
通过使用该社区中提供的样本数据集来熟悉 Watson Analytics。它们都经过测试…
www.ibm.com](https://www.ibm.com/communities/analytics/watson-analytics-blog/marketing-campaign-eff-usec_-fastf/) [## 商业科学大学
从虚拟研讨会中学习,这些研讨会将带您了解解决问题的整个数据科学业务流程…
大学.商业-科学. io](https://university.business-science.io)
我喜欢与人交流和聊天。我也乐于接受反馈和批评。请随时通过 LinkedIn 与我联系。
美国哪些州的邻居最多?
Photo by Joey Csunyo on Unsplash
这将是一篇关于使用 python 来确定美国一个州(或任何任意地理位置)是否与美国另一个州(或任何其他任意地理位置)接壤的非常快速而肮脏的帖子。
我们的输入将是美国各州的一个 GeoJSON (只是一个描述复杂形状的 JSON),你可以从我的 GitHub 这里获得。而且,我们的输出将是一个 python 的字典,它将美国的每个州映射到一个单一的数字,表示它有多少个相邻的州。
我们这篇文章的主要工具是 python 库 shapely ,它帮助我们用 python 处理复杂的地理。
这个过程非常简单:对于美国的每个州,我们可以遍历美国的所有其他州,然后检查这两个州是否接触。如果是这样,我们可以更新当前有问题的州的相邻州的运行列表。
首先,我们需要将 GeoJSON 转换成 shapely 可以理解的对象。我们将使用的两个主要的造型优美的物体是:
- 多边形对象:基本上是一个单一的有界形状
- 多多边形对象:基本上是多边形对象的集合(因为美国的一些州由多个地理区域组成)
下面是解析 GeoJSON 的代码:
现在我们已经在state Polygons中获得了一个不错的州地理对象(多边形或多多边形)字典,我们可以遍历字典并检查每个州是否与其他州相邻。
并且,结果是:
不错!所以密苏里州和田纳西州并列第一,各有 8 个邻居,然后肯塔基州和科罗拉多州并列第二,各有 7 个邻居。
希望这篇文章对使用 shapely 进行空间应用有所帮助。感谢阅读!
被 BigQuery ML 带走了
Photo credit: Phil Goerdt
预测 GCP 人对威士忌的偏好
“我在找…
…任何泥炭味的东西,像海滩上的营火一样冒烟,中度到高度的酒精,干果,柑橘,还有淡淡的陆地气息。”
我很容易走进当地的酒类商店,与工作人员中的威士忌男或女谈论品酒笔记(和笑话),他或她将能够知道我在寻找什么,并向我推荐。但是机器学习模型可以在最小数据集和有限输入的情况下做同样的事情吗?这就是眼下的问题。
(对于现在加入的人,感谢你们参与这一部分的报道!我建议你看看这个系列中的其他博客,但如果你不看,总结就是我有一堆威士忌数据和我的品尝偏好。让我们看看我们能从中学到什么。)
简单地说,BigQuery ML
在这个练习中,我将使用谷歌云平台的 BigQueryML 引擎。如果你没猜错,这是一个 ML 工具,它允许你创建 ML 模型并在 BigQuery 中运行它们。
对于任何在 BigQuery 中拥有大量数据的人来说,BQML 是一个不可思议的优势,因为数据可以保持不变,不需要定义数据框架。不仅如此,我们还可以在 BigQuery 中管理和运行我们的模型;这意味着不再需要供应特定于 ML 的计算虚拟机(或者我认为是物理机)。最后,我们可以使用 BQ 中的专用 SQL 命令创建这些模型。这不像其他 SQL 插件,需要大量用户定义的函数、类和其他有趣的东西来阻止我们开发真正的内容;它开箱即用。多酷啊。!
你为什么选择了那个?
我们为什么要关心这些特性呢?难道我不应该尝试使用 TensorFlow 这样的“真正的 ML 框架”吗?嗯,是的……也许吧。我可以尝试在 TensorFlow 这样的“真实框架”中做这个练习。但是,有几个原因让我没有走上那条路。
首先,我不想再写一篇“如何用 TensorFlow 做你的第一件事”的博客。已经被写死了。此外,像莎拉·罗宾逊这样的人在制作酷炫前卫的 TensorFlow 内容方面会比我做得好得多。BigQueryML 我们来了!
另一个原因是,在以前的博客中,我谈到了我在设计协同工作的系统时对简单性的热爱。我喜欢活动部件越少越好,故障点越少越好,从一开始就尽可能自动化。BigQueryML 很简单,对我来说试验起来很便宜,并且符合我当前的技术栈定义。使用它对我来说是很容易的。
最后,我的需求并没有规定我需要大马力的东西。我的训练集是刚刚超过 100 行的子集(2018 年我尝试过的所有威士忌),我正在进行非常简单的回归预测。由于这些原因,我认为使用一个更强大和高度工程化的解决方案过度训练的风险很高。(如果你愿意,可以在下面评论和讨论。如果对此有很多回应,也许我会在未来的帖子中做一些 TensorFlow 模型并与 BQML 进行比较。)
不管我选择 BigQueryML 的理由是什么,让我们进入使用它的正题。
大查询,大 ML?
正如我上面所说的,使用 BigQueryML 非常简单,这主要是由于产品的特性集。然而,简单易用并不意味着它没有细微差别。让我们根据我的数据创建一个示例模型,对其进行评估,并就此进行一些讨论。
我要和他一样的
在本系列的一些早期博客中,我提供了威士忌评级数据的快速浏览。这里有一个快速提醒:
Mmm… data tartare.
以上是两种威士忌的原始未加权分数,以及一些维度属性。你认为这足以预测?我认为这个案子还没有定论。我认为,如果我们从大多数喝威士忌的人通常如何开始他们喝什么的谈话来思考这个问题,通常是通过说一种威士忌,如“我是一个波旁威士忌的家伙”或“我只喝单麦芽威士忌”。有时候成熟会发挥作用,而且价格往往决定了我们买什么或能买得起什么。这些通常本身就是很好的指标。但是这个模型能够学习更多的东西吗?我们有足够的证据来发现细微差别吗?
我想我们得看看模特是怎么想的。
像专业人士一样做模特
既然我们已经对训练数据集了如指掌,让我们看看如何在 BigQueryML 中实际建模。
如果您熟悉 SQL,您可能已经猜到创建模型类似于任何 DDL 语句。使用create model
语句,我们可以创建一些在 BigQuery 中运行和训练的模型。GCP 文档在检查所有可用参数方面做得很好,所以如果你想了解我在这个例子中没有用到的东西,可以查看那里的。
--hi! i'm a (very) simple model for predicting a total score!create or replace model `sample_schema.predict_total_test`
options
( model_type='linear_reg', /*this is the model type*/
l1_reg=0, /*how much L1 regularization should we use?*/
max_iterations=5, /*how many times should we train?*/
input_label_cols=['label'], /*this is the column to predict*/
data_split_method='seq', /*how do we want to split the data?*/
data_split_eval_fraction=0.3, /*how much should we split?*/
data_split_col='date_sampled' /*which column should we split on?*/
) as /*this is a query to collect data to use in the model.
all of these columns must be present later when we run the model.*/select
f.rating_name as full_name
, f.distillery as distillery
, f.date_sampled as date_sampled
, f.total_score as label
from
`sample_schema.w_ratings_f` f
where 1 = 1
;
这看起来很简单,但是让我来分析一下到底发生了什么。
首先,我们有create or replace model
语句,后跟模型名称。接下来是options
子句,它允许我们参数化新创建的模型。正如我之前说过的,这里有很多有趣的杠杆和旋钮,你可以在文档中读到更多。这个例子中只有几个选项来激起你的兴趣。让我们来看看它们是什么。
model_type
:这是我正在创建的模型类型。我使用的是推荐的线性回归模型,用于预测和预报。l1_reg
:它控制模型中输入的权重,这对于减少特征中的噪声和移除稀疏、高维数据集中不相关的特征非常重要。既然这个模型如此简单,这里有一个 0 就可以了。但是,如果我们编辑模型使其具有更高的维度,我们可能需要调整这个参数。(这何时变得相关?让我们假设我将品尝笔记添加到数据集,并且只有一些样本集有这些笔记。因为这些注释是稀疏的(不适用于所有行),并且因为我们对每一行都有不同的注释(一组不同的文本),所以如果没有注释,我们希望将该特性的权重强制设置为 0,以忽略特定输入的注释。)max_iterations
:这是模型训练需要的步数。我对过度训练有所怀疑,因为这是一个如此小的数据集,这就是为什么我将最大值从默认的 20 降低到 5。input_label_cols
:标识将要被预测的列。简单来说,特征是输入,标签是输出。这里我试着预测总分。- 我们应该如何分割训练数据?选项有
random
和seq
。 data_split_eval_fraction
:控制分割多少数据用于训练。默认是.2
,但是由于这个数据集很小,我更喜欢多一点。因此选择了.3
。data_split_col
:标识要拆分数据的列。它不包含在功能集中。
继续往下看 SQL 语句,您会注意到有一个select
语句为模型提供数据。这是不言自明的,这种不需要定义数据框架、特性和 ML 模型附带的所有其他有趣的东西的简单性使得 BigQueryML 对我这种情况的人非常有吸引力。
一旦定义了模型,我就可以运行上面的语句,接下来发生的事情非常酷。BigQuery 接收模型逻辑,查询数据,然后在 BigQuery 中运行模型。说真的,这多酷啊?眼尖的(具有计费管理权限)可能会注意到 GCE 有几个额外的行项目,这是因为您将为运行这些 ML 语句付费。但是,在运行这些资源时,您不需要负责旋转它们。
既然我已经运行了模型,我应该对它进行评估。这样做的原因是为了更好地理解模型的准确性。虽然我们可以明确地知道模型是否准确(因为,你知道,数学),但在某些情况下,模型构建和调整更像是艺术而不是科学。让我们通过几个例子来说明为什么会出现这种情况。
考试时间
我可以通过在 BigQuery 中运行以下命令来检查我的模型准确性的一些重要指标:
select *
from ml.evaluate(model `sample_schema.predict_total_test`);
这将为您提供如下所示的输出:
Uh… thanks?
上述各种统计数据有助于量化模型中的误差量;即模型与正确分数“偏离”了多少。如果我们每次都试图预测正确的分数(我们确实是这样),我们会试图让误差尽可能接近零。
Who remembers “line of best fit” from stats class?
让我们快速浏览一下谷歌 ML 速成班的这张图。这张图向我们展示了模型是如何试图适应数据集的,显然右边的模型做得更好。通过查看模型的统计误差,我们似乎可以做得更好…对吗?
理论上,是的,我肯定可以。接下来,我用不同的特性集多次运行同一个模型,以确定是什么影响了模型的错误率。您可以在下面看到,添加和删除额外的功能使错误率发生了很大的变化,没有一个错误率比基本模型低。
Wow. Such stats.
这是否意味着我们应该回到基地?在我看来,没有,原因如下。数据集太小了。如果我们看一下基本模型,有两个特征:威士忌的全名和酿酒厂。如果我只是用这些来预测我是否喜欢威士忌,随着时间的推移,我可能会得到很差的结果。当我添加更多特征时,错误率上升的原因是没有足够的数据或足够丰富的特征来确定模式。
这意味着,尽管我们可以从数学的角度来看一个模型是“最正确的”,但这并不意味着它将扩展或能够从它所接触到的新数据中学习。那有什么意义呢?
回到制图板?
从第一个模型开始,我已经制作了几个其他的模型,并对它们进行了试验,产生了更好的结果。这个过程的一部分是获取更多的数据,特别是向模型中引入品尝记录。此外,调整模型参数也有帮助。那么最终的“进展中的工作”是什么样的呢?
Not bad… right?
我觉得上面的成绩还可以。显然,我仍然需要对模型做一些调整,我也认为小数据集是问题的一部分。(如果你想查看所有的推荐,请随意前往该死的 Dram 。)
但我们不要忘记这里的明星,BigQueryML。在 BigQueryML 中构建、管理和测试这些模型是如此的容易,而且它无缝地集成到了我已经在构建的东西中。我看不出这有什么不对。
Phil Goerdt 是专门研究云架构和数据工程的独立顾问。
谁是独立选民
对一个政党认同“不太强烈”的人和那些认同独立但“更接近”一个政党的人之间的差异。
我们使用的数据是由 YouGov Blue 和进步数据组织 Data For Progress、进行的民意调查,它由 3215 名选民组成,然后根据“年龄、性别、种族、教育、城市/农村状况、党派、婚姻状况和人口普查地区”进行加权,以反映美国投票公众,权重附加到 2018 年选民份额的编目员的数据。他们公开发表了数据,对此我表示感谢。
我要展示的数据来自政党识别问题,尽管我希望他们也被问到这个人的实际注册政党是什么,因为我来自肯塔基州,在肯塔基州第六区, 根据《纽约时报》的最新民调(或者参考哈里·恩滕的推特传记“政党 ID 不等于政党注册”),注册的民主党人只有大约 65%投票给艾米·麦格拉思,研究竞选活动如何克服数据缺陷并找到自称是自己政党但注册为反对党的选民将是有益的。
然而,被问到的问题是“总的来说,你认为自己是一个…?”回答政党的人的后续问题是“你会称自己是强大的(插入政党)还是不太强大的(插入政党)?”对于那些把自己列为无党派、其他或不确定的人,接下来的问题是“你认为自己更接近民主党还是共和党?”。一个简单的条形图将我们引向这一价差。
拥有更大样本量的好处是,我们可以看到答案的内部,所有类别至少有 200 个回答(除了不确定我和谁更接近,但我们现在忽略它们),我们可以看到这些群体的行为。我想重点介绍的群体如下:
首先,我们将看看这五类中每一类的意识形态。我们将把“更接近共和党”称为共和党独立人士,民主党也是如此。我们将把共和党+不是很强的人称为共和党弱势党员,民主党也是如此。
正如我们所见,共和党弱势党员和共和党独立人士更有可能自称为保守派,而不是民主党人自称为自由派。我们还看到,有一个“更接近民主党”的小组,在民主党的左边,比他们的保守派对手略大。总的来说,民主党人比共和党人多,所以当考虑哪些地区应该努力扩大你的基础,而不是向中间靠拢,为民主党争取温和派。即使意识形态不同,政党 ID 的投票模式在很大程度上是普遍存在的。
当我们看一看这些群体在 2018 年众议院选举中投票给谁时,我们首先看到了党派(或缺乏党派)投票行为的总体趋势。在此图中,我们比较了政党 id 与 2018 年投票:
它变得有点混乱,与所有的“精益 ______”和次要选项,所以这里有精益民主党和精益共和党和犹豫不决的两党投票。
这里我们看到,强党、弱党和无党派人士通常会投票给自己的政党,但当我们比较弱党和无党派人士时,我们看到无党派人士比弱党更有党派性。
当查看 2018 年全党选票的交叉表时,我们看到共和党人只获得了 77%的不是很强的共和党人,但民主党人获得了 88%的不是很强的民主党人,这对 2018 年的民主党竞选活动是一个很好的推动。
当我们对比无党派者和有党派者的政策偏好时,我们也看到了相似的趋势,但是我们看到弱党派者和无党派者比强党派者有更多的相似之处。以下是每个小组对黑人的命也是命的看法。
我们看到软弱的党派民主党人和党派独立民主党人对 BLM 的看法比强大的民主党人更相似,但党派独立共和党人认为 BLM 更像强大的党员,这让我们稍微绕了一下,看看政党 ID 的种族怨恨得分(代码本第 10 页)。
在这里,我们看到对弱势党派的种族怨恨更多的是针对总的中间值,而对党派独立人士的种族怨恨非常接近强势党派。也许这有助于我们解释唐纳德·特朗普的下一个交叉表,正如我们所见,弱势党派比党派独立人士更愿意打破排名。共和党人也有很多只愿意说“有点”而不是“非常好”的人,这可能会导致未来的投票率问题。尽管如此,共和党人可能会比其他人更倾向于消极的党派偏见。
我们还看到,表示支持特朗普的 60 名民主党人(强势、弱势、党派独立)的种族怨恨得分平均为 0.3941,与共和党人相似。在 114 名表示不支持特朗普的共和党人(强势、弱势、党派独立)中,种族怨恨得分为 0.3088,51 名得分非常不利的共和党人的平均种族怨恨得分为 0.2333,与弱势民主党人相似。这些样本量太小了,但是你可以在更大的数据集中寻找。
下一个数据是按党派 ID 查看 2016 年选举,因为我们的民调是基于 2018 年的投票率,所以重要的是要记住,这个样本在民主党中比 2016 年高出约 6%,所以唐纳德·特朗普的数字看起来会比实际情况好一点。
我最感兴趣的方面是特朗普能够抓住几乎 10%的弱势民主党人。党派独立人士虽然没有投票给特朗普,但也没有投票给希拉里。当然,还有“真正的无党派人士”,我们接下来会看看他们,希拉里比特朗普更接近加里·约翰逊。
让我们来揭开“真正的独立人士”的面纱,看看他们有多忠于自己的诺言。
他们的投票行为有点不稳定,但基本上是可以预测的。他们是多元化的共和党人,2018 年投票给共和党人的人大多投票给特朗普,剩下的几乎等量的选票投给了自由主义者加里·约翰逊(Gary Johnson)、希拉里·克林顿(Hillary Clinton),或者不投票。投票给民主党众议院候选人的“真正的独立人士”大约有一半时间投票给希拉里,另一半分配给加里·约翰逊(12%)、特朗普(8.5%)、吉尔·斯坦(8.12%)、不投票(7.51%)、其他(6.51%)和埃文·麦克穆林(4.59%)。
改变党派投票的独立人士只占美国选民的一小部分。
Total of 6.87% of total Americans switched from Obama voter->Trump, or Romney->AntiTrump
Only 2.13% changed from Trump Voter->Don’t Re-Elect Trump or Hillary Voter-> Re-Elect Trump
这个过去的图表非常糟糕,你可能不应该吸引特朗普的选民,而是你在 2020 年的基础。人们基本上不会改变对同一个人的看法。
85%的人投票支持参议院和众议院的同一个政党(第二届民主党/民主党+民主党/民主党+共和党/共和党)
这里还有一些表格:
I don’t really like the colorful texts either
This is better
Green Jobs particularly poll well with Non-Strong Partisans, 76% — 16% (Grand Total Line)
Labor Unions Poll poorly, 44–48, but with total voters, it is 49–41
在 2018 年投票的非强势党派选民中,略低于 75%的人在 2016 年投票给了同一个政党,即使他们之间没有强烈的党派关系。两次都没有投票给他们预期的政党的两类非强势党员约占 2018 年选民的 11%。投票给反对党的人就更少了。这部分选民中大约有 3%投了反对党的票。吸引持不同意见的 8%的人比吸引另一方的 3%的人更有用。
#Veganuary2019 的演员有哪些?
第 1 部分:Tweets 数据分析
1.介绍
“纯素食日”是由英国慈善机构“纯素食日”组织的一项活动,鼓励人们在一月份尝试纯素食(只吃植物性食物)。人们参与这一挑战的主要原因包括动物福利、气候变化和改善个人健康等问题。今年报名参加的人数创下了新纪录。Veganuary 透露,全球共有 250,000 名参与者订阅加入该运动。
素食主义比以往任何时候都是最热门的话题,因此给了 Twitter 数据分析一个绝佳的机会。这将有助于深入了解该运动的影响,并确定积极参与该运动的行为者。不幸的是,并没有收集整个一月的推文,因此,这篇文章只对 2019 年 2 月的事件略有所知。我在这里的目的是熟悉 Twitter API,并对我感兴趣的辩论进行数据清理和数据探索性分析。我们开始吧!
2.数据收集
这个项目的数据是使用 Twitter API 收集的。这些推文是在 1 月 22 日至 1 月 31 日之间收集的。总共有 21,421 条推文使用#Veganuary2019 和#Veganuary 运动的官方标签记录。
首先,请求库用于读取数据,然后构建在 JSON 编码器中。然后,我在 python 笔记本中预处理并分析了这些推文。
在这里,我要感谢一些伟大的媒体成员,他们帮助我实现了我的分析。如果你对文化和城市感兴趣,可以看看 Vishal Kumar 的文章。相反,如果你更热衷于学习如何掌握熊猫和收集推特数据,那么就去读读泰德·彼得鲁和马尔科·邦扎尼尼。
3.数据分析
以下图表说明了为更好地理解围绕#Veganuary2019 的讨论以及参与挑战的参与者而进行的介绍性分析。
在这里,我将介绍以下结果:
- 每小时的推文数量
- 前 10 名推特用户(按关注人数)
- 前 10 名推特用户(按推特数量)
- 转发量最高的 10 个账户和推文
每小时的推文数量
下图显示了每小时的推文数量。有趣的是,人们最活跃的时间是午餐和晚餐时间。这很可能是因为人们在用餐时谈论了#素食主义者的话题,并借此机会在推特上发布了这个话题。
从中午到下午 2 点总共发布了 2941 条推文,从晚上 7 点到 9 点发布了 2613 条推文。在凌晨 1 点到 6 点(GMT +0)之间,平均有 240 条推文发布,这可能对应于美国或亚洲国家用户发布的推文。
The bar chart shows the average number of tweets by hours between the 22nd-31st of January
十大推特账号:名人
用户的关注者越多,他的推文就越有可能被大量的人阅读。下图显示了参与素食讨论的十个最受欢迎的账户。
毫不奇怪,前两个地方由著名的英国名厨占据:戈登·拉姆齐和杰米·奥利弗。然而,他们受到各种行为者的关注,如媒体公司(SkyNews 或 New Scientist)、快餐连锁店(Nandos)甚至加拿大奥林匹克队(Team Canada)。这清楚地表明,讨论不是局限在一个小圈子内,而是扩展到各个人口群体。
The bar chart shows the most famous accounts by the number of followers
你想知道这些演员的推特是什么吗?看一下桌子!
The table shows the top ten most famous tweeters
How you do #Veganuary! Gordon Ramsey
十大推特账号:推特
值得注意的是,那些最著名的人并不是#Veganuary 的主要演员。为了了解积极参与宣传活动并讨论前述动物蛋白挑战一个月的人的身份,有必要看看每个推特用户的推特(包括转发)数量!下图说明了这一分析。
行动者由组织和个人组成,他们的共同目标是教育公众关于动物权利、气候变化和人类健康的知识。
The bar chart shows the most active tweeters by number of tweets
十大转发推文
转发推文的数量提供了对推特用户行为的有趣洞察,或者换句话说,对人们行为的有趣洞察!下表列出了被转发次数最多的 10 条推文,以及它们来自哪些 Twitter 账户。
有趣的是,有一半的推文邀请 Twitter 用户参加比赛,以赢得免费的东西,如纯素食巧克力、葡萄酒、植物奶酪或蛋黄酱,或者美味艾拉的美味植物食谱!😃
The table shows the tweets that have been retweeted the most
结论
该结束了!:-)这篇文章研究了 2019 年 1 月的大约 21,421 条推文。我希望你喜欢这篇文章,如果你想留下任何意见,建议或想法,我真的很感激!所以,请随时伸出手来!
我的代码可以在下面的 Github repo 中找到。
接下来的步骤
每天,我都在发现更多关于数据分析的东西,因此,我的下一篇文章将探索一些推文的自然语言处理(NLP )!素食 2019 的演员和参与者实际上在发什么微博?他们如何参与话题,是积极的、中立的还是消极的参与?
感谢您的宝贵时间!
奥德
我是 数据和植物科学家 在 垂直未来 ,之前在WBC SD。理学硕士。在城市分析和智能城市方面,来自 UCL 的 Bartlett 伦敦的 CASA 和 BSc。在食品科学方面来自 苏黎世联邦理工学院 。对城市、美食、健康充满热情通过Twitter或LinkedIn取得联系。
Twitter 上最具人力资源分析影响力的人是谁
可视化 Twitter 社交网络人力资源分析
日常生活中,人们使用 Twitter 等社交媒体来分享想法和创意。兴趣相投的人聚在一起,通过重新分享或回复自己喜欢的帖子,在网络平台上进行互动。通过研究人们如何在社交网络上互动,这将有助于我们了解信息是如何分布的,并确定谁是最突出的人物。
在我们的上一篇文章中,我们使用 Twitter feeds #HRTechConf 进行了主题建模研究,并训练了一个模型来学习所有推文的主题。在本文中,我们将分析 Twitter 用户交互,并将其可视化为一个交互图。这里是互动图表网页的链接。
社交网络是社会互动和个人关系的网络。
牛津词典
我使用 Python 3.6 和以下软件包:
如果你对组织网络分析感兴趣,可以查看我们写的这篇文章。
数据采集
我们使用 Tweepy (一个用于访问 Twitter API 的 Python 库)来提取所有提到 HRanalytics 的 Tweepy。由于 Twitter API 限制,只能检索到 2019 年 11 月 2 日至 11 日发布的推文。总共有 333 条推文。
我们认为,当一条推文被转发或回复,或者一个 Twitter 用户在另一个用户的推文中被提及时,就存在 Twitter 用户互动。这个想法是,如果某人的推文或名字在网络中出现得更频繁,那么他对人力资源分析的话题就有更大的影响力。
在下面的转发示例中,我们认为 Twitter 用户 Sonianasher 和HR 策展人之间存在交互。
RT @ HR 策展人:博世如何利用游戏化构建# HR 分析技能(案例分析)https://t.co/8IjyO1HdUe【digital hrtech @ analytics inhr…
索尼亚纳舍尔
图形建模
社交网络,例如 Twitter 图,由节点和边组成。节点是 Twitter 账号,边是 Twitter 用户之间的交互。
社交网络,例如 Twitter 图,由节点和边组成。节点是 Twitter 账号,边是 Twitter 用户之间的交互。
还有,如果 B 转发、回复或提及 A 的推文,很有可能是一个 Twitter 用户 A 对用户 B 产生了某种影响。因此,Twitter 网络是一个有向图。在上面的例子中,用户 Sonianasher 不仅与HR 策展人有联系,还受到HR 策展人的推文的“影响”。
import networkx **as** nx
graph = nx.DiGraph()
为了构建我们的 Twitter 网络,我们使用了 NetworkX ,这是一个用于研究复杂网络结构的 Python 包。
degrees = [(node, val) for (node, val) in graph.degree()]
degrees_df = pd.DataFrame(degrees, columns=['node', 'degree']).sort_values(
by='degree',ascending=False)
degrees_df.head(10)
333 条检索到的推文中的所有交互都被添加到有向图中。让我们看看我们的 Twitter 网络连接得有多好。
degrees_df.describe()
推特账号HR 策展人拥有最多的互动(40 次),而 martinhoyes 拥有 15 次。
nx.number_connected_components(graph.to_undirected())22
哇,我们有 22 个不相连的子图,这可不好。我们最感兴趣的是大型全连通图。
nodes = max(nx.connected_component_subgraphs(graph.to_undirected()), key=len)
largest_subgraph = graph.subgraph(nodes)
print(nx.info(largest_subgraph))
Name: Type: DiGraph Number of nodes: 84 Number of edges: 100 Average in degree: 1.1905 Average out degree: 1.1905
最大的子图有 84 个节点和 100 条边。让我们确保这个图中的所有节点都是连接的。
nx.number_connected_components(largest_subgraph.to_undirected())1
太好了!它只有一个连通图。
网络可视化
现在,我们可以绘制我们的 Twitter 互动网络。
node_degree = largest_subgraph.degree()
pos = nx.spring_layout(largest_subgraph, k=0.4)
plt.figure(figsize=(18,16))
nx.draw(largest_subgraph, pos=pos,
linewidths=0.2, node_color=range(len(node_degree)),
node_size=60, alpha=0.6, with_labels=True)
nx.draw_networkx_nodes(largest_subgraph, pos=pos, node_size=10, alpha=0.3)
plt.show()
现在,我们可以绘制我们的 Twitter 互动网络。
Twitter Network
环形布局的相同网络。
Twitter Network — circular layout
似乎许多箭头都指向节点HR 策展人和 martinhoyes ,这证实了我们之前在上面的分析中发现的,用户HR 策展人和 martinhoyes 在这个网络中最有影响力。
from pyvis.network import Network
net = Network(height="850px", width="100%", bgcolor="#222222",
font_color="white", directed=True)
net.from_nx(largest_subgraph)
net.show("interactive_graph.html")
这很酷,但是很难将每个节点的连接可视化。别担心。我们使用 PyVis 库来构建一个交互式 web 图,允许用户拖动、悬停和选择节点和边。这里是交互式图形网页的链接。
Interactive Twitter Network
结束语
像 Twitter 这样的社交网络拥有大量关于人类行为和社会的信息。社交网络的出现使得对信息分布、影响传播和社区结构的研究成为可能。事实证明,图表分析在从网络中发现这些见解方面很有价值。
如果您有任何问题或反馈,请随时发表评论。
机器学习快乐!
原载于 2019 年 11 月 17 日【https://ai-journey.com】。
谁是“资深”数据科学家?—一些想法
source: https://teespring.com/shop/senior-data-scientist-ba#pid=2&cid=2397&sid=front
在过去的几周里,以及几个月前,我参与了一个“高级数据科学家”职位的筛选和面试。在这个过程中,我花了相当多的时间思考:
a)是什么让候选人在数据科学方面更资深/更有经验?
b)与我们面试相对初级的数据科学家相比,我们如何调整面试流程来测试这种“资历”?
我必须明确指出,我在这方面没有太多的经验,但是在两个非常不同的组织中作为采访者和被采访者参加过这样的采访之后,我形成了一些观点。这篇文章收集了我对高级数据科学家应该知道的一些个人观点。
请注意:我的经历是在数据科学团队嵌入非专注于人工智能的公司(目标是用人工智能支持增强公司的产品)的背景下,而不是在人工智能优先的公司,这些公司有大量的研究人员、开发人员和其他专门致力于构建机器学习系统的团队。
Q1:是什么让候选人在数据科学方面更资深/更有经验?
下面是我关注的四件事:对模糊问题描述的反应、建模之外的知识、高效沟通以及指导/领导经验。
a)一个有经验的人不应该对不太具体的问题描述感到不舒服,应该主动提问以理解问题的要求,比如说,面试官用 1-2 句话描述了一个与他们组织相关的问题,并问你将如何处理这个问题?,有了好的候选人,讨论可以进入各个方面,如:如何收集数据,如何建立和选择学习模型,如何决定部署后的关键绩效指标,以及与非技术受众沟通。对于不太有经验的候选人,要么候选人只谈论学习模式,要么不通过问这些问题来继续讨论。
b)有经验的候选人将对部署数据科学系统的不同阶段有所了解——如果不是所有这些阶段的专业知识。也就是说,他们会对一些问题有话要说,比如:一旦模型建立起来,我们该做什么?它如何与将要嵌入的现有产品进行对话?我们可以使用什么工具在其他地方部署这些本地构建的具有 101 个依赖项的模型(比如在云上)?).一个不太缺乏经验的候选人可能不知道除了他们自己在项目中的角色之外的那么多细节。
c)有经验的候选人会是更好的沟通者。通常,高级数据科学家最终会参与项目的各个阶段,从需求收集到向客户展示结果。因此,在我看来,高级数据科学家还应该能够成为相关的技术和非技术团体之间的联络人。一个缺乏经验的候选人可能擅长技术方面,但不需要清楚地表达出来。
d)有经验的候选人可以独立工作,也可以承担起指导年轻数据科学家的责任。如果需要的话,他们还应该愿意承担项目的所有权并领导项目的方向。这一点尤其重要,因为在这种情况下,太多的注意力放在研究新奇的东西上,最终可能不会产生任何有形的产品。经验不足的候选人不太可能有这种经历。
Q2:我们如何调整面试程序来测试这种“资历”?
a)提出更多开放式的问题解决方案——这解决了 Q1 的第一点。一个有经验的数据科学家,即使他们以前从未听说过这个问题,也应该能够通过向面试官问更多的问题,并根据他们迄今为止的经验推断出他们所知道的东西,来对这类问题有所了解。
b)询问他们/他们的团队当前的技术架构、编程实践、他们与工程师的合作有多密切等——具体问题各不相同,但我认为这解决了 Q1 的第二点。一个有经验的候选人应该对一个项目的不同阶段所使用的一些先进的工具有所了解,并且对除了他们已经知道的之外还有什么其他选择有粗略的想法。
c)Q1 的第三点可以在面试过程中通过让候选人更多地谈论阐明他们的想法来测试,例如要求描述一个非常简单和非常复杂的机器学习模型背后的直觉。
d)在 Q1 解决第四点可能很简单——询问候选人关于指导经验、项目管理经验以及围绕这些的行为问题。
需要注意的一点是:这些是我会在常规面试过程中调整的东西,而不是我会寻找的唯一东西。也就是说,如果角色需要,候选人仍然需要技术过硬,擅长动手编程等。
谁是漫威电影中最重要的角色?
MCU 的数据分析(或者为什么钢铁侠可能值得他的百万身价)
乔和安东尼·罗素承认是小罗伯特·唐尼的《钢铁侠》为所有漫威电影定下了基调。毕竟,是唐尼用同样尖刻的话开始和结束了《复仇者联盟》的传奇——“我是钢铁侠”。鉴于《复仇者联盟》的最后阶段已经在全球范围内获得了近 20 亿美元的票房,而漫威的其他电影也获得了数十亿美元的票房,我想知道,这些成功有多少要归功于钢铁侠?
为了回答这个问题,我编写了代码来解析所有的漫威电影宇宙电影剧本。尽管我无法获得《奇异博士》和《惊奇队长》的完整剧本,但我仍然能够收集到 21 部漫威电影中 19 部的详细数据。其他人可以在 github 上看到的剧本文件和用于处理它们的计算机脚本。有了这些原始数据,我认为有可能看到超级英雄的黄金有多少是由于钢铁侠的影响。
演员工资
要想知道托尼·斯塔克(Tony Stark)给漫威电影宇宙(Marvel Cinematic Universe,MCU)带来了多少价值,最简单的方法就是看看他得到了多少报酬。虽然确切的数字很难得到,好莱坞记者和其他消息来源提供了一些关于漫威电影中每个演员收入的估计。到目前为止,我关注的只是每个演员从一部电影中获得的最大收入。结果如下所示。
就原始美元而言,小罗伯特·唐尼是迄今为止最大的赢家。有传言说,他从自己电影的票房收入中获得一定比例的分成。因此,据估计,他在《复仇者联盟无限战争》中赚了 5000 万美元,在《复仇者联盟终局》中赚了 7500 万美元。在接下来的部分,我们将看到他是否真的值得。
电影角色
衡量 MCU 中哪个角色最重要的一个简单方法是看哪个角色出现在最多的电影中。如果我们按照电影中出现的顺序来描绘漫威的主要角色,我们会得到如下结果。
说到电影出场,技术赢家是史蒂夫·罗杰斯(又名美国队长)。当然,Cap 只是挤掉了其他复仇者,因为他在蚁人有一个简短的后期制作。如果我们忽略这一幕,那么雷神、美国队长、钢铁侠和黑寡妇都并列最多电影出场(各有 8 个学分)。尼克·弗瑞以 7 次出场紧随其后。这是有道理的,因为他基本上形成了复仇者联盟。
因此,就电影角色而言,钢铁侠似乎并不比其他复仇者联盟更重要。
对白
为了更深入地挖掘,我们不仅可以看一个角色在电影中的数量,还可以看他们有多少行对话。这是一个很好的屏幕时间的代理,告诉我们一个角色对故事有多重要。
汇总所有可用的漫威剧本,并绘制出每个角色的对话的总行数,下面的画面出现了。
这里我们看到托尼·斯塔克遥遥领先。远远落后于他的第二和第三名是托尔和史蒂夫罗杰斯,他们也是 MCU 的核心。如果我们看一个漫威角色说话的总字数,而不仅仅是对话的行数,那么托尼·斯塔克又赢了。有趣的是,健谈的洛基现在排名第四,而说话温和的史蒂夫·罗杰斯远远落后于托尔。
网络分析
有人可能会说,一个角色在银幕上的突出地位可能没有反映出他们对故事的重要性。一些字符可能不需要很多行就可以集成到 MCU 中(我正看着你格鲁特!).
为了了解主要漫威人物的重要性,我决定使用一些简单的网络分析技术。使用 python NetworkX 库,我将电影角色转换成图形中的节点。然后,我添加了边缘来表现屏幕上的角色互动。所以举个例子,如果雷神的一行对话跟随着布鲁斯·班纳(绿巨人)的一行对话,我们知道这些节点应该是连在一起的。使用这种方法,我能够构建以下主要 MCU 特征的图表。
Network Graph of the Marvel Universe based on Character Interactions
我们可以看到,最初的 6 名复仇者是漫威宇宙的核心,形成了图表的中心。外部部分与 MCU 中的其他“世界”相关。这些包括蚁人世界,银河护卫队集群,奇异博士的网络和附近的 Asgard。彼得·帕克也出现在复仇者联盟和钢铁侠角色旁边。这清楚地表明,他将取代托尼·斯塔克成为 MCU 的核心。
所以,很明显复仇者联盟构成了漫威宇宙的核心,但他们中的哪一个才是最核心的呢?对中心性的一个基本测量是计算一个节点有多少条边。通过绘制每个字符的连接数,我们可以测量它们在图中的连接程度。
这一次,托尼·斯塔克显然是赢家。事实上,钢铁侠和几乎所有其他漫威角色都有直接联系。
为了完整起见,我们可以看看网络中心性的其他度量。这些包括中间性中心性、特征向量中心性和接近中心性。介数衡量一个节点作为通向其他节点的桥梁的频率。特征向量中心性赋予网络中节点的影响力一个数值。并且,接近中心性表示网络中一个节点和所有其他节点之间的最短路径。这些措施的结果如下。
我们可以看到,就“中间性”而言,托尔名列前茅。这很有意义,因为他与复仇者联盟、惊奇队长、史蒂文·斯特朗奇和所有银河护卫队人都有直接联系。他是 MCU 里两个世界之间的一个人。在特征向量中心性中,钢铁侠名列前茅,表明他的节点是网络中最有影响力的。最后,就亲密度而言,托尼·斯塔克再次胜出,因为他与大多数其他角色都关系密切。
结论
根据我的分析,托尼·斯塔克、托尔和史蒂夫·罗杰斯显然是漫威电影宇宙的核心人物。他们是 MCU 网络的最核心,对话最多,因此薪酬最高。当然,钢铁侠得到的比他的复仇者伙伴们还要多。从大多数方面来看,他是最有关系、最有影响力和最杰出的角色,我认为公平地说,扮演他的演员配得上他的天价片酬。
奖金图表
感情
使用 R sentimentR 库,我计算了与每个角色相关的对话的平均情绪。
看起来大多数复仇者都相当乐观(不像他们的 DC 超级英雄同行)。事实上,就对话价而言,名字叫彼得·帕克和佩珀·波茨的人名列前茅。另一方面,银河护卫队,尤其是加莫拉,火箭浣熊和 Drax 是相当不积极的。正中间是尼克·弗瑞。这适合一个既有组织对抗星际威胁的偏执狂,又乐观地相信他们可以被征服的角色
复仇者联盟词汇云
为了好玩,我还为 6 个核心复仇者联盟制作了单词云。看看你能不能猜出哪朵云和哪个角色相配。
Word Clouds for Iron Man, Thor and Captain America
Word Clouds for the Hulk, Black Widow, and Hawkeye (Clint Barton)
电影界最重要的人物是谁?
William Shakespeare (left), Robert De Niro (middle), and Miles Long (right). Headshots from IMDB.com
使用 IMDB 数据的网络分析
凯文·贝肯曾说,他“与好莱坞的每个人或与他们一起工作的人合作过”,这导致了室内游戏“六度凯文·贝肯”,以及各种模仿,广告,棋盘游戏,脱口秀表演,甚至慈善机构“【SixDegrees.org】”。该游戏包括通过与其他演员共享电影,尝试将一个演员与凯文·贝肯联系起来,在六个连接内。例如,尼古拉斯·凯奇与梅丽尔·斯特里普一起改编,梅丽尔·斯特里普与凯文·贝肯一起在《荒野之河》中饰演角色(相隔 2 度,意味着尼古拉斯·凯奇的“培根指数”为 2)。网上也有各种资源,像培根神谕,计算一个演员的“培根数”。
Nicolas Cage is two degrees separated from Kevin Bacon, meaning Nicolas Cage has a “Bacon Number” of 2. Nodes (or vertices) in blue and links (or edges) in orange — explained in more detail below.
但是,凯文·贝肯是电影业中“联系最紧密”还是“最重要”的人吗?为了回答这个问题,我下载了整个 IMDB 数据库。这是一个丰富的数据集(就像从 1894 年开始的超过 510 万个标题中的超过 360 万人),一旦你开始从这些数据中“提取网络”,它就会变得非常庞大。通过“提取网络”数据,我的意思是我们感兴趣的不仅仅是人和电影,还有他们所有的联系。为了让分析更容易,我只使用了 1960 年后制作的电影,这些电影的 IMDB 评分至少为 4,171(平均值),总体评分高于 1.0。尽管如此,一旦我们提取网络,我们得到超过 12,000 部电影,超过 50,000 人,和 50 万个独特的连接!
网络由节点(或顶点)和链路(或边)组成。在 IMDB 网络的情况下,我们可以在同一个电影中使用节点和协作作为链接来表示人们。在网络分析中,有许多不同的方法来度量网络中节点的“重要性”,称为“中心性”度量。我在这里用引号将单词“重要性”括起来,因为这是一个主观的术语,一个节点对网络的重要性有不同的方式。这就是为什么有不同的中心性测量。
大概最简单的中心性度量是一个节点拥有的连接总数。这被称为**“度中心性”**,因为一个节点拥有的链接数量被称为该节点的“度”。例如,凯文·贝肯在 34 部电影中有 298 个合作者,这意味着他在这个网络中的“度”是 298。一个人拥有的联系越多,中心性程度就越高。具有高度中心性的人是网络中的“中枢”。度中心性是直观的和信息丰富的,但是不考虑次级连接,并且可能错过网络中卫星群的重要性。
特征向量中心性是一种度量,其将网络中节点的位置描述为其直接连接的函数,该直接连接又被计算为其直接连接的函数,等等。特征向量中心性不仅识别“枢纽”,还识别与枢纽有联系的人。因此,这种测量考虑到了具有相对较少但重要数量的连接的节点。 PageRank (源自拉里·佩奇),谷歌用于网站排名的算法,是特征向量中心性的一种变体——假设“重要”网站将被其他“重要”网站引用。特征向量中心性不仅考虑了直接连接,还可能遗漏卫星群。
中间中心性通过寻找每组两个节点之间的最短路径来计算。对于任意两个节点,它们之间都存在一条最短路径。通过一个节点的最短路径越多,它的介数中心性就越高。在许多节点或节点群之间充当“桥”或“代理”的节点具有较高的“介数中心性”。例如,在电力网络中,节点是变电站,链路是电流,位于许多其他变电站之间最短路径上的变电站将有大量电流流过,因此具有较高的介数中心性。介数中心性可用于评估哪个节点对于从网络中提取信息最重要,并且清楚地突出了充当到其他集群的桥梁的节点,但是在识别密集聚集的中央集群中的重要节点时不太有用。
紧密中心性定义为一个节点到所有其他节点的距离之和,可用于评估哪个节点对传播信息最重要。换句话说,具有高接近中心性的节点比其他节点更“嵌入”在网络中。
下图显示了网络中已连接节点的子集。节点的大小对应于它们对于四个不同度量的中心性,颜色对应于它们不同的“社区”(下面将详细解释)。
Different centrality measures: degree (top left) eigenvector (top right) betweenness (bottom left) and closeness (bottom right)
如上所述,每种方法都有优点、缺点和用途。度中心性(左上)有利于具有许多连接的节点,因此在主集群以及红色卫星集群中有一些大节点。特征向量中心性(右上)集中在红色卫星星团而不是中央星团。中间中心性(左下角)突出显示了充当集群之间桥梁的节点,请注意连接中央集群和卫星集群的所有节点都相对较大。在紧密度中心图(右下角)中,请注意大多数节点与其他中心性度量相比是如何变大的。这意味着网络本身,或者至少是中央集群,是非常密集的,即所有节点都是“接近的”。
让我们将这些中心性度量应用于 50,000 人的整个网络。具有最高程度中心性的十个人是:
- 劳勃·狄·尼诺(演员)
- 尼古拉斯·凯奇(演员)
- 杰瑞·高德史密斯(作曲家)
- 塞缪尔·L·杰克逊(演员)
- 詹姆斯·纽顿·霍华德(作曲家)
- 斯科特·鲁丁(制片人)
- 布鲁斯·威利斯(演员)
- 马克·艾沙姆(作曲家)
- 克尔·凯恩(演员)
- 詹姆斯·霍纳(作曲家)
这意味着这些人在职业生涯中与最多的人合作过。虽然他们可能不都是家喻户晓的名字,但这个名单并不令人惊讶。多年来,所有这些人都和许多人一起制作了许多电影。劳勃·狄·尼诺在 82 部电影中担任主角,与 613 位不同的合作者合作。杰瑞·高德史密斯于 2004 年去世,但他也是 82 部电影的主角。多产的尼克·凯奇已经和 602 人合作了 73 部电影,其中五部是去年拍摄的。
但是拍很多电影不一定让你成为最有影响力的人。去年,“电影”领域最多产的人是成人导演兼电影摄影师迈尔斯·朗,他主要参与了 41 部电影,总共有 265 名合作者。劳勃·狄·尼诺只和九个合作者拍了一部电影。我无意冒犯龙永图,但我很难证明他在 2018 年的电影业中比劳勃·狄·尼诺更重要。特征向量中心性不仅仅是将所有的联系相加,而且还说明了这些人之间的联系有多紧密。如果我们将这种中心性度量应用到我们的 IMDB 网络,我们会得到以下重要人员列表:
- 斯科特·鲁丁(制片人)
- 劳勃·狄·尼诺(演员)
- 詹姆斯·纽顿·霍华德(作曲家)
- 布莱恩·格雷泽(制片人)
- 塞缪尔·L·杰克逊(演员)
- 布鲁斯·威利斯(演员)
- 汉斯·季默(作曲家)
- 汤姆·汉克斯(演员)
- 卡特·布尔维尔(作曲家)
- 杰瑞·高德史密斯(作曲家)
虽然保留了许多名称,但列表中的变化突出了度中心性和特征向量中心性之间的一些重要差异。布莱恩·格雷泽、汉斯·季默、汤姆·汉克斯和卡特·布尔维尔被加入到名单中,而尼古拉斯·凯奇、马克·艾沙姆、克尔·凯恩和詹姆斯·霍纳则落榜了,这意味着新加入的人联系较少,但这些联系的“重要性”高于那些被移除的人。例如,汉斯·季默主要参与了“仅”48 部电影,总共有 360 名合作者,但这些联系比尼克·凯奇的 602 部电影更“有联系”。
度和特征向量中心性可以告诉我们很多关于网络的信息,但它们可能会错过一些重要的见解。如果我们计算网络的介数中心性,我们会得到一个几乎完全不同的前十名列表:
- 威廉·莎士比亚(作家)
- 拉赫曼(作曲家)
- 尼古拉斯·凯奇(演员)
- 伊尔凡·可汗(演员)
- 劳勃·狄·尼诺(演员)
- 格汗·蒂尔亚基(电影摄影师)
- 埃尼奥·莫里康(作曲家)
- 杰瑞·高德史密斯(作曲家)
- 塞缪尔·L·杰克逊(演员)
- 威利姆·达福(演员)
中间中心性是通过一个节点的“最短路径”数量的函数。通过一个节点的最短路径越多,它的介数中心性就越高。这就是为什么我们可以有一个非常不同的“最重要”的人的列表——这些人在网络中充当从中心集群到卫星集群的桥梁。为了说明这一点,我运行了一个社区检测算法来识别重要的个体集群。网络中的“社区”本质上只是一组节点,它们彼此之间的连接比与网络其余部分的连接更紧密。
下图根据介数显示了一些突出的节点。每个节点的大小对应于它们的介数,颜色对应于它们的社区。在这里我们看到了为什么拉赫曼和伊尔凡·可汗的排名如此之高——他们是从好莱坞到印度电影的桥梁。同样,哥汗·蒂尔亚基是好莱坞通向土耳其电影业的桥梁,成龙是中国电影业的桥梁,佩内洛普·克鲁兹是西班牙电影的桥梁,朱丽叶·比诺什和杰拉尔·德帕迪约将好莱坞与法国电影联系起来。也许最有趣的是,威廉·莎士比亚是中间中心性方面最有影响力的节点。这是因为他的作品贯穿了电影的整个生命周期,也因为世界上几乎所有的电影业都制作过莎士比亚的电影。为了探索这种联系,你可以看看这个互动网络视频。
那么,好莱坞“最重要”的人是谁?这取决于你所说的“重要”是什么意思。在六度游戏的背景下,劳勃·狄·尼诺可能是你最好的选择,除非你和一个非常熟悉美国以外电影产业的人一起玩,那么试试威廉·莎士比亚。如果你想知道,凯文·贝肯在度中心性方面排名第 100,在特征向量中心性方面排名第 87,在中间中心性方面排名第 167。
这里是所有这些分析作为一个 Jupyter 笔记本。
感谢杰斯·雷蒂格、戴夫·波尔和伊昂·何的帮助!
【1】IMDB 的数据只列出了每部电影大概七到十个“主犯”。这通常意味着作家,导演,制片人,作曲家,和一些演员被列出。因此,电影中不在这个名单上的任何人都不在这个分析中。例如,约翰尼·德普不在《巧克力》之列——朱丽叶·比诺什、凯莉·安妮·莫斯、艾尔弗雷德·莫利纳和朱迪·丹奇名列前茅。这也解释了为什么前十名名单中有四位作曲家——作曲家几乎总是被列为主要负责人之一。
【2】虽然我在 IMDB 的数据中过滤了“成人”类别,但龙的作品被归类为“电影”,因此也包括在内,尽管当我过滤掉评分不超过 4171 分的电影时,它们都被删除了。
谁是你的金鹅?:群组分析
Python 中基于 RFM 值和 K 均值聚类的客户细分
客户细分是一种根据购买模式将客户分组的技术,以确定谁是最有利可图的群体。在细分客户时,也可以根据市场使用各种标准,如地理、人口特征或行为基础。这种方法假设具有不同特征的群体需要不同的营销方法,并希望找出最能提高其盈利能力的群体。
今天,我们将讨论如何使用来自 UCI ML repo 的在线零售数据集进行客户细分分析。这种分析将集中在获得 RFM 值和用 K-means 算法进行聚类这两个步骤上。数据集和完整代码也可以在我的 Github 上获得。这篇笔记的原始资料来自课程“Python 中的客户细分分析”
什么是 RFM?
RFM 是近期、频率和货币的缩写。最近是关于客户最后一次订购的时间。它表示自客户最后一次购买以来的天数。如果是网站或应用程序的情况,这可能被解释为最后访问日或最后登录时间。
频率是关于给定时间段内的购买次数。可能是 3 个月,6 个月或者 1 年。所以我们可以把这个值理解为客户使用公司产品的频率或数量。价值越大,客户参与度越高。我们可以说他们是我们的贵宾吗?没必要。因为我们还必须考虑他们每次购买实际支付了多少钱,这意味着货币价值。
货币是客户在给定期间花费的总金额。因此,挥金如土的人将与其他客户区分开来,如 MVP 或 VIP。
Photo from CleverTap
这三个值是队列分析中常用的可量化因素。由于其简单直观的概念,它们在其他客户细分方法中很受欢迎。
导入数据
所以我们今天将把 RFM 应用到我们的队列分析中。我们将要使用的数据集是从 2010 年 1 月到 2011 年 9 月的交易历史数据。由于这是队列分析的指导方针,我将只使用原始数据集的随机选择部分。
# Import data
online = pd.read_excel('Online Retail.xlsx')# drop the row missing customer ID
online = online[online.CustomerID.notnull()]
online = online.sample(frac = .3).reset_index(drop = True)online.head()
计算 RFM 值
我们要计算的第一件事是最近值,即自客户最后一个订单以来的天数。我们可以从哪一列获得该值? InvoiceData 。使用这个列,我们可以得到客户的第一次购买和最后一次购买的时间。我们姑且称第一个为cohorday。由于 InvoiceDate 还包含额外的时间数据,我们需要提取年、月和日部分。之后,我们将得到工作日,它是工作日的最小值。
# *extract year, month and day*
online['InvoiceDay'] = online.InvoiceDate.apply(**lambda** x: dt.datetime(x.year, x.month, x.day))online.head()
由于我们随机选择了数据的子集,我们还需要知道数据的时间段。如下图所示,我们数据集的最后一天是 2011 年 12 月 9 日。因此,将 12 月 10 日设置为我们的 pining 日期,并从每个客户最近一次购买的天数开始倒数。这就是最近值。
# print the time period
print('Min : {}, Max : {}'.format(min(online.InvoiceDay), max(online.InvoiceDay)))
# pin the last date
pin_date = max(online.InvoiceDay) + dt.timedelta(1)
在得到最近值之前,让我们先多算一个值,每个顾客花的钱的总数。这是为了计算货币价值。我们怎样才能得到它?轻松点。将每行中的产品价格和订单数量相乘。
# Create total spend dataframe
online['TotalSum'] = online.Quantity * online.UnitPrice
online.head()
现在我们准备一下子得到三个 RFM 值。我将对每个客户的数据进行分组,并针对每个最近、频率和货币价值进行汇总。
# calculate RFM values
rfm = online.groupby('CustomerID').agg({
'InvoiceDate' : lambda x: (pin_date - x.max()).days,
'InvoiceNo' : 'count',
'TotalSum' : 'sum'})# rename the columns
rfm.rename(columns = {'InvoiceDate' : 'Recency',
'InvoiceNo' : 'Frequency',
'TotalSum' : 'Monetary'}, inplace = True)rfm.head()
RFM 四分位数
现在,我们将根据 RFM 价值观对客户进行分组。因为这些是连续值,我们也可以使用分位数值,并将它们分成 4 组。
# create labels and assign them to tree percentile groups
r_labels = range(4, 0, -1)
r_groups = pd.qcut(rfm.Recency, q = 4, labels = r_labels)f_labels = range(1, 5)
f_groups = pd.qcut(rfm.Frequency, q = 4, labels = f_labels)m_labels = range(1, 5)
m_groups = pd.qcut(rfm.Monetary, q = 4, labels = m_labels)
请格外小心r_labels
。我把标签按降序排列。这是为什么呢?因为最近意味着从客户最后一次订购到现在已经过去了多长时间。因此,价值越小,顾客对该品牌的参与度越高。现在让我们创建一个新的列来表示组标签。
# make a new column for group labels
rfm['R'] = r_groups.values
rfm['F'] = f_groups.values
rfm['M'] = m_groups.values# sum up the three columns
rfm['RFM_Segment'] = rfm.apply(lambda x: str(x['R']) + str(x['F']) + str(x['M']), axis = 1)
rfm['RFM_Score'] = rfm[['R', 'F', 'M']].sum(axis = 1)
rfm.head()
我在一个单元格中贴上了所有三个标签作为RFM_Segment
。这样,我们可以很容易地检查一个客户属于哪个级别或细分市场。RFM_Score
是三个值的总和。不一定是总和,所以平均值也是可能的。此外,我们可以捕捉进一步的模式与平均值或计数值的新近,频率和货币分组的分数如下。
# calculate averae values for each RFM
rfm_agg = rfm.groupby('RFM_Score').agg({
'Recency' : 'mean',
'Frequency' : 'mean',
'Monetary' : ['mean', 'count']
})rfm_agg.round(1).head()
RFM_Score
将是客户参与度或忠诚度的总分。将这三个价值加在一起,我们最终可以将客户分为“金牌”、“银牌”、“铜牌”和“绿色”。
# assign labels from total score
score_labels = ['Green', 'Bronze', 'Silver', 'Gold']
score_groups = pd.qcut(rfm.RFM_Score, q = 4, labels = score_labels)
rfm['RFM_Level'] = score_groups.valuesrfm.head()
太好了!我们完成了一个 RFM 值的队列分析。我们确定了谁是我们的金鹅,以及我们应该额外注意的地方。现在,我们为什么不尝试一种不同的客户细分方法,并比较两种结果呢?
k 均值聚类
K-Means 聚类 是一种无监督学习算法,它根据点与点之间的距离进行分组。怎么会?K-Means 聚类中有两个距离概念。类内平方和 (WSS)和类间平方和 (BSS)。
WSS 表示每个聚类的点和相应质心之间的距离之和,BSS 表示质心和总样本平均值之间的距离之和乘以每个聚类内的点数。因此,您可以将 WSS 视为紧致性的度量,将 BSS 视为分离性的度量。为了聚类成功,我们需要获得较低的 WSS 和较高的 BSS。
通过迭代和移动聚类质心,K-Means 算法试图得到质心的优化点,使 WSS 值最小,盲源分离值最大。基本概念我就不去更深入了,不过你可以从视频中找到进一步的解释。
Photo from Wikipedia
因为 K-means 聚类使用距离作为相似性因子,所以我们需要缩放数据。假设我们有两种不同尺度的特征,比如身高和体重。平均身高 150cm 以上,体重 100kg 以下。因此,如果我们绘制这些数据,点与点之间的距离将在很大程度上由高度决定,从而导致有偏差的分析。
因此,当涉及 K-means 聚类时,缩放和归一化数据是预处理的关键步骤。如果我们检查 RFM 值的分布,你会注意到它们是右偏的。不规范使用不是一个好的状态。让我们先将 RFM 值转换成对数标度,然后再进行归一化。
# define function for the values below 0
def neg_to_zero(x):
if x <= 0:
return 1
else:
return x# apply the function to Recency and MonetaryValue column
rfm['Recency'] = [neg_to_zero(x) for x in rfm.Recency]
rfm['Monetary'] = [neg_to_zero(x) for x in rfm.Monetary]# unskew the data
rfm_log = rfm[['Recency', 'Frequency', 'Monetary']].apply(np.log, axis = 1).round(3)
小于或等于零的值在对数标度时变为负无穷大,我创建了一个函数将这些值转换为 1,并将其应用于Recency
和Monetary
列,使用如上所述的列表理解。然后,对每个 RFM 值应用对数变换。下一个预处理步骤是缩放,但它比上一步简单。使用 StandardScaler() ,我们可以得到如下标准化值。
# scale the data
scaler = StandardScaler()
rfm_scaled = scaler.fit_transform(rfm_log)# transform into a dataframe
rfm_scaled = pd.DataFrame(rfm_scaled, index = rfm.index, columns = rfm_log.columns)
左边的图是预处理前的 RFM 分布,右边的图是归一化后的 RFM 分布。通过使它们处于某种程度上的正态分布,我们可以向我们的模型提供一些提示,以便轻松而准确地掌握值之间的趋势。现在,我们完成了预处理。
接下来是什么?下一步是选择正确的集群数量。我们必须选择要组成多少个小组。如果有先验知识,我们可以把数字直接给算法。但是在无监督学习的大多数情况下,没有。所以我们需要选择优化的数字,肘法是我们可以得到提示的解决方案之一。
# the Elbow method
wcss = {}
for k in range(1, 11):
kmeans = KMeans(n_clusters= k, init= 'k-means++', max_iter= 300)
kmeans.fit(rfm_scaled)
wcss[k] = kmeans.inertia_# plot the WCSS values
sns.pointplot(x = list(wcss.keys()), y = list(wcss.values()))
plt.xlabel('K Numbers')
plt.ylabel('WCSS')
plt.show()
使用 for 循环,我为从 1 到 10 的每个集群构建了模型。然后收集每个模型的 WSS 值。看下面的剧情。随着聚类数量的增加,WSS 值降低。这并不奇怪,因为我们做的聚类越多,每个聚类的大小就会减小,所以每个聚类内的距离之和就会减小。那么最佳数字是多少呢?
答案在这条线的“肘”处。在某处,WSS 急剧下降,但 k 值不会太大,我在这里的选择是 3。你说什么?它看起来真的不像线的一个肘吗?
现在,我们选择了集群的数量,我们可以建立一个模型,使实际的集群如下。我们还可以检查每个点和聚类的质心或标签之间的距离。让我们创建一个新列,并将标签分配给每个客户。
# clustering
clus = KMeans(n_clusters= 3, init= 'k-means++', max_iter= 300)
clus.fit(rfm_scaled)# Assign the clusters to datamart
rfm['K_Cluster'] = clus.labels_
rfm.head()
现在我们做了两种分割,RFM 分位数组和 K-均值组。我们来做个可视化,对比一下两种方法。
蛇图和热图
我要做两种图,线图和热图。我们可以很容易地比较这两个图的 RFM 值的差异。首先,我将创建列来分配两个聚类标签。然后通过将 RFM 值融合到一列来重塑数据框。
# assign cluster column
rfm_scaled['K_Cluster'] = clus.labels_
rfm_scaled['RFM_Level'] = rfm.RFM_Level
rfm_scaled.reset_index(inplace = True)# melt the dataframe
rfm_melted = pd.melt(frame= rfm_scaled, id_vars= ['CustomerID', 'RFM_Level', 'K_Cluster'], var_name = 'Metrics', value_name = 'Value')
rfm_melted.head()
这将使新近性、频率和货币类别成为观察值,这允许我们在一个图中绘制值。将Metrics
放在 x 轴上,将Value
放在 y 轴上,并通过RFM_Level.
对值进行分组。这次重复通过K_Cluster
对值进行分组的相同代码。结果如下所示。
# a snake plot with RFM
sns.lineplot(x = 'Metrics', y = 'Value', hue = 'RFM_Level', data = rfm_melted)
plt.title('Snake Plot of RFM')
plt.legend(loc = 'upper right')# a snake plot with K-Means
sns.lineplot(x = 'Metrics', y = 'Value', hue = 'K_Cluster', data = rfm_melted)
plt.title('Snake Plot of RFM')
plt.legend(loc = 'upper right')
这种情节在市场分析中被称为“蛇情节”。似乎左边图中的金色和绿色组与右边图中的 1 和 2 组相似。而铜牌和银牌组好像合并成了 0 组。
让我们用热图再试一次。热图是数据的图形表示,其中较大的值用较暗的刻度表示,较小的值用较亮的刻度表示。我们可以通过颜色非常直观地比较各组之间的差异。
# the mean value in total
total_avg = rfm.iloc[:, 0:3].mean()
total_avg# calculate the proportional gap with total mean
cluster_avg = rfm.groupby('RFM_Level').mean().iloc[:, 0:3]
prop_rfm = cluster_avg/total_avg - 1# heatmap with RFM
sns.heatmap(prop_rfm, cmap= 'Oranges', fmt= '.2f', annot = True)
plt.title('Heatmap of RFM quantile')
plt.plot()
然后像之前一样对 K-clusters 重复相同的代码。
# calculate the proportional gap with total mean
cluster_avg_K = rfm.groupby('K_Cluster').mean().iloc[:, 0:3]
prop_rfm_K = cluster_avg_K/total_avg - 1# heatmap with K-means
sns.heatmap(prop_rfm_K, cmap= 'Blues', fmt= '.2f', annot = True)
plt.title('Heatmap of K-Means')
plt.plot()
这可能是不匹配的,尤其是在地块的顶部。但只是因为顺序不同而已。左边的绿色组将对应 2 组。如果你看到每个方框内的数值,你会发现黄金组和 1 组之间的差异变得非常显著。通过颜色的深浅很容易辨认出来。
结论
我们讨论了如何从客户购买数据中获取 RFM 值,并用 RFM 分位数和 K-Means 聚类方法进行了两种细分。有了这个结果,我们现在可以知道谁是我们的“黄金”客户,最赚钱的群体。这也告诉我们应该关注哪个客户,向谁提供特别优惠或促销,以培养客户忠诚度。我们可以为每个细分市场选择最佳的沟通渠道,并改进新的营销策略。
资源
-
一篇关于 https://clevertap.com/blog/rfm-analysis/的精彩文章
-
另一个对 RFM 分析有用的解释:https://www.optimove.com/learning-center/rfm-segmentation
-
对 K-means 聚类的直观解释:https://www.youtube.com/watch?v=_aWzGGNrcic
感谢您的阅读,希望您对这篇文章感兴趣。如果有需要改正的地方,请分享你的见解!如果您想鼓励一位有抱负的数据科学家,请点击👏 👏 👏!我总是乐于交谈,所以请随时留下评论或在 LinkedIn 上联系我。我会带着另一个令人兴奋的项目回来。在那之前,机器学习快乐!
谁说的:布什还是奥巴马?
Photo by Patrick Tomasso on Unsplash
想象一下,你是一位炙手可热的大学教授,刚刚收集了这学期的期末论文。当你在电脑上浏览全部 300 篇文章时,你意识到有几个学生忘记在文章上写上他们的名字。嗯……那不理想。你有没有试图追踪神秘学生?你会让所有犯了忘记名字这一令人遗憾的错误的学生不及格吗?
事实证明,数据科学可以提供帮助!
作者归属
原来,姓名缺失问题只是一个更广泛的领域中的一个例子,这个领域被称为**作者归属,**根据某一特定作品的作者和其他作者过去的例子来预测该作品的作者的过程。
在高层次上,作者归属由以下直观步骤组成:
- 通读不同作者的作品,识别每个作者使用的 【最重要】 单词、短语或其他演讲单位
- 对于一个有神秘作者的给定文档,比较最常见的单词、短语等。在具有每个作者的相应列表的文档中
- 神秘文件列表与任何给定的作者列表越匹配,我们就越有信心这个作者写了神秘文件
在这篇文章的剩余部分,我们将讨论总统演讲。具体来说,我们将分析乔治·w·布什总统的一篇演讲和巴拉克·奥巴马总统的一篇演讲,找出每位总统最重要的短语。
然后我们会读到一篇神秘的演讲,并试图找出它最有可能属于哪一位总统。
Photo by History in HD on Unsplash
它是如何工作的?
假设我们有布什总统和奥巴马总统的(非常简单的)演讲,看起来像这样:
布什演讲:“我们必须共同努力才能胜利,共同努力才能成功。”
奥巴马演讲:“要持之以恒,我们必须努力。要持之以恒,就要坚强。”
我们的目标是为每篇演讲找出“最重要的短语”。嗯……什么是短语?在演讲的上下文中,一个短语重要是什么意思?嗯,为了简单起见,我们将认为一个短语是演讲中任何连续的 3 个单词。所以对于上面的小“演讲”,短语应该是(现在忽略大写和标点):
Phrases in each toy speech
这里有几点需要注意。首先,请注意奥巴马说了两次“为了坚持,我们”,而布什从来没有说过。这表明**“为了坚持,我们”是奥巴马的一个重要识别短语。同样,布什说了【共同努力】**两次,而奥巴马从来没有说过,这表明了布什的身份。
还要注意,两位总统都说**“我们必须努力”**,这表明可能不是一个用于识别目的的有用短语。
所以我们对一个短语的重要性有了一个模糊的概念。它应该满足两个标准:
对一位总统来说很重要但对另一位总统来说不重要的短语需要…
- 在总统演讲中经常出现
- 出现 的只有 那位总统的演讲
这有直观的意义;如果我们知道某个短语只有奥巴马说而奥巴马经常说,然后我们在一个神秘的演讲中看到同样的短语,我们可以相当肯定这个演讲是奥巴马说的。****
快速数学解释器(如果你感兴趣的话)
我们如何用数学方法量化它?
我们将使用名为 TF-IDF 的久经考验的方法来确定作者身份。TF-IDF 代表词频——逆文档频率(比听起来可怕多了)。以下是部分内容:
给定一个短语和一个作者,这个短语在所有可能的短语中出现的频率是多少?例如,在上面简单的布什演讲中,总共有 8 个短语和其中两个是“共同努力”,因此“共同努力”短语的 TF 是 2/8 = 0.25
逆文档频率(IDF): 给定某个短语, IDF 定义如下:
给定上面玩具演讲中的短语“我们必须工作”,我们看到两位总统都使用它,因此 IDF 将是 log(2/2) = 0。现在,给定短语“work together to”**,布什只使用了,我们看到 IDF 将是 log(2/1) = 0.3(以 10 为基数的对数)。****
要获得特定短语和作者的 TF-IDF,您只需将 TF 和 IDF 值乘上。****
好吧…但是 为什么 有用呢?
假设我们为两位总统的短语“共同努力”计算 TF-IDF:
对于布什: TF = 0.25 & IDF = 0.3 所以 TF-IDF = 0.250.3 = 0.075*
奥巴马: TF = 0 & IDF = 0.3 所以 TF-IDF = 00.3 = 0*
因此,我们得到了布什更高的 TF-IDF,这正是我们想要的,因为这个短语自然是布什更好的标识符。
作为另一个合理性检查,让我们计算两位总统都使用的短语“我们必须工作”的 TF-IDF。
对于布什: TF = 0.125,IDF = 0,所以 TF-IDF = 0
对于奥巴马: TF = 0.1,IDF = 0,所以 TF-IDF = 0
正如我们所希望的,这个短语对两位总统都没有真正的识别价值,因为它被两位总统使用。
从本质上说,这是可行的,因为 TF-IDF 奖励那些只有一位总统经常使用的短语而惩罚那些不常使用或两位总统都使用的短语。****
代码—识别最重要的短语
好了,理论谈够了!让我们深入研究代码。
我们首先读入并清理布什和奥巴马的一篇演讲稿,这两篇演讲稿存储为 txt 文件。
然后,我们将通读两篇演讲,并得到 TF 值的字典。也就是说,我们将构造字典,其中的关键字是短语,值是该短语在任一语音中的频率。
现在,我们将获得每个短语的 IDF 值,并为每个总统构建 TF-IDF 字典。
此时,我们可以根据最高的 TF-IDF 值打印出布什和奥巴马最重要的短语。
Top 3 Bush and Obama phrases by TF-IDF scores
密码——谁写的秘密演讲稿?
不错!因此,我们为每位总统列出了最重要的短语。让我们读入一份全新的秘密演讲稿,看看我们的系统能否找出是谁写的。剧透警报……是奥巴马。
现在,我们将循环播放秘密演讲中的每个独特短语。对于每个短语,我们将将其 TF 值(在秘密演讲中出现的频率)乘以该短语对于奥巴马的 TF-IDF 值(该短语对于奥巴马的标识符有多重要)。我们为 Bush 做了同样的事情,并为每个独特的短语保存了这些产品的运行总数。得分较高的总统将是我们预测的演讲者!****
请击鼓吧! …。
将分数换算成百分比后,老布什最终得分为 37% ,奥巴马最终得分为 63% ,使得奥巴马成为我们预测的演讲者和正确答案!****
只是为了好玩,如果我们使用布什的新秘密演讲,我们会得到布什 62%的分数,T2 38%的分数,所以我们的系统是双向的!
希望这能帮助你理解一些关于作者归属的问题。这里有几个自然的扩展,例如:
- 使用多个作者,而不是只有两个
- 考虑到大写、标点和写作的其他部分
- 添加更多的自然语言上下文,而不是简单的连续单词集
我真的很兴奋看到你能想到什么扩展!
祝好运,感谢阅读!~
数据科学的 5 个先决条件。
成为数据科学家值得评价的 5 点。
数据科学——市场上的热门词汇!!不是吗?
当时最性感的工作,需求同比增长 29%,自 2013 年以来增长 344%,很容易获得不错的加薪…等等。等等。等等。😃
利润丰厚,足以进入一个人的头脑,推动他们将职业生涯转向成为一名数据科学家。
在本文中,我将解释成为数据科学家的 5 个先决条件,在决定将数据科学作为职业选择之前,必须了解这些先决条件。
我是一名数据科学家,从事行业工作已近十年。与有抱负的数据科学家打交道在我的 数据科学培训/面试 经历中,我注意到只有 10-15%的有抱负者最终得到了数据科学家的工作。
为什么即使经过培训,投入大量时间和金钱,还是会发生这种情况?
理解为什么有些人擅长数据科学,而有些人不擅长,即使经过培训和指导也是如此,这一点非常重要。
以下是在投身数据科学领域之前应该自问的一些关键问题,这些问题将有助于他们做出正确的决定。我没有把技术内容放在下面,只是一些高层次的事实。
对数据的理解:
既然数据科学都是关于数据的,那么首先要检查的应该是“对数据的 热爱”。要理解为什么数据在数据科学中如此重要,请在 YouTube 上观看这个视频— 数据科学是 15 分钟
下面的问题将有助于理解 对数据的热爱:
- 你理解数据语言或者至少什么是数据/信息吗?
- 你在目前的工作中处理数据吗?
- 你理解表格(行/列)和一些非结构化数据吗?
- 最重要的是,你喜欢看数据和处理数据吗?
如果以上问题的大多数答案为“是”,那么这是从“ 数据 ”的角度出发的。
理解算法/逻辑:
算法是给计算机做特定任务的一组指令。
即使你在纸笔上解决了一个难题,它也与计算机中的算法非常相似。
由于所有的机器学习系统都建立在算法的基础上,所以对算法的含义以及如何使用逻辑在高层次上设计算法有一个基本的理解是非常重要的先决条件。
举个例子,如果我把 10 个随机数放在这里,例如 12,54,32,76,54,31,98,67,76,87,任务是找到第三大数“T0”“”,那么人们应该能够想到应该用什么逻辑来得到第三大数“T2”。
如果一个人能写出循序渐进的逻辑,他/她也能理解机器学习算法。要了解什么是高水平的机器学习,请观看视频— 机器学习的 4 个组成部分
对编程的理解:
没有人需要成为超级程序员来开始他们的数据科学之旅。
然而,人们应该了解计算机代码是如何编写的。一些基本的东西,可能是:
- 什么是变量和常数?数据类型是什么意思?
- 循环/条件语句是什么意思?
- 输入/输出/功能等的含义是什么??
- 什么是客户端/服务器/数据库/API/托管/部署等?
如果对以上问题感到满意,那么“ 编码 ”部分就可以了!
对统计的理解:
统计学是数据科学的主要研究领域之一。这个领域没有教学大纲,这是数据科学的必备知识,但是以下主题不会让有抱负的数据科学家感到不舒服:
- 均值、中值、众数、搁浅偏差/方差、百分位数等。
- 分布/概率/贝叶斯定理等。
- 统计检验,如假设检验、方差分析、卡方检验、p 值检验等。
对业务领域的理解:
这一点并不像上面提到的那样是有抱负的数据科学家的障碍,然而,一个人对特定业务领域或领域的理解越多,他/她对来自该领域的数据进行分析就越容易。
出于上述几点,如果有人在一两个方面落后,先刷那些概念再开始数据科学之旅总是比较好的。我向你保证;旅途会更顺利。
数据科学被称为 21 世纪“最性感的工作”。如果你想知道这样称呼的原因,请观看这个关于数据科学的未来的视频
如果你认为,你已经准备好成为一名数据科学家,这里是你旅程的起点——如何成为一名数据科学家?
加入我们的数据科学社区脸书、推特、 Instagram 、 LinkedIn
链接到 YouTube 频道**“展开数据科学”**
干杯
谁将赢得 2019/20 赛季的 EPL 金靴奖。
Photo credit: https://www.stickpng.com/img/sports/soccer-football/premier-league-logo
机器学习如何在 2019/2020 英超赛季之前预测最高射手。
两周后,体育场将会座无虚席。粉丝们会欢呼的。权威人士会评论。全世界的支持者都会关注。最有趣的体育联赛,英格兰超级联赛,将会回来。
英格兰超级联赛,也被称为 EPL,是欧洲竞争激烈的足球联赛,每支球队都参加,直到赛季的最后一天。为了逃离降级区,各队都在激烈竞争前四名。
赛季开始的时候,人们会问很多关于赛季将如何进行的问题。每年提出的最大问题之一是谁将是最高射手。
因此,已经使用机器学习来创建一个模型,可以提前预测 2019/20 赛季的最高进球得分者。
英超联赛数据收集
该项目的最重要方面是数据收集,而任何数据集的最重要方面是拥有所需的重要功能。
数据收集自过去两个赛季的英超联赛。第一个数据集代表了 2017-18 年的 EPL 季。是通过这个链接获得的,并被插入到一个 excel 文件中,该文件通过添加几个列被进一步编辑。这个数据集被命名为英超 2018/19 进球预测器。
包含 2018-2019 年 EPL 赛季的信息输入到一个 excel 表格中,该表格是使用 Kaggle 获得的这里是。这个数据集被命名为英超 2019/2020 进球预测器。
两个数据集都被手动修改为包含一个名为“团队价值”的行球队价值是通过分解英超 20 支球队并分组来衡量的。
前四支队伍的得分为 5 分。接下来的四个被指定为 4。接下来的四个得到的值是 3。降级区前的五支球队被分到 2。
降级的三支球队没有获得任何球队价值,因为他们的球员下赛季不在英超联赛。因此,它们没有包括在数据集中。
英超联赛 2018/19 赛季的进球预测进一步修改,在另一个名为“2018/19 赛季进球”的栏目下,纳入了每个球员在 2018/19 赛季的进球。
将球队价值列添加到两个数据集中的原因是因为英超联赛的球队最终会产生最多的射手。2018/19 赛季的进球被添加到英超 2018/19 赛季的进球预测中,因为该模型需要拟合因变量。
此外,使用该模型通过英超 2019/2020 进球预测器预测球员在 2019/20 赛季的进球。
英超 2018/19 赛季进球预测器最终特征为:球员姓名、球队名称、上赛季进球、上赛季助攻、上赛季上场时间、球队价值以及 2018/19 赛季进球。
英超 2019/2020 进球预测器最终特征为:球员姓名、上赛季出场分钟数、上赛季进球数、上赛季助攻数和球队价值。
探索数据集
进一步探索了英超 2018/19 进球预测器,以获得关于如何正确创建有效模型的更多见解。
首先,绘制不同的条形图来显示团队价值如何随不同的可测量属性而变化。
Goal Scored in 2017/18 vs Team Value
从图表中可以看出,团队价值最高的球员进球最多,其次是得分第二高的球员。第三和第四似乎大致相等地分享了第三点。
Goal Scored in 2018/19 vs Team Value
Assist made in 2017/18 vs Team Value
2017-18 赛季进球与球队价值的条形图中的相同趋势也在 2018/19 赛季进球与球队价值的条形图中得到注意。
然而,2017/18 赛季的助攻条形图与团队价值几乎相同,只是团队价值最低的球员排名第三,团队价值第二的球员排名第四。
Minutes played in 2017/18 vs Team Value
人们注意到,在 2017/18 赛季上场时间与球队价值的图表中,球队价值最小的球员上场时间最多。而团队价值最高的球员位居第二。然后,这个类别的第二和第三团队价值球员的上场时间几乎相等。他们俩都得了第三名。
在前三个条形图中观察到共享第三位置的趋势的原因可能是因为有五个团队,团队值为 2。其他团队值每个都有四个团队。
这也是最没有团队价值的球员比其他任何有团队价值的球员打更多时间的原因。
首先,创建了 2018/19 目标预测数据集的相关系数表。
Correlation coefficient of all the columns in the 2018/19 goal predictor dataset.
该表告诉我们,2018/19 赛季的进球与上赛季的进球之间存在强烈的正相关关系,2018/19 赛季的进球与上赛季的助攻之间存在中度的正相关关系。
2018/19 赛季的进球数和上赛季的上场时间以及 2018/19 赛季的进球数和球队价值之间存在微弱的正相关关系。
创建了一个散点图,以突出 2018/19 赛季进球和上赛季进球之间的关系。
Goal Scored in 2018–19 vs Goal Scored in 2017–18
可以观察到,在图中有很强的正线性拟合。这表明,这两个变量之间有一个坚实的相关性。相关系数值可以在上表中看到,为 0.787。
预测最佳射手
根据机器学习,英超 2018/19 进球预测数据集可以拆分为两组:训练数据集和测试数据集。目标是使用训练数据集构建模型,并使用测试数据集测量其准确性。
训练数据集被随机分配整个数据集的 70%,而测试数据集被随机分配整个数据集的 30%。
然后,使用原始数据集构建的模型可以应用于另一个数据集,该数据集独立于称为验证数据集的训练数据集。
我们的验证数据集是英超 2019/2020 进球预测器,用于预测英超 2019/2020 赛季的最高进球得分。
通过将 2018/19 赛季进球特征、因变量和其他选定特征(上赛季进球、上赛季助攻和球队价值)作为自变量,创建了多元线性回归模型,以拟合基于其他特征的训练数据集。
然后,通过预测测试数据集在 2018/19 年得分的目标来测试该模型的准确性。计算出的 r 平方为 73.27 %。这表明,鉴于足球是一项非常不可预测的游戏,该模型的准确性相当强。
皮尔逊相关系数为 0.898。这表明 2018-19 年的预测目标和 2018-19 年的实际目标之间存在很强的相关性。均方根误差为 2.02,这意味着数据点离最佳拟合线并不远。
r 平方、相关系数和 rmse 的值显示了预测值在应用于验证数据集时的可靠程度。
使用从验证数据集中选择的相似特征作为独立变量,计算 2019/20 赛季的预测目标。
2018/19 赛季预测的前 20 名最佳射手
下面的表格向我们展示了根据上一赛季的变量,2018/19 赛季前 20 名进球最多的球员应该是什么样子。
The predicted top 20 highest goal scorer for the 2018/19 season.
根据模型,萨拉赫、凯恩和阿圭罗仍将分别保持第一、第二和第三。一些球员应该比其他人提前结束比赛,例如,根据预测模型,斯特林应该比瓦迪进更多的球。
2019/20 赛季预测的前 20 名最佳射手
这里是另一个表格,向我们展示了 2019/20 赛季前 20 名最高进球得分者使用英超 2018/19 进球预测器的预测模型应该是什么样子。
The predicted top 20 highest goal scorers of the 2019/20 season
嗯,预测认为萨拉赫毫无意外地名列第一。毕竟,他在过去两个赛季的联赛中进球最多。它认为奥巴姆扬排在第二位。然后,塞尔吉奥·阿奎罗是第三名。
没有人确切知道这个赛季将如何结束,因为这只是一个预测。球员在赛季中可能会被转移、受伤或坐冷板凳。因此,我们所要做的就是坐下来,放松,享受足球这项美丽的运动。
谁会赢得权力的游戏?
《权力的游戏》的最后一季终于来了,每个人心中的问题是:
最后谁会坐上铁王座?
我们在 Visme 的团队,一个数据可视化工具,有一点有趣的是可视化每个主要角色最终出现在铁王座上的概率,使用赌博网站 Bovada 上发布的最新赔率计算。
赔率显示布兰·史塔克最有可能登上王位,紧随其后的是琼恩·雪诺、丹妮莉丝和珊莎。
就连乔恩和丹妮莉丝假想的孩子也出现在了结果中,与艾莉亚·史塔克、山姆威尔·塔利和培提尔的“小指头”贝里席(有人认为他在上一季用一个无面人伪造了自己的死亡)一样,排在第九位。
每个人心中的另一个燃眉之急是:第八季谁会先死?
使用同样的计算将赔率转换成隐含概率,我们发现博彩公司认为攸伦·葛雷乔伊最有可能首先灭亡,其次是亚拉、席恩·葛雷乔伊和瑟曦·兰尼斯特。
作为书呆子,我们也开始思考:根据现代人格科学,谁最适合领导维斯特洛?
基于广泛使用的 Myers-Briggs 性格类型指标,以及来自 MBTI 数据库的信息,这是一个由用户驱动的社区,拥有数千个真实和虚构人物的性格特征,我们将每个主要人物标在四个象限中的一个上,以可视化他们的领导潜力:
用一个水平标尺来区分内向者和外向者,用一个垂直标尺来区分"感觉型和"直觉型"类型,我们绘制了 16 种不同的人格类型。
基于创造性领导中心对 26,477 名领导者进行的研究结果,我们还可视化了拥有每种性格类型的领导者的百分比。
通过破译彩色编码矩阵图,你可以清楚地看到,最高百分比的领导人要么是 INTJ,ENTJ,ISTJ 或 ESTJ(图的四个角落)。这意味着,尽管内向型和外向型领导者以及直觉型和感性型领导者的比例相对相等,但大多数被研究的领导者更喜欢将逻辑而非情感作为决策的方式,以及有计划的生活方式而非自发的生活方式。
这对维斯特洛的未来意味着什么?显然,最好的领导者并不总是好人。在这种情况下,最有领导潜力的人也是最不被看好登上铁王座的人。
在四个角落,你会发现:夜王,培提尔“小指头”贝里席,山,瑟曦·兰尼斯特,贾昆·哈加尔,塔斯的布蕾妮和亚拉·葛雷乔伊。
方法学
对于那些对我们如何创建这些图表感兴趣的人来说,下面是对这个过程的详细解释:
我们使用顶级博彩网站 Bovada 发布的最新赔率,该网站使用美国的赔率陈述方法,并使用赔率转换器将其转换为隐含概率,以评估结果的可能性。
对于第三个图表,我们在这个 MBTI 数据库中搜索了《权力的游戏》中每个角色的性格类型,这些性格类型是根据数百名成员的投票决定的。(你可以在下面看到完整的列表。)
接下来,我们将 16 种 Myers-Briggs 人格类型中的每一种绘制在一张 4x4 矩阵图上,并根据MBTI 认证从业者 Susan Storm 的分类为每一种命名。
最后,我们使用 Visme 通过给一系列颜色分配百分比值,创建了一个颜色编码标度。这些值对应于每种性格类型的领导者的百分比,由创造性领导中心的研究“领导的性格类型”确定。
每个字符的迈尔斯-布里格斯型指示器
- 布兰·史塔克——INFP
- 琼恩·雪诺——INFJ ISFP
- 丹妮莉丝·坦格利安— INFJ
- 珊莎·史塔克— ESFJ
- 詹德利— ISTP
- 夜王——INTJ
- 提利昂·兰尼斯特— ENTP
- 艾莉亚·史塔克— ISTP
- 培提尔·贝里席— INTJ
- 山姆威尔·塔利— INFP
- 瑟曦·兰尼斯特— ESTJ
- 詹姆·兰尼斯特— ESTP
- 瓦里斯— INFJ
- 戴佛斯·席渥斯— ISFP
- 波隆— ISTP
- ISTJ 塔斯的布蕾妮
- 攸伦·葛雷乔伊— ESTP
- 吉利 Gilly
- 贾昆·赫加尔——INTJ
- 乔拉·莫尔蒙——ISFJ
- 贝里·唐德利恩— ENFP
- 达里奥·纳哈里斯— ESTP
- 梅丽珊卓— INFJ
- 猎犬——ISTP
- 这座山——ISTJ
- 席恩·葛雷乔伊— ESFP
- 托尔蒙德·巨人银行
- 亚拉·葛雷乔伊——ESTJ
轮到你了
你觉得最后谁会坐上铁王座?你同意我们的评估吗?在下面给我们你最好的有证据支持的预测。
今天谁要辞职?
熊猫、海牛和机器学习眼中的飞行风险故事
HR Analytics for Flight Risk — Credits by information-age.com
介绍
“我在寻找更好的机会”
“我认为我付出的工作和时间还不够多。”
“这份工作对我来说吸引力不够。”
你以前有没有听同事说过这样的话,甚至自己也想过一个。如果你有,你并不孤单。
根据 Balance Articles 的文章,员工在一生的职业生涯中平均会跳槽 12 次。令人震惊!想象一下,跨国公司为了留住员工或…你而浪费的数十亿美元发生了什么?(这里放一个阴险的声音,杜杜·杜姆)
人们不再为一家公司工作一辈子,50 年后退休,拿着养老金和金表…
www.thebalancecareers.com](https://www.thebalancecareers.com/how-often-do-people-change-jobs-2060467)
因此,有效管理员工流失是非常重要的。新员工将花费大量的时间和金钱来培训和雇佣他们,否则这些时间和金钱将被重新分配到另一项投资中。事实上,这一直是 IBM 人力资源专业人士的一个大问题,IBM 正在向沃森投资数十亿美元,以预测飞行风险和赢得员工流失。这无疑意味着了解员工离职的原因是吸引和留住人才的良好开端。
[## IBM 人工智能可以以 95%的准确率预测哪些员工将要辞职
IBM 人工智能技术能够以 95%的准确率预测员工何时离开他们的…
www.cnbc.com](https://www.cnbc.com/2019/04/03/ibm-ai-can-predict-with-95-percent-accuracy-which-employees-will-quit.html)
总之,得出数据驱动的决策对于了解员工休假以降低离职率、节省雇佣/培训成本和最大化工作效率非常重要。所有这些都转化为未来几年的巨大利润。
通过这篇文章,让我们讨论如何找出员工离职的原因,以及如何预测谁将离开公司。然后,我们将建议公司如何留住他们。
但首先,让我们头脑风暴一下员工辞职的原因:
- 工作生活平衡
- 糟糕的经理/同事
- 社会压力(丑闻)
- 另一个更好的提议(薪水,生活条件)
- 家庭(产假/陪产假)
- 还有更多
这种头脑风暴的原因是为了确保当我们的分析陷入死胡同时,我们有更多的话题去发现。
我遇到过一些数据分析师/科学家,他们很难将注意力放回到他们当前工作的不同解决方案上。在心理学中,这被称为认知隧道。
知道如何解决这个问题将会大大节省您进行分析的时间。
[## 认知隧道:它是什么以及我打算如何防止它
你可能从未听说过认知隧道。然而,很有可能,你有时是它的受害者…
www.parhamdoustdar.com](https://www.parhamdoustdar.com/soft-skills/2016/04/24/cognitive-tunneling/)
为了解决认知隧道问题,一个好的做法是头脑风暴来分散思想。然后在一个好的头脑风暴会议之后,计划你的编码方式。在我看来,一个好的数据科学家或开发人员应该总是参与头脑风暴,以发现问题和头脑中的分析的新观点。因此,暂停你编码和思考的强烈欲望。
好吧,你做到了吗?很好。我们继续吧:)。
了解数据集
导入 Kaggle 数据集
数据集来自 Kaggle,由一个名为 ludobenistant 的用户提供,该用户因未知原因被关闭。幸运的是,你可以在我下面的 repo 中下载 csv 文件。
这是一个存放我的 Kaggle 和 iPython 笔记本- VincentTatan/PythonAnalytics 的仓库
github.com](https://github.com/VincentTatan/PythonAnalytics/blob/master/Youtube/dataset/HR_comma_sep.csv)
元数据包括以下特征:员工满意度、上次评估、项目数量、平均月小时数、在公司花费的时间、他们是否发生过工伤事故、他们在过去 5 年中是否有过晋升、部门、工资、员工是否已离职。
所有这些都很简单;不需要更多的解释,尤其是如果你已经熟悉了公司生活的黑暗面😈。
不好笑?无论如何,让我们从导入 csv 文件到 Pandas Dataframe 开始我们的旅程。
**import** **numpy** **as** **np** *# linear algebra* **import** **pandas** **as** **pd** *# data processing, CSV file I/O (e.g. pd.read_csv)*
df = pd.read_csv(‘dataset/HR_comma_sep.csv’)
查看数据
让我们用一个简单的代码来看看下面的数据中的快速和肮脏的健全性测试。
*df.tail()*
这似乎没问题。数据帧中总共有 14998 条记录。
首先,为了理解数据集的快速外观,让我们描述一下数据集。为了更好地查看,我们将对其进行转置,将特征排列成行。
df.describe().T
这将描述所有数字特征及其聚合值(计数、平均值等)。从这里我们可以看到一切看起来都很好:完整的计数值,没有空值,以及逻辑分布值。
一个有趣的数值是每月最大平均工作时间:310 小时。哇!这意味着有人每个工作日工作 15 个小时。这个人可能是投资银行家——哦,如果你是投资银行家,无意冒犯。如果你是其中之一,请在下面随意评论😁。
然后,我们可以通过包含参数的数据类型“object”来描述非数值。include=[‘object’]
df.describe(include=['object'])
这里的销售是指员工所在的部门,工资标明“顶”、“中”、“低”。
似乎 Kaggle 已经用干净的准备好分析的数据宠坏了我们。然而,在现实中,您应该期望进行全面的数据清理,包括空值、异常值等。
数据探索
导入 Matplotlib 和 Seaborn 来讲述故事
对于那些不了解 Seaborn 的人来说,我很惭愧没有早点告诉你们。在我看来,这是每个数据分析师和科学家都需要熟悉的最大财富之一!(不开玩笑!).
Seaborn 将允许您在几秒钟内创建令人惊叹的图形和可视化。因此,作为有效的数据科学家/分析师,这是一个非常重要的工具来提高你的故事讲述技巧。
Seaborn 是一个基于 matplotlib 的 Python 数据可视化库。它提供了一个高层次的界面来绘制有吸引力的和信息丰富的统计图形。— Seaborn Pydata 组织
编辑描述
seaborn.pydata.org](https://seaborn.pydata.org/examples/index.html)
*# Import seaborn and matplotlib with matplotlib inline*
**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**
%matplotlib inline
导入 seaborn 和 matplotlib 后,让我们得到离开或留下的人数。我们将在一个简单的 matplotlib 饼图中将其可视化
*# Getting the count of people that leave and not*
leftcounts=df['left'].value_counts()
**print**(leftcounts)
*# Using matplotlib pie chart and label the pie chart*
plt.pie(leftcounts,labels=['not leave','leave']);
Simple piechart for leave and not leave
这就是 Seaborn 可视化真正发挥作用的地方。让我们为每个离职和留任员工生成多个 Seaborn 分布,然后将其与 Matplotlib 图结合。这段代码会有点长,因为我们要插入 10 个支线剧情(5 行 2 列)。但是可视化对于发现那些离开和留下的人的趋势和差异是非常有价值的。这就是故事的来源!
# Create a figure instance, and the two subplots
fig = plt.figure(figsize=(20,17))
ax1 = fig.add_subplot(521)
ax2 = fig.add_subplot(522)
ax3 = fig.add_subplot(523)
ax4 = fig.add_subplot(524)
ax5 = fig.add_subplot(525)
ax6 = fig.add_subplot(526)
ax7 = fig.add_subplot(527)
ax8 = fig.add_subplot(528)
ax9 = fig.add_subplot(529)
ax10 = fig.add_subplot(5,2,10)# Tell pointplot to plot on ax1 with the ax argument (satisfaction level)
sns.distplot(leftdf[‘satisfaction_level’],ax = ax1);
sns.distplot(notleftdf[‘satisfaction_level’],ax = ax2);
sns.distplot(leftdf[‘last_evaluation’], kde=True,ax=ax3);
sns.distplot(notleftdf[‘last_evaluation’], kde=True,ax=ax4);
sns.distplot(leftdf[‘number_project’], kde=True,ax=ax5);
sns.distplot(notleftdf[‘number_project’], kde=True,ax=ax6);
sns.distplot(leftdf[‘average_montly_hours’], kde=True,ax=ax7);
sns.distplot(notleftdf[‘average_montly_hours’], kde=True,ax=ax8);
sns.distplot(leftdf[‘time_spend_company’], kde=True,ax=ax9);
sns.distplot(notleftdf[‘time_spend_company’], kde=True,ax=ax10);
Distributions of those who stayed vs left
整洁!记住这种视觉化,它会让你受益终生:)。现在,我们能从中学到什么?
洞察力:离开的人的简介
- 满意度:这里没有太多的模式,除了我们可以看到离开的员工不仅仅是那些不满意的人,还有那些对他们的工作非常满意的人。
- last_evaluation :高和低,可能表示超出业绩者和低于业绩者离开公司。如果这是真的,那就意味着员工离职有两个原因:他们觉得自己不能很好地发挥才能或激发积极性,或者他们有动力去申请更好的职业机会。
- **编号 _ 项目:**最多有 2 个项目。也许与拥有 3-4 个项目的留守员工的分布不同。我们可能希望将此与平均每月小时数进行进一步比较,并观察是否存在辛普森悖论,即当我们考虑其他混杂变量时,洞察力会发生变化。我们还需要进一步比较项目的规模和性质。
- 平均月工作时间:它的平均工作时间要么长,要么短。这是独一无二的,因为也许员工对公司的参与度过高或过低。
- time_spend_company: 他们中的一些人花的时间比留下来的员工少,我们可能会认为他们不太忙于工作。结合平均每月小时数,这是一个可能的假设。
很酷的故事,让我们进一步搞清楚这些变量是如何相互关联的。
相关分析
让我们创建相关性分析来找出特性之间的相关性。这可以通过。corr()方法导出左侧 employees 数据框中所有数值的相关性。然后,让我们应用 Seaborn 热图来显示离职员工之间的属性相关性。
corr = leftdf.drop(‘left’,axis=1).corr()sns.heatmap(corr)
Finding the correlations among attributes
Seaborn 拯救了世界!非常简单的可视化,全部在一行 sns.heatmap()中。
洞察力:相关元素
快速浏览一下,我们可以发现一些可能的相关元素,例如:
- 数字 _ 项目和平均 _ 月 _ 小时:这是有意义的,因为你有越多的项目,你应该花更多的时间在它上面。这可能是不满意的原因。
- 最后评估和平均每月小时数:这是一个很好的有希望的发现,这表明每月小时数越长,你就越有可能得到一个好的最后评估。在亚洲这样的文化中,这可能是真的,亚洲有时仍然有微观管理。我们需要进一步了解数据的背景信息,以从中提取一些假设。
当我们做预测模型并继续前进时,让我们记住这一点。目前,基于我们对元数据和相关性强度(> 0.7)的理解,似乎还没有相关的特性
部门分析
哪些部门的员工离职最频繁?
我们将使用 Seaborn Factorplot 根据部门和工资水平可视化左侧数据框。由于图像没有显示足够清晰的文本大小,我已经标记了关键特征来查看。
*# For this we assume that high earners are paid highly = 3, the otherwise is paid low to decent* sns.factorplot(x=”sales”,data=leftdf,col=”salary”,kind=’count’,aspect=.8,size=14
Factorplot among different department and salary levels
洞察力
- 似乎销售人员大部分时间都是以中低收入离开公司的。
- 同样,其次是对中低工资的技术和支持。
我们现在可以问自己“为什么?”
为什么这些部门的员工会离开?
让我们想象一下箱线图,以得到清楚的答案。使用 Seaborn,我们可以将可视化堆叠在 matplotlib 图形中。这将使我们能够协调我们之前讨论过的四个特性。
为了你的理解,我把视觉化产生的故事编了号。请随意查找下面的故事。如果你发现这太牵强,那就是!这样做的目的是让你的想象力自由流动,自由地提出你的假设。有些甚至可能是真的,你们将成为在废墟中发现宝藏的英雄。
在这些故事中,我借此机会讲述了我自己的一些个人经历或社会群体。如果你能感同身受,请随意鼓掌或评论:)。
*# Create a figure instance, and the two subplots*
fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(411)
ax2 = fig.add_subplot(412)
ax3 = fig.add_subplot(413)
ax4 = fig.add_subplot(414)
sns.boxplot(x="sales",y="satisfaction_level",data=leftdf,ax=ax1)
sns.boxplot(x="sales",y="time_spend_company",data=leftdf,ax=ax2)
sns.boxplot(x="sales",y="number_project",data=leftdf,ax=ax3)
sns.boxplot(x="sales",y="average_montly_hours",data=leftdf,ax=ax4)
Boxplot for different features and various departments
见解:
- 与其他离职部门的比较。与其他部门相比,销售部没有留下他们离职的重要原因。事实上,我们在这里可以看到,他们的调查满意度实际上高于会计和其他部门。这意味着销售人员离开的唯一原因可能是因为低工资。另一个原因是他们可能因为害怕被销售经理发现而篡改了调查答案。这可能是一种敲诈材料,以防他们没有达到销售目标。
- 会计是满意度最低的行业之一,大多数四分位数都低于 0.5。但同时,会计也是离职率较低的部门之一。这可能是由于会计行业工作保障的神话。我的一些朋友坚持从事卑微而艰苦的会计和审计工作,因为他们努力奋斗,以求在公司高层获得更稳定的工作。谁知道呢,不过那是个好玩的故事分享给我的会计朋友们(哈哈!).
- 另一方面,“技术和支持”给出了所有检查功能的广泛范围。与销售不同,我们仍然可以看到大量员工对他们的工作不够满意。因此,我们需要进一步分离,以了解他们中的一些人离开的原因。很可能,小公司和大公司会区别对待这些员工。还记得英国电信, IT 人群秀吗?爱死了!
- 市场营销和产品管理的满意度很高,尽管低薪辞职率很高。这可能是因为这个行业发展非常快,一些从业者在跨国公司获得了更好的机会。
The British IT Crowd Show which shows Moss and Roy as the Technical and Support Employees, Jen as Entertainment Marketing Manager, and Douglas as the fun CEO — credit to comedy.co.uk
模型生成
咻,我们今天学了这么多故事。现在,让我们享受一下生成模型的乐趣。万岁!!
创建交叉验证训练测试分解
让我们从创建训练和测试数据集开始。
想法是使用训练数据集来训练模型,并使用测试数据集来测试模型。这是为了避免过度拟合模型以达到高精度但高方差误差。您可以使用的另一个集合是用于调整模型的验证集合。
The architecture of train, test, and validation data set
请参考这一惊人的列车测试验证分裂解释媒体。
想知道为什么我们把数据分成训练-验证-测试吗?
medium.com](https://medium.com/datadriveninvestor/data-science-essentials-why-train-validation-test-data-b7f7d472dc1f)
**import** **numpy** **as** **np**
**from** **sklearn** **import** cross_validation,neighbors,svm*#dropping left and sales X for the df, y for the left*
X = df.drop(['left','sales'],axis=1)
y = df['left']*#splitting the train and test sets*
X_train, X_test, y_train,y_test= cross_validation.train_test_split(X,y,test_size=0.2)
完成分割后,我们将继续训练和验证模型。
训练支持向量机(SVM)
支持向量机(SVM)是一种用于分类和回归的监督机器学习算法。该模型将处理 n 维空间中的每个数据点,其中 n 表示您拥有的特征数量。每个值都是 n 维平面中特定坐标的值。然后,分类将找到这个最佳超平面,它给出了到训练样本的最大最小距离。它分隔了班级,就像你如何在你的办公桌和你讨厌的同事的办公桌之间放置一个隔板一样。这是我自己的例子,请自行斟酌使用!
Optimal Hyperplane which allows maximum margins of two classes
这是一个惊人的参考,让你进一步了解 SVM。
支持向量机(SVM)是一种有监督的机器学习算法,可用于分类…
medium.com](https://medium.com/coinmonks/support-vector-machines-svm-b2b433419d73)
现在,让我们用训练数据训练我们的 SVM。一旦我们符合模型,我们可以通过一个简单的评分过程找到准确性。
clfsvm = svm.SVC()
clfsvm.fit(X_train,y_trainaccuracy = clfsvm.score(clfsvm.predict(X_test),y_test)
这将返回 0.96 的准确度,这在测试数据集上表现得非常好。
训练决策树
决策树基本上是一个二叉树流程图,其中每个节点根据一些特征变量分割一组观察值。决策树的目标是将数据分成组,这样一个组中的每个元素都属于同一个类别。这将基于最小均方值,以确保每个组都具有定义的同质性。这样做最大的好处是,它真的很直观,很容易用来得出见解。
请参考以下文章了解更多信息。
决策树是当今使用的一些最强大的监督学习方法的构建块。一个…
medium.com](https://medium.com/@rnbrown/creating-and-visualizing-decision-trees-with-python-f8e8fa394176)
让我们开始训练我们的决策树。
**from** **sklearn** **import** tree
clftree = tree.DecisionTreeClassifier(max_depth=3)
clftree.fit(X_train,y_train)
拥有决策树的最大好处是可视化它。您可以导入 pydotplus 并运行以下可视化。
*# Visualizing the decision tree*
**from** **sklearn** **import** tree
**from** **scipy** **import** misc
**import** **pydotplus**
**import** **graphviz**
**def** show_tree(decisionTree, file_path):
tree.export_graphviz(decisionTree, out_file='tree.dot',feature_names=X_train.columns)
graph = pydotplus.graphviz.graph_from_dot_file('tree.dot')
graph.write_png('tree.png')
i = misc.imread(file_path)
fig, ax = plt.subplots(figsize=(18, 10))
ax.imshow(i, aspect='auto')
*# To use it*
show_tree(clftree, 'tree.png')
Decision Tree with high intuition, the important characteristics of the left employees are shown in the circle
整洁!你可以想象一个非常直观的决策树。你可以找到红圈来理解这些观点:
见解:什么最有可能导致人们离开?
- 满意度低(<=0.115)
- high number of projects (> 2.5)。
- 低到中的最后评价(≤0.575)
- 在这个层次上,工资并不是一个重要的预测因素
这是非常明显的,但与我们之前头脑风暴的一些假设一致,例如低满意度和低上次评估。这一发现也可以用一个规则来表示,您可以很容易地用 excel 表进行编码,然后提交给您的管理层进行高度评价(太好了!).
决策树解释
一般来说,我们得到满意度作为我们的顶级节点。然后分支到第二级节点,具有数量 _ 项目和时间 _ 花费 _ 公司。技术上节点位置越低,分支节点的 gini (分类离散度)越小。这意味着节点越低,分离越均匀。
顶层节点拥有最重要的特征来分隔分类,其次是第二层,依此类推。
结论:公司留住员工的 3 条简单建议
- 在任何给定的时间,将员工的项目数量减少到 1 或 2 个。这比减少他们的工作时间更重要。
- 除了销售、技术和支持之外,工资不是一个重要的预测因素。谨慎加薪。
- 增进管理者和员工之间的沟通和信任。很大一部分离职员工在最后一次评估中得分很低。这意味着我们需要在部门/小组之间培养健康的关系。一个具体的解决方案是减少微观管理者和对错误的惩罚。
额外收获:训练和测试多个分类模型
这是一个额外的分析,通过训练几个分类模型来提高您的理解。我将在后续出版物的更大主题中讨论每个模型。现在,我们将只探索一段快速代码来涵盖一些模型,如 RandomForest、AdaBoost 等。
**from** **sklearn.metrics** **import** accuracy_score, log_loss
**from** **sklearn.neighbors** **import** KNeighborsClassifier
**from** **sklearn.svm** **import** SVC, LinearSVC, NuSVC
**from** **sklearn.tree** **import** DecisionTreeClassifier
**from** **sklearn.ensemble** **import** RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier
**from** **sklearn.naive_bayes** **import** GaussianNB
**from** **sklearn.discriminant_analysis** **import** LinearDiscriminantAnalysis
**from** **sklearn.discriminant_analysis** **import** QuadraticDiscriminantAnalysis
classifiers = [
KNeighborsClassifier(3),
SVC(kernel="rbf", C=0.025, probability=True),
DecisionTreeClassifier(),
RandomForestClassifier(),
AdaBoostClassifier(),
GradientBoostingClassifier(),
GaussianNB(),
LinearDiscriminantAnalysis(),
QuadraticDiscriminantAnalysis()]
*# Logging for Visual Comparison*
log_cols=["Classifier", "Accuracy", "Log Loss"]
log = pd.DataFrame(columns=log_cols)
**for** clf **in** classifiers:
clf.fit(X_train, y_train)
name = clf.__class__.__name__
**print**("="*30)
**print**(name)
**print**('****Results****')
train_predictions = clf.predict(X_test)
acc = accuracy_score(y_test, train_predictions)
**print**("Accuracy: {:.4%}".format(acc))
train_predictions = clf.predict_proba(X_test)
ll = log_loss(y_test, train_predictions)
**print**("Log Loss: {}".format(ll))
log_entry = pd.DataFrame([[name, acc*100, ll]], columns=log_cols)
log = log.append(log_entry)
**print**("="*30)
太好了!您将获得如下一些打印结果,完整打印结果请参考 Python 笔记本:
Prints for multiple models
我们将使用精确度和对数损失来评估这些模型。对数损失是由预测要素和实际要素之间的不匹配导致的累积成本。请参考下面的日志丢失定义:
对数损失,或简称为对数损失,是一种分类损失函数,常用作 kaggle…
www.r-bloggers.com](https://www.r-bloggers.com/making-sense-of-logarithmic-loss/)
使用 Seaborn,让我们基于准确性和日志损失来可视化哪些模型表现最好。
sns.set_color_codes("muted")
sns.barplot(x='Accuracy', y='Classifier', data=log, color="b")
plt.xlabel('Accuracy %')
plt.title('Classifier Accuracy')
plt.show()
sns.set_color_codes("muted")
sns.barplot(x='Log Loss', y='Classifier', data=log, color="g")
plt.xlabel('Log Loss')
plt.title('Classifier Log Loss')
plt.show()
Accuracy and Log Loss Visualization
这是一个很好的可视化工具,展示了我们分类需求中各种模型的性能。
从图中,我们了解到我们应该训练随机森林分类,因为它的低对数损失和高准确性。对于不知道什么是随机森林的人,我将它定义为各种决策树预测的集合。请随意阅读下面的帖子了解更多细节。
随机森林算法用于分类和回归。随机森林是一种集成学习方法…
medium.com](https://medium.com/@hjhuney/implementing-a-random-forest-classification-model-in-python-583891c99652)
这就是你如何用随机森林分类器进行预测来总结我们的分析。
*# Predict Test Set*
favorite_clf = RandomForestClassifier()
favorite_clf.fit(X_train, y_train)
submission = pd.DataFrame(favorite_clf.predict(X_test),index=X_test.index,columns=['Prediction'])
这是我走过的路的尽头。希望现在你能更多地了解飞行风险背后的故事,以及如何从数据驱动的见解中保住你的工作:)。
目的、Github 代码和您的贡献
本概念证明(POC)的目的是作为辅助项目的一部分,用于学习目的。该应用程序的目标是帮助您快速检索和显示正确的见解,以理解和解决现实生活中的业务问题。
在 POC 中,我使用 Pandas 生成表格格式的数据框架进行分析,使用 Seaborn 可视化重要的分析,最后使用机器学习模型(如 SVM 和决策树)来预测员工的飞行风险。Github Python 笔记本代码位于下面。
这是一个存放我的 Kaggle 和 iPython 笔记本- VincentTatan/PythonAnalytics 的仓库
github.com](https://github.com/VincentTatan/PythonAnalytics/blob/master/Youtube/Lesson%204%20Basic%20Python%20for%20Data%20Analytics%20%28HR%20Retention%20Prediction%29%20-%20Practice.ipynb)
您可以随意克隆这个库,并在有时间的时候贡献自己的一份力量。
用 Python 和熊猫分析股票投资
代替今天关于 python 和分析的主题。你也可以看看我为有抱负的投资者出版的另一本书。你应该试着通过这个演示来指导你编写快速的 Python 代码来分析、可视化和预测股票。
使用 Python 快速分析、可视化和预测股票价格
towardsdatascience.com](/in-12-minutes-stocks-analysis-with-pandas-and-scikit-learn-a8d8a7b50ee7)
我的另一个好的出版物是为有抱负的价值投资者准备的价值投资仪表板。
[## 价值投资仪表盘,配有 Python Beautiful Soup 和 Dash Python
价值投资的 Web 抓取与快速 Dash 可视化概述
towardsdatascience.com](/value-investing-dashboard-with-python-beautiful-soup-and-dash-python-43002f6a97ca)
希望从这两本出版物中,你可以学到如何通过讲故事来创造个人价值。喜欢的请阅读并给予掌声:)。
感谢
我想感谢我的人力资源专业同事和朋友们,他们给了我关于这本书的建设性反馈。我真的很高兴得知你从我的出版物中获得了很多价值。
最后…向我伸出手
咻…就是这样,关于我的想法,我把它写成了文字。我真的希望这对你们来说是一个伟大的阅读。因此,我希望我的想法可以成为你发展和创新的灵感来源。
请通过我的 LinkedIn 联系我,订阅我的 Youtube 频道
下面评论出来建议和反馈。
快乐编码:)
免责声明:本免责声明告知读者,文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人。参考文献从列表中挑选,与其他作品的任何相似之处纯属巧合
本文纯粹是作者的个人项目,绝无任何其他不可告人的目的。