Nhờ anh chị tìm sản phẩm được khách hàng mua thường xuyên cùng nhau
Chào các anh chị!
Em có một câu hỏi nhờ anh chị giúp đỡ:
Em có dữ liệu khách hàng mua hàng các sản phẩm khác nhau, em muốn tìm ra sản phẩm được khách hàng thường xuyên mua, dữ liệu và câu hỏi như sau:
3889
Cảm ơn các anh chị nhiều!
Dựa theo kết quả #9
Power Query
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
tbl0 = Table.Group(Source, {"Khách hàng"}, {{"Count", each List.Count(List.Distinct([Ngày]))}}),
tbl1 = Table.Group(Source, {"Khách hàng", "Sản Phẩm"}, {{"OderSP", each Table.RowCount(_), Int64.Type}}),
tbl2 = Table.NestedJoin(tbl1, {"Khách hàng"}, tbl0, {"Khách hàng"}, "tbl1", JoinKind.LeftOuter),
tbl3 = Table.ExpandTableColumn(tbl2, "tbl1", {"Count"}, {"TotalOder"}),
tbl4 = Table.AddColumn(tbl3, "DK", each [OderSP]/[TotalOder]),
tbl5 = Table.SelectRows(tbl4, each [DK] > 0.5),
KQ = Table.RemoveColumns(tbl5,{"DK"})
in
KQ
Công thức E365
=LET(so,A2:A4386,sp,B2:B4386,sl,C2:C4386,d,D2:D4386,_ab,so&"|"&sp,uso,UNIQUE(so),od_1,MAP(uso,LAMBDA(x,ROWS(UNIQUE(FILTER(d,so=x))))),uss,UNIQUE(_ab),od_2,MAP(uss,LAMBDA(y,ROWS(FILTER(sp,_ab=y)))),kh,TEXTBEFORE(uss,"|"),_sp,TEXTAFTER(uss,"|"),od_3,XLOOKUP(kh,uso,od_1),FILTER(HSTACK(kh,od_3,_sp,od_2),od_2/od_3>0.5))
www.giaiphapexcel.com/diendan/threads/nh%E1%BB%9D-anh-ch%E1%BB%8B-t%C3%ACm-s%E1%BA%A3n-ph%E1%BA%A9m-%C4%91%C6%B0%E1%BB%A3c-kh%C3%A1ch-h%C3%A0ng-mua-th%C6%B0%E1%BB%9Dng-xuy%C3%AAn-c%C3%B9ng-nhau.164096/#post-1095622
Khóa học SprinGO phù hợp
Xây dựng Lương 3P, KPI cho Doanh nghiệp
Làm thế nào để trả lương cho nhân viên chính xác nhất? Đây là một trong những câu hỏi khó trong quản trị nhân...
Xem khóa học
Bài toán tương đối phức tạp nên mình sẽ làm qua các bước sau:
1- Tạo sheet "Tonghop"
Mỗi đơn hàng là 1 dòng
Mỗi sản phẩm là 1 cột
Nộii dung trong bảng là đếm số lần xuất hiện của mỗi sản phẩm
2- Tạo sheet "Thongke"
Mỗi khách hàng là 1 dòng, và có thống kên số đơn hàng của khách hàng đó
Mỗi sản phẩm là 1 cột. Cho mỗi sản phẩm, thống kê % xuất hiện của sản phẩm đó cho mỗi khách hàng. Chỉ liệt kê số liệu >50%, nếu dưới thì tự động loại bỏ ra.
3- Về yêu cầu trích ra "các SP cùng nhau xuất hiện >75%", mình vẫn chưa hiểu yêu cầu này.
Nếu được thì căn cứ vào các bảng kết quả nói trên, bạn làm tay một vài trường hợp ra xem sao.
Option Explicit
Sub test()
Dim lr&, i&, j&, k&, s, rng, arr(), id As String, cell As Range
Dim dicKH As Object, dicSP As Object
Set dicKH = CreateObject("Scripting.Dictionary")
Set dicSP = CreateObject("Scripting.Dictionary")
With Sheets("data")
lr = .Cells(Rows.Count, "A").End(xlUp).Row
rng = .Range("A2:D" & lr).Value
ReDim arr(1 To 100000, 1 To 2)
For i = 1 To UBound(rng)
id = rng(i, 1) & "|" & rng(i, 4)
If Not dicKH.exists(id) Then
dicKH.Add id, rng(i, 2)
k = k + 1: arr(k, 1) = rng(i, 1): arr(k, 2) = rng(i, 4)
Else
dicKH(id) = dicKH(id) & "|" & rng(i, 3)
End If
If Not dicSP.exists(rng(i, 2)) Then dicSP.Add rng(i, 2), ""
Next
End With
With Sheets("Tonghop")
.Cells.ClearContents
.Range("B1").Value = Sheets("Data").Range("A1").Value: .Range("C1").Value = Sheets("Data").Range("D1").Value
.Range("B2").Resize(k, 2).Value = arr
.Range("D1").Resize(1, dicSP.Count).Value = dicSP.keys
.Range("D2").Resize(dicKH.Count, dicSP.Count).Formula = "=COUNTIFS(data!$A$2:$A$4387,$B2,data!$D$2:$D$4387,$C2,data!$B$2:$B$4387,D$1)"
rng = .Range("B2").Resize(dicKH.Count, 1).Value
End With
dicKH.RemoveAll
With Sheets("Thongke")
.Cells.ClearContents
.Range("B1").Value = Sheets("Tonghop").Range("B1").Value: .Range("C1").Value = "So don hang"
For i = 1 To UBound(rng)
If Not dicKH.exists(rng(i, 1)) Then
dicKH.Add rng(i, 1), 1
Else
dicKH(rng(i, 1)) = dicKH(rng(i, 1)) + 1
End If
Next
.Range("B2").Resize(dicKH.Count, 1).Value = WorksheetFunction.Transpose(dicKH.keys)
.Range("C2").Resize(dicKH.Count, 1).Value = WorksheetFunction.Transpose(dicKH.items)
.Range("D1").Resize(1, dicSP.Count).Value = dicSP.keys
With .Range("D2").Resize(dicKH.Count, dicSP.Count)
.Formula = "=IF(SUMIF(Tonghop!$B$2:$B$10000,$B2,Tonghop!D$2:D$10000)/$C2>0.5,SUMIF(Tonghop!$B$2:$B$10000,$B2,Tonghop!D$2:D$10000)/$C2,"""")"
.NumberFormat = "0%"
End With
For Each cell In .Range("D1").Resize(1, dicSP.Count)
If WorksheetFunction.Sum(cell.Resize(dicKH.Count, 1)) = 0 Then cell.ClearContents
Next
.Range("D1").Resize(1, dicSP.Count).SpecialCells(xlBlanks).EntireColumn.Delete
End With
End Sub
Sản phẩm B mua cùng sản phẩm A, ngược lại chưa chắc Sản phẩm A mua cùng sản phẩm B
Kiểm tra lại
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ả
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
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"
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út
407540744073
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-Tree4249
Tôi chưa thành thao R lắm nhưng chạy tạm, sử dụng thuật toán Apriori