Clustering molto distorto, contare i dati: qualche suggerimento da fare (trasformare, ecc.)?


11

Problema di base

Ecco il mio problema di base: sto cercando di raggruppare un set di dati contenente alcune variabili molto distorte con conteggi. Le variabili contengono molti zeri e pertanto non sono molto istruttive per la mia procedura di clustering, che è probabilmente un algoritmo k-mean.

Bene, dici, trasforma semplicemente le variabili usando radice quadrata, box cox o logaritmo. Ma poiché le mie variabili si basano su variabili categoriali, temo di poter introdurre una distorsione gestendo una variabile (basata su un valore della variabile categoriale), lasciando gli altri (basati su altri valori della variabile categoriale) così come sono .

Andiamo in qualche dettaglio in più.

Il set di dati

Il mio set di dati rappresenta gli acquisti di articoli. Gli articoli hanno categorie diverse, ad esempio colore: blu, rosso e verde. Gli acquisti vengono quindi raggruppati insieme, ad esempio dai clienti. Ognuno di questi clienti è rappresentato da una riga del mio set di dati, quindi devo in qualche modo aggregare gli acquisti sui clienti.

Il modo in cui lo faccio è contando il numero di acquisti, in cui l'articolo ha un certo colore. Così, invece di una sola variabile color, io alla fine con tre variabili count_red, count_bluee count_green.

Ecco un esempio per l'illustrazione:

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

In realtà, non utilizzo i conteggi assoluti alla fine, utilizzo i rapporti (frazione di articoli verdi di tutti gli articoli acquistati per cliente).

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

Il risultato è lo stesso: per uno dei miei colori, ad esempio il verde (a nessuno piace il verde), ottengo una variabile inclinata a sinistra contenente molti zeri. Di conseguenza, k-mean non riesce a trovare un buon partizionamento per questa variabile.

D'altra parte, se standardizzo le mie variabili (sottrai media, dividi per deviazione standard), la variabile verde "esplode" a causa della sua piccola varianza e prende valori da un intervallo molto più ampio rispetto alle altre variabili, il che la fa sembrare più importante per k-mean di quanto non sia in realtà.

L'idea successiva è quella di trasformare la variabile verde di sk (r).

Trasformando la variabile obliqua

Se trasformo la variabile verde applicando la radice quadrata, appare un po 'meno inclinata. (Qui la variabile verde è tracciata in rosso e verde per garantire confusione.)

inserisci qui la descrizione dell'immagine

Rosso: variabile originale; blu: trasformato da radice quadrata.

Diciamo che sono soddisfatto del risultato di questa trasformazione (che non lo sono, poiché gli zeri distorcono ancora fortemente la distribuzione). Ora dovrei ridimensionare anche le variabili rosse e blu, anche se le loro distribuzioni sembrano a posto?

Linea di fondo

In altre parole, posso distorcere i risultati del cluster gestendo il colore verde in un modo, ma non gestendo affatto il rosso e il blu? Alla fine, tutte e tre le variabili appartengono insieme, quindi non dovrebbero essere gestite allo stesso modo?

MODIFICARE

Per chiarire: sono consapevole che k-mean non è probabilmente la strada da percorrere per i dati basati sul conteggio . La mia domanda però riguarda davvero il trattamento delle variabili dipendenti. La scelta del metodo corretto è una questione separata.

Il vincolo intrinseco nelle mie variabili è quello

count_red(i) + count_blue(i) + count_green(i) = n(i), dove n(i)è il numero totale di acquisti del cliente i.

(O, equivalentemente, count_red(i) + count_blue(i) + count_green(i) = 1quando si usano i conteggi relativi.)

Se trasformo le mie variabili in modo diverso, ciò corrisponde a dare pesi diversi ai tre termini del vincolo. Se il mio obiettivo è separare in modo ottimale gruppi di clienti, devo preoccuparmi di violare questo vincolo? O "il fine giustifica i mezzi"?


Benvenuto in CV! Grazie per aver reso la tua prima domanda così chiara e ben scritta.
Silverfish,

Non ho capito bene il tuo set di dati. Le variabili (attributi) sono count_red, count_bluee count_greenei dati sono conteggi. Giusto? Quali sono le righe quindi - elementi? E hai intenzione di raggruppare gli articoli?
ttnphns,

Le righe rappresentano generalmente gruppi di acquisti aggregati. Puoi pensarli come clienti che hanno acquistato più articoli. Ho aggiornato la mia domanda con un set di dati di esempio per renderlo più chiaro.
pederpansen,

Vuoi raggruppare i "clienti"?
ttnphns,

Sì. Intendo raggruppare gli acquisti anche per intervalli di tempo e di conseguenza raggruppare gli intervalli di tempo, ma per ora: i clienti.
pederpansen,

Risposte:


7

@ttnphns ha fornito una buona risposta.

Fare bene il clustering spesso significa pensare molto ai dati, quindi facciamolo. A mio avviso, l'aspetto più fondamentale dei tuoi dati è che sono composizionali .

