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

tranhungdao12a3

Thành viên thường trực
Tham gia
29/11/07
Bài viết
365
Được thích
332
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:
1677032099017.png
Cảm ơn các anh chị nhiều!
 

File đính kèm

  • data.xlsx
    107 KB · Đọc: 46
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:
View attachment 286766
Cảm ơn các anh chị nhiều!
Sao mình tính không có sản phẩm nào đạt trên 50% của mỗi đơn hàng, không biết mình có hiểu ý sai bạn không? Bạn thử tính tay 1 số sản phẩm đạt trên 50% rồi gửi lên xem.
 
Sao mình tính không có sản phẩm nào đạt trên 50% của mỗi đơn hàng, không biết mình có hiểu ý sai bạn không? Bạn thử tính tay 1 số sản phẩm đạt trên 50% rồi gửi lên xem.
(Đoán mò): Định nghĩa về đơn hàng: mỗi ngày mua hàng của 1 khách hàng sẽ tính là 1 đơn hàng,
vì thế Distinccount đơn hàng của khách hàng sẽ là

1677060211960.png
 
Lần chỉnh sửa cuối:
Bài này viết code còn thấy gian nan.

Giả sử "các sản phẩm được mua cùng nhau" tạm xét theo cặp (2 loại sản phẩm).
Xét dữ liệu của 1 khách hàng.
Đầu tiên, lọc danh sách các mặt hàng xuất hiện nhiều hơn 1 lần ở các đơn hàng.
Tạo danh sách các cặp sản phẩm từ danh sách vừa lọc được ở bước trên.
Xét từng cặp sản phẩm đó, đếm số lần xuất hiện của chúng trong tất cả các đơn hàng. Đối chiếu số lần xuất hiện và xuất kết quả.
---
Trường hợp 3, 4, ..., n các sản phẩm được mua cùng nhau thì làm tương tự. Rất phức tạp.
 
Sao mình tính không có sản phẩm nào đạt trên 50% của mỗi đơn hàng, không biết mình có hiểu ý sai bạn không? Bạn thử tính tay 1 số sản phẩm đạt trên 50% rồi gửi lên xem.
Có nhiều chứ bạn, bạn đếm tổng số đơn hàng của khách hàng, sau đó sản phẩm nào xuất hiện >=1/2 số đơn hàng thì nó là sản phẩm thường xuyên thôi
Bài đã được tự động gộp:

(Đoán mò): Định nghĩa về đơn hàng: mỗi ngày mua hàng của 1 khách hàng sẽ tính là 1 đơn hàng,
vì thế Distinccount đơn hàng của khách hàng sẽ là

View attachment 286804
Bạn tính vậy cũng được, do dữ liệu một số dòng phần số lượng =0 mình quên không sửa.
Bài đã được tự động gộp:

Bài này viết code còn thấy gian nan.

Giả sử "các sản phẩm được mua cùng nhau" tạm xét theo cặp (2 loại sản phẩm).
Xét dữ liệu của 1 khách hàng.
Đầu tiên, lọc danh sách các mặt hàng xuất hiện nhiều hơn 1 lần ở các đơn hàng.
Tạo danh sách các cặp sản phẩm từ danh sách vừa lọc được ở bước trên.
Xét từng cặp sản phẩm đó, đếm số lần xuất hiện của chúng trong tất cả các đơn hàng. Đối chiếu số lần xuất hiện và xuất kết quả.
---
Trường hợp 3, 4, ..., n các sản phẩm được mua cùng nhau thì làm tương tự. Rất phức tạp.
Logic tính vậy sẽ phức tạp anh. Theo em logic thử như vầy:
Đầu tiên đi qua từng khách hàng một, với mỗi khách hàng sẽ đếm tổng số đơn, sau đó sẽ tính tiếp cho từng sản phẩm một(quét một lượt tất cả các sản phẩm luôn), xem mỗi sản phẩm xuất hiện trong bao nhiêu đơn hàng, tiếp đó sẽ so sánh nếu sản phẩm đó xuất hiện >=50% số đơn hàng của khách hàng là được.
Tuy nhiên nếu dữ liệu nhiều đơn hàng+ nhiều sản phẩm thì khả năng chạy sẽ tương đối nặng
 
