Pengelompokan yang sangat miring, hitung data: ada saran untuk ditindaklanjuti (mengubah dll)?

11

Masalah dasar

Inilah masalah dasar saya: Saya mencoba mengelompokkan dataset yang berisi beberapa variabel yang sangat miring dengan jumlah. Variabel mengandung banyak nol dan karenanya tidak terlalu informatif untuk prosedur pengelompokan saya - yang kemungkinan merupakan algoritma k-means.

Baik, Anda berkata, hanya mengubah variabel menggunakan akar kuadrat, kotak cox, atau logaritma. Tetapi karena variabel saya didasarkan pada variabel kategorikal, saya khawatir bahwa saya mungkin memperkenalkan bias dengan menangani variabel (berdasarkan satu nilai dari variabel kategorikal), sambil meninggalkan yang lain (berdasarkan nilai lain dari variabel kategorik) seperti apa adanya .

Mari kita bahas lebih detail.

Dataset

Dataset saya mewakili pembelian barang. Item memiliki kategori yang berbeda, misalnya warna: biru, merah, dan hijau. Pembelian kemudian dikelompokkan bersama, misalnya oleh pelanggan. Masing-masing pelanggan diwakili oleh satu deretan dataset saya, jadi saya entah bagaimana harus mengagregasi pembelian atas pelanggan.

Cara saya melakukan ini adalah dengan menghitung jumlah pembelian, di mana barang tersebut berwarna tertentu. Jadi, bukannya variabel tunggal color, saya berakhir dengan tiga variabel count_red, count_bluedan count_green.

Berikut ini adalah contoh untuk ilustrasi:

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

Sebenarnya, saya tidak menggunakan jumlah absolut pada akhirnya, saya menggunakan rasio (fraksi item hijau dari semua item yang dibeli per pelanggan).

-----------------------------------------------------------
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      |
-----------------------------------------------------------

Hasilnya sama: Untuk salah satu warna saya, misalnya hijau (tidak ada yang suka hijau), saya mendapatkan variabel miring kiri yang mengandung banyak nol. Akibatnya, k-means gagal menemukan partisi yang baik untuk variabel ini.

Di sisi lain, jika saya menstandarkan variabel saya (kurangi mean, bagi dengan deviasi standar), variabel hijau "meledak" karena variansnya yang kecil dan mengambil nilai dari rentang yang jauh lebih besar daripada variabel lain, yang membuatnya terlihat lebih penting untuk k-berarti daripada yang sebenarnya.

Gagasan berikutnya adalah mengubah sk (r) variabel hijau yang baru.

Mengubah variabel yang miring

Jika saya mengubah variabel hijau dengan menerapkan akar kuadrat itu terlihat sedikit kurang miring. (Di sini variabel hijau diplot dalam warna merah dan hijau untuk memastikan kebingungan.)

masukkan deskripsi gambar di sini

Merah: variabel asli; biru: ditransformasikan oleh root kuadrat.

Katakanlah saya puas dengan hasil transformasi ini (yang tidak saya lakukan, karena nol masih sangat condong pada distribusi). Haruskah saya sekarang juga skala variabel merah dan biru, meskipun distribusinya terlihat baik?

Intinya

Dengan kata lain, apakah saya mengubah hasil pengelompokan dengan menangani warna hijau di satu sisi, tetapi tidak menangani merah dan biru sama sekali? Pada akhirnya, ketiga variabel milik bersama, jadi bukankah mereka harus ditangani dengan cara yang sama?

EDIT

Untuk memperjelas: Saya sadar bahwa k-means mungkin bukan cara untuk mencari data berbasis hitungan . Namun pertanyaan saya sebenarnya adalah tentang perawatan variabel dependen. Memilih metode yang benar adalah masalah tersendiri.

Batasan yang melekat dalam variabel saya adalah itu

count_red(i) + count_blue(i) + count_green(i) = n(i), di mana n(i)jumlah total pembelian pelanggan i.

(Atau, setara, count_red(i) + count_blue(i) + count_green(i) = 1saat menggunakan jumlah relatif.)

Jika saya mengubah variabel saya secara berbeda, ini sesuai dengan memberikan bobot yang berbeda untuk tiga istilah dalam kendala. Jika tujuan saya adalah untuk memisahkan kelompok pelanggan secara optimal, apakah saya harus peduli melanggar batasan ini? Atau apakah "akhirnya membenarkan cara"?

