Grupowanie bardzo wypaczonych, zliczanie danych: jakieś sugestie (transformacja itp.)?

11

Podstawowy problem

Oto mój podstawowy problem: próbuję zgrupować zestaw danych zawierający niektóre bardzo wypaczone zmienne z licznikami. Zmienne zawierają wiele zer i dlatego nie są zbyt pouczające dla mojej procedury klastrowania - która prawdopodobnie jest algorytmem k-średnich.

Dobra, mówisz, po prostu przekształć zmienne za pomocą pierwiastka kwadratowego, pola Coxa lub logarytmu. Ale ponieważ moje zmienne są oparte na zmiennych kategorialnych, obawiam się, że mógłbym wprowadzić błąd systematyczny, posługując się zmienną (opartą na jednej wartości zmiennej kategorialnej), pozostawiając inne (oparte na innych wartościach zmiennej kategorialnej) takie, jakie są .

Przejdźmy do bardziej szczegółowych informacji.

Zestaw danych

Mój zestaw danych reprezentuje zakupy przedmiotów. Przedmioty mają różne kategorie, na przykład kolor: niebieski, czerwony i zielony. Zakupy są następnie grupowane, np. Według klientów. Każdy z tych klientów jest reprezentowany przez jeden wiersz mojego zestawu danych, więc w jakiś sposób muszę agregować zakupy w stosunku do klientów.

Sposób, w jaki to robię, polega na liczeniu zakupów, w których przedmiot ma określony kolor. Więc zamiast pojedynczej zmiennej color, I skończyć z trzech zmiennych count_red, count_blueoraz count_green.

Oto przykład ilustracji:

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

Właściwie ostatecznie nie używam liczb bezwzględnych, używam współczynników (ułamek zielonych elementów wszystkich zakupionych przedmiotów na klienta).

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

Wynik jest taki sam: dla jednego z moich kolorów, np. Zielonego (nikt nie lubi zielonego), otrzymuję zmienną skośną w lewo zmienną zawierającą wiele zer. W związku z tym k-średnich nie znajduje dobrego podziału dla tej zmiennej.

Z drugiej strony, jeśli znormalizuję moje zmienne (odejmij średnią, podziel przez odchylenie standardowe), zielona zmienna „wysadzi się” z powodu swojej małej wariancji i przyjmuje wartości z dużo większego zakresu niż inne zmienne, co sprawia, że ​​wygląda bardziej ważne dla k-średnich, niż jest w rzeczywistości.

Kolejnym pomysłem jest przekształcenie zielonej zmiennej sk (r) ewed.

Przekształcanie skośnej zmiennej

Jeśli zmienię zieloną zmienną przez zastosowanie pierwiastka kwadratowego, będzie ona wyglądać nieco mniej przekrzywiona. (Tutaj zielona zmienna jest wykreślona na czerwono i zielono, aby zapewnić zamieszanie.)

wprowadź opis zdjęcia tutaj

Czerwony: oryginalna zmienna; niebieski: przekształcony przez pierwiastek kwadratowy.

Powiedzmy, że jestem zadowolony z wyniku tej transformacji (której nie jestem, ponieważ zera wciąż mocno wypaczają rozkład). Czy powinienem teraz skalować zmienne czerwone i niebieskie, chociaż ich rozkłady wyglądają dobrze?

Dolna linia

Innymi słowy, czy zniekształcam wyniki grupowania, obsługując kolor zielony w jedną stronę, ale w ogóle nie obsługując czerwonego i niebieskiego? Ostatecznie wszystkie trzy zmienne należą do siebie, więc czy nie powinny być traktowane w ten sam sposób?

EDYTOWAĆ

Wyjaśnij: Zdaję sobie sprawę, że k-średnich prawdopodobnie nie jest sposobem na uzyskanie danych opartych na zliczaniu . Moje pytanie naprawdę dotyczy jednak traktowania zmiennych zależnych. Wybór właściwej metody to osobna sprawa.

Nieodłącznym ograniczeniem moich zmiennych jest to

count_red(i) + count_blue(i) + count_green(i) = n(i), gdzie n(i)jest łączna liczba zakupów klienta i.

(Lub, równoważnie, count_red(i) + count_blue(i) + count_green(i) = 1przy użyciu liczby względnej.)