Lần chỉnh sửa cuối:
... tiếp đó sẽ so sánh nếu sản phẩm đó xuất hiện >=50% số đơn hàng của khách hàng là được.
Trường hợp = 50% thì cũng có thể chúng không được mua cùng nhau đâu.
Trường hợp > 50% chưa thể xác định được chúng được mua cùng nhau bao nhiêu lần. Do đó, cách này không trả về kết quả bạn yêu cầu được.
 
...

Logic tính vậy sẽ phức tạp anh. Theo em logic thử như vầy:
...
Bạn làm cái Sales/Customer Analysis như thế này bắt buộc phải rõ quy trình Hóa đơn và Thanh toán Hóa đơn. Sau đó thiết kế CSDL, cố gắng chuẩn hóa đến bậc 3. Từ đó mới tính tiếp được.

Cái này làm xuôi rót hay không là do kỹ năng thiết kế bảng chứ không phải các công thức Excel hay VBA.

Nếu là bài toán đoán Mẫu (Model) thì dùng file CSV và dùng R hay Python. Đương nhirn là nếu chịu bỏ tiền ra thì có cả đống phần mềm chuyên nghiệp để tính.
 
Bạn làm cái Sales/Customer Analysis như thế này bắt buộc phải rõ quy trình Hóa đơn và Thanh toán Hóa đơn. Sau đó thiết kế CSDL, cố gắng chuẩn hóa đến bậc 3. Từ đó mới tính tiếp được.

Cái này làm xuôi rót hay không là do kỹ năng thiết kế bảng chứ không phải các công thức Excel hay VBA.

Nếu là bài toán đoán Mẫu (Model) thì dùng file CSV và dùng R hay Python. Đương nhirn là nếu chịu bỏ tiền ra thì có cả đống phần mềm chuyên nghiệp để tính.
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
 
Tôi lập bảng cấu trúc tương tự trên Access. Giả sử mỗi khách hàng trong một ngày chỉ có duy nhất một đơn hàng (có thể nhiều mặt hàng khác nhau), với những sản phẩm xuất hiện trong hơn 1/2 trong tổng số đơn của mỗi khách tôi query được kết quả như thế này. Không biết đúng không nhỉ?