pederpansen
sumber
Selamat datang di CV! Terima kasih telah membuat pertanyaan pertama Anda begitu jelas dan ditulis dengan baik.
Silverfish
Saya tidak begitu mengerti dataset Anda. Variabel (atribut) adalah count_red, count_bluedan count_greendan data dihitung. Baik? Lalu apa barisnya - item? Dan Anda akan mengelompokkan item?
ttnphns
Baris umumnya mewakili kelompok pembelian agregat. Anda dapat menganggap mereka sebagai pelanggan yang membeli banyak barang. Saya telah memperbarui pertanyaan saya dengan dataset sampel untuk membuatnya lebih jelas.
pederpansen
Anda ingin mengelompokkan "pelanggan"?
ttnphns
Iya. Saya bermaksud mengelompokkan pembelian berdasarkan interval waktu dan juga mengelompokkan interval waktu, tetapi untuk saat ini: pelanggan.
pederpansen

Jawaban:

7

@ttnphns telah memberikan jawaban yang bagus.

Melakukan pengelompokan yang baik seringkali tentang berpikir keras tentang data Anda, jadi mari kita lakukan beberapa hal. Menurut saya, aspek paling mendasar dari data Anda adalah bahwa mereka bersifat komposisional .

Di sisi lain, perhatian utama Anda tampaknya adalah Anda memiliki banyak 0 untuk produk hijau dan secara khusus bertanya-tanya apakah Anda hanya dapat mengubah nilai hijau untuk membuatnya lebih mirip dengan yang lain. Tetapi karena ini adalah data komposisi, Anda tidak dapat memikirkan satu set penghitungan secara independen dari yang lainnya. Selain itu, tampaknya yang benar-benar Anda minati adalah probabilitas pelanggan untuk membeli berbagai produk berwarna, tetapi karena banyak yang belum membeli yang berwarna hijau, Anda khawatir bahwa Anda tidak dapat memperkirakan probabilitas tersebut. Salah satu cara untuk mengatasinya adalah dengan menggunakan pendekatan yang agak Bayesian di mana kami mendorong perkiraan proporsi pelanggan terhadap proporsi rata-rata, dengan jumlah pergeseran dipengaruhi oleh seberapa jauh mereka dari rata-rata dan berapa banyak data yang Anda miliki untuk memperkirakan kebenaran mereka. probabilitas.

Di bawah ini saya menggunakan contoh dataset Anda untuk menggambarkan (dalam R) satu cara untuk mendekati situasi Anda. Saya membaca data dan mengubahnya menjadi proporsi baris, dan kemudian menghitung proporsi rata-rata dengan kolom. Saya menambahkan cara kembali ke setiap hitungan untuk mendapatkan jumlah yang disesuaikan dan proporsi baris baru. Ini mendorong perkiraan proporsi setiap pelanggan terhadap proporsi rata-rata untuk setiap produk. Jika Anda menginginkan dorongan yang lebih kuat, Anda bisa menggunakan beberapa cara (seperti, 15*mean.props).

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

Ada beberapa hasil dari ini. Salah satunya adalah bahwa Anda sekarang memiliki perkiraan nihil dari probabilitas yang mendasari pembelian produk hijau, bahkan ketika pelanggan sebenarnya belum memiliki catatan telah membeli produk hijau apa pun. Konsekuensi lain adalah bahwa Anda sekarang memiliki nilai yang agak kontinu, sedangkan proporsi aslinya lebih terpisah; yaitu, himpunan estimasi yang mungkin kurang terbatas, sehingga ukuran jarak seperti jarak Euclidean kuadrat mungkin lebih masuk akal sekarang.

Kami dapat memvisualisasikan data untuk melihat apa yang terjadi. Karena ini adalah data komposisi, kami hanya benar-benar memiliki dua informasi, dan kami dapat memplotnya dalam sebar sebaran tunggal. Dengan sebagian besar informasi dalam kategori merah dan biru, masuk akal untuk menggunakannya sebagai sumbu. Anda dapat melihat bahwa proporsi yang disesuaikan (angka merah) sedikit bergeser dari posisi semula.

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")

