Clustering von sehr verzerrten Zähldaten: Gibt es Vorschläge (Transformation usw.)?


11

Grundproblem

Hier ist mein grundlegendes Problem: Ich versuche, einen Datensatz zu gruppieren, der einige sehr verzerrte Variablen mit Zählungen enthält. Die Variablen enthalten viele Nullen und sind daher für mein Clustering-Verfahren - das wahrscheinlich ein k-means-Algorithmus ist - nicht sehr informativ.

Gut, sagen Sie, transformieren Sie die Variablen einfach mit Quadratwurzel, Box Cox oder Logarithmus. Da meine Variablen jedoch auf kategorialen Variablen basieren, befürchte ich, dass ich eine Verzerrung einführen könnte, indem ich eine Variable (basierend auf einem Wert der kategorialen Variablen) behandle, während andere (basierend auf anderen Werten der kategorialen Variablen) so bleiben, wie sie sind .

Lassen Sie uns näher darauf eingehen.

Der Datensatz

Mein Datensatz repräsentiert den Kauf von Artikeln. Die Elemente haben verschiedene Kategorien, z. B. Farbe: Blau, Rot und Grün. Die Einkäufe werden dann z. B. nach Kunden zusammengefasst. Jeder dieser Kunden wird durch eine Zeile meines Datensatzes dargestellt, sodass ich Einkäufe über Kunden zusammenfassen muss.

Ich zähle dazu die Anzahl der Einkäufe, bei denen der Artikel eine bestimmte Farbe hat. Also statt einer einzigen Variablen color, ich mit drei Variablen am Ende count_red, count_blueund count_green.

Hier ist ein Beispiel zur Veranschaulichung:

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

Eigentlich verwende ich am Ende keine absoluten Zählungen, sondern Verhältnisse (Anteil der grünen Artikel aller gekauften Artikel pro Kunde).

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

Das Ergebnis ist das gleiche: Für eine meiner Farben, z. B. Grün (niemand mag Grün), erhalte ich eine linksgerichtete Variable mit vielen Nullen. Folglich findet k-means keine gute Partitionierung für diese Variable.

Wenn ich dagegen meine Variablen standardisiere (Mittelwert subtrahieren, durch Standardabweichung dividieren), "explodiert" die grüne Variable aufgrund ihrer geringen Varianz und nimmt Werte aus einem viel größeren Bereich als die anderen Variablen an, wodurch sie besser aussieht wichtig für k-means als es tatsächlich ist.

Die nächste Idee ist, die grüne Variable sk (r) ewed zu transformieren.

Transformieren der verzerrten Variablen

Wenn ich die grüne Variable durch Anwenden der Quadratwurzel transformiere, sieht sie etwas weniger schief aus. (Hier ist die grüne Variable in Rot und Grün dargestellt, um Verwirrung zu vermeiden.)

Geben Sie hier die Bildbeschreibung ein

Rot: ursprüngliche Variable; blau: transformiert durch Quadratwurzel.

Nehmen wir an, ich bin mit dem Ergebnis dieser Transformation zufrieden (was ich nicht bin, da die Nullen die Verteilung immer noch stark verzerren). Sollte ich jetzt auch die roten und blauen Variablen skalieren, obwohl ihre Verteilungen gut aussehen?

Endeffekt

Mit anderen Worten, verzerre ich die Clustering-Ergebnisse, indem ich die Farbe Grün auf eine Weise behandle, aber überhaupt nicht Rot und Blau? Am Ende gehören alle drei Variablen zusammen. Sollten sie also nicht auf die gleiche Weise behandelt werden?

BEARBEITEN

Zur Verdeutlichung: Mir ist bewusst, dass k-means wahrscheinlich nicht der richtige Weg für zählbasierte Daten ist. Meine Frage betrifft jedoch wirklich die Behandlung abhängiger Variablen. Die Wahl der richtigen Methode ist eine separate Angelegenheit.

Die inhärente Einschränkung in meinen Variablen ist die folgende

count_red(i) + count_blue(i) + count_green(i) = n(i), wo n(i)ist die Gesamtzahl der Einkäufe des Kunden i.

(Oder gleichwertig, count_red(i) + count_blue(i) + count_green(i) = 1wenn relative Zählungen verwendet werden.)

Wenn ich meine Variablen anders transformiere, entspricht dies einer unterschiedlichen Gewichtung der drei Terme in der Einschränkung. Wenn mein Ziel darin besteht, Kundengruppen optimal zu trennen, muss ich mich dann darum kümmern, diese Einschränkung zu verletzen? Oder rechtfertigt "der Zweck die Mittel"?