Khách hàngTổng đơnSản phẩmLượng đơn
S0005360
26​
C-PIE02P
19​
S0005360
26​
C-PIE06P
23​
S0005360
26​
C-PIE12P
26​
S0005360
26​
CSTS06P
21​
S0005360
26​
CSTS12P(8)
24​
S0005360
26​
OStarKim Chi - Small
14​
S0005360
26​
OStarS.W - Small
18​
S0005360
26​
SwingNYSteak-Small
16​
S0005361
21​
C-PIE12P
15​
S0005361
21​
OStarS.W - Normal
12​
S0005361
21​
OStarS.W - Small
11​
S0005361
21​
SwingNYSteak - Normal
11​
S0005361
21​
SwingNYSteak-Small
11​
S0005362
24​
C-PIE06P
14​
S0005362
24​
C-PIE12P
17​
S0005362
24​
CSTS06P
13​
S0005362
24​
CSTS12P(8)
17​
S0005362
24​
OStarS.W - Normal
14​
S0005362
24​
OStarS.W - Small
17​
S0005362
24​
SwingNYSteak - Normal
15​
S0005362
24​
SwingNYSteak-Small
17​
S0005366
26​
C-PIE06P
18​
S0005366
26​
C-PIE12P
23​
S0005366
26​
CSTS06P
21​
S0005366
26​
CSTS12P(8)
21​
S0005366
26​
OStarKim Chi - Small
16​
S0005366
26​
OStarS.W - Small
20​
S0005366
26​
SwingChicken - Small
15​
S0005366
26​
SwingNYSteak-Small
19​
S0005367
25​
C-PIE02P
15​
S0005367
25​
C-PIE12P
21​
S0005367
25​
CSTS12P(8)
19​
S0005367
25​
OStarKim Chi - Small
16​
S0005367
25​
OStarS.W - Small
17​
S0005367
25​
SwingNYSteak-Small
14​
S0005373
26​
C-PIE06P
15​
S0005373
26​
C-PIE12P
21​
S0005373
26​
CSTS12P(8)
17​
S0005373
26​
OStarKim Chi - Small
18​
S0005373
26​
OStarPMai-TMuoi - Small
14​
S0005373
26​
OStarS.W - Small
21​
S0005373
26​
SwingNYSteak-Small
23​
S0005374
11​
OStarS.W - Small
6​
S0005375
26​
C-PIE02P
16​
S0005375
26​
C-PIE06P
20​
S0005375
26​
C-PIE12P
25​
S0005375
26​
CSTS02P
14​
S0005375
26​
CSTS06P
17​
S0005375
26​
CSTS12P(8)
26​
S0005375
26​
OStarKim Chi - Small
20​
S0005375
26​
OStarNatural - Small
20​
S0005375
26​
OStarPMai-TMuoi - Small
22​
S0005375
26​
OStarS.W - Small
26​
S0005375
26​
SwingNYSteak-Small
25​
S0005379
23​
C-PIE12P
15​
S0005379
23​
CSTS12P(8)
13​
S0005379
23​
OStarPMai-TMuoi - Small
12​
S0005379
23​
OStarS.W - Small
17​
S0005379
23​
SwingNYSteak - Normal
13​
S0005379
23​
SwingNYSteak-Small
17​
S0005380
23​
C-PIE06P
13​
S0005380
23​
C-PIE12P
14​
S0005380
23​
CSTS12P(8)
15​
S0005381
24​
OStarKim Chi - Normal
18​
S0005381
24​
OStarS.W - Normal
18​
S0005381
24​
OStarS.W - Small
17​
S0005381
24​
SwingChicken-Normal
13​
S0005381
24​
SwingNYSteak - Normal
17​
S0005381
24​
SwingNYSteak-Small
15​
S0005384
20​
C-PIE02P
13​
S0005384
20​
C-PIE12P
16​
S0005384
20​
CSTS12P(8)
14​
S0005384
20​
OStarS.W - Small
12​
S0005386
21​
C-PIE12P
11​
S0005386
21​
OStarKim Chi - Small
13​
S0005386
21​
OStarS.W - Small
14​
S0005386
21​
SwingNYSteak-Small
14​
S0005396
25​
C-PIE06P
16​
S0005396
25​
C-PIE12P
21​
S0005396
25​
CSTS12P(8)
18​
S0005396
25​
OStarKim Chi - Small
16​
S0005396
25​
OStarS.W - Small
17​
S0005396
25​
SwingNYSteak-Small
17​
S0005398
14​
C-PIE02P
8​
S0005398
14​
C-PIE06P
10​
S0005398
14​
C-PIE12P
13​
S0005398
14​
CSTS12P(8)
13​
S0005401
26​
C-PIE06P
16​
S0005401
26​
C-PIE12P
21​
S0005401
26​
C-PIE12P(Dark)
14​
S0005401
26​
CSTS12P(8)
15​
S0005401
26​
OStarKim Chi - Small
25​
S0005401
26​
OStarNatural - Small
25​
S0005401
26​
OStarPMai-TMuoi - Small
22​
S0005401
26​
OStarS.W - Small
26​
S0005401
26​
SwingCheese - Small
16​
S0005401
26​
SwingChicken - Small
25​
S0005401
26​
SwingMAXX - Bo Small
16​
S0005401
26​
SwingNYSteak-Small
26​
S0005404
26​
C-PIE06P
15​
S0005404
26​
C-PIE12P
25​
S0005404
26​
CSTS12P(8)
14​
S0005404
26​
OStarKim Chi - Small
23​
S0005404
26​
OStarNatural - Small
18​
S0005404
26​
OStarPMai-TMuoi - Small
18​
S0005404
26​
OStarS.W - Small
23​
S0005404
26​
SwingNYSteak-Small
16​
S0005415
26​
C-PIE02P
18​
S0005415
26​
C-PIE12P
25​
S0005415
26​
CSTS02P
18​
S0005415
26​
CSTS12P(8)
20​
S0005415
26​
OStarKim Chi - Normal
14​
S0005415
26​
OStarS.W - Normal
16​
S0005415
26​
OStarS.W - Small
16​
S0005415
26​
SwingNYSteak - Normal
17​
S0005416
26​
C-PIE02P
14​
S0005416
26​
C-PIE06P
14​
S0005416
26​
C-PIE12P
22​
S0005416
26​
CSTS12P(8)
15​
S0005416
26​
OStarKim Chi - Normal
19​
S0005416
26​
OStarS.W - Normal
20​
S0005416
26​
OStarS.W - Small
14​
S0005416
26​
SwingNYSteak - Normal
19​
S0005423
26​
C-PIE02P
26​
S0005423
26​
C-PIE06P
20​
S0005423
26​
C-PIE12P
26​
S0005423
26​
C-PIE12P(Dark)
15​
S0005423
26​
CSTS02P
24​
S0005423
26​
CSTS06P
24​
S0005423
26​
CSTS12P(8)
25​
S0005423
26​
OStarKim Chi - Normal
21​
S0005423
26​
OStarKim Chi - Small
24​
S0005423
26​
OStarNatural - Small
24​
S0005423
26​
OStarPMai-TMuoi - Small
24​
S0005423
26​
OStarS.W - Normal
22​
S0005423
26​
OStarS.W - Small
25​
S0005423
26​
SwingCheese - Small
17​
S0005423
26​
SwingChicken - Small
24​
S0005423
26​
SwingChicken-Normal
16​
S0005423
26​
SwingMAXX - Bo Normal
14​
S0005423
26​
SwingMAXX - Bo Small
20​
S0005423
26​
SwingNYSteak - Normal
21​
S0005423
26​
SwingNYSteak-Small
25​
 