Jeśli zmienię moje zmienne w inny sposób, odpowiada to nadaniu różnej wagi trzem warunkom ograniczenia. Jeśli moim celem jest optymalne rozdzielenie grup klientów, czy muszę dbać o naruszenie tego ograniczenia? Czy też „cel uzasadnia środki”?

pederpansen
źródło
Witamy w CV! Dziękujemy za uczynienie pierwszego pytania tak jasnym i dobrze napisanym.
Silverfish,
Nie do końca zrozumiałem twój zestaw danych. Zmienne (atrybuty) są count_red, count_bluea count_greendane są zliczane. Dobrze? Jakie są zatem wiersze - przedmioty? I zamierzasz grupować przedmioty?
ttnphns
Wiersze ogólnie reprezentują grupy zagregowanych zakupów. Możesz myśleć o nich jak o klientach, którzy kupili wiele produktów. Zaktualizowałem moje pytanie o przykładowy zestaw danych, aby to wyjaśnić.
pederpansen
Chcesz skupić „klientów”?
ttnphns
Tak. Zamierzam również grupować zakupy według przedziałów czasowych, a tym samym grupować przedziały czasowe, ale na razie: klienci.
pederpansen

Odpowiedzi:

7

@ttnphns podał dobrą odpowiedź.

Właściwe tworzenie klastrów często wymaga bardzo intensywnego myślenia o danych, więc zróbmy to trochę. Moim zdaniem najbardziej podstawowym aspektem twoich danych jest to, że są one złożone .

Z drugiej strony, twoim głównym zmartwieniem wydaje się być to, że masz dużo zer dla zielonych produktów i szczególnie zastanawiasz się, czy możesz przekształcić tylko zielone wartości, aby uczynić je bardziej podobnymi do pozostałych. Ponieważ jednak są to dane kompozycyjne, nie można myśleć o jednym zestawie liczb niezależnie od pozostałych. Co więcej, wydaje się, że najbardziej interesują Cię prawdopodobieństwo zakupu różnych kolorowych produktów, ale ponieważ wielu nie kupiło żadnych zielonych, martwisz się, że nie możesz oszacować tych prawdopodobieństw. Jednym ze sposobów rozwiązania tego problemu jest zastosowanie nieco bayesowskiego podejścia, w którym popychamy szacunkowe proporcje klientów w kierunku średniej proporcji, przy czym wielkość przesunięcia zależy od tego, jak daleko są od średniej i ile danych trzeba oszacować, aby byli prawdziwi prawdopodobieństwa.

Poniżej wykorzystuję twój przykładowy zestaw danych, aby zilustrować (w R) jeden ze sposobów podejścia do twojej sytuacji. Czytam dane i przekształcam je w proporcje rzędowe, a następnie obliczam średnie proporcje według kolumn. Dodam środki z powrotem do każdej liczby, aby uzyskać skorygowane liczby i nowe proporcje wierszy. To popycha szacunkową proporcję każdego klienta do średniej proporcji dla każdego produktu. Jeśli chcesz silniejszego szturchnięcia, możesz 15*mean.propszamiast tego użyć wielu środków (takich jak, ).

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

Istnieje kilka wyników tego. Jednym z nich jest to, że masz teraz niezerowe oszacowania leżące u podstaw prawdopodobieństw zakupu zielonych produktów, nawet jeśli klient tak naprawdę nie ma żadnych danych na temat zakupu jakichkolwiek zielonych produktów. Inną konsekwencją jest to, że masz teraz nieco ciągłe wartości, podczas gdy oryginalne proporcje były bardziej dyskretne; oznacza to, że zestaw możliwych oszacowań jest mniej zawężony, więc miara odległości, taka jak kwadratowa odległość euklidesowa, może mieć teraz większy sens.

Możemy wizualizować dane, aby zobaczyć, co się stało. Ponieważ są to dane kompozycyjne, w rzeczywistości mamy tylko dwie informacje i możemy je wykreślić w jednym wykresie rozrzutu. W przypadku większości informacji w kategoriach czerwonej i niebieskiej sensowne jest użycie ich jako osi. Widać, że skorygowane proporcje (czerwone liczby) są nieco przesunięte w stosunku do pierwotnych pozycji.

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