masukkan deskripsi gambar di sini

Pada titik ini, Anda memiliki data dan banyak orang akan mulai dengan membakukan mereka. Sekali lagi, karena ini adalah data komposisi, saya akan menjalankan analisis cluster tanpa melakukan standarisasi apa pun — nilai-nilai ini sudah sepadan dan standardisasi akan menghancurkan beberapa informasi relasional. Bahkan, dari melihat plot saya pikir Anda hanya memiliki satu dimensi informasi di sini. (Setidaknya dalam dataset sampel; dataset asli Anda mungkin berbeda.) Kecuali, dari sudut pandang bisnis, Anda pikir penting untuk mengenali orang-orang yang memiliki kemungkinan besar untuk membeli produk hijau sebagai kelompok pelanggan yang berbeda, saya akan mengekstraksi skor pada komponen utama pertama (yang menyumbang 99,5% dari varians dalam dataset ini) dan hanya mengelompokkannya.

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 
gung - Pasang kembali Monica
sumber
+1 karena Anda mengetahui bahwa ini adalah data komposisi tetapi mengapa Anda tidak hanya menggunakan teknik transformasi standar untuk kompos. data alih-alih ide aneh "berarti jumlah yang disesuaikan" ini? Sepertinya ad-hoc bagi saya, apakah ada referensi khusus untuk ini atau yang serupa? Mengapa ini lebih baik daripada transformasi log-rasio sederhana dan kemudian mengelompokkan skor PC pertama dari data yang diubah? (yang akan ditanyakan oleh pengulas mana pun dari aplikasi analisis data kompos.)
usεr11852
Terima kasih, @ usεr11852. Hitungan> 2, tetapi terbatas, opsi adalah multinomial. Ini adalah (1 bentuk empiris) analisis Bayesian dengan Dirichlet sebelumnya (konjugat). Saya yakin opsi lain dimungkinkan. Saya tidak segera melihat bagaimana mengambil rasio akan bekerja dengan 0s, namun.
gung - Reinstate Monica
2
Terima kasih atas tautannya. Jika Anda memiliki dimensi komponen non-nol tunggal, Anda dapat menggunakannya untuk transformasi rasio log tambahan (tidak termasuk ide imputasi yang jelas; lihat komentar di sini ). CLR akan dimatikan, karena menggunakan mean geometrik. Telah ada penelitian tentang "data komposisi nol-inflasi"; lihat misalnya di sini , di sini dan di sini .
usεr11852
1
Sepertinya Anda tahu lebih banyak tentang topik ini daripada saya, @ usεr11852. Jawaban saya benar-benar hanya mencoba membuat fakta-fakta ini tentang sifat situasi secara eksplisit / mengemukakan masalah & memberikan saran pendahuluan. Mengapa tidak berkontribusi jawaban Anda sendiri (informasi lebih baik)?
gung - Reinstate Monica
7

Tidak bijaksana mengubah variabel secara individual karena mereka termasuk bersama (seperti yang Anda perhatikan) dan melakukan k-means karena data dihitung (Anda mungkin, tetapi k-means lebih baik dilakukan pada atribut kontinu seperti panjang misalnya) .

Di tempat Anda, saya akan menghitung jarak chi-square (sempurna untuk hitungan) antara setiap pasangan pelanggan, berdasarkan variabel yang mengandung jumlah. Kemudian lakukan pengelompokan hierarkis (misalnya, metode hubungan rata-rata atau metode keterkaitan lengkap - mereka tidak menghitung centroid dan karena itu tidak memerlukan jarak euclidean) atau pengelompokan lain yang bekerja dengan matriks jarak sewenang-wenang.

Menyalin contoh data dari pertanyaan:

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

Pertimbangkan pasangan c0dan c1dan hitung statistik Chi-square untuk 2x3tabel frekuensi mereka . Ambil akar kuadratnya (seperti yang Anda ambil saat menghitung jarak euclidean biasa). Itu jarakmu. Jika jaraknya mendekati 0, kedua pelanggan itu serupa.