Tôi lập bảng cấu trúc tương tự trên Access. Giả sử mỗi khách hàng trong một ngày chỉ có duy nhất một đơn hàng (có thể nhiều mặt hàng khác nhau), với những sản phẩm xuất hiện trong hơn 1/2 trong tổng số đơn của mỗi khách tôi query được kết quả như thế này. Không biết đúng không nhỉ?

Khách hàngTổng đơnSản phẩmLượng đơn
S0005360
26​
C-PIE02P
19​
S0005360
26​
C-PIE06P
23​
S0005360
26​
C-PIE12P
26​
S0005360
26​
CSTS06P
21​
S0005360
26​
CSTS12P(8)
24​
S0005360
26​
OStarKim Chi - Small
14​
S0005360
26​
OStarS.W - Small
18​
S0005360
26​
SwingNYSteak-Small
16​
S0005361
21​
C-PIE12P
15​
S0005361
21​
OStarS.W - Normal
12​
S0005361
21​
OStarS.W - Small
11​
S0005361
21​
SwingNYSteak - Normal
11​
S0005361
21​
SwingNYSteak-Small
11​
S0005362
24​
C-PIE06P
14​
S0005362
24​
C-PIE12P
17​
S0005362
24​
CSTS06P
13​
S0005362
24​
CSTS12P(8)
17​
S0005362
24​
OStarS.W - Normal
14​
S0005362
24​
OStarS.W - Small
17​
S0005362
24​
SwingNYSteak - Normal
15​
S0005362
24​
SwingNYSteak-Small
17​
S0005366
26​
C-PIE06P
18​
S0005366
26​
C-PIE12P
23​
S0005366
26​
CSTS06P
21​
S0005366
26​
CSTS12P(8)
21​
S0005366
26​
OStarKim Chi - Small
16​
S0005366
26​
OStarS.W - Small
20​
S0005366
26​
SwingChicken - Small
15​
S0005366
26​
SwingNYSteak-Small
19​
S0005367
25​
C-PIE02P
15​
S0005367
25​
C-PIE12P
21​
S0005367
25​
CSTS12P(8)
19​
S0005367
25​
OStarKim Chi - Small
16​
S0005367
25​
OStarS.W - Small
17​
S0005367
25​
SwingNYSteak-Small
14​
S0005373
26​
C-PIE06P
15​
S0005373
26​
C-PIE12P
21​
S0005373
26​
CSTS12P(8)
17​
S0005373
26​
OStarKim Chi - Small
18​
S0005373
26​
OStarPMai-TMuoi - Small
14​
S0005373
26​
OStarS.W - Small
21​
S0005373
26​
SwingNYSteak-Small
23​
S0005374
11​
OStarS.W - Small
6​
S0005375
26​
C-PIE02P
16​
S0005375
26​
C-PIE06P
20​
S0005375
26​
C-PIE12P
25​
S0005375
26​
CSTS02P
14​
S0005375
26​
CSTS06P
17​
S0005375
26​
CSTS12P(8)
26​
S0005375
26​
OStarKim Chi - Small
20​
S0005375
26​
OStarNatural - Small
20​
S0005375
26​
OStarPMai-TMuoi - Small
22​
S0005375
26​
OStarS.W - Small
26​
S0005375
26​
SwingNYSteak-Small
25​
S0005379
23​
C-PIE12P
15​
S0005379
23​
CSTS12P(8)
13​
S0005379
23​
OStarPMai-TMuoi - Small
12​
S0005379
23​
OStarS.W - Small
17​
S0005379
23​
SwingNYSteak - Normal
13​
S0005379
23​
SwingNYSteak-Small
17​
S0005380
23​
C-PIE06P
13​
S0005380
23​
C-PIE12P
14​
S0005380
23​
CSTS12P(8)
15​
S0005381
24​
OStarKim Chi - Normal
18​
S0005381
24​
OStarS.W - Normal
18​
S0005381
24​
OStarS.W - Small
17​
S0005381
24​
SwingChicken-Normal
13​
S0005381
24​
SwingNYSteak - Normal
17​
S0005381
24​
SwingNYSteak-Small
15​
S0005384
20​
C-PIE02P
13​
S0005384
20​
C-PIE12P
16​
S0005384
20​
CSTS12P(8)
14​
S0005384
20​
OStarS.W - Small
12​
S0005386
21​
C-PIE12P
11​
S0005386
21​
OStarKim Chi - Small
13​
S0005386
21​
OStarS.W - Small
14​
S0005386
21​
SwingNYSteak-Small
14​
S0005396
25​
C-PIE06P
16​
S0005396
25​
C-PIE12P
21​
S0005396
25​
CSTS12P(8)
18​
S0005396
25​
OStarKim Chi - Small
16​
S0005396
25​
OStarS.W - Small
17​
S0005396
25​
SwingNYSteak-Small
17​
S0005398
14​
C-PIE02P
8​
S0005398
14​
C-PIE06P
10​
S0005398
14​
C-PIE12P
13​
S0005398
14​
CSTS12P(8)
13​
S0005401
26​
C-PIE06P
16​
S0005401
26​
C-PIE12P
21​
S0005401
26​
C-PIE12P(Dark)
14​
S0005401
26​
CSTS12P(8)
15​
S0005401
26​
OStarKim Chi - Small
25​
S0005401
26​
OStarNatural - Small
25​
S0005401
26​
OStarPMai-TMuoi - Small
22​
S0005401
26​
OStarS.W - Small
26​
S0005401
26​
SwingCheese - Small
16​
S0005401
26​
SwingChicken - Small
25​
S0005401
26​
SwingMAXX - Bo Small
16​
S0005401
26​
SwingNYSteak-Small
26​
S0005404
26​
C-PIE06P
15​
S0005404
26​
C-PIE12P
25​
S0005404
26​
CSTS12P(8)
14​
S0005404
26​
OStarKim Chi - Small
23​
S0005404
26​
OStarNatural - Small
18​
S0005404
26​
OStarPMai-TMuoi - Small
18​
S0005404
26​
OStarS.W - Small
23​
S0005404
26​
SwingNYSteak-Small
16​
S0005415
26​
C-PIE02P
18​
S0005415
26​
C-PIE12P
25​
S0005415
26​
CSTS02P
18​
S0005415
26​
CSTS12P(8)
20​
S0005415
26​
OStarKim Chi - Normal
14​
S0005415
26​
OStarS.W - Normal
16​
S0005415
26​
OStarS.W - Small
16​
S0005415
26​
SwingNYSteak - Normal
17​
S0005416
26​
C-PIE02P
14​
S0005416
26​
C-PIE06P
14​
S0005416
26​
C-PIE12P
22​
S0005416
26​
CSTS12P(8)
15​
S0005416
26​
OStarKim Chi - Normal
19​
S0005416
26​
OStarS.W - Normal
20​
S0005416
26​
OStarS.W - Small
14​
S0005416
26​
SwingNYSteak - Normal
19​
S0005423
26​
C-PIE02P
26​
S0005423
26​
C-PIE06P
20​
S0005423
26​
C-PIE12P
26​
S0005423
26​
C-PIE12P(Dark)
15​
S0005423
26​
CSTS02P
24​
S0005423
26​
CSTS06P
24​
S0005423
26​
CSTS12P(8)
25​
S0005423
26​
OStarKim Chi - Normal
21​
S0005423
26​
OStarKim Chi - Small
24​
S0005423
26​
OStarNatural - Small
24​
S0005423
26​
OStarPMai-TMuoi - Small
24​
S0005423
26​
OStarS.W - Normal
22​
S0005423
26​
OStarS.W - Small
25​
S0005423
26​
SwingCheese - Small
17​
S0005423
26​
SwingChicken - Small
24​
S0005423
26​
SwingChicken-Normal
16​
S0005423
26​
SwingMAXX - Bo Normal
14​
S0005423
26​
SwingMAXX - Bo Small
20​
S0005423
26​
SwingNYSteak - Normal
21​
S0005423
26​
SwingNYSteak-Small
25​
Sản phẩm mua >50% số đơn như này chuẩn rồi anh, Vấn đề là ở câu số 2, cần trích ra sản phẩm nào mà cùng nhau xuất hiện ở >75% số đơn của mỗi khách hàng ý anh!
 
