Nhờ anh chị tìm sản phẩm được khách hàng mua thường xuyên cùng nhau

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Kết quả như vầy anh ạ:
Khách hàngTổng đơn75% đơnSố đơnSản phẩm mua cùng 75% số Bill
S0005360
26​
19.5​
20 đơnSản phẩm: CSTS06P,CSTS12P(8)
S0005360
26​
19.5​
21 đơnSản phẩm: C-PIE06P,C-PIE12P,CSTS06P
S0005360
26​
19.5​
22 đơnSản phẩm: C-PIE06P,CSTS12P(8)
S0005360
26​
19.5​
23 đơnSản phẩm: C-PIE06P,C-PIE12P
S0005360
26​
19.5​
24 đơnSản phẩm: C-PIE12P,CSTS12P(8)
S0005366
26​
19.5​
20 đơnSản phẩm: C-PIE12P,CSTS12P(8)
S0005373
26​
19.5​
21 đơnSản phẩm: OStarS.W - Small,SwingNYSteak-Small
S0005375
26​
19.5​
20 đơnSản phẩm: C-PIE06P,C-PIE12P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarS.W - Small,SwingNYSteak-Small
S0005375
26​
19.5​
21 đơnSản phẩm: C-PIE12P,OStarPMai-TMuoi - Small,SwingNYSteak-Small
S0005375
26​
19.5​
22 đơnSản phẩm: CSTS12P(8),OStarPMai-TMuoi - Small,OStarS.W - Small
S0005375
26​
19.5​
24 đơnSản phẩm: C-PIE12P,SwingNYSteak-Small
S0005375
26​
19.5​
25 đơnSản phẩm: C-PIE12P,CSTS12P(8),OStarS.W - Small,SwingNYSteak-Small
S0005375
26​
19.5​
26 đơnSản phẩm: CSTS12P(8),OStarS.W - Small
S0005381
24​
18​
18 đơnSản phẩm: OStarKim Chi - Normal,OStarS.W - Normal
S0005398
14​
10.5​
12 đơnSản phẩm: C-PIE12P,CSTS12P(8)
S0005401
26​
19.5​
20 đơnSản phẩm: C-PIE12P,OStarKim Chi - Small,SwingChicken - Small
S0005401
26​
19.5​
21 đơnSản phẩm: C-PIE12P,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingNYSteak-Small
S0005401
26​
19.5​
22 đơnSản phẩm: OStarKim Chi - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005401
26​
19.5​
24 đơnSản phẩm: OStarKim Chi - Small,OStarNatural - Small,SwingChicken - Small
S0005401
26​
19.5​
25 đơnSản phẩm: OStarKim Chi - Small,OStarNatural - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005401
26​
19.5​
26 đơnSản phẩm: OStarS.W - Small,SwingNYSteak-Small
S0005404
26​
19.5​
22 đơnSản phẩm: C-PIE12P,OStarKim Chi - Small,OStarS.W - Small
S0005404
26​
19.5​
23 đơnSản phẩm: OStarKim Chi - Small,OStarS.W - Small
S0005415
26​
19.5​
20 đơnSản phẩm: C-PIE12P,CSTS12P(8)
S0005423
26​
19.5​
20 đơnSản phẩm: C-PIE02P,C-PIE06P,C-PIE12P,CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Normal,OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Normal,OStarS.W - Small,SwingChicken - Small,SwingMAXX - Bo Small,SwingNYSteak - Normal,SwingNYSteak-Small
S0005423
26​
19.5​
21 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS12P(8),OStarKim Chi - Normal,OStarNatural - Small,OStarS.W - Normal,OStarS.W - Small,SwingNYSteak - Normal,SwingNYSteak-Small
S0005423
26​
19.5​
22 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS02P,CSTS06P,OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Normal,SwingChicken - Small
S0005423
26​
19.5​
23 đơnSản phẩm: CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005423
26​
19.5​
24 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005423
26​
19.5​
25 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS12P(8),OStarS.W - Small,SwingNYSteak-Small
S0005423
26​
19.5​
26 đơnSản phẩm: C-PIE02P,C-PIE12P
Sản phẩm muốn được trích ra thì nó phải cùng nhau xuất hiện xuất hiện >75% số đơn là được, ví dụ khách hàng S0005360, tổng đơn là 26, 75% đơn là 19.5, tức là cứ xuất hiện cùng nhau 20 đơn trở lên là tách ra: Vậy sản phẩm tách ra là
CSTS06P,CSTS12P(8),
C-PIE06P,C-PIE12P
Được trích ra từ kết hợp của 20 đơn đến 24 đơn có các sản phẩm cùng nhau.
Khách hàng và sản phẩm khác tương tự vậy
Dùng cách vét cạn và tìm cách tăng tốc xử lý nên code khá phức tạp, kết quả liệt kê tất cả các trường hợp mua chung
Kiểm tra lại kết quả
Mã:
Option Explicit
Sub XYZ()
  Dim dic As Object, dic2 As Object, dKH As Object, dDH As Object, dSP As Object
  Dim aTH$(), sTH&, sCol&, iMin&
  Dim arr(), res(), aDH, aSP, a, b()
  Dim dh$, sp$, kh, tmp$
  Dim sRow&, sDH&, sDon#, k&, N&, i&, j&, r&, c&, id&, jd&
 
  iMin = -1 'Dieu kien xet cot So luong: So luong >= 0 (iMin = -1), So luong >0 (iMin = 0)
  sCol = 10 'Thong thuong: 10 < sCol < 20
  Call Creat_TH(aTH, sTH, sCol)
  Set dic = CreateObject("scripting.dictionary")
  Set dic2 = CreateObject("scripting.dictionary")
  Set dKH = CreateObject("scripting.dictionary")
  Set dDH = CreateObject("scripting.dictionary")
  Set dSP = CreateObject("scripting.dictionary")
  arr = Range("A2", Range("D" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 5)
 
  For i = 1 To sRow
    If arr(i, 3) > iMin Then
      kh = arr(i, 1)
      dh = kh & "|" & arr(i, 4)
      sp = dh & "|" & arr(i, 2)
      If dSP.exists(sp) = False Then
        dSP.Add sp, ""
        If dDH.exists(dh) = False Then
          dDH.Add dh, Array(arr(i, 2))
          If dKH.exists(kh) = False Then
            dKH(kh) = Array(dh)
          Else
            a = dKH(kh) 'Gan DH moi vao Khach hang
            ReDim Preserve a(0 To UBound(a) + 1)
            a(UBound(a)) = dh
            dKH(kh) = a
          End If
        Else
          a = dDH(dh) 'gán San Pham vào Don hang
          ReDim Preserve a(0 To UBound(a) + 1)
          a(UBound(a)) = arr(i, 2)
          dDH(dh) = a
        End If
      End If
    End If
  Next i
 
  For Each kh In dKH.keys
    aDH = dKH(kh)
    sDH = UBound(aDH)  'So Don Hang
    sDon = (sDH + 1) * 0.75 '75% So Don hang
    dic.RemoveAll:    dic2.RemoveAll
    k = 0
    For i = 0 To sDH
      aSP = dDH(aDH(i))
      For j = 0 To UBound(aSP)
        sp = aSP(j)
        N = dic(sp) + 1
        dic(sp) = N
        If N > sDon Then
          If dic2.exists(sp) = False Then
            k = k + 1
            dic2.Add sp, k
            ReDim Preserve a(1 To k)
            a(k) = sp
            For c = 0 To sDH
              If dSP.exists(aDH(c) & "|" & sp) Then dic2(c & "|" & sp) = ""
            Next c
          End If
        End If
      Next j
    Next i
    
    If k > 1 Then
      If k > sCol Then sCol = k: Call Creat_TH(aTH, sTH, sCol) 'Tao lai TH Lon hon
      For i = 1 To sTH
        N = aTH(i, 2):        If N > k Then Exit For
        tmp = aTH(i, 1)
        jd = 0: id = 0
        For j = 1 To N
          If Mid(tmp, j, 1) = "1" Then
            jd = jd + 1
            ReDim Preserve b(1 To jd)
            b(jd) = a(j)
          End If
        Next j
        
        For c = 0 To sDH
          For j = 1 To jd
            If dic2.exists(c & "|" & b(j)) = False Then Exit For
          Next j
          If j = jd + 1 Then id = id + 1 'Dem so don hang cua San pham
        Next c
        If id > sDon Then
          r = r + 1
          res(r, 1) = kh
          res(r, 2) = sDH + 1
          res(r, 3) = sDon
          res(r, 4) = id
          res(r, 5) = Join(b, ", ")
        End If
      Next i
    End If
  Next kh
  If Range("H6").Value <> Empty Then Range("H6").CurrentRegion.ClearContents
  If r Then Range("H6").Resize(r, 5) = res 'Sp mua cung nhau
End Sub

Sub Creat_TH(aTH, sTH, sCol)
  Dim N&, i&, j&, S&, r&, tmp$
 
  ReDim bTH(2 To sCol, 1 To 1)
  j = 2
  N = 2 ^ sCol - 1
  ReDim aTH(1 To N - 2, 1 To 2)
  For i = 3 To N
    tmp = D2B(i, sCol)
    If tmp <> Empty Then
      r = r + 1
      aTH(r, 1) = StrReverse(tmp)
      aTH(r, 2) = j
    End If
    If i >= S Then
      j = j + 1
      S = 2 ^ j
    End If
  Next i
  sTH = r
End Sub

Function D2B(num, sCol) As String
  Dim qt&, rd&, tmp$, L&
  qt = num
  Do
    rd = qt Mod 2
    If rd = 1 Then L = L + 1
    qt = Int(qt / 2)
    tmp = rd & tmp
  Loop Until qt = 0
  If L > 1 Then D2B = Format(Val(tmp), String(sCol, "0"))
End Function
 
Dùng cách vét cạn và tìm cách tăng tốc xử lý nên code khá phức tạp, kết quả liệt kê tất cả các trường hợp mua chung
Kiểm tra lại kết quả
Mã:
Option Explicit
Sub XYZ()
  Dim dic As Object, dic2 As Object, dKH As Object, dDH As Object, dSP As Object
  Dim aTH$(), sTH&, sCol&, iMin&
  Dim arr(), res(), aDH, aSP, a, b()
  Dim dh$, sp$, kh, tmp$
  Dim sRow&, sDH&, sDon#, k&, N&, i&, j&, r&, c&, id&, jd&
 
  iMin = -1 'Dieu kien xet cot So luong: So luong >= 0 (iMin = -1), So luong >0 (iMin = 0)
  sCol = 10 'Thong thuong: 10 < sCol < 20
  Call Creat_TH(aTH, sTH, sCol)
  Set dic = CreateObject("scripting.dictionary")
  Set dic2 = CreateObject("scripting.dictionary")
  Set dKH = CreateObject("scripting.dictionary")
  Set dDH = CreateObject("scripting.dictionary")
  Set dSP = CreateObject("scripting.dictionary")
  arr = Range("A2", Range("D" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 5)
 
  For i = 1 To sRow
    If arr(i, 3) > iMin Then
      kh = arr(i, 1)
      dh = kh & "|" & arr(i, 4)
      sp = dh & "|" & arr(i, 2)
      If dSP.exists(sp) = False Then
        dSP.Add sp, ""
        If dDH.exists(dh) = False Then
          dDH.Add dh, Array(arr(i, 2))
          If dKH.exists(kh) = False Then
            dKH(kh) = Array(dh)
          Else
            a = dKH(kh) 'Gan DH moi vao Khach hang
            ReDim Preserve a(0 To UBound(a) + 1)
            a(UBound(a)) = dh
            dKH(kh) = a
          End If
        Else
          a = dDH(dh) 'gán San Pham vào Don hang
          ReDim Preserve a(0 To UBound(a) + 1)
          a(UBound(a)) = arr(i, 2)
          dDH(dh) = a
        End If
      End If
    End If
  Next i
 
  For Each kh In dKH.keys
    aDH = dKH(kh)
    sDH = UBound(aDH)  'So Don Hang
    sDon = (sDH + 1) * 0.75 '75% So Don hang
    dic.RemoveAll:    dic2.RemoveAll
    k = 0
    For i = 0 To sDH
      aSP = dDH(aDH(i))
      For j = 0 To UBound(aSP)
        sp = aSP(j)
        N = dic(sp) + 1
        dic(sp) = N
        If N > sDon Then
          If dic2.exists(sp) = False Then
            k = k + 1
            dic2.Add sp, k
            ReDim Preserve a(1 To k)
            a(k) = sp
            For c = 0 To sDH
              If dSP.exists(aDH(c) & "|" & sp) Then dic2(c & "|" & sp) = ""
            Next c
          End If
        End If
      Next j
    Next i
   
    If k > 1 Then
      If k > sCol Then sCol = k: Call Creat_TH(aTH, sTH, sCol) 'Tao lai TH Lon hon
      For i = 1 To sTH
        N = aTH(i, 2):        If N > k Then Exit For
        tmp = aTH(i, 1)
        jd = 0: id = 0
        For j = 1 To N
          If Mid(tmp, j, 1) = "1" Then
            jd = jd + 1
            ReDim Preserve b(1 To jd)
            b(jd) = a(j)
          End If
        Next j
       
        For c = 0 To sDH
          For j = 1 To jd
            If dic2.exists(c & "|" & b(j)) = False Then Exit For
          Next j
          If j = jd + 1 Then id = id + 1 'Dem so don hang cua San pham
        Next c
        If id > sDon Then
          r = r + 1
          res(r, 1) = kh
          res(r, 2) = sDH + 1
          res(r, 3) = sDon
          res(r, 4) = id
          res(r, 5) = Join(b, ", ")
        End If
      Next i
    End If
  Next kh
  If Range("H6").Value <> Empty Then Range("H6").CurrentRegion.ClearContents
  If r Then Range("H6").Resize(r, 5) = res 'Sp mua cung nhau
End Sub

Sub Creat_TH(aTH, sTH, sCol)
  Dim N&, i&, j&, S&, r&, tmp$
 
  ReDim bTH(2 To sCol, 1 To 1)
  j = 2
  N = 2 ^ sCol - 1
  ReDim aTH(1 To N - 2, 1 To 2)
  For i = 3 To N
    tmp = D2B(i, sCol)
    If tmp <> Empty Then
      r = r + 1
      aTH(r, 1) = StrReverse(tmp)
      aTH(r, 2) = j
    End If
    If i >= S Then
      j = j + 1
      S = 2 ^ j
    End If
  Next i
  sTH = r
End Sub

Function D2B(num, sCol) As String
  Dim qt&, rd&, tmp$, L&
  qt = num
  Do
    rd = qt Mod 2
    If rd = 1 Then L = L + 1
    qt = Int(qt / 2)
    tmp = rd & tmp
  Loop Until qt = 0
  If L > 1 Then D2B = Format(Val(tmp), String(sCol, "0"))
End Function
Kết quả chưa đúng anh ạ, kết quả trùng lặp nhiều mã, ví dụ kháchS0005423
1677636013435.png
Thực tế nó chỉ có những sản phẩm này thôi ah:
Khách hàngTổng đơn75% đơnSố đơnSản phẩm mua cùng 75% số Bill
S0005423
26​
19.5​
20 đơnSản phẩm: C-PIE02P,C-PIE06P,C-PIE12P,CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Normal,OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Normal,OStarS.W - Small,SwingChicken - Small,SwingMAXX - Bo Small,SwingNYSteak - Normal,SwingNYSteak-Small
S0005423
26​
19.5​
21 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS12P(8),OStarKim Chi - Normal,OStarNatural - Small,OStarS.W - Normal,OStarS.W - Small,SwingNYSteak - Normal,SwingNYSteak-Small
S0005423
26​
19.5​
22 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS02P,CSTS06P,OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Normal,SwingChicken - Small
S0005423
26​
19.5​
23 đơnSản phẩm: CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005423
26​
19.5​
24 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005423
26​
19.5​
25 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS12P(8),OStarS.W - Small,SwingNYSteak-Small
S0005423
26​
19.5​
26 đơnSản phẩm: C-PIE02P,C-PIE12P
 
Kết quả chưa đúng anh ạ, kết quả trùng lặp nhiều mã, ví dụ kháchS0005423
View attachment 287010
Thực tế nó chỉ có những sản phẩm này thôi ah:
Khách hàngTổng đơn75% đơnSố đơnSản phẩm mua cùng 75% số Bill
S0005423
26​
19.5​
20 đơnSản phẩm: C-PIE02P,C-PIE06P,C-PIE12P,CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Normal,OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Normal,OStarS.W - Small,SwingChicken - Small,SwingMAXX - Bo Small,SwingNYSteak - Normal,SwingNYSteak-Small
S0005423
26​
19.5​
21 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS12P(8),OStarKim Chi - Normal,OStarNatural - Small,OStarS.W - Normal,OStarS.W - Small,SwingNYSteak - Normal,SwingNYSteak-Small
S0005423
26​
19.5​
22 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS02P,CSTS06P,OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Normal,SwingChicken - Small
S0005423
26​
19.5​
23 đơnSản phẩm: CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005423
26​
19.5​
24 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS02P,CSTS06P,CSTS12P(8),OStarKim Chi - Small,OStarNatural - Small,OStarPMai-TMuoi - Small,OStarS.W - Small,SwingChicken - Small,SwingNYSteak-Small
S0005423
26​
19.5​
25 đơnSản phẩm: C-PIE02P,C-PIE12P,CSTS12P(8),OStarS.W - Small,SwingNYSteak-Small
S0005423
26​
19.5​
26 đơnSản phẩm: C-PIE02P,C-PIE12P
Code mình liệt kê tất cả các tổ hợp, nếu có 3 sp mua cùng sẽ liệt kê 4 trường hợp
 
Code mình liệt kê tất cả các tổ hợp, nếu có 3 sp mua cùng sẽ liệt kê 4 trường hợp
Em chưa lọc toàn bộ nhưng nếu liệt kê như vậy thì khả năng bỏ trùng tất cả các sku cho tất cả các trường hợp >75% đơn khả năng là sẽ ra tất cả các sku cuối cùng
 
Em chưa lọc toàn bộ nhưng nếu liệt kê như vậy thì khả năng bỏ trùng tất cả các sku cho tất cả các trường hợp >75% đơn khả năng là sẽ ra tất cả các sku cuối cùng
Mình chưa hiểu ý của bạn "khả năng bỏ trùng tất cả các sku cho tất cả các trường hợp >75% đơn khả năng là sẽ ra tất cả các sku cuối cùng"
 
Mình chưa hiểu ý của bạn "khả năng bỏ trùng tất cả các sku cho tất cả các trường hợp >75% đơn khả năng là sẽ ra tất cả các sku cuối cùng"
Ý em là ví dụ khách S0005360 thì có 4 sản phẩm mua cùng nhau là C-Pie12P, C-Pie06P, Csts12P(8), CSTS06P, còn kết quả file của anh là nó bị lặp như vầy
1677732976079.png
Sau khi lấy duy nhất thì nó cũng là 4 mã C-Pie12P, C-Pie06P, Csts12P(8), CSTS06P đó ạ!
 
Vậy là bạn chưa lường hết nội dung bài toán.
Khi mình đưa ra giải thuật, bạn nghĩ đó là phức tạp, nhưng nó phải là như vậy vì thự tế là thế mà.

Bạn còn xét thêm:
* Số lượng mặt hàng trong nhóm đạt yêu cầu mua cùng nhau là nhiều nhất hay bằng bao nhiêu (2-3-4-5...mặt hàng).
* Các mặt hàng trong các nhóm đạt yêu cầu là không lặp lại.
* Trường hợp các nhóm 3 mặt hàng đạt số lần mua cùng nhau là 99%, nhóm 4 mặt hàng đạt số lần mua cùng nhau là 76%, thì chọn nhóm 3 hay nhóm 4?
 
Vậy là bạn chưa lường hết nội dung bài toán.
Khi mình đưa ra giải thuật, bạn nghĩ đó là phức tạp, nhưng nó phải là như vậy vì thự tế là thế mà.

Bạn còn xét thêm:
* Số lượng mặt hàng trong nhóm đạt yêu cầu mua cùng nhau là nhiều nhất hay bằng bao nhiêu (2-3-4-5...mặt hàng).
* Các mặt hàng trong các nhóm đạt yêu cầu là không lặp lại.
* Trường hợp các nhóm 3 mặt hàng đạt số lần mua cùng nhau là 99%, nhóm 4 mặt hàng đạt số lần mua cùng nhau là 76%, thì chọn nhóm 3 hay nhóm 4?
Em có hiểu nội dung bài toán anh. Đây chỉ là một câu hỏi nhỏ trong một nhánh. Tức là với mỗi loại được lọc ra thì sẽ phân tích theo Brand và Sku đồng thời kết hợp với tốc độ mua hàng của người tiêu dùng thì sẽ kết hợp chọn chạy chương trình như thế nào cho từng thời điểm. Sẽ kết hợp 2 sku hay 3,4,5,... sku tùy vào nhãn hàng và đặc điểm thị trường đó ạ. Nó cũng bao gồm sự kết hợp với nhóm đối tượng khách hàng( khách hàng lớn thì chọn kết hợp như nào, khách hàng nhỏ thì chọn kết hợp như nào). Để chọn được lấy nhóm nào nó bao gồm tổ hợp( đơn hàng, sức mạnh nhãn hàng, tốc độ sử dụng của người tiêu dùng, đối tượng khách hàng, hiệu quả doanh thu). Cái em hỏi về Đơn hàng chỉ là một mục nhỏ trong đó thôi ạ! Chọn cái nào nó sẽ phụ thuộc vào chiến lược của các yếu tố khác.
Bài toán này nếu viết bằng Dax thì cũng chỉ hơn chục dòng code thôi, tuy nhiên nếu chạy cho hàng trăm nghìn, hàng triệu đơn hàng thì sẽ rất dễ treo máy, ngồi chơi xơi nước nên em mới xin giải pháp Python hay ngôn ngữ khác.
 
Kết quả như vầy anh ạ:
Khách hàngTổng đơn75% đơnSố đơnSản phẩm mua cùng 75% số Bill
S0005360
26​
19.5​
20 đơnSản phẩm: CSTS06P,CSTS12P(8)
S0005360
26​
19.5​
21 đơnSản phẩm: C-PIE06P,C-PIE12P,CSTS06P
S0005360
26​
19.5​
22 đơnSản phẩm: C-PIE06P,CSTS12P(8)
S0005360
26​
19.5​
23 đơnSản phẩm: C-PIE06P,C-PIE12P
S0005360
26​
19.5​
24 đơnSản phẩm: C-PIE12P,CSTS12P(8)
Sản phẩm muốn được trích ra thì nó phải cùng nhau xuất hiện xuất hiện >75% số đơn là được, ví dụ khách hàng S0005360, tổng đơn là 26, 75% đơn là 19.5, tức là cứ xuất hiện cùng nhau 20 đơn trở lên là tách ra: Vậy sản phẩm tách ra là
CSTS06P,CSTS12P(8),
C-PIE06P,C-PIE12P
Được trích ra từ kết hợp của 20 đơn đến 24 đơn có các sản phẩm cùng nhau.
Khách hàng và sản phẩm khác tương tự vậy

Ý em là ví dụ khách S0005360 thì có 4 sản phẩm mua cùng nhau là C-Pie12P, C-Pie06P, Csts12P(8), CSTS06P, còn kết quả file của anh là nó bị lặp như vầy
View attachment 287064
Sau khi lấy duy nhất thì nó cũng là 4 mã C-Pie12P, C-Pie06P, Csts12P(8), CSTS06P đó ạ!
Bạn nói không rỏ nên Code mình liệt kê toàn bộ các trường hợp kết quả, để khi cần xử lý tiếp sẽ thuận tiện hơn
Cụ thể khách hàng S0005360 bạn muốn kết quả là gì?
 
Bạn nói không rỏ nên Code mình liệt kê toàn bộ các trường hợp kết quả, để khi cần xử lý tiếp sẽ thuận tiện hơn
Cụ thể khách hàng S0005360 bạn muốn kết quả là gì?
Em chưa hiểu cách duyệt lấy kết quả của code, mặc dù nó có lặp lại nhưng kết quả cuối cùng sau khi bỏ trùng lấy ra sản phẩm duy nhất thì chuẩn rồi anh.
 
Bạn nói không rỏ nên Code mình liệt kê toàn bộ các trường hợp kết quả, để khi cần xử lý tiếp sẽ thuận tiện hơn
Cụ thể khách hàng S0005360 bạn muốn kết quả là gì?
Theo kết quả bạn ấy đưa thì bài này chỉ xét 2 cặp thôi sau group lại theo số đơn
Theo một cách logic như đã diễn giải thì có thể dùng Power Bi phân tích được, vấn đề phát sinh với dữ liệu lớn và hàng trăm sku, nếu nó chạy tổ hợp như vậy rất là nặng máy, nếu chạy 1,2 cái câu hỏi như vậy thì khả năng dẫn đến ngồi chơi xơi nước. Em vẫn nghĩ R hay Python sẽ mạnh hơn trong cái khoản phân tích này dù sao Power Bi chủ yếu mạnh mẽ ở phần trực quan hóa thôi. Em tìm kiếm giải pháp ngoài Power Bi
Bữa trước thấy bài của bạn rồi tính không giải, mà thấy có vẻ chưa xong nên tham gia chút cho vui. Mà Power BI nó rất mạnh ở xử lý (ETL) và phân tích chứ không riêng gì trực quan hóa, về công nghệ nó ngang với Analysis services mạnh hơn mấy thằng Relational database, nên dữ liệu vài chục trệu dòng Power BI mà chậm thì dùng Python SQL cũng chẳng khá hơn đâu
Bài này tôi làm trên group Power BI cũng khá lâu rồi y chang bài bạn hỏi, như cái report bạn đưa thì dùng thằng nào làm cũng được kể cả excel (excel thì khá nặng), và Power BI nhanh nhất so với SQL, Python (Python sài thư viện dành cho machine learning sẽ nhanh hơn với dữ liệu lớn), Power BI tôi viết lại 3 cách 2 table và 1 measure, Python tôi viết 2 cách, cách 1 theo kết quả report của bạn , cách 2 dùng thư viện mlxtend trả vét cạn giống kêt của bạn HieuCD muốn ra kết quả của bạn thêm vài step (dùng max_len) nữa là được, Excel thì dùng công thức 365 nhưng nó rất nặng mặc dù đã tách ra rồi nên chỉ tham khảo thôi vì giờ excel nó có đầy đủ vòng lặp , đệ quy nên làm mấy bài này là được, cùng 1 thuật toán power BI mất 0.05s, Python 0.2s, Excel> 1 phút1677914958777.png1677914942111.png1677914931058.png
 

File đính kèm

  • ex_68_buy the same order.rar
    64.7 KB · Đọc: 20
  • data.xlsx
    275.5 KB · Đọc: 17
Theo kết quả bạn ấy đưa thì bài này chỉ xét 2 cặp thôi sau group lại theo số đơn

Bữa trước thấy bài của bạn rồi tính không giải, mà thấy có vẻ chưa xong nên tham gia chút cho vui. Mà Power BI nó rất mạnh ở xử lý (ETL) và phân tích chứ không riêng gì trực quan hóa, về công nghệ nó ngang với Analysis services mạnh hơn mấy thằng Relational database, nên dữ liệu vài chục trệu dòng Power BI mà chậm thì dùng Python SQL cũng chẳng khá hơn đâu
Bài này tôi làm trên group Power BI cũng khá lâu rồi y chang bài bạn hỏi, như cái report bạn đưa thì dùng thằng nào làm cũng được kể cả excel (excel thì khá nặng), và Power BI nhanh nhất so với SQL, Python (Python sài thư viện dành cho machine learning sẽ nhanh hơn với dữ liệu lớn), Power BI tôi viết lại 3 cách 2 table và 1 measure, Python tôi viết 2 cách, cách 1 theo kết quả report của bạn , cách 2 dùng thư viện mlxtend trả vét cạn giống kêt của bạn HieuCD muốn ra kết quả của bạn thêm vài step (dùng max_len) nữa là được, Excel thì dùng công thức 365 nhưng nó rất nặng mặc dù đã tách ra rồi nên chỉ tham khảo thôi vì giờ excel nó có đầy đủ vòng lặp , đệ quy nên làm mấy bài này là được, cùng 1 thuật toán power BI mất 0.05s, Python 0.2s, Excel> 1 phútView attachment 287138View attachment 287137View attachment 287136
Cảm ơn anh nhiều nhé! Công nhận đoạn code Dax của anh chạy nhanh thật, em viết cũng ra nhưng chạy máy bàn 64gb ram mà vẫn mất 20s, chạy lapop ram thấp là quay quay mãi mới ra được. Do em chỉ biết chút Dax nên vẫn nghĩ Python sẽ nhanh hơn.
Một lần nữa cảm ơn anh!
 
Theo kết quả bạn ấy đưa thì bài này chỉ xét 2 cặp thôi sau group lại theo số đơn

Bữa trước thấy bài của bạn rồi tính không giải, mà thấy có vẻ chưa xong nên tham gia chút cho vui. Mà Power BI nó rất mạnh ở xử lý (ETL) và phân tích chứ không riêng gì trực quan hóa, về công nghệ nó ngang với Analysis services mạnh hơn mấy thằng Relational database, nên dữ liệu vài chục trệu dòng Power BI mà chậm thì dùng Python SQL cũng chẳng khá hơn đâu
Bài này tôi làm trên group Power BI cũng khá lâu rồi y chang bài bạn hỏi, như cái report bạn đưa thì dùng thằng nào làm cũng được kể cả excel (excel thì khá nặng), và Power BI nhanh nhất so với SQL, Python (Python sài thư viện dành cho machine learning sẽ nhanh hơn với dữ liệu lớn), Power BI tôi viết lại 3 cách 2 table và 1 measure, Python tôi viết 2 cách, cách 1 theo kết quả report của bạn , cách 2 dùng thư viện mlxtend trả vét cạn giống kêt của bạn HieuCD muốn ra kết quả của bạn thêm vài step (dùng max_len) nữa là được, Excel thì dùng công thức 365 nhưng nó rất nặng mặc dù đã tách ra rồi nên chỉ tham khảo thôi vì giờ excel nó có đầy đủ vòng lặp , đệ quy nên làm mấy bài này là được, cùng 1 thuật toán power BI mất 0.05s, Python 0.2s, Excel> 1 phútView attachment 287138View attachment 287137View attachment 287136
Thuật toán vét cạn là thế nào bạn nhỉ? Có thể nói cho tôi biết sơ lược cách làm được không?
 
Thuật toán vét cạn là thế nào bạn nhỉ? Có thể nói cho tôi biết sơ lược cách làm được không?
Vét cạn có điều kiện thì tôi dùng thư viện Python, chứ dữ liệu nhiều vét cạn dùng vòng lặp thì không khả thi, ví dụ hình dưới tính tổ hợp 40 sản phẩm đã thỏa điều kiện thì lượng vòng lặp đã trên 1000 tỷ rồi, tôi dùng fpgrowth sử dụng thuật thuật toán FP-Tree1677998087351.png
 
Vét cạn có điều kiện thì tôi dùng thư viện Python, chứ dữ liệu nhiều vét cạn dùng vòng lặp thì không khả thi, ví dụ hình dưới tính tổ hợp 40 sản phẩm đã thỏa điều kiện thì lượng vòng lặp đã trên 1000 tỷ rồi, tôi dùng fpgrowth sử dụng thuật thuật toán FP-TreeView attachment 287206
Xin anh tham khảo all code Python để mọi người ham khảo với ạ !
 
Xin anh tham khảo all code Python để mọi người ham khảo với ạ !
Bạn có thể tham khảo code R:
install.packages("writexl")
install.packages("openxlsx")
library(readxl)
data <- read_excel("C:/Users/Admin/Desktop/data.xlsx")
#View(data)
library(arules)
library(Matrix)
library(writexl)
# Tạo danh sách sản phẩm cho từng khách hàng
transactions <- split(data$"Sản Phẩm", data$"Khách hàng")
# Chuyển đổi danh sách sản phẩm thành dạng ma trận
trans_matrix <- as(transactions, "transactions")
# Phân tích bán chéo sản phẩm sử dụng thuật toán Apriori
rules <- apriori(trans_matrix, parameter = list(supp = 0.75, conf = 1))
df <- data.frame(lhs = labels(lhs(rules)),
rhs = labels(rhs(rules)),
support = quality(rules)$support,
confidence = quality(rules)$confidence)
write_xlsx(df, "C:/Users/Admin/Desktop/rules.xlsx")

Tôi chưa thành thao R lắm nhưng chạy tạm, sử dụng thuật toán Apriori
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom