计算最常购买的项目组合

时间:2017-06-13 08:56:09

标签: excel excel-vba excel-formula vba

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

我有一个名称为买方的列和一个包含项目名称的列。该人购买的每件商品都在新的一行

例如:

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

我尝试在行标签上使用数据透视表放置项目,在列标签上使用人物然后计算项目。然后我可以使用公式查找并乘以数据透视表中的结果,但这不适用于这么大的文件。有更有效的方法吗?

我愿意接受各种解决方案。

2 个答案:

答案 0 :(得分:1)

您可以使用帮助者表格'去做这个。首先创建一个人工购买表。该表中的公式为:

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

如果有人购买该物品,则会得到1/0的结果。例如:

enter image description here

然后在帖子中创建产品网格并输入以下公式:

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

购买物品X和物品Y的倍数实例。例如:enter image description here

答案 1 :(得分:0)

也许我误解了你,但是你对这个人买的不是什么感兴趣,而是买了同样的人买的东西?我不认为你只能使用公式一步完成这一步(当然在vba中你可以更容易地做到这一点)。

要做到没有vba你可以:

  1. 列表项
  2. 按人物和物品排序
  3. 使用一个人购买的所有(不同)商品构建累积字符串 (未经测试:类似IF(A1 = A2; B1;"")& B2
  4. 忽略所有字符串,但最后一个人(如IF(A2 = A3;""; B2)
  5. 在此之后你会有类似

    的东西
    P   I   Items_a All_Items
    1   A   A   
    1   B   AB  
    1   E   ABE 
    1   G   ABEG    ABEG
    2   A   A   
    2   B   AB  
    2   K   ABK 
    2   O   ABKO    
    2   Q   ABKOQ   
    2   T   ABKOQT  
    2   U   ABKOQTU ABKOQTU
    3   A   A   
    3   B   AB  
    3   F   ABF 
    3   K   ABFK    
    3   O   ABFKO   ABFKO
    4   A   A   
    4   B   AB  
    4   E   ABE 
    4   G   ABEG    ABEG
    

    在下一步中,您可以将所有组合复制到新表中,并在列中构建所有组合(升序,原因项目已排序),如果条件匹配则标记为1

    为了更容易地解释这些项目被命名为A,B,......(对应于示例中的第1项,第2项......) 公式就像 = IF(IS_ERROR(FIND(部分(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 BF BF BK BO BQ BT BU EF 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功能有助于实现这一目标:

        A   B   E   F   G   K   O   Q   T   U
    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个项目(帮助 - Cols将是n *(n-1)/ 2,10个项目 - > 45列(导致AA,BB,......)未评估)

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