Dựa theo kết quả #9
Power Query
Mã:
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
Mã:
=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))
 
Dựa theo kết quả #9
Power Query
Mã:
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
Mã:
=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))
Cảm ơn bạn, mình chưa xài E365 nên chưa coi công thức được, mình sẽ xem sau khi cài
 
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.
PHP:
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
 

File đính kèm

  • data.xlsm
    265.9 KB · Đọc: 18
Bài này có sẵn bài giải bằng Python rồi đó.
Và có cả bài giải kết hợp Python + Power BI.
 
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.
PHP:
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
Điều kiện >=75% số đơn tức là sản phẩm nào mà cùng nhau xuất hiện ở >=75% số đơn của khách hàng thì trích ra ạ.
Ví dụ khách hàng A trong khoảng thời gian dữ liệu có mua 26 đơn trong đó sản phẩm nào cùng nhau xuất hiện ở 19 đơn trở lên thì trích nó ra, còn nếu nó có xuất hiện ở 19 đơn nhưng không xuất hiện cùng nhau thì cũng không tính ạ. Hiểu như hành vi mua hàng của khách hàng đó anh, ví dụ anh xem trên web bán hàng cái điện thoại SamSung chẳng hạn thì nó sẽ hiện luôn cho biết khách hàng mua điện thoại này thì thường sẽ mua phụ kiện gì kèm theo ý.
 
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:

