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_blue
dan 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.)
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) = 1
saat 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"?
count_red
,count_blue
dancount_green
dan data dihitung. Baik? Lalu apa barisnya - item? Dan Anda akan mengelompokkan item?Jawaban:
@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
).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.
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.
sumber
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:
Pertimbangkan pasangan
c0
danc1
dan hitung statistik Chi-square untuk2x3
tabel 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
c0
denganc1
vsc0
denganc2
. Kemudian hitung (root) jarak Phi-square : diPhi-sq = Chi-sq/N
manaN
jumlah total gabungan dalam dua baris (pelanggan) saat ini dipertimbangkan. Dengan demikian, jarak tersebut dinormalisasi menjadi jumlah keseluruhan.Jadi, jarak antara dua baris data adalah (akar kuadrat dari) statistik chi-square atau phi-square dari
2 x p
tabel frekuensi (p
adalah jumlah kolom dalam data). Jika ada kolom di2 x p
tabel 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.sumber