【问题标题】:List all products for a given product ID in R列出 R 中给定产品 ID 的所有产品
【发布时间】:2013-02-18 22:45:06
【问题描述】:

我对 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 订购的每个商品的相关性。我首先使用table(ID, Product),它为我提供了在每个订单中订购的产品。现在我被困在如何计算每个其他产品(产品 2-k)的订单数量,因为已经订购了产品 1。理想情况下,我想对每种产品进行分析并将其转换为矩阵,但正确评估一个似乎是合乎逻辑的第一步。

如果我能就这个问题获得任何指导,我将不胜感激。提前致谢。

【问题讨论】:

  • 您能否将dput(your_example_data) 的结果编辑到您的问题中?像现在这样将您的示例表读入 R 并不是特别容易。

标签: r matrix correlation


【解决方案1】:

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

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

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

它不仅可以返回 2 产品分布,还可以返回所有组合。

你正在寻找一个集合的支持,所以使用:

inspect(sets)

【讨论】:

  • 在试验这个功能时,我只能生成单个产品规则。 (例如 apriori(NB2, parameter=list(supp=0.003,conf=0.05)) -> ap2 lhs rhs 支持置信度提升 1 {} => {Product=California Burger} 0.07200321 0.07200321 1 2 {} => {Product=炸薯条} 0.07520883 0.07520883 1 3 {} => {Product=Make it a Meal} 0.08377770 0.08377770 1 4 {} => {Product=Hamburger} 0.16287026 0.16287026 1 ) 是否没有关联或 R 没有将订单 ID 注册为一个因素正确吗?
  • 您将不得不对上面给出的原始输出中的数据进行一些重组 - 如果它在每一行中作为单独的事务读取,这将解释为什么您只看到单个产品.我主要通过 unix 使用它,但鉴于您设置的支持度和置信度阈值非常低 - 我会说这是输入的问题
【解决方案2】:

如果您使用 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

【讨论】:

    【解决方案3】:

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

    # 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
    

    【讨论】:

    • 这正是我要找的,谢谢你的帮助。关于展示这一天的好方法有什么建议吗?我在两个轴上都有 66 个产品,它在 RStudio 界面上并不是非常有用。再次感谢!
    • 我不知道...也许热图是绘制相关性的好方法?网上有很多例子。实际上,有一个很好的问题here
    【解决方案4】:

    您正在研究购物篮分析(或亲和力分析),特别是定义和寻找支持、信心和提升。我发现 here 解释它的最佳论文之一。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多