您希望根据客户购买的产品来识别他们的类别(我认为这是出于营销原因)。这需要一种聚类方法。我会告诉你整个设置。
聚类空间
让我们首先考虑一下您究竟在聚类什么:订单或客户。在任何一种情况下,您描述项目的方式和它们之间的距离都是相同的。我将首先讨论订单的基本情况,然后解释适用于客户集群的注意事项。
出于您的目的,订单的特征是购买了哪些商品,可能还包括购买了多少商品。就空间而言,这意味着您对每种类型的文章 (item_article_id) 都有一个维度,例如“wire”维度。如果您只关心是否购买了商品,那么每个商品在每个维度上的坐标都是 0 或 1。如果某个订单包含电线但不包含管道,则“电线”维度的值为 1,“管道”维度的值为 0。
但是,对于数量的关心还是有话要说的。也许水管工买很多胶水,而电工只买少量。这种情况下,可以将每个维度的坐标设置为对应文章的数量(大概是item_qty)。所以假设你有三件物品,电线、管道和胶水,那么向量 (2, 3, 0) 描述的顺序包括2 线、3 管和0 胶水,而由向量 (0, 1, 4) 包括 0 根导线、1 根管道和 4 根胶水。
如果给定文章的数量分布很大,即如果某些订单包含的某些文章比其他订单多一个数量级,那么使用对数刻度可能会有所帮助。假设你有这四个订单:
- 2 线、2 管、1 胶
- 3线2管0胶
- 0线,100管,1胶
- 0线300管3胶
前两个订单看起来可能属于电工,而后两个订单看起来属于水管工。但是,如果您使用线性标度,则 3 阶将比 4 阶更接近 1 阶和 2 阶。我们通过对编码这些阶的向量使用对数标度来解决此问题(我使用以 10 为底的对数在这里,但您采用哪个基数并不重要,因为它们的差异只有一个常数):
- (0.30, 0.30, 0)
- (0.48, 0.30, -2)
- (-2, 2, 0)
- (-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 仍然很有趣。
来源