Spis treści
- Podstawy teoretyczne analizy skupień
- Definicja
- Przykładowe zastosowania analizy skupień w praktyce
- Dane wykorzystane do analizy
- Opis danych oraz cel badania
- Wczytanie i podstawowe statystyki
- Transformacja
- Metody pomiaru (nie)podobieństwa
- Algorytm metody k-średnich
- Funkcja kmeans()
- Ustalenie optymalnej liczby skupień
- Dodatkowa analiza poszczególnych skupień
- Rozkład wieku klientów
- Struktura płci klientów
- Podsumowanie
- Źródła
1. Podstawy teoretyczne analizy skupień
Definicja
- Analiza skupień (cluster analysis, data clustering) to dział wielowymiarowej analizy statystycznej znajdujący zastosowanie w badaniu danych o obiektach wielowymiarowych w celu podzielenia zbioru tych obiektów na grupy (skupienia), które w świetle danych wykazują odrębność.
Innymi słowy, naszym głównym celem jest pogrupowanie obiektów w taki sposób, aby stopień powiązania elementów z tej samej grupy był jak najwyższy (homogeniczność obiektów wchodzących w skład jednej grupy), a z elementami z innych grup jak najniższy (heterogeniczność samych grup).
Najczęściej wyróżnia się dwie podstawowe techniki tworzenia skupień:
- Metody hierarchiczne
- Metody niehierarchiczne (w tym grupa metod k-średnich)
Główną różnicą pomiędzy hierarchicznymi i niehierarchicznymi algorytmami jest konieczność wcześniejszego podania liczby skupień (w drugim przypadku).
Przy użyciu metod hierarchicznych utworzona zostaje pewna hierarchia skupień reprezentowana graficznie w postaci drzewa binarnego (dendrogramu). W liściach tego rodzaju drzewa znajdują się poszczególne elementy zbioru, a węzły stanowią ich grupy.
Algorytmy niehierarchiczne dzielą natomiast zbiór na zadaną wcześniej liczbę podzbiorów w taki sposób, aby uzyskać optymalną wartość pewnego kryterium. Optymalizację uzyskuje się np. poprzez iteracyjne przemieszczanie obiektów między skupieniami.
Przykładowe zastosowania analizy skupień w praktyce
Analiza skupień znajduje szerokie zastosowanie w wielu dziedzinach. Grupowanie może umożliwić przede wszystkim wyodrębnienie zasadniczych cech obiektów badania, odkrycie nieznanej struktury analizowanych danych oraz porównanie elementów, które posiadają więcej niż jedną cechę wspólną. Dzięki zredukowaniu wymiarowości zestawu danych pierwotnych do kilku podstawowych struktur, zmniejszony zostaje nakład pracy i czasu poświęcony na dalszą analizę statystyczną lub ekonometryczną.
Sztandarowe przykłady, w których stosuje się analizę skupień to m.in.:
- segmentacja rynku (szukanie podobieństwa między grupami klientów)
- grupowanie akcji na giełdzie na podstawie wyników
- grupowanie chorób, ich symptomów i metod leczenia (medycyna).
W dalszej części poruszone zostanie pierwsze z wyżej wymienionych zagadnień, a dokładnie - segmentacja klientów galerii handlowej, czyli identyfikacja grup klientów o podobnych gustach lub zwyczajach. Zabieg ten może dostarczyć wielu cennych informacji przy opracowaniu strategii marketingowych. Umożliwia także lepsze dopasowanie produktu do wymagań i oczekiwań klientów.
2. Dane wykorzystane do analizy
Opis danych oraz cel badania
Dane, które będą wykorzystywane w dalszej analizie pochodzą ze strony http://kaggle.com. Dotyczą wybranych charakterystyk dwustu klientów galerii handlowej. Nie są to dane rzeczywiste.
Poszczególne zmienne opisujące danego klienta to:- CustomerID - Identyfikator przypisany do klienta
- Gender - Płeć klient
- Age - Wiek klienta
- Annual income - Roczny dochód klienta (w tysiącach dolarów)
- Spending score - Wynik przyznawany przez galerię handlową na podstawie zachowań kosumenckich i charakteru wydatków (od 1 do 100)
Celem badania będzie stworzenie skupień na podstawie rocznych dochodów i wyników wydatków klientów (zmienne AnnualIncome
oraz SpendingScore
), a także przyjrzenie się pozostałym charakterystykom klientów w wyodrębnionych grupach. Pozwoli to na lepsze planowanie przyszłych strategii, a tym samym na efektywne odpowiadanie na potrzeby rynku.
Wczytanie i podstawowe statystyki
Segmentację klientów rozpoczniemy od wczytania wszystkich niezbędnych w dalszych etapach pakietów.
Następnie wczytamy dane oraz sprawdzimy ich podstawowe statystyki.
Mall_Customers <- read.csv("~/Downloads/Mall_Customers.csv") %>%
rename(SpendingScore=`Spending.Score..1.100.`,
AnnualIncome=`Annual.Income..k..`) #wczytanie danych oraz zmiana nazw kolumn
datatable(Mall_Customers, rownames = FALSE, filter="top",
options = list(pageLength = 10, scrollX=T) ) #wyświetlenie tabeli danych
## CustomerID Gender Age AnnualIncome
## Min. : 1.00 Length:200 Min. :18.00 Min. : 15.00
## 1st Qu.: 50.75 Class :character 1st Qu.:28.75 1st Qu.: 41.50
## Median :100.50 Mode :character Median :36.00 Median : 61.50
## Mean :100.50 Mean :38.85 Mean : 60.56
## 3rd Qu.:150.25 3rd Qu.:49.00 3rd Qu.: 78.00
## Max. :200.00 Max. :70.00 Max. :137.00
## SpendingScore
## Min. : 1.00
## 1st Qu.:34.75
## Median :50.00
## Mean :50.20
## 3rd Qu.:73.00
## Max. :99.00
Wstępny przegląd statystyk umożliwia wyciągnięcie kilku podstawowych wniosków na temat zestawu danych. Na przykład widzimy, że badani klienci galerii znajdowali się w przedziale wiekowym 18-70 lat, a średnia ich wieku wyniosła blisko 39 lat. Ponadto, najmniejszy zaobserwany roczny dochód wyniósł 15 tysięcy dolarów, a największy - 137 tysięcy dolarów. Dostrzeżenie, w jaki sposób rozkładają się poszczególne charakterystyki jest pierwszym i niezbędnym etapem głębszej analizy danych, na których pracujemy.
Transformacja
Przeprowadzenie analizy skupień wymaga odpowiedniego przygotowania danych, w tym dokonania niezbędnych przekształceń.
Po pierwsze, należy usunąć lub oszacować wszelkie brakujące wartości.
Ponadto, często przydatną transformacją jest zmiana typu informacji o płci na dane numeryczne (oznaczenie: 0-kobieta, 1-mężczyzna). W naszej analizie nie będzie to jednak zabieg konieczny, więc pozostaniemy przy znakowym typie danych (character). Przekształcenie na numeryczny typ zostało umieszczone w komentarzu:
Mall_Customers$Gender<-as.character(factor(Mall_Customers$Gender,
c("Male", "Female"),
labels=c(1,0)))
# Mall_Customers$Gender<-as.numeric(as.character(factor(Mall_Customers$Gender,
# c("Male", "Female"),
# labels=c(1,0))))
Następnym krokiem jest wybór zmiennych, na podstawie których zostaną utworzone skupienia. W niniejszym badaniu są to zmienne: SpendingScore
oraz AnnualIncome
. Dla przejrzystości utworzymy nową bazę Mall_Customers_2
.
## AnnualIncome SpendingScore
## Min. : 15.00 Min. : 1.00
## 1st Qu.: 41.50 1st Qu.:34.75
## Median : 61.50 Median :50.00
## Mean : 60.56 Mean :50.20
## 3rd Qu.: 78.00 3rd Qu.:73.00
## Max. :137.00 Max. :99.00
Kolejną istotną kwestią jest standaryzacja zmiennych, która zapewni ich porównywalność. Zabieg ten jest niezbędny jeśli zmienne opisujące obiekty są wyrażone w innych miarach lub jednostkach bądź zróżnicowanie obiektów pod względem poszczególnych cech nie jest jednakowe (różne odchylenia standardowe).
Funkcja
scale()
przy ustawieniach domyślnych unormuje każdy element odejmując średnią i dzieląc przez odchylenie standardowe.
Mall_Customers_2_s<-scale(Mall_Customers_2)
head(Mall_Customers_2_s) #wyświetlenie kilku pierwszych obserwacji po dokonaniu standaryzacji
## AnnualIncome SpendingScore
## 1 -1.734646 -0.4337131
## 2 -1.734646 1.1927111
## 3 -1.696572 -1.7116178
## 4 -1.696572 1.0378135
## 5 -1.658498 -0.3949887
## 6 -1.658498 0.9990891
3. Metody pomiaru (nie)podobieństwa
Podział obserwacji na grupy wymaga pewnych metod obliczania odległości lub (nie)podobieństwa między każdą parą obserwacji. Wynik tego obliczenia nazywany jest macierzą niepodobieństwa. Istnieje wiele metod obliczania informacji o odległości; wybór miar odległości jest krytycznym krokiem w tworzeniu klastrów. Definiuje, w jaki sposób obliczane jest podobieństwo dwóch elementów (x, y) i wpłynie na kształt skupień. Jedną z klasycznych metod pomiaru odległości jest miara euklidesowa, wyrażona wzorem:
\[d(x,y)=\sqrt{\sum_{i=1}^{n}{(x_i-y_i)}^{2}}\]
gdzie \(x\) i \(y\) to dwa wektory o długości \(n\).
Odległość euklidesowa jest najczęściej domyślną miarą w funkcjach do grupowania dostępnych w R. W zależności od celu analizy oraz postawionego pytania badawczego możemy używać także innych opcji (np. ogległości Czebyszewa, odległości Manhattan).
Funkcja
get_dist()
z pakietufactoextra
służy do obliczenia macierzy odległości. Domyślnie przyjęta jest odległość euklidesowa, lecz parametr ten można modyfikować. Natomiast funkcjafviz_dist()
(z tego samego pakietu) jest graficzną interpretacją utworzonej macierzy.
odleglosc <- get_dist(Mall_Customers_2_s)
fviz_dist(odleglosc,
show_labels = T,
gradient = list(low = "red", mid = "white", high = "blue"))
Pary obserwacji o najmniejszym podobieństwie (największej odległości) oznaczone są kolorem czeronym, a pary o największym podobieństwie (najmniejszej odległości) - niebieskim.
4. Algorytm metody k-średnich
Grupowanie metodą k-średnich jest jednym z najczęściej używanych algorytmów uczenia maszynowego bez nadzoru (unsupervised learning). Zestaw danych zostaje podzielony na k grup (skupień). Liczba k musi zostać wstępnie określona przez analityka.
Działanie algorytmu polega na przenoszeniu obiektów ze skupienia do skupienia tak długo, aż wariancja wewnątrz każdego z nich zostanie zminimalizowana. Celem jest zatem zapewnienie największego podobieństwa elementów w ramach każdej z grup, przy jednoczesnej maksymalnej różnicy pomiędzy samymi grupami.
Standardowym algorytmem metody k-średnich jest algorytm Hartigana-Wonga (1979). Całkowita zmienność wewnątrz skupienia jest w tym przypadku zdefiniowana jako suma kwadratów odległości euklidesowych między elementami a odpowiadającym im środkiem ciężkości:
\[W(C_k)=\sum_{x_i\in C_k}{(x_i-\mu_k)}^{2}\] gdzie: \(x_i\) to punkt należący do skupienia \(C_k\), a \(\mu_k\) to średnia wartość punktów przypisanych do skupienia \(C_k\).
Każda obserwacja \((x_i)\) powinna zostać przypisana do danego skupienia w taki sposób, aby suma kwadratów \((W(C_k))\) odległości obserwacji do przypisanych im centrów skupień \((\mu_k)\) została zminimalizowana.
Optymalne rozwiązanie zapewnia minimalizacja całkowitej zmienności wewnątrz skupień (\(tot.withiness\)), którą definiuje się w poniższy sposób:
\[tot.withiness=\sum_{k=1}^{k}{W(C_k)}=\sum_{k=1}^{k}\sum_{x_i\in C_k}{(x_i-\mu_k)}^{2}\]
Poszczególne kroki algorytmu k-średnich można opisać jako:
1. Ustalenie liczby skupień k
2. Wylosowanie k punktów (wstępnych środków skupień)
3. Obliczenie odległości obiektów od środków skupień
4. Przypisanie obiektów do najbliższych skupień
5. Wyliczenie nowych środków skupień
6. Powtarzanie kroków 3, 4, 5 do czasu, aż:
- środki skupień przestaną się zmieniać
- wykonamy maksymalną liczbę iteracji
Funkcja kmeans()
Grupowanie metodą k-średnich możemy przeprowadzić przy użyciu funkcji
kmeans()
.
W wyniku otrzymujemy także dodatkowe informacje, w tym najbardziej istotne z punktu widzenia analizy skupień:
cluster - wektor liczb całkowitych (od 1 do k) wskazujący na skupienie, do którego została przypisana dana obserwacja
centers - macierz środków skupień
totss - całkowita suma kwadratów
withinss - wektor sumy kwadratów wewnątrz skupienia
tot.withinss - całkowita suma kwadratów wewnątrz skupień
betweenss - suma kwadratów między skupieniami
size - rozmiar poszczególnych skupień
Na początku założymy, że chcemy podzielić klientów jedynie na dwie grupy:
## List of 9
## $ cluster : Named int [1:200] 1 2 1 2 1 2 1 2 1 2 ...
## ..- attr(*, "names")= chr [1:200] "1" "2" "3" "4" ...
## $ centers : num [1:2, 1:2] 0.0144 -0.0139 -0.8225 0.7903
## ..- attr(*, "dimnames")=List of 2
## .. ..$ : chr [1:2] "1" "2"
## .. ..$ : chr [1:2] "AnnualIncome" "SpendingScore"
## $ totss : num 398
## $ withinss : num [1:2] 133 135
## $ tot.withinss: num 268
## $ betweenss : num 130
## $ size : int [1:2] 98 102
## $ iter : int 1
## $ ifault : int 0
## - attr(*, "class")= chr "kmeans"
## K-means clustering with 2 clusters of sizes 98, 102
##
## Cluster means:
## AnnualIncome SpendingScore
## 1 0.01442146 -0.8225376
## 2 -0.01385591 0.7902812
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 1 2 1 2 1 2 2 1 1 1 2 2 2 2 1 1 2 1 2 1
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 2 2 2 2 2 1 2 1 2 1 1 2 1 2 2 1 2 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 2 2 1 1 2 1 2 2 2 1 2 1 1 1 1 2 1 2 1 1
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 1 1 2 2 2 1 2 1 1 1 2 2 1 1 1 2 1 2 1 2
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 2 1 2 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
##
## Within cluster sum of squares by cluster:
## [1] 133.1768 134.7760
## (between_SS / total_SS = 32.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Obserwacje zostały podzielone w 2 skupienia liczące odpowiednio 111 oraz 89 elementów. Interpretacja graficzna tego podziału przedstawia się następująco:
fviz_cluster(k2, data = Mall_Customers_2_s, geom="point",
main="Grupowanie metodą k-średnich, 2 skupienia", ggtheme=theme_minimal())
Ponieważ liczbę skupień (k) należy ustawić przed uruchomieniem algorytmu, często korzystne jest użycie kilku różnych wartości i zbadanie różnic w wynikach. Powtórzymy proces dodatkowo dla 3, 4, 5 i 6 skupień, a także ukażemy wizualizację.
k3 <- kmeans(Mall_Customers_2_s, centers = 3, nstart = 25)
k4 <- kmeans(Mall_Customers_2_s, centers = 4, nstart = 25)
k5 <- kmeans(Mall_Customers_2_s, centers = 5, nstart = 25)
k6 <- kmeans(Mall_Customers_2_s, centers = 6, nstart = 25)
# wykresy dla porównania
w1 <- fviz_cluster(k3, geom = "point", data = Mall_Customers_2_s,
ggtheme=theme_minimal()) + ggtitle("3 skupienia")
w2 <- fviz_cluster(k4, geom = "point", data = Mall_Customers_2_s,
ggtheme=theme_minimal()) + ggtitle("4 skupienia")
w3 <- fviz_cluster(k5, geom = "point", data = Mall_Customers_2_s,
ggtheme=theme_minimal()) + ggtitle("5 skupień")
w4 <- fviz_cluster(k6, geom = "point", data = Mall_Customers_2_s,
ggtheme=theme_minimal()) + ggtitle("6 skupień")
grid.arrange(w1, w2, w3, w4, nrow = 2)
Wizualizacja nie sugeruje jednak, jaka liczba skupień wydaje się być najbardziej odpowiednia. Aby uzyskać odpowiedź na to pytanie, można posłużyć się dodatkowymi metodami.
5. Ustalenie optymalnej liczby skupień
Wybór najlepszej liczby skupień \(k\) może ułatwić zastosowanie jednej ze statystycznych metod: Elbow, Silhouette lub Gap Statistic.
Metody te są dostępne w pakiecie
factoextra
przy wykorzystaniu funkcjifviz_nbclust()
.
W niniejszej analizie posłużymy się jedynie metodą Elbow, ponieważ jest najprostsza i w konsekwencji najczęściej wykorzystywana.
Metoda Elbow
Przypomnijmy, że najbardziej optymalna liczba skupień zostanie wyznaczona przy spełnieniu warunku minimalizacji całkowitej zmienności wewnątrz skupień, czyli:
\[min\left({\sum_{k=1}^{k}{W(C_k)}}\right)\]
Naturalnie suma wariancji wraz ze wzrostem podziału na coraz większą liczbę skupień będzie malała. Dzieje się tak, ponieważ skupienia stają się coraz mniejsze. Jednak optymalnej liczby klastrów poszukujemy w miejscu, w którym suma wariancji przestaje gwałtownie maleć, a podział na coraz większą liczbę skupień nie poprawia znacząco wyniku. Innymi słowy szukamy na wykresie silnego przegięcia, tzw. “łokcia”.
Możemy samodzielnie stworzyć funkcję generującą wykres, na podstawie którego odczytamy najlepszą wartość \(k\):
tot.withinss <- vector("numeric", length = 10)
for (i in 1:10){
k_d <- kmeans(Mall_Customers_2_s, i)
tot.withinss[i] <- k_d$tot.withinss
}
ggplot(as.data.frame(tot.withinss), aes(x = seq(1,10), y = tot.withinss)) +
theme_minimal() +
geom_point(col = "#bcbcf5") +
geom_line(col = "#bcbcf5") +
ylab("Total Within Sum of Square") +
xlab("Liczba skupień k") +
ggtitle("Optymalna liczba skupień - Metoda Elbow")
Możemy również skorzystać z gotowej, wbudowanej funkcji fviz_nbclust()
:
fviz_nbclust(Mall_Customers_2_s, kmeans, method="wss") +
theme_minimal() +
ylab("Total Within Sum of Square") +
xlab("Liczba skupień k") +
ggtitle("Optymalna liczba skupień - Metoda Elbow")
W naszym przykładzie widać, iż optymalnie będzie podzielić klientów na 6 skupień.
## K-means clustering with 6 clusters of sizes 23, 10, 29, 22, 81, 35
##
## Cluster means:
## AnnualIncome SpendingScore
## 1 -1.3042458 -1.13411939
## 2 1.8709508 1.23143545
## 3 0.6850149 1.23811207
## 4 -1.3262173 1.12934389
## 5 -0.2004097 -0.02638995
## 6 1.0523622 -1.28122394
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4 1 4
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 1 4 1 5 1 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 5 5 5 3 6 3 5 3 6 3 6 3 5 3 6 3 6 3 6 3
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 6 3 5 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2
##
## Within cluster sum of squares by cluster:
## [1] 7.577407 3.681858 5.514889 5.217630 14.485632 18.304646
## (between_SS / total_SS = 86.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Skupienia 1-6 będą liczyło kolejno po 23, 10, 29, 22, 81 i 35 elementów.
fviz_cluster(k6, data = Mall_Customers_2_s, geom="point",
main="Grupowanie metodą k-średnich, 6 skupień",
ggtheme=theme_minimal())
Z powyższej wizualizacji skupień możemy wywnioskować, iż:
Do skupienia 1 należą klienci o niskim rocznym dochodzie oraz niskim wyniku wydatków.
Do skupienia 2 należą klienci o wysokim rocznym dochodzie oraz wysokim wyniku wydatków.
Do skupienia 3 należą klienci o średnim rocznym dochodzie oraz wysokim wyniku wydatków.
Do skupienia 4 należą klienci o niskim rocznym dochodzie oraz wysokim wyniku wydatków.
Do skupienia 5 należą klienci o średnim rocznym dochodzie oraz średnim wyniku wydatków.
Do skupienia 6 należą klienci o wysokim rocznym dochodzie oraz niskim wyniku wydatków.
Możemy teraz pogłębić analizę i sprawdzić, w jaki sposób w poszczególnych grupach rozkładają się charakterystyki takie jak płeć oraz wiek.
6. Dodatkowa analiza poszczególnych skupień
Na początku należy powiązać pozostałe charakterystyki z utworzonymi skupieniami:
## CustomerID Gender Age AnnualIncome SpendingScore cluster
## 1 1 1 19 15 39 1
## 2 2 1 21 15 81 4
## 3 3 0 20 16 6 1
## 4 4 0 23 16 77 4
## 5 5 0 31 17 40 1
## 6 6 0 22 17 76 4
Rozkład wieku klientów
Interesującą informacją z punktu widzenia segmentacji rynku będzie z pewnością rozkład wieku w poszczególnych grupach.
ggplot(Mall_Customers, aes(Age, fill = factor(cluster))) +
geom_density(alpha=0.7) +
theme_minimal() +
ylab("Gęstość") +
xlab("Wiek") +
ggtitle("Rozkład wieku klientów w poszczególnych skupieniach") +
scale_fill_discrete(name=" ",
breaks=c("1", "2", "3", "4", "5", "6"),
labels=c("Skupienie 1", "Skupienie 2", "Skupienie 3",
"Skupienie 4", "Skupienie 5", "Skupienie 6"))
Powyższa wizualizacja niesie za sobą kilka cennych informacji. Po pierwsze, w skupieniach 1, 5 oraz 6 rozkład wieku jest normalny. Do skupienia nr 4 należą natomiast przede wszystkim młodzi ludzie, mający w większości nieco ponad 20 lat. Z poprzedniej części analizy wiemy, że skupienie to odznaczało się niskim rocznym dochodem oraz wysokim wynikiem wydatków. Jest to zgodne z intuicją podpowiadającą, iż bardzo młode osoby nie będą miały jeszcze wysokich dochodów, lecz znaczną ich część będą przeznaczały na własną konsumpcję impulsywną. Pozostałe skupienia (2 i 3) obejmują w większości osoby w wieku 25-40 lat i są to klienci o wysokich lub średnich dochodach, a także wysokim wyniku w zakresie wydatków.
Struktura płci klientów
Kolejne istotne informacje może nieść za sobą struktura płci. Możemy sprawdzić, czy znacznie różni się ona w poszczególnych grupach:
ggplot(Mall_Customers, aes(Gender, fill = factor(cluster))) +
geom_bar(position = "fill") +
theme_minimal() +
ggtitle("Struktura płci w poszczególnych skupieniach") +
scale_fill_discrete(name=" ",
breaks=c("1", "2", "3", "4", "5", "6"),
labels=c("Skupienie 1", "Skupienie 2", "Skupienie 3",
"Skupienie 4", "Skupienie 5", "Skupienie 6")) +
ylab("Proporcje") +
xlab("Płeć (0-kobieta; 1-mężczyzna)")
Widzimy, że proporcje kobiet i mężczyzn w poszczególnych skupieniach są dosyć wyrównane. Dla analityka opracowującego strategie marketingowe na podstawie zmiennych AnnualIncome oraz SpendingScore może stanowić to informację, że w tym przypadku nie warto przykładać dużej uwagi do tego, aby dotrzeć do przedstawicieli konkretnej płci.
7. Podsumowanie
Praktyczne zastosowanie analizy skupień jest niezwykle szerokie. Niniejsza praca miała na celu pokazać, iż z jej wykorzystaniem można przeprowadzić segmentację rynku. Zastosowana metoda k-średnich jest prosta, lecz dostarcza wielu istotnych informacji o strukturze naszego zbioru danych.
8. Źródła
Podstawy teoretyczne analizy skupień:
https://en.wikipedia.org/wiki/Cluster_analysis#Algorithms
https://www.statystyka.az.pl/analiza-skupien.php
https://www.statystyka.az.pl/analiza-skupien/metoda-k-srednich.php
http://zsi.tech.us.edu.pl/~nowak/odzw/smad_lab11.pdfDane:
https://www.kaggle.com/vjchoudhary7/customer-segmentation-tutorial-in-pythonGrupowanie metodą k-średnich:
https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html
https://www.datanovia.com/en/lessons/determining-the-optimal-number-of-clusters-3-must-know-methods/
https://www.guru99.com/r-k-means-clustering.html
https://uc-r.github.io/kmeans_clustering
https://www.datanovia.com/en/lessons/cluster-analysis-example-quick-start-r-code/
http://www.cs.put.poznan.pl/dbrzezinski/teaching/sphd/07_Uczenie_maszynowe_w_R_III.htmlFunkcje ggplot:
https://ggplot2-book.org/guides.html