1

我对 R 很陌生,所以如果这个问题相对新手,我深表歉意。我有一个大约 33,000 行的列表,其中显示了订单 ID 和在该订单 ID 内订购的产品。结构如下:

Order.ID    Product  
193505  Pineapple Cheddar Burger  
193505  Onion Rings  
193564  Pineapple Cheddar Burger  
193623  Hamburger  
193623  French Fries  
193623  Fountain Soda  
193623  Hot Dog  
193631  Hamburger  
193631  French Fries  
193631  Milkshake  
193644  Daily Special  
193726  Hamburger  
193726  French Fries  
193726  Fountain Soda  
193728  Hamburger  
193728  French Fries  
193728  Fountain Soda  
193738  Hamburger  
193738  French Fries  
193762  Hamburger  
193762  French Fries  
193762  Fountain Soda  
193762  Hamburger  
193762  French Fries  
193762  Fountain Soda

我想生成一个相关矩阵,该矩阵反映以与其他项目相同的订单 ID 订购的每个项目的相关性。我首先使用 atable(ID, Product)它给了我在每个订单中订购的产品。现在我被困在如何计算每个其他产品(产品 2-k)的订单数量,因为已经订购了产品 1。理想情况下,我想对每个产品进行分析并将其转换为矩阵,但正确评估一个似乎是合乎逻辑的第一步。

我将不胜感激任何关于这个问题的指导。提前致谢。

4

4 回答 4

5

我建议查看 arules 包(http://cran.r-project.org/web/packages/arules/index.html)。具体来说,您正在寻找频繁的项目集:

sets = apriori(asc, parameter=list(target="freq"))

它将能够找出所有的组合。您将不得不更改数据的格式,但 table() 应该是一个好的开始。

它将不仅能够返回 2 产品分布,而且能够返回所有组合。

您正在寻找一组支持,因此请使用:

inspect(sets)
于 2013-02-18T23:07:11.023 回答
1

如果您使用 reshape2 包中的 dcast ,您将获得一个矩阵,然后您可以对它执行成对相关函数:

data <- read.table(h=T, text="Order.ID    Product  
+ 193505  'Pineapple Cheddar Burger'  
+ 193505  'Onion Rings'  
+ 193564  'Pineapple Cheddar Burger'  
+ 193623  'Hamburger'  
+ 193623  'French Fries'  
+ 193623  'Fountain Soda'  
+ 193623  'Hot Dog'  
+ 193631  'Hamburger'  
+ 193631  'French Fries'  
+ 193631  'Milkshake'  
+ 193644  'Daily Special'  
+ 193726  'Hamburger'  
+ 193726  'French Fries'  
+ 193726  'Fountain Soda'  
+ 193728  'Hamburger'  
+ 193728  'French Fries'  
+ 193728  'Fountain Soda'  
+ 193738  'Hamburger'  
+ 193738  'French Fries'  
+ 193762  'Hamburger'  
+ 193762  'French Fries'  
+ 193762  'Fountain Soda'  
+ 193762  'Hamburger'  
+ 193762  'French Fries'  
+ 193762  'Fountain Soda'")



library(reshape2)

df <- dcast(data, Order.ID ~ Product)
cor(df[,-1], use = "pairwise")

                         Daily Special Fountain Soda French Fries Hamburger Hot Dog
Daily Special                   1.0000       -0.2868      -0.4375   -0.4375 -0.1250
Fountain Soda                  -0.2868        1.0000       0.8030    0.8030  0.2294
French Fries                   -0.4375        0.8030       1.0000    1.0000  0.1250
Hamburger                      -0.4375        0.8030       1.0000    1.0000  0.1250
Hot Dog                        -0.1250        0.2294       0.1250    0.1250  1.0000
Milkshake                      -0.1250       -0.2868       0.1250    0.1250 -0.1250
Onion Rings                    -0.1250       -0.2868      -0.4375   -0.4375 -0.1250
Pineapple Cheddar Burger       -0.1890       -0.4336      -0.6614   -0.6614 -0.1890
                         Milkshake Onion Rings Pineapple Cheddar Burger
Daily Special              -0.1250     -0.1250                  -0.1890
Fountain Soda              -0.2868     -0.2868                  -0.4336
French Fries                0.1250     -0.4375                  -0.6614
Hamburger                   0.1250     -0.4375                  -0.6614
Hot Dog                    -0.1250     -0.1250                  -0.1890
Milkshake                   1.0000     -0.1250                  -0.1890
Onion Rings                -0.1250      1.0000                   0.6614
Pineapple Cheddar Burger   -0.1890      0.6614                   1.0000
于 2013-02-18T23:24:03.907 回答
0

我想这就是你想要的。首先,读入数据:

# Read in data
df<-read.table(
textConnection('
193505,Pineapple Cheddar Burger
193505,Onion Rings
193564,Pineapple Cheddar Burger
193623,Hamburger
193623,French Fries 
193623,Fountain Soda
193623,Hot Dog
193631,Hamburger
193631,French Fries
193631,Milkshake
193644,Daily Special
193726,Hamburger
193726,French Fries 
193726,Fountain Soda
193728,Hamburger
193728,French Fries
193728,Fountain Soda
193738,Hamburger
193738,French Fries
193762,Hamburger
193762,French Fries
193762,Fountain Soda
193762,Hamburger
193762,French Fries
193762,Fountain Soda
')
,sep=',')
names(df)<-c('id','food')

现在,构建矩阵。

# Create a matrix of 1's and 0's with id on left and food and column.
id.by.food<-as.matrix(table(df$id,df$food))
# If someone ordered an item twice, you'll get a '2'. 
# Convert everything to 1's.
id.by.food<-pmin(id.by.food,1)
# Get a correlation matrix
round(cor(id.by.food),2)
                         Daily Special Fountain Soda French Fries Hamburger Hot Dog Milkshake Onion Rings
Daily Special                     1.00         -0.32        -0.50     -0.50   -0.12     -0.12       -0.12
Fountain Soda                    -0.32          1.00         0.63      0.63    0.40     -0.32       -0.32
French Fries                     -0.50          0.63         1.00      1.00    0.25      0.25       -0.50
Hamburger                        -0.50          0.63         1.00      1.00    0.25      0.25       -0.50
Hot Dog                          -0.12          0.40         0.25      0.25    1.00     -0.12       -0.12
Milkshake                        -0.12         -0.32         0.25      0.25   -0.12      1.00       -0.12
Onion Rings                      -0.12         -0.32        -0.50     -0.50   -0.12     -0.12        1.00
Pineapple Cheddar Burger         -0.19         -0.48        -0.76     -0.76   -0.19     -0.19        0.66
                         Pineapple Cheddar Burger
Daily Special                               -0.19
Fountain Soda                               -0.48
French Fries                                -0.76
Hamburger                                   -0.76
Hot Dog                                     -0.19
Milkshake                                   -0.19
Onion Rings                                  0.66
Pineapple Cheddar Burger                     1.00
于 2013-02-18T23:20:21.823 回答
0

您正在查看市场篮子分析(或亲和力分析),特别是定义和寻找支持、信心和提升。我在这里找到的最好的解释它的论文之一。

kmmats提到的 arules 是要使用的包,使用它的很好的例子来自 CrossValidated 站点here

于 2013-02-18T23:40:07.143 回答