零售业的客户细分

时间:2015-07-15 20:39:00

标签: r cluster-analysis k-means pca

我有一个庞大的家庭和建筑销售数据库。零售。 而且我需要知道商店里的电工,水管工,画家等等。

我的第一种方法是选择与专业相关的文章(例如,电线[文章]与电工[专业]相关)然后,根据客户销售情况,了解客户是谁。

但这是很多工作。

我的第二种方法是首先进行群集分割,然后发现哪个群集属于专业。 (这样更好,因为我能够发现新的细分)

但是,我怎么能这样做?我应该占用什么类型的聚类? Kmeans,模糊?我应该对该模型采取哪些变量?我应该使用PCA来了解要搜索的群集数量吗?

我的数据标题(简化):

call_with

任何帮助将不胜感激 (对不起,我的英文)

1 个答案:

答案 0 :(得分:4)

您希望根据他们购买的商品识别客户类别(我认为这是出于营销原因)。这需要一种聚类方法。我会告诉你整个设置。

聚类空间

让我们首先考虑您究竟是什么聚类:订单或客户。在任何一种情况下,您对物品进行表征的方式以及它们之间的距离都是相同的。我将首先讨论订单的基本情况,然后解释适用于客户群集的注意事项。

为了您的目的,订单的特点是购买了哪些商品,可能还有多少商品。就空间而言,这意味着每种类型的文章(item_article_id)都有一个维度,例如" wire"尺寸。如果你关心的是文章是否被买,每个项目的每个维度的坐标为0或1。如果某些订单包含电线但不包括电线,那么它在电线上的值为1。 "管道上的尺寸和0"尺寸。

然而,关于数量的关注还有待说明的事情。也许管道工购买大量胶水,而电工只购买少量胶水。在这种情况下,您可以将每个维度中的坐标设置为相应文章的数量(可能是item_qty)。所以假设你有三篇文章,电线,管道和胶水,那么矢量(2,3,0)描述的订单包括2线,3管和0胶,而订单由矢量(0,1,4)包括0线,1管和4胶。

如果给定商品的数量存在较大差异,即如果某些订单的某些商品的数量比其他订单多一个数量级,那么使用对数比例可能会有所帮助。假设您有以下四个订单:

  1. 2线,2管,1胶
  2. 3线,2管,0胶
  3. 0线,100管,1胶
  4. 0线,300管,3胶
  5. 前两个订单看起来可能属于电工,而后两个看起来他们属于水管工。但是,如果使用线性比例,订单3将更接近订单1和2而不是订单4.我们通过对编码这些订单的向量使用对数比例来修复它(我使用基数10对数在这里,但你选择哪个基因并不重要,因为它们只有一个常数因素而不同):

    1. (0.30,0.30,0)
    2. (0.48,0.30,-2)
    3. ( - 2,2,0)
    4. ( - 2,2.48,0.48)
    5. 现在订单3最接近订单4,正如我们所料。请注意,我使用-2作为特殊值来表示没有文章,因为0的对数没有定义(log(x)倾向于负无穷大,因为x倾向于0)。 -2意味着我们假装订单包括文章的1/100;你可以使特殊值或多或少地极端,这取决于你想要给文章没有包括多少重量。

      您的聚类算法的输入(无论您采用哪种算法,请参见下文)将是一个位置矩阵,每个项目(订单或客户)有一行,每个维度(文章)一列,以及存在(0/1),每个单元格中金额的数量或对数,具体取决于您根据上述讨论选择的数量。如果您按客户进行集群,则可以在计算进入仓位矩阵的每个单元格的内容之前,将所有属于该客户的订单的金额相加(如果使用对数刻度,则将之前的金额相加取对数)。

      按订单而非客户进行聚类可以为您提供更多细节,但也会产生更多噪音。客户可能在订单中保持一致,但在订单之间不一致;也许客户有时表现得像水管工,有时像电工。这是一种只有按订单集群才能找到的模式。然后,您将找到每个客户属于每个群集的频率;也许70%的某人订单属于电工类型,30%属于管道工类型。另一方面,水管工可能只按一个订单购买管道,然后只按下一个订单购买胶水。只有当您按客户群集并汇总订单金额时,您才能平衡地了解每个客户平均需求。

      从此处开始,我将使用名称my.matrix来引用您的位置矩阵。

      聚类算法

      如果您希望能够发现新的客户类型,您可能希望尽可能让数据自己说话。一个很好的老式 在这种情况下,具有完全链接(CLINK)的分层聚类可能是合适的选择。在R中,你只需hclust(dist(my.matrix))(这将使用欧几里德距离测量,这在你的情况下可能已经足够了)。它将紧密连接相邻的项目或群集,直到所有项目都在分层树中进行分类。您可以将树的任何分支视为一个集群,观察该分支的典型文章数量,并确定该分支是单独表示客户细分,应该在子分支中拆分,还是与兄弟分支联合。优点是你找到了#34;完整故事"哪些项目和项目群组彼此最相似以及多少。缺点是算法的结果不会告诉您在客户群之间绘制边界的位置;您可以通过多种方式切割群集树,因此您可以根据自己的需要确定自己的客户类型。

      另一方面,如果您愿意事先确定群集数量( k ),那么k-means是一种非常强大的方法,可以在 k中获得客户的任何细分不同的类型。在R中,你会kmeans(my.matrix, k)。出于营销目的,拥有(比方说)您为其制作定制广告的5个不同客户资料可能就足够了,而不是将所有客户视为相同。使用k-means,您无法探索数据中存在的所有多样性,但无论如何您可能不需要这样做。

      如果您不想事先确定群集的数量,但您也不想手动决定在之后绘制段之间的边界的位置,则还有第三种可能性。你从k-means算法开始,你可以让它产生一定数量的聚类中心,这个聚类中心远远大于你希望最终得到的聚类数量(例如,如果你希望最终得到大约10个聚类的聚类) ,让k-means算法寻找200个簇。然后,使用均值漂移算法进一步聚类生成的中心。最终会得到较少数量的紧凑集群。 James Li over here更详细地解释了这种方法。您可以使用ms包中的LPCM函数将R中的均值平移算法用于this documentation

      关于使用PCA

      PCA不会告诉你需要多少个群集。 PCA回答了一个不同的问题:哪些变量似乎代表了一个共同的潜在(隐藏)因素。从某种意义上说,它是一种聚类变量(即实体属性)的方法,而不是对实体本身进行聚类。主成分的数量(共同的潜在因素)并不表示所需的集群数量。如果您想了解每篇文章关于客户兴趣的预测价值,PCA仍然会很有趣。

      来源