创建条件百分比矩阵

时间:2015-12-05 18:47:02

标签: r arules

首先,我已经能够组合一个嵌套的for循环来创建我所追求的对象,并且它适用于小型玩具数据集,但我将使用的数据通常会更大,我试图确定R中是否存在包含内置函数的包来完成此任务。

最终对象是一个数据框或矩阵,显示给定参考行的列中的条件百分比。这是玩具数据的代码和我生成最终输出对象的嵌套for循环。

mylist <- list(
ID001=c("apple","orange","grape"),
ID002=c("banana","grape"),
ID003=c("apple","pineapple"),
ID004=c("orange","apple"),
ID005=c("orange","grape", "apple"))

dat <- reshape2:::melt(mylist)
names(dat) <- c("fruit","id")
dat <- dat[,c(2,1)]

theFruit <- unique(dat$fruit)
n=length(theFruit)
final.df <- data.frame(matrix(nrow=n,ncol=n, dimnames=list(theFruit,theFruit)))

for(i in theFruit){
    for(j in theFruit){
        tempid1 <- dat[dat$fruit==i,]$id
        tempid2 <- dat[dat$fruit==j,]$id
        final.df[i,j] <- round(length(which(tempid1%in%tempid2))/length(tempid1),2)
    }
}

final.df

          apple orange grape banana pineapple
apple      1.00   0.75  0.50   0.00      0.25
orange     1.00   1.00  0.67   0.00      0.00
grape      0.67   0.67  1.00   0.33      0.00
banana     0.00   0.00  1.00   1.00      0.00
pineapple  1.00   0.00  0.00   0.00      1.00

阅读输出我们看到,如果一个人吃了一个苹果(苹果排),75%也吃了橙色(橙色列)。同样,如果一个人吃了橙色(橙色排),100%也吃了一个苹果(苹果专栏)。这不是与两个水果的交叉点对称,它是在行上排列的。

这似乎类似于市场购物篮分析应用程序,过去几天我一直在使用arules软件包来实现这个目标。在arules包的白话中,我会说填充数据框的百分比名称是支持值,但我无法生成arules中所有支持百分比的矩阵或数据框。

我将使用的数据将有几百万个ID但只有大约150个“产品”,因此输出矩阵只有大约150x150。我可以使用arules来识别引人注目的成对关系,但有兴趣看到所有的条件。

是否有人知道arules或其他包是否可以实现此目的?

1 个答案:

答案 0 :(得分:1)

您正在寻找置信度值(Wikipedia)。使用arules

,您可以获得与此类似的输出
library(arules)
library(reshape2)
trans <- as(mylist, "transactions")
rules <- apriori(trans, parameter = list(supp = 0, conf = 0, minlen=2, maxlen=2))
df <- inspect(rules)[, c("lhs", "rhs", "confidence")]
dcast(df, lhs~rhs, value.var="confidence", fill=1)
#           lhs   {apple}  {banana}   {grape}  {orange} {pineapple}
# 1     {apple} 1.0000000 0.0000000 0.5000000 0.7500000        0.25
# 2    {banana} 0.0000000 1.0000000 1.0000000 0.0000000        0.00
# 3     {grape} 0.6666667 0.3333333 1.0000000 0.6666667        0.00
# 4    {orange} 1.0000000 0.0000000 0.6666667 1.0000000        0.00
# 5 {pineapple} 1.0000000 0.0000000 0.0000000 0.0000000        1.00

当然,您可以将第一列设为行名,然后将数据框转换为矩阵。我把它留给你。