Ini mungkin mengganggu Anda bahwa jumlah dalam baris di tabel Anda berbeda dan karenanya memengaruhi jarak chi-square ketika Anda membandingkan c0dengan c1vs c0dengan c2. Kemudian hitung (root) jarak Phi-square : di Phi-sq = Chi-sq/Nmana Njumlah total gabungan dalam dua baris (pelanggan) saat ini dipertimbangkan. Dengan demikian, jarak tersebut dinormalisasi menjadi jumlah keseluruhan.

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

Jadi, jarak antara dua baris data adalah (akar kuadrat dari) statistik chi-square atau phi-square dari 2 x ptabel frekuensi ( padalah jumlah kolom dalam data). Jika ada kolom di 2 x ptabel saat ini yang benar-benar nol, potong kolom itu dan hitung jarak berdasarkan kolom bukan nol yang tersisa (itu OK dan ini adalah bagaimana, misalnya, SPSS lakukan ketika menghitung jarak). Jarak Chi-square sebenarnya adalah jarak euclidean tertimbang.

ttnphns
sumber
Terima kasih atas jawaban terperinci ini. Saya menghargai Anda memberikan saran tentang sesuatu yang bukan pertanyaan awal saya: Apakah K-means (dengan jarak Euclidean implisit) pilihan yang tepat untuk kasus penggunaan ini? Saya curiga tidak, dan Anda mengonfirmasi hal itu. Namun, saya masih belum mengerti mengapa . Bisakah Anda alasan 1) mengapa jarak chi-square (atau phi-square) adalah pilihan yang baik untuk menghitung data? 2) kembali ke pertanyaan awal saya: apakah ada argumen (matematika / empiris) yang baik mengapa semua variabel harus diperlakukan dengan cara yang sama selain "mereka milik bersama"?
pederpansen
Seorang pelanggan memilih di antara tiga warna ketika dia melakukan pembelian tunggal: ketiga warna itu secara konseptual tidak "variabel". Plus data Anda adalah jumlah. Segera jelas bagi saya bahwa ukuran berbasis chi-square harus optimal. Sehubungan dengan poin terakhir Anda - saya dapat bertanya kembali: mengapa mereka harus diperlakukan berbeda? A memberi Anda solusi untuk melakukan pekerjaan pengelompokan. Apakah ada sesuatu di dalamnya yang tidak Anda sukai atau yang membuat Anda ragu?
ttnphns
2
Saya juga tidak berpikir k-means (varians minimization!) Adalah cara untuk pergi: k-means menggunakan cara . Data Anda bilangan bulat, dan memiliki banyak nol. Pusat-pusat cluster tidak akan menjadi bilangan bulat, dan akan memiliki beberapa nol. Mereka sama sekali tidak seperti titik data Anda, bagaimana mereka bisa mewakili? Intinya: jangan berjuang untuk mengubah data Anda agar sesuai dengan k-means. Pahami masalahnya, dan sesuaikan algoritme dengan masalah Anda, bukan sebaliknya. Jika Anda memasukkan data Anda ke masalah k-means, itu mungkin masih masalah yang salah ...
Memiliki QUIT - Anony-Mousse
1
Ketika Anda membakukan variabel Anda untuk menyeimbangkan varians mereka, itu kira-kira setara dengan menyamakan total dalam kolom tabel data Anda. Saat Anda mengubah kemiringan, ini kira-kira sama dengan meningkatkan jumlah yang lebih besar tetapi tidak lebih kecil di tabel Anda. Anda dapat melakukannya (dan bahkan setelah itu Anda dapat menghitung chi atau phi seperti yang saya sarankan), tetapi perlu diketahui bahwa Anda telah memutar data asli. Apakah itu dijamin, apakah Anda mengungkap dan tidak menyembunyikan informasi berharga? Apakah tidak perlu menyiksa data? Pada akhirnya, Anda adalah satu-satunya yang memutuskan refleksi ini.
ttnphns
2
Sangat mudah untuk menghancurkan properti fundamental dengan normalisasi yang tidak sesuai. Misalnya, jika data Anda berjumlah hingga 1 di setiap baris, normalisasi setiap kolom akan menghancurkan properti ini. Pada data tersebut, Anda harus mempertimbangkan, misalnya, langkah-langkah divergensi (jarak untuk distribusi). Pada penghitungan data, atur ukuran persimpangan seperti Jaccard mungkin lebih informatif; tetapi mereka membutuhkan vektor biner. dll
Memiliki QUIT - Anony-Mousse