Willkommen im Lebenslauf! Vielen Dank, dass Sie Ihre erste Frage so klar und gut geschrieben haben.
Silverfish

Ich habe Ihren Datensatz nicht ganz verstanden. Die Variablen (Attribute) sind count_red, count_blueund , count_greenund die Daten sind Zählungen. Richtig? Was sind dann die Zeilen - Elemente? Und Sie werden die Elemente gruppieren?
ttnphns

Die Zeilen repräsentieren im Allgemeinen Gruppen von aggregierten Einkäufen. Sie können sich diese als Kunden vorstellen, die mehrere Artikel gekauft haben. Ich habe meine Frage mit einem Beispieldatensatz aktualisiert, um dies klarer zu machen.
Pederpansen

Sie möchten "Kunden" gruppieren?
ttnphns

Ja. Ich beabsichtige, Einkäufe auch nach Zeitintervallen zu gruppieren und folglich Zeitintervalle zu gruppieren, aber vorerst: Kunden.
Pederpansen

Antworten:


7

@ttnphns hat eine gute Antwort geliefert.

Wenn Sie Clustering gut machen, müssen Sie oft sehr gründlich über Ihre Daten nachdenken. Lassen Sie uns also etwas davon tun. Meiner Meinung nach ist der grundlegendste Aspekt Ihrer Daten, dass sie kompositorisch sind .

Auf der anderen Seite scheint Ihr Hauptanliegen zu sein, dass Sie viele Nullen für grüne Produkte haben und sich speziell fragen, ob Sie nur die grünen Werte transformieren können, um sie den anderen ähnlicher zu machen. Da es sich jedoch um Kompositionsdaten handelt, können Sie nicht unabhängig von den anderen über einen Satz von Zählungen nachdenken. Darüber hinaus scheinen Sie wirklich an den Wahrscheinlichkeiten der Kunden für den Kauf verschiedenfarbiger Produkte interessiert zu sein. Da jedoch viele keine grünen Produkte gekauft haben, befürchten Sie, dass Sie diese Wahrscheinlichkeiten nicht abschätzen können. Eine Möglichkeit, dies zu beheben, besteht darin, einen etwas Bayes'schen Ansatz zu verwenden, bei dem wir die geschätzten Anteile der Kunden in Richtung eines mittleren Anteils verschieben, wobei das Ausmaß der Verschiebung davon abhängt, wie weit sie vom Mittelwert entfernt sind und wie viele Daten Sie benötigen, um ihre Wahrheit zu schätzen Wahrscheinlichkeiten.

Im Folgenden verwende ich Ihren Beispieldatensatz, um (in R) einen Weg zu veranschaulichen, wie Sie sich Ihrer Situation nähern können. Ich lese die Daten ein und konvertiere sie in zeilenweise Proportionen und berechne dann die mittleren Proportionen nach Spalten. Ich addiere die Mittelwerte zurück zu jeder Zählung, um angepasste Zählungen und neue zeilenweise Proportionen zu erhalten. Dies stößt den geschätzten Anteil jedes Kunden an den mittleren Anteil für jedes Produkt an. Wenn Sie einen stärkeren Anstoß wünschen, können Sie 15*mean.propsstattdessen ein Vielfaches der Mittel (wie z. B. ) verwenden.

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

Hierfür gibt es mehrere Ergebnisse. Eine davon ist, dass Sie jetzt Schätzungen der zugrunde liegenden Wahrscheinlichkeiten für den Kauf umweltfreundlicher Produkte ungleich Null haben, selbst wenn ein Kunde noch keine Aufzeichnungen darüber hat, dass er umweltfreundliche Produkte gekauft hat. Eine weitere Konsequenz ist, dass Sie jetzt etwas kontinuierliche Werte haben, während die ursprünglichen Proportionen diskreter waren. Das heißt, die Menge der möglichen Schätzungen ist weniger eingeschränkt, sodass ein Abstandsmaß wie der quadratische euklidische Abstand jetzt möglicherweise sinnvoller ist.

Wir können die Daten visualisieren, um zu sehen, was passiert ist. Da es sich um Zusammensetzungsdaten handelt, verfügen wir nur über zwei Informationen, die wir in einem einzigen Streudiagramm darstellen können. Bei den meisten Informationen in den Kategorien Rot und Blau ist es sinnvoll, diese als Achsen zu verwenden. Sie können sehen, dass die angepassten Proportionen (die roten Zahlen) etwas von ihren ursprünglichen Positionen verschoben sind.

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

