Menikam:
Saya mencoba mengidentifikasi teknik pengelompokan dengan ukuran kesamaan yang akan bekerja untuk data biner kategoris dan numerik.
Gower Distance adalah metrik jarak yang berguna ketika data berisi variabel kontinu dan kategorikal.
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 tidak dapat menemukan implementasi Gower Distance di Python ketika saya mencarinya sekitar 4-5 bulan yang lalu. Jadi saya datang dengan implementasi saya sendiri.
import pandas as pd
import numpy as np
from sklearn.neighbors import DistanceMetric
def gower_distance(X):
"""
This function expects a pandas dataframe as input
The data frame is to contain the features along the columns. Based on these features a
distance matrix will be returned which will contain the pairwise gower distance between the rows
All variables of object type will be treated as nominal variables and the others will be treated as
numeric variables.
Distance metrics used for:
Nominal variables: Dice distance (https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient)
Numeric variables: Manhattan distance normalized by the range of the variable (https://en.wikipedia.org/wiki/Taxicab_geometry)
"""
individual_variable_distances = []
for i in range(X.shape[1]):
feature = X.iloc[:,[i]]
if feature.dtypes[0] == np.object:
feature_dist = DistanceMetric.get_metric('dice').pairwise(pd.get_dummies(feature))
else:
feature_dist = DistanceMetric.get_metric('manhattan').pairwise(feature) / np.ptp(feature.values)
individual_variable_distances.append(feature_dist)
return np.array(individual_variable_distances).mean(0)
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
Saya ingin membuat profil segmen individu. artinya kelompok individu ini lebih peduli pada serangkaian fitur ini.
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.
╔═══════════════════════╦═══════════╦═══════════╦════╦═══════════╗
║ Feature ║ Cluster 1 ║ Cluster 2 ║ … ║ Cluster N ║
╠═══════════════════════╬═══════════╬═══════════╬════╬═══════════╣
║ Numeric feature 1 ║ 15 ║ 37 ║ .. ║ 1 ║
║ Numeric feature 2 ║ 34 ║ 56 ║ … ║ 56 ║
║ Categorical feature 1 ║ 47% ║ 87% ║ … ║ 25% ║
║ … ║ … ║ … ║ … ║ … ║
║ Categorical feature N ║ 25% ║ 91% ║ … ║ 11% ║
║ Numeric feature N ║ 0.2 ║ 0.7 ║ … ║ 0.5 ║
╚═══════════════════════╩═══════════╩═══════════╩════╩═══════════╝