Data saya mencakup respons survei yang bersifat biner (numerik) dan nominal / kategorikal. Semua tanggapan terpisah dan pada tingkat individu.
Data berbentuk (n = 7219, p = 105).
Beberapa hal:
Saya mencoba mengidentifikasi teknik pengelompokan dengan ukuran kesamaan yang akan bekerja untuk data biner kategoris dan numerik. Ada teknik dalam R kmodes clustering dan kprototype yang dirancang untuk jenis masalah ini, tetapi saya menggunakan Python dan membutuhkan teknik dari sklearn clustering yang bekerja dengan baik dengan masalah jenis ini.
Saya ingin membuat profil segmen individu. artinya kelompok individu ini lebih peduli pada serangkaian fitur ini.
Jawaban:
Menikam:
Gower Distance adalah metrik jarak yang berguna ketika data berisi variabel kontinu dan kategorikal.
Saya tidak dapat menemukan implementasi Gower Distance di Python ketika saya mencarinya sekitar 4-5 bulan yang lalu. Jadi saya datang dengan implementasi saya sendiri.
Tautan ke kode yang sama: https://github.com/matchado/Misc/blob/master/gower_dist.py
Berkenaan dengan teknik pengelompokan, saya belum menggunakan yang Anda sebutkan. Tapi saya telah menggunakan pengelompokan hierarkis dalam R bersama dengan jarak gower dengan kesuksesan di masa lalu.
Melihat ke dalam teknik pengelompokan yang tersedia dalam scikit belajar, Agglomerative Clustering tampaknya sesuai dengan tagihan. http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering
Setelah Anda menetapkan label kluster untuk setiap baris data Anda, untuk setiap kluster lihat distribusi fitur (statistik ringkasan untuk variabel kontinu & distribusi frekuensi untuk variabel kategori). Ini lebih mudah untuk dianalisis secara visual jika jumlah fitur Anda dapat dikelola (<20 mungkin?).
Tetapi karena Anda memiliki lebih dari 100 fitur, saya sarankan pendekatan yang lebih terorganisir. Buat matriks dengan label klaster di kolom dan ringkasan statistik fitur di baris (saya sarankan menggunakan median untuk variabel kontinu dan persentase kemunculan nilai paling sering di kluster untuk variabel kategori)
Mungkin terlihat seperti ini.
sumber
Saya menambahkan jawaban saya untuk pertanyaan ini di bawah - kalian pada dasarnya menanyakan hal yang sama.
Pertanyaan ini tampaknya benar-benar tentang representasi, dan bukan tentang pengelompokan.
Data kategorikal merupakan masalah bagi sebagian besar algoritma dalam pembelajaran mesin. Misalkan, misalnya, Anda memiliki beberapa variabel kategori yang disebut "warna" yang dapat mengambil nilai merah, biru, atau kuning. Jika kita hanya menyandikan angka-angka ini sebagai 1,2, dan 3 masing-masing, algoritma kita akan berpikir bahwa merah (1) sebenarnya lebih dekat dengan biru (2) daripada kuning (3). Kita perlu menggunakan representasi yang memungkinkan komputer memahami bahwa semua hal ini sebenarnya sama-sama berbeda.
Salah satu cara sederhana adalah dengan menggunakan apa yang disebut representasi satu-panas, dan itulah yang menurut Anda harus Anda lakukan. Daripada memiliki satu variabel seperti "warna" yang dapat mengambil tiga nilai, kami memisahkannya menjadi tiga variabel. Ini akan menjadi "warna-merah," "warna-biru," dan "warna-kuning," yang semuanya hanya dapat mengambil nilai 1 atau 0.
Ini meningkatkan dimensi ruang, tetapi sekarang Anda bisa menggunakan algoritma pengelompokan apa pun yang Anda suka. Terkadang masuk akal untuk zscore atau memutihkan data setelah melakukan proses ini, tetapi ide Anda jelas masuk akal.
sumber
Metrik jarak yang diterapkan oleh @gregorymatchado memiliki satu bug. Untuk atribut Numerik, rentang akan memberikan NaN untuk nilai yang sama di seluruh. Untuk itu kita perlu menggunakan perubahan
max(np.ptp(feature.values),1)
daripadanp.ptp(feature.values)
. Kode lengkap di bawah ini:sumber
Saya pikir Anda memiliki bug juga. Jika fitur vektor memiliki skala yang sangat kecil. maka jarakmu tidak berguna. Jadi, saya akan mengonversi seperti berikut:
sumber