楼主: 时光永痕
845 0

[数据挖掘新闻] 使用R将客户流失分析扩展到收入预测 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

38%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
使用R将客户流失分析扩展到收入预测
首先,我们将定义开发聚类模型的方法,包括导出的预测变量和虚拟变量。第二,我们将通过以累积方式使用模型来预测将来由一组时间限制定义的客户重新订购,来超越典型的“客户流失”模型;最后,我们将使用聚类模型来预测实际收入,方法是在聚类的基础上估算订购参数的分布,然后对这些分布进行采样,以预测一段时间内的新订单和订单价值。
聚类是在开始进行分析和机器学习中教授的一种数据分析方法。它在概念上很简单,但有时功能非常强大。一个典型的示例是使用聚类将多变量数据分为两类或更多类,例如从组织样本的观察数据中检测癌症(注意:这种应用也可以通过图像分类或组合以及其他方法来完成。 )。另一个通常被引用的应用程序是预测客户“流失”,其中一些标准用来表示客户“流失”(即不再是客户),而您希望提前预测哪些客户可能流失并针对他们进行营销。
您在课堂上或在线上看到的大多数示例都非常简单-通常只有几个因素或几个集群或两者兼而有之。这样,一定程度的直觉可以适用于加强学生的学习过程。但是,就像许多现实世界中的数据科学问题一样,群集的使用可能非常复杂。例如,聚类被用作文本搜索算法的一部分(以及其他更复杂的技术),维度的数量可以是词汇表中的所有单词以及过去的搜索经验,达到了数千个维度。
R在基本R和许多可用的开源软件包中提供了多种群集方法。R的一大优点是能够在函数定义中建立默认值,因此可以通过简单地传递数据或仅使用几个参数来使用许多函数。这样做的副作用是,主要使用默认值来使用和教授许多方法。如果默认值始终都能产生最佳或至少良好的结果,我们都会感到高兴。但是,现实世界通常并非如此。在这里,我们正在分析有关成千上万个客户的大量产品订单的数据(例如:一个工业B2B案例),并将用它来说明您可能会发现有用的几点。
回到客户流失的情况,一个更有趣的问题是试图不仅预测客户是否会离开,还会预测他们何时会重新订购?我们通过定义一系列时间范围并使用聚类分析在每个时间范围分析相同的数据来解决此问题。这大致相当于更改客户流失标准并重复分析。
基本数据集由数据中每行的以下字段组成:
Item.Number
order_date的
ship_date
REQUEST_DATE
cust_order
CUST_NO
数量
价格
由于已有数年的历史,因此大约有20万条生产线,其中包括约2000名客户和大量物品。Request_date是客户要求装运的日期,ship_date是实际装运的日期。
根据这些数据,我们定义了一些派生值:
每笔订单价值=客户用于分析的日期范围内所有订单价值的平均值。
新近度=从今天开始或从某个截止日期到客户最近的过去订单的天数。
平均再订购=客户用于分析的日期范围内的两次订购之间的平均天数。
客户寿命=客户下订单的持续时间。这受分析中使用的最早日期限制。
上一个系列=产品系列或最近的订单(对应于新近度的订单)。
频率=用于分析的日期范围内的订单数。
我们还计算了循环变量的标准偏差,以供以后估算分布时使用。请注意,已经引入了一个假设,即与客户数据中的数据透视表类似,对数据进行了合并。由于这组合了每个客户的多个实例,因此出现了以上新变量。使用从R包resphape2融化和转换的功能完成了合并。
由于特定的项目编号可能表示更可能重新排序或更快的重新排序,因此在群集变量中包含项目编号可能是有益的。面临的挑战是,数据中大约有6000个项目编号,并且包括所有这些编号可能会过度说明问题(即,每个客户的变量比典型实例多得多)并且计算速度较慢。我们采用了一种方法,使用数据中最常出现的前100个物料编号。超出我们在此显示的范围,将有可能评估添加更多项目编号作为聚类变量的好处和重要性(基本上将包含的项目编号的数量视为另一个超参数)。
为了包括项目编号,会生成所谓的伪变量,其中为每个使用的项目编号添加一列,如果实例具有该项目编号,则该行/列的交点中将包含1。由于原始数据是每个物料编号的唯一行(无论它们是否在单个订单号下的组合订单中),因此每个实例的原始数据中只有1列中有1列,但合并中可以有多个1列数据。但是,我们选择仅使用最后订购的项目号来构建集群模型。此方法的另一扩展是将要“回头看”的项目数量参数化,并将其包括在虚拟变量中。R函数model.matrix用于生成伪变量;为了每行使用多个项目,将需要更复杂的方法。
准备数据的最后一个细节是定义训练数据,测试数据和验证数据。我们使用60/20/20分割进行此处所示的分析;在代码中,将分割参数化,因此我们可以研究性能对分割值的敏感性。请注意,拆分是在客户上完成的,因此数据子集具有互斥的客户组。请记住,原始数据包含订单历史记录,因此数据中有许多客户的多个实例。我们执行的熔化/浇铸(“枢轴”)操作已由客户合并,因此用于建模的数据中每个客户只有一个实例。如果我们使用原始数据进行工作,我们仍希望按客户将分组分组,因为我们希望能够展望未来以确定客户流失和未来订单行为。如果我们对原始数据进行了随机拆分,那么我们将在拆分中随机分配给定客户的历史记录和未来数据,从而影响分析。以下是拆分后数据的概述:
我们可以看到,数据在三个子集中具有相似的特征。
有了数据,我们定义了我们要预测的结果,即给定的客户是否会在一系列日期范围内重新订购。在这种情况下,我们使用了15天宽的存储桶,直到90天为止。因此,我们询问是否每个客户都会在从群集数据结束到每个截止日期的15、30、40等天的时间内进行重新排序。为了“训练”模型,将数据提供给聚类算法。一旦将训练数据分组,就可以计算出群集“中心”(或由算法返回,取决于方法)。
下一步是确定测试数据中每个实例到模型中每个群集的距离,并将测试数据的实例分配给最近的群集。然后,对于每个实例,将预测的重新排序时间取为其所属的集群的平均重新排序时间。
现在我们来选择聚类算法和所使用的距离度量。R附带的stats包包括功能kmeans和功能hclust。kmeans本质上找到了n个聚类,从而每个成员到聚类中心的距离小于该成员到任何其他聚类中心的距离。中心直观地定义为质心,质心是所有点的几何平均位置,泛化为聚类数据中存在许多维度。这里的目的不是要深入了解如何找到解决方案;值得注意的是,对于kmeans来说,不能保证有一个唯一的最佳解决方案,并且随着解决方案的不断迭代,迭代次数是一个重要参数。由于无法保证独特的解决方案,另一个参数控制着试图找到最佳解决方案的起始点数。如前所述,默认设置为10,在这种情况下为1(分别为迭代次数和起点);经过一点测试之后,我们使用了500和15,以确保数据一致性。
kmeans中的另一个重要参数是使用哪种方法。基本功能中提供了四种:Hartigan-Wong,Lloyd,Forgy和MacQueen。Lloyd和Forgy是同一个算法,只是名字不同。所有这些都是以可追溯至1950年代的相对知名的研究人员的名字命名的。默认值为Hartigan-Wong。而不是反复试验,我们对方法进行了迭代编码,以查看哪种方法效果最佳。
对kmeans的调用如下所示:
           cluster_model <
              -kmeans(train_cust_summary_temp,
                          中心= clusters_used,
                          算法= all_methods [cluster_method],
                          iter.max = 500,
                          nstart = 15,
                          trace = FALSE)