Geben Sie hier die Bildbeschreibung ein

Zu diesem Zeitpunkt haben Sie Daten, und viele Leute beginnen damit, sie zu standardisieren. Da es sich um Zusammensetzungsdaten handelt, würde ich Clusteranalysen ohne Standardisierung durchführen. Diese Werte sind bereits angemessen und die Standardisierung würde einige der relationalen Informationen zerstören. Wenn ich mir die Handlung anschaue, denke ich, dass Sie hier wirklich nur eine Dimension von Informationen haben. (Zumindest im Beispieldatensatz; Ihr realer Datensatz kann durchaus anders sein.) Aus geschäftlicher Sicht halten Sie es nicht für wichtig, Personen mit einer erheblichen Wahrscheinlichkeit für den Kauf umweltfreundlicher Produkte als einen bestimmten Kundencluster zu erkennen würde Scores für die erste Hauptkomponente extrahieren (die 99,5% der Varianz in diesem Datensatz ausmacht) und diese einfach gruppieren.

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, weil Sie erkannt haben, dass dies Kompositionsdaten sind, aber warum sollten Sie nicht einfach Standardtransformationstechniken für Kompositionen verwenden? Daten anstelle dieser seltsamen Idee "mittlere angepasste Anzahl"? Es scheint mir ad-hoc, gibt es einen bestimmten Hinweis dafür oder ähnliches? Warum ist dies besser als eine einfache zentrierte Log-Ratio-Transformation und dann das Clustering der ersten PC-Bewertung der transformierten Daten? (was jeder vernünftige
Prüfer

Danke, @ usεr11852. Anzahl von> 2, aber endlichen Optionen sind Multinome. Dies ist (1 Form einer empirischen) Bayes'schen Analyse mit einem Dirichlet vor (dem Konjugat). Ich bin sicher, dass andere Optionen möglich sind. Ich sehe jedoch nicht sofort, wie das Nehmen von Verhältnissen mit den Nullen funktionieren würde.
Gung - Reinstate Monica

2
Danke für den Link. Wenn Sie eine einzelne Komponentendimension ungleich Null haben, können Sie diese für eine additive Log-Ratio-Transformation verwenden (mit Ausnahme der offensichtlichen Idee der Imputation; siehe Kommentare hier ). Die CLR wäre ausgeschaltet, da sie ein geometrisches Mittel verwendet. Es wurde an "Null-Inflations-Kompositionsdaten" gearbeitet; siehe zum Beispiel hier , hier und hier .
usεr11852

1
Es hört sich so an, als ob Sie viel mehr über dieses Thema wissen als ich, @ usεr11852. Meine Antwort war wirklich nur der Versuch, diese Fakten über die Art der Situation explizit zu machen / das Problem anzusprechen und einen vorläufigen Vorschlag zu machen. Warum nicht Ihre eigene (besser informierte) Antwort einbringen?
Gung - Reinstate Monica

7

Es ist nicht ratsam, die Variablen einzeln zu transformieren, weil sie zusammengehören (wie Sie bemerkt haben), und k-means auszuführen, weil die Daten zählen (Sie könnten es tun, aber k-means ist besser, wenn Sie fortlaufende Attribute wie zum Beispiel Länge verwenden). .

An Ihrer Stelle würde ich den Chi-Quadrat-Abstand (perfekt für Zählungen) zwischen jedem Kundenpaar basierend auf den Variablen berechnen, die Zählungen enthalten. Führen Sie dann ein hierarchisches Clustering (z. B. eine durchschnittliche Verknüpfungsmethode oder eine vollständige Verknüpfungsmethode - sie berechnen keine Schwerpunkte und erfordern daher keinen euklidischen Abstand) oder ein anderes Clustering durch, das mit beliebigen Abstandsmatrizen arbeitet.

Kopieren von Beispieldaten aus der Frage:

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

Betrachten Sie die Paar- c0und c1Berechnungs- Chi-Quadrat- Statistik für ihre 2x3Häufigkeitstabelle. Nehmen Sie die Quadratwurzel davon (wie Sie es nehmen, wenn Sie den üblichen euklidischen Abstand berechnen). Das ist deine Distanz. Wenn der Abstand nahe 0 liegt, sind sich die beiden Kunden ähnlich.

Es kann Sie stören, dass sich die Summen in Zeilen in Ihrer Tabelle unterscheiden und sich daher auf den Chi-Quadrat-Abstand auswirken, wenn Sie c0mit c1vs c0mit vergleichen c2. Berechnen Sie dann die (Wurzel) des Phi-Quadrat- Abstands: Phi-sq = Chi-sq/Nwobei Ndie kombinierte Gesamtzahl in den beiden aktuell betrachteten Zeilen (Kunden) ist. Es ist somit der normalisierte Abstand zu den Gesamtzählungen.

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

Der Abstand zwischen zwei beliebigen Zeilen der Daten ist also die (Quadratwurzel von) der Chi-Quadrat- oder Phi-Quadrat-Statistik der 2 x pHäufigkeitstabelle ( pist die Anzahl der Spalten in den Daten). Wenn eine oder mehrere Spalten in der aktuellen 2 x pTabelle vollständig Null sind, schneiden Sie diese Spalte ab und berechnen Sie den Abstand basierend auf den verbleibenden Spalten ungleich Null (dies ist in Ordnung, und so verhält sich beispielsweise SPSS bei der Berechnung des Abstands). Der Chi-Quadrat-Abstand ist tatsächlich ein gewichteter euklidischer Abstand.


Vielen Dank für diese ausführliche Antwort. Ich schätze, Sie haben Ratschläge zu etwas gegeben, das nicht meine ursprüngliche Frage war: Ist K-means (mit dem impliziten euklidischen Abstand) die richtige Wahl für diesen Anwendungsfall? Ich habe vermutet, dass dies nicht der Fall ist, und Sie haben das bestätigt. Ich verstehe jedoch immer noch nicht warum . Könnten Sie begründen, 1) warum der Chi-Quadrat- (oder Phi-Quadrat-) Abstand eine gute Wahl für Zähldaten ist? 2) Zurück zu meiner ursprünglichen Frage: Gibt es ein gutes (mathematisch / empirisches) Argument, warum alle Variablen anders behandelt werden sollten als "sie gehören zusammen"?
Pederpansen

