【问题标题】:customer segmentation in retail [closed]零售客户细分[关闭]
【发布时间】:2015-10-05 02:17:17
【问题描述】:

我有一个“家庭和建筑”零售的大型销售数据库。 而且我需要知道店里的电工、水管工、油漆工等是谁。

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

但这是很多工作。

我的第二种方法是先做一个集群分割,然后发现哪个集群属于一个专业。 (这好多了,因为我可以发现新的细分市场)

但是,我该怎么做呢?我应该占用什么类型的集群? Kmeans,模糊?我应该对该模型采取哪些变量?我应该使用 PCA 来知道要搜索多少个集群吗?

我的数据的标题(简化):

customer_id | transaction_id | transaction_date | item_article_id | item_group_id | item_category_id | item_qty | sales_amt

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

【问题讨论】:

  • 我会查看 arules 包以首先识别预测规则,然后在这些规则上进行聚类。 cran.r-project.org/web/packages/arules/index.html
  • 应移至交叉验证。
  • 虽然您的第一种方法很麻烦,但您仍然可以这样做。我不知道您的数据集的大小,但对于初学者来说,如何根据存在的文章存储数据的子集。因此,首先,在文章字段上运行unique() 以查看所有可用文章,然后使用which() 函数进行子集化。假设您想存储一个包含与“wire”文章相关的数据的子集:yourDataset[which(yourDataset$item_article_id == 'wire'),] 然后交叉引用它周围的其他字段。

标签: r cluster-analysis k-means pca


【解决方案1】:

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

聚类空间

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

出于您的目的,订单的特征是购买了哪些商品,可能还包括购买了多少商品。就空间而言,这意味着您对每种类型的文章 (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胶

前两个订单看起来可能属于电工,而后两个订单看起来属于水管工。但是,如果您使用线性标度,则 3 阶将比 4 阶更接近 1 阶和 2 阶。我们通过对编码这些阶的向量使用对数标度来解决此问题(我使用以 10 为底的对数在这里,但您采用哪个基数并不重要,因为它们的差异只有一个常数):

  1. (0.30, 0.30, 0)
  2. (0.48, 0.30, -2)
  3. (-2, 2, 0)
  4. (-2, 2.48, 0.48)

正如我们所料,现在订单 3 最接近订单 4。请注意,我使用 -2 作为一个特殊值来表示没有文章,因为未定义 0 的对数(log(x) 趋向于负无穷大,而 x 趋向于 0)。 -2 表示我们假设订单包含文章的 1/100;你可以使特殊值或多或少极端,这取决于你想对一篇文章不包括在内的事实给予多大的重视。

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

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

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

聚类算法

如果您希望能够发现新的客户类型,您可能希望尽可能让数据自己说话。一个很好的老式 在这种情况下,具有完全链接(CLINK)的层次聚类可能是一个合适的选择。在 R 中,您只需执行 hclust(dist(my.matrix)) (这将使用欧几里得距离度量,这在您的情况下可能已经足够好了)。它将紧密相邻的项目或集群连接在一起,直到所有项目都在层次树中分类。您可以将树的任何分支视为一个集群,观察该分支的典型文章数量,并决定该分支本身是否代表一个客户群,应该拆分为子分支,还是与兄弟分支连接。优点是您可以找到哪些项目和项目集群彼此最相似以及有多少相似的“完整故事”。缺点是算法的结果没有告诉你在哪里画出你的客户群之间的边界;您可以通过多种方式切割聚类树,因此您可以自行决定如何识别客户类型。

另一方面,如果您愿意预先确定集群的数量 (k),k-means 是一种非常可靠的方法,可以在 k 中对客户进行任何细分 不同的类型。在 R 中,你会做kmeans(my.matrix, k)。出于营销目的,拥有(例如)5 种不同的客户资料供您为其制作自定义广告可能就足够了,而不是对所有客户一视同仁。使用 k-means,您无需探索数据中存在的所有多样性,但您可能无论如何都不需要这样做。

如果您不想事先固定集群的数量,但也不想事后手动决定在哪里绘制线段之间的边界,那么还有第三种可能性。您从 k-means 算法开始,让它生成的集群中心数量远远大于您希望最终得到的集群数量(例如,如果您希望最终得到大约 10 个集群,让 k-means 算法寻找 200 个簇)。然后,使用 mean shift 算法进一步对结果中心进行聚类。您最终会得到较少数量的紧凑集群。 James Li over here 更详细地解释了该方法。您可以将 R 中的均值偏移算法与 LPCM 包中的 ms 函数一起使用,请参阅 this documentation

关于使用 PCA

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

来源

【讨论】:

    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 2021-04-05
    • 2012-05-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    相关资源
    最近更新 更多