Słownik metodologiczny · Analizy wielowymiarowe

Wskaźnik sylwetki (silhouette) – jak ocenić podział na skupienia?

Wskaźnik sylwetki porównuje, jak blisko obiekt leży swojego skupienia i najbliższego obcego skupienia. Pokazujemy wzór, zakres od −1 do 1, wybór liczby skupień, przykład w R i opis do pracy.

Strona główna / Słownik / Wskaźnik sylwetki
W skrócie: Wskaźnik sylwetki (silhouette) mierzy dla każdego obiektu, o ile bliżej mu do własnego skupienia niż do najbliższego innego, w skali od −1 do 1. Średnia sylwetka ocenia cały podział i pomaga wybrać liczbę skupień.

Co to jest wskaźnik sylwetki?

Wskaźnik sylwetki (ang. silhouette) mówi, jak dobrze obiekt pasuje do swojego skupienia w porównaniu z najbliższym innym skupieniem. Rousseeuw (1987) zaproponował go jako graficzną pomoc w ocenie wyników analizy skupień: sylwetka pokazuje, które obiekty leżą wyraźnie w swoim skupieniu, a które gdzieś pomiędzy.

Wzór i zakres

Dla obiektu i:

  • a(i) – średnia odległość od pozostałych obiektów jego skupienia (zwartość);
  • b(i) – średnia odległość od obiektów najbliższego obcego skupienia (oddzielenie);
  • s(i) = [b(i) − a(i)] / max{a(i), b(i)}.

Wartość leży od −1 do 1. Blisko 1 – obiekt jest dobrze przypisany; około 0 – leży na granicy dwóch skupień; ujemna – bliżej mu do sąsiedniego skupienia niż do własnego. Średnia sylwetka wszystkich obiektów ocenia cały podział. Wskaźnik działa z każdą miarą odległości, także z odległością Gowera dla danych mieszanych. W R liczy go funkcja silhouette() z pakietu cluster, opartego na podręczniku Kaufmana i Rousseeuwa (1990).

Wybór liczby skupień

Rousseeuw (1987) zaproponował wybór tej liczby skupień k, przy której średnia sylwetka jest największa. W symulacji 150 punktów z trzech skupień k-średnich dało średnie sylwetki: 0.409 (k = 2), 0.527 (k = 3), 0.438 (k = 4), 0.368 (k = 5) i 0.356 (k = 6), więc wskaźnik trafnie wskazał trzy skupienia. Tylko jeden punkt miał ujemną sylwetkę: a = 2.384, b = 2.372, s = −0.005. W danych bez żadnej struktury średnie wyniosły od 0.290 do 0.346 – algorytm zawsze coś podzieli, a sylwetka nie spada do zera.

Jak opisać w pracy

Liczbę skupień wybrano na podstawie średniej szerokości sylwetki dla k = 2–6. Największą wartość uzyskano dla k = 3 (0.527); średnie sylwetki skupień wynosiły od 0.486 do 0.554.

Na co uważać

  • Kształt skupień. Sylwetka faworyzuje zwarte, kuliste skupienia; wydłużone lub zagnieżdżone grupy ocenia gorzej.
  • Brak skupień. Średnia około 0.3 nie dowodzi, że grupy istnieją – porównaj ją z danymi bez struktury i z interpretacją merytoryczną.
  • Jedno kryterium. W segmentacji respondentów łącz sylwetkę z innymi kryteriami i opisem profili segmentów, np. w badaniach turystyki i rekreacji czy marketingu.
Przykład reprodukowalny

Wskaźnik sylwetki w R

Kod symuluje trzy skupienia, liczy średnią sylwetkę k-średnich dla k = 2–6, sprawdza ręcznie sylwetkę najgorzej przypisanego punktu i powtarza obliczenia dla danych bez struktury.

Średnia sylwetka a liczba skupień

Dane wejściowe: 150 punktów w dwóch wymiarach, po 50 wokół trzech środków; dla porównania 150 punktów bez struktury (dane symulowane, set.seed(3601)).

Co odczytać: średnie sylwetki dla k = 2–6, średnie w skupieniach, liczbę ujemnych sylwetek, a, b i s jednego punktu oraz średnie dla danych bez struktury.