wprowadź opis zdjęcia tutaj

W tym momencie masz dane i wiele osób zaczynałoby od ich standaryzacji. Ponownie, ponieważ są to dane kompozycyjne, uruchomiłbym analizy skupień bez żadnej standaryzacji - te wartości są już współmierne, a standaryzacja zniszczyłaby niektóre informacje relacyjne. W rzeczywistości, patrząc na fabułę, myślę, że naprawdę masz tutaj tylko jeden wymiar informacji. (Przynajmniej w przykładowym zestawie danych; twój prawdziwy zestaw danych może się różnić). Chyba że z biznesowego punktu widzenia uważasz, że ważne jest, aby rozpoznać osoby, które mają duże prawdopodobieństwo zakupu zielonych produktów, jako odrębną grupę klientów, ja wyodrębni wyniki dla pierwszego głównego składnika (który stanowi 99,5% wariancji w tym zbiorze danych) i po prostu to zgrupuje.

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 
gung - Przywróć Monikę
źródło
+1, ponieważ zauważyłeś, że są to dane kompozycyjne, ale dlaczego nie miałbyś po prostu używać standardowych technik transformacji dla kompozycji. dane zamiast tego nieparzystego pomysłu na „średnią skorygowaną”? Wydaje mi się to ad-hoc, czy jest jakieś odniesienie do tego lub czegoś podobnego? Dlaczego jest to lepsze niż prosta, wyśrodkowana transformacja logarytmiczna, a następnie grupowanie pierwszego wyniku PC transformowanych danych? (o co poprosiłby każdy rozsądny recenzent aplikacji do analizy danych kompozytów.)
usεr11852
Dzięki, @ usεr11852. Liczy> 2, ale skończone opcje są wielomianami. Jest to (1 forma empirycznej) analizy bayesowskiej z Dirichletem przed (koniugat). Jestem pewien, że możliwe są inne opcje. Jednak nie od razu widzę, jak przyjmowanie współczynników działałoby w zerach.
gung - Przywróć Monikę
2
Dzięki za link. Jeśli masz jeden niezerowy wymiar komponentu, możesz go użyć do transformacji addytywnego współczynnika logarytmicznego (wyłączając oczywistą ideę imputacji; zobacz komentarze tutaj ). CLR byłby wyłączony, ponieważ używa średniej geometrycznej. Pracowano nad „zerowymi danymi kompozycyjnymi”; patrz na przykład tutaj , tutaj i tutaj .
usεr11852
1
Wygląda na to, że wiesz dużo więcej na ten temat niż ja, @ usεr11852. Moja odpowiedź naprawdę próbowała tylko wyjaśnić te fakty dotyczące charakteru sytuacji / podnieść problem i przedstawić wstępną sugestię. Dlaczego nie wnieść własnej (lepiej poinformowanej) odpowiedzi?
gung - Przywróć Monikę
7

Nie jest rozsądne przekształcanie zmiennych indywidualnie, ponieważ należą one do siebie (jak zauważyłeś) i wykonywanie k-średnich, ponieważ dane się liczą (możesz, ale k-średnich lepiej jest robić na ciągłych atrybutach, takich jak na przykład długość) .

Zamiast tego obliczyłem odległość chi-kwadrat (idealną do zliczeń) między każdą parą klientów, na podstawie zmiennych zawierających liczby. Następnie wykonaj hierarchiczne grupowanie (na przykład średnią metodę łączenia lub pełną metodę łączenia - nie obliczają one centroidów i dlatego nie wymagają odległości euklidesowej) lub inne klastrowanie pracujące z dowolnymi macierzami odległości.

Kopiowanie przykładowych danych z pytania:

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

Rozważ parę c0i c1oblicz statystyki Chi-kwadrat dla ich 2x3tabeli częstotliwości. Weź pierwiastek kwadratowy z niego (tak jak robisz to podczas obliczania zwykłej odległości euklidesowej). To jest twój dystans. Jeśli odległość jest bliska 0, dwóch klientów jest podobnych.

Może ci przeszkadzać, że sumy w rzędach w tabeli różnią się, a więc wpływa na odległość chi-kwadrat, gdy porównujesz c0z c1vs c0z c2. Następnie oblicz (pierwiastek) odległości Phi-kwadrat : Phi-sq = Chi-sq/Ngdzie Njest łączną całkowitą liczbą w dwóch aktualnie rozważanych wierszach (klientach). Jest to zatem znormalizowana odległość wrt do ogólnej liczby.

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

