Phân cụm dữ liệu rất sai lệch, đếm: bất kỳ đề xuất nào sẽ được thực hiện (chuyển đổi, v.v.)?


11

Vấn đề cơ bản

Đây là vấn đề cơ bản của tôi: Tôi đang cố gắng phân cụm một tập dữ liệu có chứa một số biến rất sai lệch với số lượng. Các biến chứa nhiều số không và do đó không có nhiều thông tin cho quy trình phân cụm của tôi - có khả năng là thuật toán k-mean.

Tốt, bạn nói, chỉ cần chuyển đổi các biến bằng cách sử dụng căn bậc hai, hộp cox hoặc logarit. Nhưng vì các biến của tôi dựa trên các biến phân loại, tôi sợ rằng tôi có thể đưa ra sai lệch bằng cách xử lý một biến (dựa trên một giá trị của biến phân loại), trong khi để các biến khác (dựa trên các giá trị khác của biến phân loại) theo cách chúng .

Chúng ta hãy đi vào chi tiết hơn.

Bộ dữ liệu

Tập dữ liệu của tôi đại diện cho việc mua các mặt hàng. Các mặt hàng có các loại khác nhau, ví dụ màu sắc: xanh dương, đỏ và xanh lá cây. Các giao dịch mua sau đó được nhóm lại với nhau, ví dụ như bởi khách hàng. Mỗi khách hàng này được đại diện bởi một hàng trong bộ dữ liệu của tôi, vì vậy tôi bằng cách nào đó phải tổng hợp mua hàng trên khách hàng.

Cách tôi làm điều này là bằng cách đếm số lượng mua, trong đó mặt hàng là một màu nhất định. Vì vậy, thay vì một biến duy nhất color, tôi kết thúc với ba biến count_red, count_bluecount_green.

Dưới đây là một ví dụ để minh họa:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

Trên thực tế, cuối cùng tôi không sử dụng số lượng tuyệt đối, tôi sử dụng tỷ lệ (một phần của các mặt hàng xanh của tất cả các mặt hàng đã mua cho mỗi khách hàng).

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    0.71    |        0.29     |       0.00      |
-----------------------------------------------------------
c1       |    0.43    |        0.57     |       0.00      |
-----------------------------------------------------------
c2       |    0.09    |        0.91     |       0.00      |
-----------------------------------------------------------
c3       |    0.31    |        0.62     |       0.08      |
-----------------------------------------------------------

Kết quả là như nhau: Đối với một trong các màu của tôi, ví dụ: màu xanh lá cây (không ai thích màu xanh lá cây), tôi nhận được một biến lệch trái có chứa nhiều số không. Do đó, k-nghĩa là không tìm thấy phân vùng tốt cho biến này.

Mặt khác, nếu tôi chuẩn hóa các biến của mình (trừ trung bình, chia cho độ lệch chuẩn), biến xanh "sẽ nổ tung" do phương sai nhỏ của nó và lấy các giá trị từ phạm vi lớn hơn nhiều so với các biến khác, khiến nó trông giống hơn quan trọng đối với k-nghĩa hơn thực tế.

Ý tưởng tiếp theo là biến đổi biến xanh lục sk (r) ewed.

Biến đổi biến thiên

Nếu tôi biến đổi biến màu xanh lá cây bằng cách áp dụng căn bậc hai, nó trông có vẻ ít sai lệch hơn. (Ở đây biến màu xanh lá cây được vẽ bằng màu đỏ và màu xanh lá cây để đảm bảo nhầm lẫn.)

nhập mô tả hình ảnh ở đây

Màu đỏ: biến ban đầu; màu xanh: biến đổi bởi căn bậc hai.

Hãy nói rằng tôi hài lòng với kết quả của sự chuyển đổi này (mà tôi thì không, vì các số 0 vẫn làm lệch mạnh phân phối). Bây giờ tôi có nên chia tỷ lệ các biến màu đỏ và màu xanh không, mặc dù các bản phân phối của chúng trông ổn?

Dòng dưới cùng

Nói cách khác, tôi có làm biến dạng kết quả phân cụm bằng cách xử lý màu xanh lá cây theo một cách, nhưng không xử lý màu đỏ và màu xanh nào không? Cuối cùng, cả ba biến thuộc về nhau, vậy chúng có nên được xử lý theo cùng một cách không?

BIÊN TẬP

Để làm rõ: Tôi biết rằng k-mean có lẽ không phải là cách để sử dụng dữ liệu dựa trên số lượng. Tuy nhiên, câu hỏi của tôi thực sự là về việc điều trị các biến phụ thuộc. Chọn phương pháp đúng là một vấn đề riêng biệt.

Các ràng buộc cố hữu trong các biến của tôi là

count_red(i) + count_blue(i) + count_green(i) = n(i), trong đó n(i)tổng số lượng mua của khách hàng i.

(Hoặc, tương đương, count_red(i) + count_blue(i) + count_green(i) = 1khi sử dụng số lượng tương đối.)

Nếu tôi biến đổi các biến của mình khác nhau, điều này tương ứng với việc đưa ra các trọng số khác nhau cho ba thuật ngữ trong ràng buộc. Nếu mục tiêu của tôi là phân tách tối ưu các nhóm khách hàng, tôi có phải quan tâm đến việc vi phạm ràng buộc này không? Hay "kết thúc biện minh cho phương tiện"?


Chào mừng đến với CV! Cảm ơn bạn đã làm cho câu hỏi đầu tiên của bạn rất rõ ràng và được viết tốt.
Cá bạc

Tôi không hiểu dữ liệu của bạn. Các biến (thuộc tính) là count_red, count_bluecount_greenvà các dữ liệu được đếm. Đúng? Các hàng sau đó là gì - các mặt hàng? Và bạn sẽ phân cụm các mặt hàng?
ttnphns

Các hàng thường đại diện cho các nhóm mua hàng tổng hợp. Bạn có thể nghĩ về họ như những khách hàng đã mua nhiều mặt hàng. Tôi đã cập nhật câu hỏi của mình với một bộ dữ liệu mẫu để làm cho điều này rõ ràng hơn.
pederpansen

Bạn muốn phân cụm "khách hàng"?
ttnphns

Đúng. Tôi dự định nhóm mua hàng theo các khoảng thời gian là tốt và do đó khoảng thời gian cụm, nhưng bây giờ: khách hàng.
pederpansen

Câu trả lời:


7

@ttnphns đã cung cấp một câu trả lời tốt.

Làm tốt việc phân cụm thường là suy nghĩ rất kỹ về dữ liệu của bạn, vì vậy hãy thực hiện một số điều đó. Theo tôi, khía cạnh cơ bản nhất của dữ liệu của bạn là chúng có tính cấu thành .

Mặt khác, mối quan tâm chính của bạn dường như là bạn có rất nhiều 0 cho các sản phẩm xanh và đặc biệt tự hỏi liệu bạn có thể chuyển đổi chỉ các giá trị xanh để làm cho nó giống với phần còn lại không. Nhưng vì đây là dữ liệu thành phần, bạn không thể nghĩ về một bộ đếm độc lập với phần còn lại. Hơn nữa, dường như điều bạn thực sự quan tâm là xác suất của khách hàng mua các sản phẩm có màu khác nhau, nhưng vì nhiều người không mua bất kỳ sản phẩm xanh nào, bạn lo lắng rằng bạn không thể ước tính các xác suất đó. Một cách để giải quyết vấn đề này là sử dụng cách tiếp cận có phần Bayes trong đó chúng tôi đưa tỷ lệ ước tính của khách hàng theo tỷ lệ trung bình, với mức độ thay đổi bị ảnh hưởng bởi mức độ trung bình của họ và số lượng dữ liệu bạn phải ước tính xác suất.

Dưới đây tôi sử dụng tập dữ liệu mẫu của bạn để minh họa (theo R) một cách để tiếp cận tình huống của bạn. Tôi đọc dữ liệu và chuyển đổi chúng thành tỷ lệ theo hàng, và sau đó tính tỷ lệ trung bình theo cột. Tôi thêm phương tiện trở lại mỗi số đếm để có được số lượng điều chỉnh và tỷ lệ hàng mới. Điều này làm giảm tỷ lệ ước tính của mỗi khách hàng đối với tỷ lệ trung bình của từng sản phẩm. Nếu bạn muốn một cú huých mạnh hơn, bạn có thể sử dụng nhiều phương tiện (chẳng hạn như, 15*mean.props) để thay thế.

d = read.table(text="id  red    blue    green
...
c3  4   8   1", header=TRUE)
tab = as.table(as.matrix(d[,-1]))
rownames(tab) = paste0("c", 0:3)
tab
#    red blue green
# c0  12    5     0
# c1   3    4     0
# c2   2   21     0
# c3   4    8     1
props = prop.table(tab, 1)
props
#           red       blue      green
# c0 0.70588235 0.29411765 0.00000000
# c1 0.42857143 0.57142857 0.00000000
# c2 0.08695652 0.91304348 0.00000000
# c3 0.30769231 0.61538462 0.07692308
mean.props = apply(props, 2, FUN=function(x){ weighted.mean(x, rowSums(tab)) })
mean.props
#        red       blue      green 
# 0.35000000 0.63333333 0.01666667 
adj.counts = sweep(tab, 2, mean.props, FUN="+");  adj.counts
#            red        blue       green
# c0 12.35000000  5.63333333  0.01666667
# c1  3.35000000  4.63333333  0.01666667
# c2  2.35000000 21.63333333  0.01666667
# c3  4.35000000  8.63333333  1.01666667
adj.props = prop.table(adj.counts, 1);  adj.props
#             red         blue        green
# c0 0.6861111111 0.3129629630 0.0009259259
# c1 0.4187500000 0.5791666667 0.0020833333
# c2 0.0979166667 0.9013888889 0.0006944444
# c3 0.3107142857 0.6166666667 0.0726190476

Có một số kết quả của điều này. Một trong số đó là bây giờ bạn có ước tính khác không về xác suất cơ bản của việc mua sản phẩm xanh, ngay cả khi khách hàng chưa thực sự có bất kỳ hồ sơ nào về việc đã mua bất kỳ sản phẩm xanh nào. Một hậu quả khác là bây giờ bạn có các giá trị hơi liên tục, trong khi tỷ lệ ban đầu thì rời rạc hơn; nghĩa là, tập hợp các ước tính có thể ít bị hạn chế hơn, do đó, một thước đo khoảng cách như khoảng cách Euclide bình phương có thể có ý nghĩa hơn bây giờ.

Chúng ta có thể hình dung dữ liệu để xem những gì đã xảy ra. Bởi vì đây là dữ liệu thành phần, chúng tôi thực sự chỉ có hai mẩu thông tin và chúng tôi có thể vẽ chúng trong một biểu đồ phân tán duy nhất. Với hầu hết các thông tin trong các loại màu đỏ và màu xanh, sẽ hợp lý khi sử dụng chúng làm trục. Bạn có thể thấy rằng các tỷ lệ được điều chỉnh (các số màu đỏ) được dịch chuyển một chút so với vị trí ban đầu của chúng.

windows()
  plot(props[,1], props[,2], pch=as.character(0:3),
       xlab="Proportion Red", ylab="Proportion Blue", xlim=c(0,1), ylim=c(0,1))
  points(adj.props[,1], adj.props[,2], pch=as.character(0:3), col="red")

nhập mô tả hình ảnh ở đây

Tại thời điểm này, bạn có dữ liệu và rất nhiều người sẽ bắt đầu bằng cách tiêu chuẩn hóa chúng. Một lần nữa, vì đây là dữ liệu thành phần, tôi sẽ chạy các phân tích cụm mà không thực hiện bất kỳ tiêu chuẩn hóa nào. Các giá trị này đã tương xứng và tiêu chuẩn hóa sẽ phá hủy một số thông tin quan hệ. Trên thực tế, từ việc nhìn vào cốt truyện tôi nghĩ bạn thực sự chỉ có một chiều thông tin ở đây. (Ít nhất là trong tập dữ liệu mẫu; tập dữ liệu thực của bạn có thể khác.) Trừ khi, từ quan điểm kinh doanh, bạn nghĩ rằng việc nhận ra những người có xác suất đáng kể mua sản phẩm xanh là một nhóm khách hàng khác biệt là rất quan trọng sẽ trích xuất điểm trên thành phần chính đầu tiên (chiếm 99,5% phương sai trong bộ dữ liệu này) và chỉ cụm đó.

pc.a.props = prcomp(adj.props[,1:2], center=T, scale=T)
cumsum(pc.a.props$sdev^2)/sum(pc.a.props$sdev^2)
# [1] 0.9946557 1.000000
pc.a.props$x
#           PC1         PC2
# c0 -1.7398975 -0.03897251
# c1 -0.1853614 -0.04803648
# c2  1.6882400 -0.06707115
# c3  0.2370189  0.15408015
library(mclust)
mc = Mclust(pc.a.props$x[,1])
summary(mc)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
# 
# Mclust E (univariate, equal variance) model with 3 components:
# 
#  log.likelihood n df       BIC       ICL
#       -2.228357 4  6 -12.77448 -12.77448
# 
# Clustering table:
# 1 2 3 
# 1 2 1 

+1 vì bạn đã nhận ra rằng đây là dữ liệu thành phần nhưng tại sao bạn không chỉ sử dụng các kỹ thuật chuyển đổi tiêu chuẩn cho các bản tổng hợp. dữ liệu thay vì ý tưởng "số lượng điều chỉnh" kỳ quặc này? Dường như ad-hoc với tôi, có một tài liệu tham khảo cụ thể cho điều này hoặc một cái gì đó tương tự? Tại sao điều này tốt hơn một biến đổi tỷ lệ log trung tâm đơn giản và sau đó phân cụm điểm số PC đầu tiên của dữ liệu được chuyển đổi? (đó sẽ là điều mà bất kỳ người đánh giá hợp lý nào của một tổng hợp. ứng dụng phân tích dữ liệu sẽ yêu cầu)
usεr11852

Cảm ơn, @ usεr11852. Số lượng> 2, nhưng hữu hạn, tùy chọn là đa thức. Đây là (1 hình thức phân tích Bayes theo kinh nghiệm) với Dirichlet trước (liên hợp). Tôi chắc chắn các lựa chọn khác là có thể. Tuy nhiên, tôi không thấy ngay việc lấy tỷ lệ sẽ hoạt động như thế nào với số 0, tuy nhiên.
gung - Phục hồi Monica

2
Cảm ơn liên kết. Nếu bạn có một thứ nguyên thành phần khác không, bạn có thể sử dụng nó cho một biến đổi tỷ lệ log phụ gia (không bao gồm ý tưởng rõ ràng về việc cắt bỏ; xem các bình luận ở đây ). CLR sẽ tắt, bởi vì nó sử dụng một ý nghĩa hình học. Đã có nghiên cứu về "dữ liệu tổng hợp không lạm phát"; xem ví dụ ở đây , ở đâyở đây .
usεr11852

1
Có vẻ như bạn biết nhiều về chủ đề này hơn tôi, @ usεr11852. Câu trả lời của tôi thực sự chỉ là cố gắng làm cho những sự thật này về bản chất của tình huống rõ ràng / nêu vấn đề & đưa ra một gợi ý sơ bộ. Tại sao không đóng góp câu trả lời của bạn (thông tin tốt hơn)?
gung - Phục hồi Monica

7

Sẽ không khôn ngoan khi chuyển đổi các biến riêng lẻ vì chúng thuộc về nhau (như bạn nhận thấy) và thực hiện phương tiện k vì dữ liệu là số đếm (bạn có thể, nhưng phương tiện k tốt hơn là thực hiện trên các thuộc tính liên tục như độ dài chẳng hạn) .

Ở vị trí của bạn, tôi sẽ tính khoảng cách chi bình phương (hoàn hảo cho số đếm) giữa mỗi cặp khách hàng, dựa trên các biến chứa số đếm. Sau đó, thực hiện phân cụm theo cấp bậc (ví dụ: phương pháp liên kết trung bình hoặc phương pháp liên kết hoàn chỉnh - chúng không tính toán trọng tâm và theo yêu cầu không yêu cầu khoảng cách euclide) hoặc một số phân cụm khác làm việc với ma trận khoảng cách tùy ý.

Sao chép dữ liệu mẫu từ câu hỏi:

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

Xem xét cặp c0c1tính toán thống kê Chi-vuông cho 2x3bảng tần số của họ . Lấy căn bậc hai của nó (giống như bạn lấy nó khi bạn tính khoảng cách euclide thông thường). Đó là khoảng cách của bạn. Nếu khoảng cách gần bằng 0 thì hai khách hàng tương tự nhau.

Nó có thể làm phiền bạn rằng khoản tiền thành hàng trong bảng khác nhau và do đó nó ảnh hưởng đến khoảng cách chi-square khi bạn so sánh c0với c1vs c0với c2. Sau đó, tính toán (gốc của) khoảng cách Phi bình phương : Phi-sq = Chi-sq/Ntrong đó Ntổng số tổng hợp trong hai hàng (khách hàng) hiện đang xem xét. Do đó, nó được chuẩn hóa khoảng cách wrt đến tổng số.

Here is the matrix of sqrt(Chi-sq) distance between your four customers
 .000   1.275   4.057   2.292
1.275    .000   2.124    .862
4.057   2.124    .000   2.261
2.292    .862   2.261    .000

And here is the matrix of sqrt(Phi-sq) distance 
.000    .260    .641    .418
.260    .000    .388    .193
.641    .388    .000    .377
.418    .193    .377    .000

Vì vậy, khoảng cách giữa hai hàng dữ liệu bất kỳ là (căn bậc hai của) thống kê chi bình phương hoặc phi bình phương của 2 x pbảng tần số (p là số cột trong dữ liệu). Nếu bất kỳ (các) cột nào trong 2 x pbảng hiện tại hoàn toàn bằng 0, hãy cắt bỏ cột đó và tính khoảng cách dựa trên các cột khác không (ví dụ, đây là cách và SPSS thực hiện khi tính khoảng cách). Khoảng cách Chi-vuông thực sự là một khoảng cách euclid có trọng số.


Cảm ơn bạn cho câu trả lời công phu này. Tôi đánh giá cao bạn đã đưa ra lời khuyên về điều gì đó không phải là câu hỏi ban đầu của tôi: Có phải K-nghĩa (với khoảng cách Euclide ẩn) là lựa chọn đúng cho trường hợp sử dụng này? Tôi nghi ngờ nó không phải, và bạn đã xác nhận điều đó. Tuy nhiên, tôi vẫn không hiểu tại sao . Bạn có thể lý do 1) tại sao khoảng cách chi-vuông (hoặc phi vuông) là một lựa chọn tốt cho dữ liệu đếm? 2) quay trở lại câu hỏi ban đầu của tôi: có một lý lẽ (toán học / thực nghiệm) tốt tại sao tất cả các biến phải được xử lý theo cùng một cách khác với "chúng thuộc về nhau" không?
pederpansen

Một khách hàng chọn trong số ba màu khi anh ta mua hàng: ba màu không phải là "biến" độc lập về mặt khái niệm. Cộng với dữ liệu của bạn là số lượng. Tôi thấy rõ ràng rằng một biện pháp dựa trên chi bình phương nên là tối ưu. Liên quan đến điểm cuối cùng của bạn - tôi có thể hỏi lại bạn: tại sao chúng phải được đối xử khác nhau? A đã cho bạn một giải pháp để thực hiện công việc phân cụm. Có bất cứ điều gì trong đó những gì bạn không thích hoặc những gì làm cho bạn nghi ngờ?
ttnphns

2
Tôi cũng không nghĩ k-mean (tối thiểu hóa phương sai!) Là cách để đi: k-mean sử dụng phương tiện . Dữ liệu của bạn là số nguyên và có nhiều số không. Các trung tâm cụm sẽ không phải là số nguyên và sẽ có một vài số không. Chúng hoàn toàn không giống với điểm dữ liệu của bạn, làm thế nào chúng có thể là đại diện? Điểm mấu chốt: không đấu tranh để chuyển đổi dữ liệu của bạn để phù hợp với phương tiện k. Hiểu vấn đề và phù hợp với các thuật toán cho vấn đề của bạn, không phải theo cách khác. Nếu bạn phù hợp với dữ liệu của mình cho vấn đề k-
mean