Cảm ơn các anh chị nhiều!
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
Mã:
Option Explicit
Sub XYZ()
  Dim arr(), a, SP(), res(), res2(), dh$, dhSP$, dic As Object, dicDH As Object
  Dim sRow&, sR$, i&, j&, r&, id&, jd&, sSP&, k&, k2&, sDon#, iSP#
 
  Set dic = CreateObject("scripting.dictionary")
  Set dicDH = CreateObject("scripting.dictionary")
  arr = Range("A2", Range("D" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 2)

  For i = 1 To sRow
    If arr(i, 3) > 0 Then
      If dic.exists(arr(i, 2)) = False Then
        sSP = sSP + 1 'So San Pham
        res(sSP, 2) = arr(i, 2)
        dic.Add arr(i, 2), sSP
      End If
      dh = arr(i, 1) & "|" & arr(i, 4)
      dhSP = dh & "|" & arr(i, 2)
      If dic.exists(dhSP) = False Then
        dic.Add dhSP, ""
        If dicDH.exists(dh) = False Then
          sDon = sDon + 1 'So Don hang
          dicDH.Add dh, Array(arr(i, 2))
        Else
          a = dicDH(dh) 'San Pham cua Don hang
          ReDim Preserve a(0 To UBound(a) + 1)
          a(UBound(a)) = arr(i, 2)
          dicDH(dh) = a
        End If
      End If
    End If
  Next i
  ReDim SP(1 To sSP, 0 To sSP)
  ReDim res2(1 To sSP, 1 To sSP)
 
  For Each a In dicDH.items
    sRow = UBound(a)
    For i = 0 To sRow
      id = dic(a(i))
      SP(id, 0) = SP(id, 0) + 1
      For j = 0 To sRow
        jd = dic(a(j))
        If id <> jd Then
          SP(id, jd) = SP(id, jd) + 1
        End If
      Next j
    Next i
  Next a
 
  sDon = sDon * 0.5  '50% So Don hang
  For i = 1 To sSP
    If SP(i, 0) > sDon Then
      k = k + 1
      res(k, 1) = res(i, 2)
    End If
    iSP = SP(i, 0) * 0.75  '75% So San Pham
    jd = 1
    For j = 1 To sSP
      If SP(i, j) > iSP Then
        If jd = 1 Then
          k2 = k2 + 1
          res2(k2, 1) = res(i, 2)
        End If
        jd = jd + 1
        res2(k2, jd) = res(j, 2)
      End If
    Next j
  Next i
  Range("F6").Resize(k) = res 'SP mua thuong xuyên
  Range("H6").Resize(k2, sSP) = res2 'Sp mua cung nhau
End Sub
 

File đính kèm

  • data.xlsb
    61.6 KB · Đọc: 28
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
Mã:
Option Explicit
Sub XYZ()
  Dim arr(), a, SP(), res(), res2(), dh$, dhSP$, dic As Object, dicDH As Object
  Dim sRow&, sR$, i&, j&, r&, id&, jd&, sSP&, k&, k2&, sDon#, iSP#
 
  Set dic = CreateObject("scripting.dictionary")
  Set dicDH = CreateObject("scripting.dictionary")
  arr = Range("A2", Range("D" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)
  ReDim res(1 To sRow, 1 To 2)

  For i = 1 To sRow
    If arr(i, 3) > 0 Then
      If dic.exists(arr(i, 2)) = False Then
        sSP = sSP + 1 'So San Pham
        res(sSP, 2) = arr(i, 2)
        dic.Add arr(i, 2), sSP
      End If
      dh = arr(i, 1) & "|" & arr(i, 4)
      dhSP = dh & "|" & arr(i, 2)
      If dic.exists(dhSP) = False Then
        dic.Add dhSP, ""
        If dicDH.exists(dh) = False Then
          sDon = sDon + 1 'So Don hang
          dicDH.Add dh, Array(arr(i, 2))
        Else
          a = dicDH(dh) 'San Pham cua Don hang
          ReDim Preserve a(0 To UBound(a) + 1)
          a(UBound(a)) = arr(i, 2)
          dicDH(dh) = a
        End If
      End If
    End If
  Next i
  ReDim SP(1 To sSP, 0 To sSP)
  ReDim res2(1 To sSP, 1 To sSP)
 
  For Each a In dicDH.items
    sRow = UBound(a)
    For i = 0 To sRow
      id = dic(a(i))
      SP(id, 0) = SP(id, 0) + 1
      For j = 0 To sRow
        jd = dic(a(j))
        If id <> jd Then
          SP(id, jd) = SP(id, jd) + 1
        End If
      Next j
    Next i
  Next a
 
  sDon = sDon * 0.5  '50% So Don hang
  For i = 1 To sSP
    If SP(i, 0) > sDon Then
      k = k + 1
      res(k, 1) = res(i, 2)
    End If
    iSP = SP(i, 0) * 0.75  '75% So San Pham
    jd = 1
    For j = 1 To sSP
      If SP(i, j) > iSP Then
        If jd = 1 Then
          k2 = k2 + 1
          res2(k2, 1) = res(i, 2)
        End If
        jd = jd + 1
        res2(k2, jd) = res(j, 2)
      End If
    Next j
  Next i
  Range("F6").Resize(k) = res 'SP mua thuong xuyên
  Range("H6").Resize(k2, sSP) = res2 'Sp mua cung nhau
End Sub
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
 
Web KT
Back
Top Bottom