这里,train_cust_summary_temp是准备好的训练数据,clusters_used是模型中要使用的簇数的参数,all_methods []是保存可用方法的向量,cluster_method是此遍使用的特定方法。cluster_model变量是一个列表,其中包含有关集群成员资格,集群中心和其他信息的信息。
hclust的工作原理是首先将每个实例分配给它自己的群集,然后按反向层次结构组合最近的2个群集,直到顶部有单个群集。确定最近距离的方法在形式上是一种“差异”度量,但是出于此目的,您可以将其视为kmeans中使用的大致距离。通常通过在某个级别上“剪切”“树”,从而丢弃所有较低(较小)的群集来获得结果。剪切是通过函数cutree()完成的,而distance方法是通过调用dist函数来实现的。
在集群的情况下,还有更多的方法以及对聚类期间使用的距离度量的控制。可用的方法是Ward.D,Ward.D2,单个,完整,平均,McQuitty,中位数和质心,距离方法是欧几里得,最大,曼哈顿,堪培拉,二进制和Minkowski。由于距离是可以作为函数的参数,因此也可以修改距离。一个常见的修改是平方欧几里德距离。同样,我们对方法进行参数化以研究性能。
我们还参数化了簇的数量,这在两种情况下都是一个参数。与简单的教程案例相比,鉴于大量的数据集和数据集的大小,我们使用的簇数范围从20到80。然后,对hclust的调用如下。
          hcluster_model <
             -cutree(hclust(dist(train(cus_cust_summary_temp,
                                       method = method)^ use_exponent,
                                  method = all_methods [cluster_method]),
                                  k = clusters_used)
此处的变量与以前相同,并且我们添加了use_exponent,用于将平方欧几里德距离应用于某些情况。
如前所述,在建立集群模型之后,将测试数据和验证数据分配给集群,并且平均重新订购时间用于预测每个客户的重新订购时间。一次完成一个约会存储桶。为了评估性能,需要一些指标。尽管在许多分析问题中,准确性(以某种形式)用于比较方法和参数,但这在我们这里的问题中存在问题,其中数据具有称为类不平衡的特征。
如果我们将准确度定义为正确预测的数目除以预测的总数,那么在存在很多负面结果的情况下,这可能会产生误导。这是阶级失衡的本质。否定的意思是,如果我们预测客户是否会在1到15天之间重新订购,而实际结果却不是,那是负面的结果。如果数据中的负片比例很高,则仅对每个点报告错误的方法将获得较高的准确性得分。我们这里的许多数据都是这种情况。
尽管有一些方法可以解决数据本身中的类不平衡问题(例如,对代表性不足的类进行重新采样,以及对代表性过多的类进行欠采样),但是我们在这里没有采用这种方法;取而代之的是通过机器学习和分析中通常使用的其他几种指标来解决此类问题。精度定义为真阳性的数量除以真阳性和假阳性的总和,其中真阳性表示正确预测的阳性结果,假阳性表示预测为阳性但实际上为阴性的结果:
精度可以被认为是“在我们预测是肯定的事情中,哪些是正确的?”
召回率定义为真阳性的数量除以真阳性和假阴性的总和。假阴性是指预测为阴性但实际上是阳性的病例。因此,召回可以被认为是“阳性结果的实际数量中,我们正确预测的比例是多少?”
您会看到,根据对您而言重要的内容,您可能会更加注重精度或召回率。另一个指标被定义为这两者的平均值,称为F1,它是比率:
为了评估这些方法,我们将结果整理为每个日期区的表面图。这是在15天截止时间的测试数据上评估的召回率(以百分比表示)的示例(垂直刻度反转以显示表面特征,为清楚起见,大多数方法未在轴上明确显示)。
*为了清楚起见,未显示所有方法名称
令人惊讶的是所使用的方法之间存在很大差异。在上图中,我们可以看到在右上角有几种方法,对于某些数量的聚类,召回率明显较差(记住比例尺是倒置的)。我们还可以看到,有许多方法可以在大多数数据(在图中显示为波谷)上产生峰(倒峰),而在大多数数据上却较差。为了更好地比较各个时间范围,我们对数据进行了筛选,以找出性能最佳的方法。该过滤器是使用所有群集的平均性能指标创建的,并且仅包括阈值以上的那些方法,以查看每个日期的前10-15个方法。过滤后,同一15天截止时间的图片看起来有些不同(此处的垂直比例未反转,
分析所有结果,有趣的是,某些方法似乎在某些日期范围而不是其他日期范围内产生良好的结果。我们认为没有理由说明为什么是这种情况,因此我们想选择看起来最可靠的最终方法。查看测试数据结果,并对日期存储区和群集数量中的F1指标求平均值,结果如下。下图是15天,30天和45天的平均结果,在这些情况下,效果通常较差(由于大多数客户最终倾向于重新订购,因为我们移到更长的日期截止日期,因此总体而言,我们看到了更好的预测效果,因为它变得越来越可能将会发生重新排序)。
作为参考,以下是测试数据的所有方法的F1度量标准。
我们看到,最佳方法和最差方法之间大约有10%的差异,并且大多数方法在此指标上非常相似。我们还可以看到某些方法或距离度量似乎表现更好-例如,堪培拉距离通常出现在效果最好的情况下。我们应该解决一些微妙的问题。如果我们在每个日期截止日期仔细查看过滤后的方法,就会发现在某些情况下,指标之一可能为0;而在某些情况下,指标可能为0。在这种情况下,它表示当有实际的正数时,我们正在预测0个正值。对于测试数据,对于10种最佳性能的方法,如下所示。
我们在这里可以看到的是,总体而言,对于最佳性能的方法而言,簇的数量并不是很重要,但是当我们仔细研究细节时,某些方法在某些区域中的效果会稍差一些。实际上,整个数据集的差异更大,但是我们已经通过选择最佳的平均F1表现者来过滤“顶部”方法。特别是,如果可能的话,我们希望缩小方法的范围-为此,将从测试结果中筛选出的相同方法用于查看验证数据的性能。因为我们使用测试数据的性能来选择方法,所以我们实际上是在优化测试数据的聚类数,聚类方法和距离方法的“超参数”。因此,重要的是让其他人提供验证数据并将其用于最终评估。
这是相同的“最佳”验证数据方法的结果,然后是完整结果。
我们看到的是,所选方法似乎可以普遍地推广到验证数据。有趣的是,在15天截止时的性能通常比测试数据中的性能差一些,但到45天时实际上更好。请注意,所使用的配色方案是任意的,并且仅用于帮助显示结果。
从到目前为止的结果来看,我们可以使用在训练数据上开发的聚类模型,并将该方法应用于新数据以预测可能的重新排序窗口,或预测在给定日期截止时的流失/不流失。我们可能会选择一组性能最佳的方法,以增加将模型推广到未来看不见的数据的可能性。
实际上,对于流失分析,仅预测重新排序是可以的,但是在这里我们对预测更感兴趣。回想一下,我们为数据中的每个实例计算并存储了重新订购时间,订购频率和订购值,因此这些都是集群模型中的维度。鉴于此,我们可以进行如下操作:
如使用训练数据所述开发聚类模型。
对于每个聚类,通过假设每个元素的伽玛分布,并使用元素均值和元素标准差来计算重新排序时间的分布,并使用sample()生成一组样本,然后计算(加权)分布,然后进给这些样本放到rgamma()函数中。权重是每个元素的频率变量,它指示给定客户过去订购的频率。客户订购频率更高的数据将具有更大的权重。权重作为概率传递给sample()函数,这样,更频繁地订购和/或具有更高价值的客户就被更频繁地采样。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:客户流失分析 客户流失 clusters Distance Cluster

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 06:27