R
library(cluster)
set.seed(3601)
srodki <- rbind(c(0, 0), c(4, 0), c(2, 3.5))            # trzy prawdziwe skupienia
X <- do.call(rbind, lapply(1:3, function(j)
  cbind(rnorm(50, srodki[j, 1]), rnorm(50, srodki[j, 2]))))
D <- dist(X)
sr_s <- sapply(2:6, function(k) {
  km <- kmeans(X, centers = k, nstart = 25)
  mean(silhouette(km$cluster, D)[, "sil_width"])
})
round(setNames(sr_s, paste0("k=", 2:6)), 3)
km3 <- kmeans(X, centers = 3, nstart = 25)
s3 <- silhouette(km3$cluster, D)
summary(s3)$clus.avg.widths |> round(3)
sum(s3[, "sil_width"] < 0)                               # obserwacje z ujemną sylwetką
# jedna obserwacja ręcznie: a = średnia odległość do własnego skupienia, b = do najbliższego obcego
i <- which.min(s3[, "sil_width"]); Dm <- as.matrix(D); cl <- km3$cluster
a <- mean(Dm[i, cl == cl[i] & seq_along(cl) != i])
b <- min(sapply(setdiff(1:3, cl[i]), function(j) mean(Dm[i, cl == j])))
round(c(a = a, b = b, s = (b - a) / max(a, b), z_silhouette = unname(s3[i, "sil_width"])), 3)
# dane bez struktury skupień
Y <- matrix(rnorm(300), ncol = 2)
round(sapply(2:6, function(k) mean(silhouette(kmeans(Y, k, nstart = 25)$cluster, dist(Y))[, 3])), 3)
Wynik w R
  k=2   k=3   k=4   k=5   k=6 
0.409 0.527 0.438 0.368 0.356 
    1     2     3 
0.540 0.486 0.554 
[1] 1
           a            b            s z_silhouette 
       2.384        2.372       -0.005       -0.005 
[1] 0.290 0.326 0.331 0.338 0.346

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (pakiet cluster). W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. cluster (wersja 2.1.8.2): Maechler, M., Rousseeuw, P., Struyf, A., Hubert, M., & Hornik, K. (2026). cluster: Cluster analysis basics and extensions (R package version 2.1.8.2) [Computer software]. https://CRAN.R-project.org/package=cluster

Najczęstsze pytania

Jaka wartość wskaźnika sylwetki jest dobra?

Im bliżej 1, tym wyraźniej oddzielone skupienia. Wartość około 0 oznacza obiekty na granicy, a ujemna – obiekty bliższe sąsiedniemu skupieniu. Średnią warto porównać z wynikiem dla danych bez struktury, bo nawet one dają wartości około 0.3.

Jak wybrać liczbę skupień za pomocą sylwetki?

Policz średnią sylwetkę dla kilku wartości k (np. 2–6) i wybierz tę z największą średnią. Decyzję potwierdź interpretacją profili skupień i innymi kryteriami.

Jak policzyć wskaźnik sylwetki w R?

Funkcją silhouette(skupienia, dist(dane)) z pakietu cluster; średnią daje summary(s)$avg.width, a wykres – plot(s). Obiekty z pakietu cluster, np. pam(), zawierają sylwetki od razu.

Powiązane hasła

Poradniki, w których użyjesz tego pojęcia

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Kaufman, L., & Rousseeuw, P. J. (1990). Finding groups in data: An introduction to cluster analysis. Wiley. https://doi.org/10.1002/9780470316801
  2. Rousseeuw, P. J. (1987). Silhouettes: A graphical aid to the interpretation and validation of cluster analysis. Journal of Computational and Applied Mathematics, 20, 53–65. https://doi.org/10.1016/0377-0427(87)90125-7 ● Otwarty dostęp

Cytowania BibTeX

@book{kaufman1990finding, author={Kaufman, Leonard and Rousseeuw, Peter J.}, title={{Finding groups in data: An introduction to cluster analysis}}, year={1990}, publisher={Wiley}, doi={10.1002/9780470316801}}
@article{rousseeuw1987silhouettes, author={Rousseeuw, Peter J.}, title={{Silhouettes: A graphical aid to the interpretation and validation of cluster analysis}}, journal={Journal of Computational and Applied Mathematics}, year={1987}, volume={20}, pages={53--65}, doi={10.1016/0377-0427(87)90125-7}}
R