1
Khi bạn chuẩn hóa các biến của mình để cân bằng phương sai của chúng, nó gần tương đương với việc cân bằng tổng số trong các cột của bảng dữ liệu của bạn. Khi bạn chuyển đổi độ nghiêng, nó gần tương đương với việc tăng số lượng lớn hơn nhưng không nhỏ hơn trong bảng của bạn. Bạn có thể làm điều đó (và thậm chí sau đó bạn có thể tính chi hoặc phi như tôi đã đề xuất), nhưng lưu ý rằng bạn đã xoắn dữ liệu gốc. Được bảo hành, bạn đã phát hiện ra và không che giấu thông tin có giá trị? Có phải nó không cần thiết tra tấn dữ liệu? Cuối cùng, bạn là người duy nhất quyết định những phản ánh này.
ttnphns

2
Thật dễ dàng để phá hủy các thuộc tính cơ bản bằng cách chuẩn hóa không phù hợp. Ví dụ: nếu dữ liệu của bạn tổng hợp tối đa 1 trong mỗi hàng, bình thường hóa mỗi cột sẽ phá hủy thuộc tính này. Trên dữ liệu đó, bạn nên xem xét các biện pháp phân kỳ (khoảng cách cho phân phối) thay vào đó. Khi đếm dữ liệu, thiết lập các biện pháp giao nhau như Jaccard có thể nhiều thông tin hơn; nhưng họ cần vectơ nhị phân. vv
Có QUIT - Anony-Mousse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.