Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 零售业中的客户细分_R_Cluster Analysis_K Means_Pca - Fatal编程技术网

R 零售业中的客户细分

R 零售业中的客户细分,r,cluster-analysis,k-means,pca,R,Cluster Analysis,K Means,Pca,我有一个大型的“住宅和建筑”零售销售数据库。 我需要知道谁是店里的电工、水管工、油漆工等等 我的第一种方法是选择与专业相关的文章(例如,电线[文章]与电工[专业]相关),然后根据客户销售情况,了解客户是谁 但这是一个很大的工作 我的第二种方法是首先进行集群分割,然后发现哪个集群属于某个专业。(这会更好,因为我可以发现新的细分市场) 但是,我该怎么做呢?我应该使用什么类型的集群?模糊的?我应该对该模型采取哪些变量?我应该使用PCA来知道要搜索多少个集群吗 我的数据的标题(简化): 任何帮助都将不胜

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

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

但这是一个很大的工作

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

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

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

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

您想根据客户的购买情况确定客户类别(我想这是出于营销原因)。这就需要一种集群方法。我会告诉你整个设置过程

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

出于您的目的,订单的特征是购买了哪些物品,可能还包括购买了多少物品。对于空间,这意味着每种类型的文章都有一个维度(
item\u article\u id
),例如“wire”维度。如果您只关心是否购买了一件物品,那么每个物品在每个维度中的坐标为0或1。如果某些顺序包括导线但不包括管道,则“导线”标注上的值为1,“管道”标注上的值为0

然而,关心数量是有道理的。也许水管工买很多胶水,而电工只买少量。在这种情况下,您可以将每个维度中的坐标设置为相应物品的数量(大概是
物品数量
)。因此,假设您有三篇文章,电线、管道和胶水,那么由向量描述的顺序(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阶将更接近第1阶和第2阶,而不是第4阶。我们通过对编码这些顺序的向量使用对数标度来修正这一点(我在这里使用以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意味着我们假装订单包含了物品的百分之一;你可以使这个特殊值或多或少极端化,这取决于你想对一篇文章没有包括在内的事实给予多少重视

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

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

    从这里开始,我将通过名称
    my.matrix
    参考您的位置矩阵

    聚类算法 如果您希望能够发现新的客户类型,那么您可能希望尽可能让数据为自己说话。好的老式汽车 在这种情况下,带完全链接的层次聚类(CLINK)可能是一个合适的选择。在R中,您只需执行
    hclust(dist(my.matrix))
    (这将使用欧几里德距离度量,这在您的情况下可能已经足够好了)。它会将相邻的项目或集群紧密地连接在一起,直到所有项目都被分类到一个层次结构树中。您可以将树的任何分支视为一个簇,观察该分支的典型文章量,并确定该分支是否为r
    customer_id | transaction_id | transaction_date | item_article_id | item_group_id | item_category_id | item_qty | sales_amt