Mar*_*elo 5 r cluster-analysis k-means pca
我有一个大型的"住宅和建筑"零售销售数据库.而且我需要知道商店里的电工,水管工,画家等等.
我的第一种方法是选择与专业相关的文章(例如,电线[文章]与电工[专业]相关)然后,根据客户销售情况,了解客户是谁.
但这是很多工作.
我的第二种方法是首先进行聚类分割,然后发现哪个聚类属于专业.(这样更好,因为我能够发现新的细分)
但是,我该怎么做?我应该占用什么类型的聚类?Kmeans,模糊?我应该对该模型采取哪些变量?我应该使用PCA来了解要搜索的群集数量吗?
我的数据标题(简化):
customer_id | transaction_id | transaction_date | item_article_id | item_group_id | item_category_id | item_qty | sales_amt
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激(对不起,我的英文)
您想根据客户购买的商品来识别客户类别(我认为这是出于营销原因)。这就需要一种聚类方法。我将向您介绍整个设置。
让我们首先考虑一下您到底要聚类什么:订单或客户。无论哪种情况,描述项目及其之间距离的方式都是相同的。我将首先讨论订单的基本情况,然后解释适用于客户聚类的注意事项。
出于您的目的,订单的特征是购买了哪些物品,也可能包括购买的数量。就空间而言,这意味着每种类型的物品都有一个尺寸 ( item_article_id
),例如“电线”尺寸。如果您只关心某件商品是否被购买,则每个商品在每个维度上都有一个 0 或 1 的坐标。如果某个订单包含电线但不包含管道,则“电线”维度的值为 1,“管道”维度的值为 0。
然而,对于数量的关心还是有话要说。也许水管工购买大量胶水,而电工只购买少量。这种情况下,可以将每个维度的坐标设置为对应物品的数量(大概为item_qty
)。因此,假设你有三件物品,电线、管子和胶水,那么向量(2, 3, 0)描述的顺序包括 2 根电线、3 管子和 0 胶水,而向量 (0, 1, 4 ) 包括 0 根电线、1 根管子和 4 根胶水。
如果给定商品的数量分布较大,即,如果某些订单包含的商品数量级多于其他订单,则使用对数标度可能会有所帮助。假设您有以下四个订单:
前两个订单看起来可能属于电工,而后两个订单看起来可能属于水管工。但是,如果您使用线性标度,则 3 阶将比 4 阶更接近 1 阶和 2 阶。我们通过对编码这些阶的向量使用对数标度来解决这个问题(我使用以 10 为底的对数)在这里,但采用哪个基数并不重要,因为它们仅因常数因子而不同):
现在,正如我们所期望的,顺序 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 均值是一种非常可靠的方法,可以将您的客户分为k种不同类型。在 R 中,你会这样做kmeans(my.matrix, k)
。出于营销目的,您可以为(例如)5 个不同的客户资料制作定制广告,而不是对所有客户一视同仁。使用 k 均值,您无需探索数据中存在的所有多样性,但您可能也不需要这样做。
如果您不想事先固定簇的数量,但也不想事后手动决定在哪里绘制段之间的边界,则还有第三种可能性。您从 k-means 算法开始,让它生成一定数量的聚类中心,该数量远大于您希望最终得到的聚类数量(例如,如果您希望最终得到大约 10 个聚类) ,让 k-means 算法查找 200 个簇)。然后,使用均值平移算法进一步对所得中心进行聚类。您最终将得到较少数量的紧凑簇。James Li在此处更详细地解释了该方法。您可以将 R 中的均值平移算法与包ms
中的函数一起使用LPCM
,请参阅此文档。
PCA 不会告诉您需要多少个集群。PCA 回答了一个不同的问题:哪些变量似乎代表了一个共同的潜在(隐藏)因素。从某种意义上说,它是一种对变量(即实体的属性)进行聚类的方法,而不是对实体本身进行聚类。主成分(共同的潜在因素)的数量并不表示所需的聚类数量。如果您想了解每篇关于客户兴趣的文章的预测价值,PCA 仍然很有趣。
归档时间: |
|
查看次数: |
3635 次 |
最近记录: |