Ein Kunde wählt bei einem Einzelkauf zwischen den drei Farben: Die drei Farben sind keine konzeptionell unabhängigen "Variablen". Außerdem zählen Ihre Daten. Mir war sofort klar, dass ein auf Chi-Quadrat basierendes Maß optimal sein sollte. In Bezug auf Ihren letzten Punkt - ich könnte Sie zurückfragen: Warum sollten sie anders behandelt werden? A gab Ihnen eine Lösung für den Clustering-Job. Gibt es etwas, was du nicht magst oder was dich zweifeln lässt?
ttnphns

2
Ich denke auch nicht, dass k-means (Varianzminimierung!) Der richtige Weg ist: k-means verwendet Mittel . Ihre Daten sind Ganzzahlen und haben viele Nullen. Die Cluster-Zentren sind keine ganzen Zahlen und haben nur wenige Nullen. Sie sind völlig anders als Ihre Datenpunkte. Wie können sie repräsentativ sein? Fazit: Kämpfen Sie nicht darum, Ihre Daten so zu transformieren, dass sie zu k-means passen. Verstehen Sie das Problem und passen Sie die Algorithmen an Ihr Problem an, nicht umgekehrt. Wenn Sie Ihre Daten an das k-means-Problem
anpassen

1
Wenn Sie Ihre Variablen standardisieren, um ihre Varianzen auszugleichen, entspricht dies in etwa dem Ausgleich der Summen in den Spalten Ihrer Datentabelle. Wenn Sie den Versatz transformieren, entspricht dies in etwa der Erhöhung größerer, aber nicht kleinerer Zählwerte in Ihrer Tabelle. Sie können es tun (und sogar danach können Sie Chi oder Phi berechnen, wie ich vorgeschlagen habe), aber beachten Sie, dass Sie die Originaldaten verdreht haben. War es gerechtfertigt, haben Sie wertvolle Informationen aufgedeckt und nicht verborgen? War es unnötig, die Daten zu quälen? Am Ende sind Sie der einzige, der über diese Überlegungen entscheidet.
ttnphns

2
Es ist leicht, grundlegende Eigenschaften durch unangemessene Normalisierung zu zerstören. Wenn Ihre Daten beispielsweise in jeder Zeile 1 ergeben, wird diese Eigenschaft durch Normalisieren jeder Spalte zerstört. Bei solchen Daten sollten Sie stattdessen z. B. Divergenzmaße (Abstände für Verteilungen) berücksichtigen. Beim Zählen von Daten können Schnittmengenmaße wie Jaccard informativer sein. aber sie brauchen binäre Vektoren. etc.
Hat aufgehört - Anony-Mousse
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.