D'altra parte, la tua preoccupazione principale sembra essere che hai molti 0 per i prodotti verdi e in particolare ti chiedi se puoi trasformare solo i valori verdi per renderlo più simile al resto. Ma poiché si tratta di dati compositivi, non è possibile pensare a una serie di conteggi indipendentemente dal resto. Inoltre, sembra che ciò a cui sei veramente interessato siano le probabilità dei clienti di acquistare prodotti di colore diverso, ma poiché molti non hanno acquistato quelli verdi, ti preoccupi di non poter stimare tali probabilità. Un modo per affrontarlo è utilizzare un approccio un po 'bayesiano in cui spingiamo le proporzioni stimate dei clienti verso una proporzione media, con la quantità di spostamento influenzata da quanto sono lontani dalla media e da quanti dati devi stimare il loro vero probabilità.

Di seguito utilizzo il tuo set di dati di esempio per illustrare (in R) un modo per affrontare la tua situazione. Ho letto i dati e li ho convertiti in proporzioni in ordine di riga, quindi ho calcolato le proporzioni medie per colonna. Aggiungo i mezzi a ogni conteggio per ottenere conteggi corretti e nuove proporzioni in ordine di riga. Ciò spinge la proporzione stimata di ciascun cliente verso la proporzione media per ciascun prodotto. Se si desidera una spinta più forte, è possibile utilizzare invece un multiplo dei mezzi (come, 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

Ci sono diversi risultati di questo. Uno dei quali è che ora disponi di stime diverse da zero delle probabilità sottostanti di acquistare prodotti ecologici, anche quando un cliente non ha ancora alcuna traccia di aver acquistato prodotti ecologici. Un'altra conseguenza è che ora hai valori alquanto continui, mentre le proporzioni originali erano più discrete; vale a dire, l'insieme delle possibili stime è meno ristretto, quindi una misura della distanza come la distanza euclidea quadrata potrebbe avere più senso ora.

Possiamo visualizzare i dati per vedere cosa è successo. Poiché si tratta di dati compositivi, in realtà abbiamo solo due informazioni e possiamo tracciarle in un singolo diagramma a dispersione. Con la maggior parte delle informazioni nelle categorie rosso e blu, ha senso usare quelle come assi. Puoi vedere che le proporzioni regolate (i numeri rossi) sono leggermente spostate rispetto alle loro posizioni originali.

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

inserisci qui la descrizione dell'immagine

A questo punto, disponi di dati e molte persone inizierebbero a standardizzarli. Ancora una volta, poiché si tratta di dati di composizione, eseguirò analisi di cluster senza fare alcuna standardizzazione: questi valori sono già commisurati e la standardizzazione distruggerebbe alcune delle informazioni relazionali. In effetti, guardando la trama penso che tu abbia davvero una sola dimensione di informazione qui. (Almeno nel set di dati di esempio; il set di dati reale potrebbe ben essere diverso.) A meno che, dal punto di vista aziendale, pensi che sia importante riconoscere le persone che hanno una sostanziale probabilità di acquistare prodotti verdi come un gruppo distinto di clienti, I estrarrebbe i punteggi sul primo componente principale (che rappresenta il 99,5% della varianza in questo set di dati) e lo raggrupperebbe semplicemente.

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 perché hai riconosciuto che si tratta di dati di composizione, ma perché non dovresti utilizzare solo tecniche di trasformazione standard per compos. dati invece di questa strana idea "conteggi corretti medi"? Mi sembra ad-hoc, c'è un riferimento particolare per questo o qualcosa di simile? Perché è meglio di una semplice trasformazione centrata del rapporto log e quindi raggruppare il primo punteggio PC dei dati trasformati? (che sarebbe quello che ogni revisore ragionevole di una domanda di analisi dei dati compositi chiederebbe)
usεr11852

Grazie, @ usεr11852. Conta di> 2, ma le opzioni finite sono multinomiali. Questa è (1 forma di un'analisi empirica) bayesiana con un Dirichlet precedente (il coniugato). Sono sicuro che sono possibili altre opzioni. Tuttavia, non vedo subito come funzionerebbe il rapporto di assunzione con gli 0.
gung - Ripristina Monica

2
Grazie per il link. Se si dispone di una singola dimensione componente diversa da zero, è possibile utilizzarla per una trasformazione addizionale del rapporto log (esclusa l'ovvia idea di imputazione; vedere i commenti qui ). Il CLR sarebbe disattivato perché utilizza una media geometrica. Si è lavorato su "dati compositivi a zero inflazione"; vedi ad esempio qui , qui e qui .
usεr11852

1
Sembra che tu sappia molto di più su questo argomento di me, @ usεr11852. La mia risposta stava davvero solo cercando di rendere espliciti questi fatti sulla natura della situazione / sollevare il problema e fornire un suggerimento preliminare. Perché non contribuire con la tua risposta (meglio informata)?
gung - Ripristina Monica

7

Non è saggio trasformare le variabili singolarmente perché appartengono insieme (come hai notato) e fare k-medie perché i dati sono conteggi (potresti, ma è meglio fare k-medie su attributi continui come ad esempio lunghezza) .

Al posto tuo, calcolerei la distanza chi-quadro (perfetta per i conteggi) tra ogni coppia di clienti, in base alle variabili che contano i conteggi. Quindi esegui il clustering gerarchico (ad esempio il metodo di collegamento medio o il metodo di collegamento completo - non calcolano i centroidi e quindi non richiedono la distanza euclidea) o altri cluster che lavorano con matrici di distanza arbitrarie.

Copia dei dati di esempio dalla domanda:

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

Considera la coppia c0e c1calcola la statistica Chi- quadro per la loro 2x3tabella delle frequenze. Prendine la radice quadrata (come se la prendessi quando calcoli la solita distanza euclidea). Questa è la tua distanza. Se la distanza è vicina a 0, i due clienti sono simili.

Può darti fastidio che le somme nelle righe della tabella differiscano e quindi influisce sulla distanza del chi-quadrato quando si confronta c0con c1vs c0con c2. Quindi calcola la (radice di) la distanza del Phi-quadrato : Phi-sq = Chi-sq/Ndov'è Nil conteggio totale combinato nelle due file (clienti) attualmente considerati. Viene quindi normalizzata la distanza rispetto ai conteggi complessivi.

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

Quindi, la distanza tra due righe qualsiasi dei dati è la (radice quadrata di) la statistica chi-quadrato o phi-quadrato della 2 x ptabella delle frequenze ( pè il numero di colonne nei dati). Se una o più colonne della 2 x ptabella corrente sono zero completo, tagliare quella colonna e calcolare la distanza in base alle colonne non zero rimanenti (è OK e questo è, ad esempio, come fa SPSS quando calcola la distanza). La distanza del Chi-quadrato è in realtà una distanza euclidea ponderata.


Grazie per questa risposta elaborata. Apprezzo che tu abbia dato consigli su qualcosa che non era la mia domanda originale: K-significa (con la distanza euclidea implicita) la scelta giusta per questo caso d'uso? Sospettavo che non lo fosse, e tu lo hai confermato. Tuttavia, ancora non capisco perché . Potresti ragionare 1) perché la distanza chi-quadro (o phi-quadrato) è una buona scelta per i dati di conteggio? 2) tornando alla mia domanda originale: esiste un buon argomento (matematico / empirico) per cui tutte le variabili dovrebbero essere trattate nello stesso modo diverso da "appartengono insieme"?
pederpansen,

Un cliente sceglie tra i tre colori quando effettua un singolo acquisto: i tre colori non sono "variabili" concettualmente indipendenti. Inoltre i tuoi dati sono conteggi. Mi è stato subito chiaro che una misura basata sul chi-quadrato dovrebbe essere ottimale. Per quanto riguarda il tuo ultimo punto, potrei chiederti di nuovo: perché dovrebbero essere trattati in modo diverso? A ti ha fornito una soluzione per eseguire il lavoro di clustering. C'è qualcosa in ciò che non ti piace o che ti fa dubitare?
ttnphns,

2
Inoltre, non credo che k-means (minimizzazione della varianza!) Sia la strada da percorrere: k-means usa i mezzi . I tuoi dati sono numeri interi e hanno molti zeri. I centri del cluster non saranno numeri interi e avranno pochi zeri. Sono totalmente diversi dai tuoi punti dati, come possono essere rappresentativi? In conclusione: non lottare per trasformare i tuoi dati in modo da adattarli a k-medie. Comprendi il problema e adatta gli algoritmi al tuo problema, non viceversa. Se adattate i vostri dati al problema k-
mean

1
Quando si standardizzano le variabili per uniformare le loro varianze, è quasi equivalente all'equalizzazione dei totali nelle colonne della tabella dei dati. Quando si trasforma l'inclinazione è all'incirca equivalente per aumentare i conteggi più grandi ma non più piccoli nella tabella. Puoi farlo (e anche dopo puoi calcolare chi o phi come ho suggerito), ma tieni presente che hai distorto i dati originali. Era giustificato, hai scoperto e non nascosto informazioni preziose? È stata una tortura non necessaria dei dati? Alla fine, sei l'unico che decide su queste riflessioni.
ttnphns,

2
È facile distruggere le proprietà fondamentali mediante una normalizzazione inappropriata. Ad esempio, se i dati sommano fino a 1 in ogni riga, la normalizzazione di ogni colonna distruggerà questa proprietà. Su tali dati, dovresti prendere in considerazione, ad esempio, misure di divergenza (distanze per le distribuzioni). Sul conteggio dei dati, impostare misure di intersezione come Jaccard può essere più informativo; ma hanno bisogno di vettori binari. ecc.
QUIT - Anony-Mousse,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.