Tak więc, odległość pomiędzy dowolnymi dwoma rzędami danych jest (kw. Korzeń) na chi-kwadrat lub phi-kwadrat statystyki w 2 x ptabeli częstotliwości ( pjest liczba kolumn w danych). Jeśli którakolwiek kolumna w bieżącej 2 x ptabeli ma wartość zero, odetnij tę kolumnę i oblicz odległość na podstawie pozostałych niezerowych kolumn (jest to w porządku i tak robi na przykład SPSS, gdy oblicza odległość). Odległość chi-kwadrat jest faktycznie ważoną odległością euklidesową.

ttnphns
źródło
Dziękuję za tę szczegółową odpowiedź. Doceniam, że udzieliłeś porady w sprawie czegoś, co nie było moim pierwotnym pytaniem: czy środki K (z niejawną odległością euklidesową) są właściwym wyborem dla tego przypadku zastosowania? Podejrzewałem, że tak nie jest, a ty to potwierdziłeś. Jednak nadal nie rozumiem, dlaczego . Czy możesz wyjaśnić 1) dlaczego odległość chi-kwadrat (lub phi-kwadrat) jest dobrym wyborem dla danych zliczania? 2) wracając do mojego pierwotnego pytania: czy istnieje dobry (matematyczny / empiryczny) argument, dlaczego wszystkie zmienne powinny być traktowane tak samo, jak „należą do siebie”?
pederpansen
Klient wybiera jeden z trzech kolorów, kiedy dokonuje pojedynczego zakupu: trzy kolory nie są koncepcyjnie niezależnymi „zmiennymi”. Plus twoje dane są liczone. Od razu stało się dla mnie jasne, że miara oparta na chi-kwadrat powinna być optymalna. W odniesieniu do twojej ostatniej kwestii - mogę cię zapytać: dlaczego mieliby być traktowani inaczej? Dał ci rozwiązanie do wykonania zadania grupowania. Czy jest w tym coś, czego nie lubisz lub co budzi w tobie wątpliwości?
ttnphns
2
Nie sądzę też, aby k-średnie (minimalizacja wariancji!) Było dobrym rozwiązaniem: k-średnie używa środków . Twoje dane są liczbami całkowitymi i mają wiele zer. Centra klastra nie będą liczbami całkowitymi i będą miały kilka zer. Są całkowicie odmienne od twoich punktów danych, w jaki sposób mogą być reprezentatywne? Konkluzja: nie walcz o przekształcenie swoich danych, aby pasowały do ​​k-średnich. Zrozum problem i dopasuj algorytmy do swojego problemu, a nie odwrotnie. Jeśli dopasujesz swoje dane do problemu k-średnich, może to być nadal zły problem ...
Ma ZAKOŃCZENIE - Anony-Mousse
1
Kiedy ustandaryzujesz swoje zmienne, aby wyrównać ich wariancje, jest to mniej więcej odpowiednik wyrównywania sum w kolumnach tabeli danych. Po przekształceniu pochylenia jest to w przybliżeniu równoważne zwiększenie większych, ale nie mniejszych liczb w tabeli. Możesz to zrobić (a nawet po tym możesz obliczyć chi lub phi, jak zasugerowałem), ale pamiętaj, że przekręciłeś oryginalne dane. Czy było to uzasadnione, czy odkryłeś i nie ukryłeś cennych informacji? Czy było to niepotrzebne torturowanie danych? Ostatecznie to ty decydujesz o tych refleksjach.
ttnphns
2
Łatwo jest zniszczyć podstawowe właściwości przez niewłaściwą normalizację. Np. Jeśli twoje dane sumują się do 1 w każdym rzędzie, normalizacja każdej kolumny zniszczy tę właściwość. W przypadku takich danych należy rozważyć np. Miary rozbieżności (odległości dla rozkładów). Przy liczeniu danych ustawione miary przecięcia, takie jak Jaccard, mogą być bardziej pouczające; ale potrzebują wektorów binarnych. itd.
Ma ZAKOŃCZENIE - Anony-Mousse,