如何将市场购物篮项目划分为集群?

时间:2018-03-28 08:59:28

标签: r cluster-analysis partitioning market-basket-analysis

我有一个数据集如下:(我举了一个简单的例子,但实际的数据集要大得多)

     V1 V2 V3 V4
1    1  0  0  1
2    0  1  1  0 
3    0  0  1  0 
4    1  1  1  1
5    0  1  1  0
6    1  0  0  1 
7    0  0  0  1
8    0  1  1  1
9    1  0  1  0 
10   0  1  1  0 
...

其中V1,V2,V3 ... Vn是项目,1,2,3,4 ... 1000是交易。我想将这些项目划分为k个集群,这样在每个集群中我都有在同一个事务中最频繁出现的项目。 为了确定每个项目出现在一起的次数,我尝试了crosstable,我得到了以下结果:

   V1 V2 V3 V4
V1  4  1  2  3
V2  1  5  5  2
V3  2  5  7  2
V4  3  2  2  5

对于这个小例子,如果我想创建2个集群(k = 2),使得集群必须包含2个项目(为了维持集群之间的平衡),我将得到:

Cluster1中= {V1,V4}

Cluster2 = {V2,V3}

,因为:

1)V4(V1,V4)= 3时,V1更频繁地出现。 (V1,V3)> (V1,V2)和V4相同。

2)V2更频繁出现,V2(V2,V3)= 5> (V2,V4)> (V2,V1)和V3相同。

如何使用R和更大的数据集进行此分区?

4 个答案:

答案 0 :(得分:2)

我认为你在问群集问题。它与上面的内容并不完全相同,但您可以使用hclust来查找具有合适距离度量的变量之间的相似性。

例如

plot(hclust(dist(t(df),method="binary")))

产生以下......

enter image description here

您应该查看?dist以查看此距离度量在您的上下文中是否有意义,并?hclust查看一旦获得树形图后可以执行的其他操作(例如识别群集)。

或者您可以将交叉表用作距离矩阵(可能取值的倒数,然后as.dist)。

答案 1 :(得分:1)

library(data.table)

数据:

df<-
fread("
    V1 V2 V3
1    1  0  0
2    0  0  1
3    0  0  1
4    1  1  1
5    0  0  1
6    1  0  0
7    0  0  0
8    0  1  1
9    1  0  1
10   0  1  1
")[,-1]

代码:

setDT(df)
sapply(names(df),function(x){
    df[get(x)==1,lapply(.SD,sum,na.rm=T),.SDcols=names(df)]
    })

结果:

   V2 V3 V4
V2 4  1  2 
V3 1  3  3 
V4 2  3  7 

答案 2 :(得分:0)

df <- read.table(text="
ID V1 V2 V3 
1    1  0  0
2    0  0  1
3    0  0  1
4    1  1  1
5    0  0  1
6    1  0  0
7    0  0  0
8    0  1  1
9    1  0  1
10   0  1  1
", header = TRUE) 

k = 3 # number of clusters

library(dplyr)
df %>% 
  # group and count on all except the first id column
  group_by_at(2:ncol(df)) %>%
  # get the counts, and collect all the transaction ids
  summarize(n = n(), tran_ids = paste(ID, collapse = ',')) %>%
  ungroup() %>%
  # grab the top k summarizations
  top_n(k, n)

# V1    V2    V3     n tran_ids
# <int> <int> <int> <int> <chr>   
# 1     0     0     1     3 2,3,5   
# 2     0     1     1     2 8,10    
# 3     1     0     0     2 1,6  

答案 3 :(得分:0)

您可以转置表格并使用标准的聚类方法。因此,您将对项目进行聚类。功能是交易。

几何方法可以像kmeans一样使用。或者,您可以使用混合模型来提供信息标准(如BIC)来选择簇的数量。这是一个R脚本

require(VarSelLCM)

my.data <- as.data.frame(t(df))
# To consider Gaussian mixture
# Alternatively Poisson mixture can be considered by converting each column into integer.
for (j in 1:ncol(my.data)) my.data[,j] <- as.numeric(my.data[,j])

## Clustering by considering all the variables as discriminative
# Number of clusters is between 1 and 6
res.all <- VarSelCluster(my.data, 1:6, vbleSelec = FALSE)

# partition
res.all@partitions@zMAP

# shiny application
VarSelShiny(res.all)


## Clustering with variable selection
# Number of clusters is between 1 and 6
res.selec <- VarSelCluster(my.data, 1:6, vbleSelec = TRUE)

# partition
res.selec@partitions@zMAP

# shiny application
VarSelShiny(res.selec)