计算哪些项目组合最经常购买

什么是这样做的有效方法?

我有一个与买方名称和一个项目名称列的列。 每个人买的东西都在一个新的行上

例如:

Person 1 Item 1 Person 1 Item 2 Person 1 Item 5 Person 1 Item 7 Person 2 Item 1 Person 2 Item 2 Person 2 Item 11 Person 2 Item 15 Person 2 Item 20 Person 2 Item 21 Person 2 Item 17 Person 3 Item 1 Person 3 Item 2 Person 3 Item 6 Person 3 Item 11 Person 3 Item 15 Person 4 Item 1 Person 4 Item 2 Person 4 Item 5 Person 4 Item 7 

总共约1000000行,每个人平均有30个项目。

我想统计一个人购买两件特定物品的频率。 我想像这样的事情

  Item1 Item2 Item3 Item4 Item5 Item6 Item1 xxxxx 0% 0% 5% 10% 90% Item2 Item3 Item4 Item5 Item6 

我已经尝试使用数据透视表将项目放在行标签和人员列标签上,然后计算项目。 然后,我可以使用公式查找并将数据透视表的结果相乘,但这不适用于这样一个大文件。 有没有更有效的方法?

我很乐意接受各种解决scheme。

你可以使用助手“表”来做到这一点。 首先创build一个人的购买表。 该表中的公式是:

 =SUMPRODUCT(--($A$1:$A$20=E$2),--($B$1:$B$20=$D3)) 

如果一个人曾经购买过这个物品,那么这个结果就是1/0。 例:

在这里输入图像说明

然后在你的文章中创build产品网格并input这个公式:

 =SUMPRODUCT($E3:$H3,INDEX($E$3:$H$12,MATCH(K$2,$D$3:$D$12,0),0)) 

购买物品X和物品Y的倍数是多less。示例: 在这里输入图像说明

也许我误解了你的意思,但是你对那个买东西的人不感兴趣,而是在同一个人买的东西里面呢? 我不认为你可以只使用公式一步做到这一点(当然在vba中你可以做到这一点)。

要做到这一点W / O vba你可以:

  1. 项目清单
  2. 按人员和项目sorting
  3. 用一个人购买的所有(不同的)物品build立累积string(未经testing:如IF(A1 = A2; B1;“”)&B2
  4. 忽略所有string,但最后一个人(如IF(A2 = A3;“”; B2)

在此之后,你有类似的东西

 PI Items_a All_Items 1 AA 1 B AB 1 E ABE 1 G ABEG ABEG 2 AA 2 B AB 2 K ABK 2 O ABKO 2 Q ABKOQ 2 T ABKOQT 2 U ABKOQTU ABKOQTU 3 AA 3 B AB 3 F ABF 3 K ABFK 3 O ABFKO ABFKO 4 AA 4 B AB 4 E ABE 4 G ABEG ABEG 

在下一步中,您可以将所有组合复制到新表中,并在列中构build所有组合(升序,导致项目被sorting),如果条件匹配,则标记为1

为了解释它更容易的项目被命名为A,B,…(对应于项目1,项目2 …在你的例子中)公式是这样的= IF(IS_ERROR(FIND(PART(B $ 1; 1; 1 ); $ A2)); 0; 1)* IF(IS_ERROR(FIND(部分(B $ 1; 2; 1); $ A2)); 0; 1)

而你的情况将是以下可能的组合

AB AE AF AG AK AO AQ AT AU BE BF BG BK BO BQ BT BU EF EG EK EO EQ ET EU FG FK FO FQ FT FU GK GO GQ GT GU KO KQ KT KU OQ OT OU QT QU TU

但在这个例子中66%存在,所以我只显示表的开始:

 XXXXX AB AE AF AG AK AO AQ AT AU BE BF ABEG 1 1 0 1 0 0 0 0 0 1 0 ABEG 1 1 0 1 0 0 0 0 0 1 0 ABFKO 1 0 1 0 1 1 0 0 0 0 1 ABKOQTU 1 0 0 0 1 1 1 1 1 0 0 SUM ALL 4 2 1 2 2 2 1 1 1 2 1 

现在你可以数,无论你想要什么。

一个简单的WVERWEIS函数将有助于得到这个:

  ABEFGKOQTU A 0 4 2 1 2 2 2 1 1 1 B 0 0 2 1 2 2 2 1 1 1 E 0 0 0 0 2 0 0 0 0 0 F 0 0 0 0 0 1 1 0 0 0 G 0 0 0 0 0 0 0 0 0 0 K 0 0 0 0 0 0 2 1 1 1 O 0 0 0 0 0 0 0 1 1 1 Q 0 0 0 0 0 0 0 0 1 1 T 0 0 0 0 0 0 0 0 0 1 U 0 0 0 0 0 0 0 0 0 0 

但是对于我的意见,你可以处理大概10个项目(帮助列将是n *(n-1)/ 2,10个项目 – > 45个列(导致AA,BB,…不被评估)

在所有其他情况下,您应该尝试编程。