Grupowanie to technika uczenia nienadzorowanego, w której zestaw danych jest podzielony na kilka grup nazywanych skupieniami (ang. clusters) na podstawie ich podobieństwa. Po grupowaniu obiektów powstaje kilka skupień. Wszystkie obiekty w danej grupie mają podobne cechy (obiekty należące do tej samej grupy są do siebie podobne), a jednocześnie mają cechy odmienne od obiektów spoza grupy (obiekty należące do różnych grup różnią się od siebie). Podczas eksploracji i analizy danych analiza skupień jest używana do wyszukiwania podobnych zestawów danych. Celem ćwiczenia jest podział obiektów (klientów banku) z zestawu danych kredytowych - ((https://archive.ics.uci.edu/ml/datasets/statlog+(german+credit+data)) na podstawie cech ilościowych oraz cech ilościowych i wybranych cech jakościowych oraz ocena dokonanego podziału.
Podstawową biblioteką umożliwiająca przeprowadzenie grupowania w R jest library(cluster). Wczytanie zestawu danych:
library(cluster)
load("C:/Users/Dell/Documents/dysk_wymienny/zajęcia/data_mining/credit.RData")Spośród zmiennych opisujących kredytobiorców, są zmienne ilościowe: okres kredytu (2), kwota kredytu (5), rat jako procent dochodu (8), wiek kredytobiorcy (13). Na ich podstawie można przeprowadzić grupowanie wykorzystując do określenia odległości między obiektami odległości euclidesowej. Odległość między obiektami r i s można wyznaczyć ze wzoru: \[ d_{rs} = \sqrt {\sum_{j=1}^p {(x_{r,j} - x_{s,j})^2}} \] Stworzenie nowego obiektu grupa1 ze zmiennymi ilościowymi na podstawie których zostanie przeprowadzony proces grupowania i obliczenie wartości średnich i odchylenia standardowego dla każdej ze zmiennych
grupa1<- credit[,c(2,5,8,13)]
colMeans(grupa1)## czas kwota rata_%doch wiek
## 20.903 3271.258 2.973 35.546
sapply(grupa1, sd)## czas kwota rata_%doch wiek
## 12.058814 2822.736876 1.118715 11.375469
Ponieważ wszystkie zmienne mają różne skale i różny jest zakres ich zmienności, istnieje szansa, że przy wyznaczeniu odległości między obiektami większą wagę przypisuje się cechom o większej skali. Wpłynie to na wydajność algorytmu grupowania. Z tego względu należy przeprowadzić normalizację wartości zmiennych. Jednym ze sposobów jest standaryzacja. Jest to technika skalowania, w której wartości są wyśrodkowane wokół średniej z jednostkowym odchyleniem standardowym. Oznacza to, że średnia atrybutu wynosi zero, a wynikowy rozkład ma jednostkowe odchylenie standardowe. Wartość po standaryzacji x’ może zostać obliczona ze wzoru: \[
x' = \frac{x - \mu}{\sigma}
\] Do standaryzacji wykorzystano funkcję scale(obekt). Rozkład zmiennych po standaryzacji wygląda następująco:
normalizacja<-scale(grupa1)
round(colMeans(as.data.frame(normalizacja)),3)## czas kwota rata_%doch wiek
## 0 0 0 0
sapply(as.data.frame(normalizacja), sd)## czas kwota rata_%doch wiek
## 1 1 1 1
Na podstawie danych po standaryzacji obliczono odległości między obiektami, z wykorzystaniem funkcji dist(obiekt, metoda). W rezultacie otrzymuje się ciąg składający się z 499,5 tys. wartości. Tak duża liczba wynika z faktu, iż obliczane są odległości każdego obiektu od pozostałych. tak więc dla pierwszego obiektu wyznacza się 999 odległości względem pozostałych, dla drugiego 998, itd. Pierwszych 15 wyrazów ciągu można sprawdzić wywołując funkcję head().
distance<-dist(normalizacja, method = 'euclidean')
head(distance, 15)## [1] 5.817721 2.460765 4.637307 2.502176 5.010355 2.211367 4.635743 2.042105
## [9] 4.217710 3.831527 5.334355 4.807045 1.614585 3.938799 3.419998
Spośród podanych wartości najmniejszą wartością jest 1.6145853 wyznaczającą odległość między 1 a 14 obiektem, zaś największą wartością jest wartość 5.8177208, która jest odległością między 1 a 2 obiektem. Poniższe kody pozwalają porównać ze sobą obiekty dla których wspomniane odległości są najmniejsze i największe.
grupa1[c(1,14),]## czas kwota rata_%doch wiek
## 1 6 1169 4 67
## 14 24 1199 4 60
grupa1[c(1,2),]## czas kwota rata_%doch wiek
## 1 6 1169 4 67
## 2 48 5951 2 22
Aby znaleźć w całym zbiorze obserwacji obiekty najbardziej i najmniej do siebie podobne pod względem analizowanych cech obiekt distance należy przekształcić w macierz, wykorzystując do tego funkcję as.matrix. Poniższe kody pozwalają na wyszukanie najbardziej podobnych i najmniej podobnych obiektów, czyli takich między którymi obliczona odległość jest najmniejsza i największa
euclides_mat <- as.matrix(distance)
# Output most similar pair
grupa1[
which(euclides_mat == min(euclides_mat[euclides_mat != min(euclides_mat)]),
arr.ind = TRUE)[1, ], ]## czas kwota rata_%doch wiek
## 756 24 1285 4 32
## 16 24 1282 4 32
# Output most dissimilar pair
grupa1[
which(euclides_mat == max(euclides_mat[euclides_mat != max(euclides_mat)]),
arr.ind = TRUE)[1, ], ]## czas kwota rata_%doch wiek
## 916 48 18424 1 32
## 537 6 1374 4 75
Grupowanie hierarchiczne rozpoczyna się od traktowania każdej obserwacji jako osobnego skupienia. Następnie wielokrotnie wykonuje następujące dwa kroki: (1) identyfikuje dwa najbardziej podobne do siebie klastry i (2) łączy dwa najbardziej podobne klastry. Ten iteracyjny proces trwa do momentu połączenia wszystkich klastrów. Ilustrują to poniższe schematy.
Schemat grupowania hierarchicznego
Wynikiem grupowania hierarchicznego jest dendrogram, który pokazuje hierarchiczną relację między obiektami. Właściwa interpretacja dendrogramu przy dużej liczbie obiektów jest utrudnione. Poniżej przedstawiono dendrogram utworzony za pomocą funcji hclust() przy zastosowaniu metody Warda jako metody określenia odległości między skupieniami.W metodzie tej wykorzystuje się analizę wariancji do oszacowania odległości między skupieniami. Ma ona na celu zminimalizowanie sumy kwadratów odchyleń wewnątrz klastrów. Dostępne w danym kroku podzbiory łączy się parami w nowe grupy i dla każdej z nich oblicza się wartość wariancji. Wśród utworzonych grup znajduje się tę, której wariancja jest najmniejsza. Jest to ostateczna grupa utworzona w danym kroku
mydata.hclust <- hclust(distance, method = 'ward.D2')
plot(mydata.hclust)Do określenia właściwej liczby skupień wykorzystano wskaźnik sylwetkowy (indeks shilhouette).
library(factoextra)
fviz_nbclust(normalizacja, kmeans, method = "silhouette") +
xlab("liczba skupień") +
ylab("wskaźnik sylwetkowy") +
labs(title= "") +
theme_bw() +
theme(legend.position="top",
text = element_text(size=14))Poniżej przedstawiono dendrogram z zaznaczonymi 2 grupami obiektów.
plot(mydata.hclust)
rect.hclust(mydata.hclust, k = 2, border = 1:7)Analiza skupień metodą niehierarchiczną to metoda, w której dokonuje się podziału obiektów na z góry określoną liczbę skupień. Liczba klastrów K jest wstępnie zdefiniowana, aby rozpocząć procedurę grupowania.
Poniżej dokonano podziału zbiorów na 2 grupy z wykorzystaniem funkcji kmeans()
klastry <- kmeans(normalizacja, 2, nstart = 25)
klastry$cluster## [1] 2 1 2 1 2 1 2 1 2 1 2 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 1
## [38] 2 2 2 2 2 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 1 2 2 2 1 2 2 2 2 2 2 1 2 2 1
## [75] 2 2 1 2 1 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 1 1 2 1 2 2
## [112] 2 2 1 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 1 2 1 2 2 2 2 1 2 2 2 1 2 2
## [149] 1 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 1 2 2 2
## [186] 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 1 2 2 1 1 2 2 2 2 1 2 2 2 2
## [223] 2 2 2 2 1 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [260] 2 2 2 2 2 2 2 1 2 1 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 1 1 1 1 1
## [297] 2 2 2 2 2 1 2 2 1 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1
## [334] 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2
## [371] 2 2 2 1 1 1 2 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 2 2
## [408] 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2
## [445] 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
## [482] 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 1
## [519] 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2
## [556] 2 2 2 2 2 2 2 2 1 2 2 2 2 1 1 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [593] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 2 2 1
## [630] 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 1 1 2 2 2 1 2 2 1 2 2 2 1 1 1 2 2 2 2 2 1
## [667] 2 1 2 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2
## [704] 2 2 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 1 1 2 2 2
## [741] 2 2 2 2 1 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 1
## [778] 2 1 2 1 2 2 2 1 2 2 1 1 1 2 1 2 2 2 2 1 2 2 2 2 2 2 2 1 1 2 2 1 2 2 2 1 1
## [815] 1 1 2 2 1 2 2 2 1 2 2 2 2 2 1 1 2 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2
## [852] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 1 1 1 2 2 2 2 2 1
## [889] 1 1 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 2 2 1 2 2 1 2 2 2 2 1 2 1 2 2 2 1 2 2 1
## [926] 2 2 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2
## [963] 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 1 1 2 1 2 2 1 2 1 2 2 2 2 1 2 2 2 2 1
## [1000] 1
klastry$centers## czas kwota rata_%doch wiek
## 1 1.3869997 1.4911057 -0.31213542 -0.004043789
## 2 -0.3686961 -0.3963699 0.08297271 0.001074931
klastry$size## [1] 210 790
print(klastry)## K-means clustering with 2 clusters of sizes 210, 790
##
## Cluster means:
## czas kwota rata_%doch wiek
## 1 1.3869997 1.4911057 -0.31213542 -0.004043789
## 2 -0.3686961 -0.3963699 0.08297271 0.001074931
##
## Clustering vector:
## [1] 2 1 2 1 2 1 2 1 2 1 2 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 1 1
## [38] 2 2 2 2 2 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 1 2 2 2 1 2 2 2 2 2 2 1 2 2 1
## [75] 2 2 1 2 1 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 1 1 2 1 2 2
## [112] 2 2 1 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 1 2 1 2 2 2 2 1 2 2 2 1 2 2
## [149] 1 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 1 2 2 2
## [186] 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 1 2 2 1 1 2 2 2 2 1 2 2 2 2
## [223] 2 2 2 2 1 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2
## [260] 2 2 2 2 2 2 2 1 2 1 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 1 1 1 1 1
## [297] 2 2 2 2 2 1 2 2 1 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 1
## [334] 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2
## [371] 2 2 2 1 1 1 2 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 2 2 2 2
## [408] 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2
## [445] 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
## [482] 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 1
## [519] 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2
## [556] 2 2 2 2 2 2 2 2 1 2 2 2 2 1 1 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [593] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 2 2 1
## [630] 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 1 1 2 2 2 1 2 2 1 2 2 2 1 1 1 2 2 2 2 2 1
## [667] 2 1 2 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2
## [704] 2 2 2 1 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 1 1 2 2 2
## [741] 2 2 2 2 1 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 1
## [778] 2 1 2 1 2 2 2 1 2 2 1 1 1 2 1 2 2 2 2 1 2 2 2 2 2 2 2 1 1 2 2 1 2 2 2 1 1
## [815] 1 1 2 2 1 2 2 2 1 2 2 2 2 2 1 1 2 2 1 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2
## [852] 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 1 1 1 2 2 2 2 2 1
## [889] 1 1 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 2 2 1 2 2 1 2 2 2 2 1 2 1 2 2 2 1 2 2 1
## [926] 2 2 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2
## [963] 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2 2 2 1 1 2 1 2 2 1 2 1 2 2 2 2 1 2 2 2 2 1
## [1000] 1
##
## Within cluster sum of squares by cluster:
## [1] 845.4244 2022.2617
## (between_SS / total_SS = 28.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Wskazanie wartości średnich danych wyjściowych dla poszczególnych grup
aggregate(grupa1, by=list(cluster=klastry$cluster), mean)## cluster czas kwota rata_%doch wiek
## 1 1 37.62857 7480.257 2.623810 35.50000
## 2 2 16.45696 2152.410 3.065823 35.55823
Przypisanie obiektów do poszczególnych skupień i obliczenie podstawowych statystyk zmiennych w obrębie grupy:
### przypisanie obiektóW do grupy
grupa1$klaster <- as.factor(klastry$cluster)
library(dplyr)
klaster1<-filter(grupa1, klaster == "1")
summary(klaster1)## czas kwota rata_%doch wiek klaster
## Min. : 6.00 Min. : 1845 Min. :1.000 Min. :21.0 1:210
## 1st Qu.:30.00 1st Qu.: 5238 1st Qu.:2.000 1st Qu.:27.0 2: 0
## Median :36.00 Median : 6880 Median :2.000 Median :33.0
## Mean :37.63 Mean : 7480 Mean :2.624 Mean :35.5
## 3rd Qu.:48.00 3rd Qu.: 9020 3rd Qu.:4.000 3rd Qu.:42.0
## Max. :72.00 Max. :18424 Max. :4.000 Max. :75.0
klaster2<-filter(grupa1, klaster == "2")
summary(klaster2)## czas kwota rata_%doch wiek klaster
## Min. : 4.00 Min. : 250 Min. :1.000 Min. :19.00 1: 0
## 1st Qu.:12.00 1st Qu.:1259 1st Qu.:2.000 1st Qu.:27.00 2:790
## Median :15.00 Median :1890 Median :4.000 Median :33.00
## Mean :16.46 Mean :2152 Mean :3.066 Mean :35.56
## 3rd Qu.:24.00 3rd Qu.:2824 3rd Qu.:4.000 3rd Qu.:42.00
## Max. :39.00 Max. :7865 Max. :4.000 Max. :75.00
Wizualizacja położenia obiektów w dwuwymiarowej przestrzeni:
fviz_cluster(klastry, data = normalizacja)W analizie skupień wykorzystywane mogą być nie tylko zmienne ilościowe, ale także jakościowe. W celu podziału kredytobiorców na jednorodne grupy wybrano następujące zmienne: ilościowe: okres kredytu (2), kwota kredytu (5), oraz zmienne jakościowe: stan konta czekowego (1), historia kredytowa (3), staż pracy (7), płeć (9), rodzaj zabezpieczenia (12). Istnieje kilka sposobów określenia odległości między obiektami, w przypadku zmiennych mieszanych. W analizie wykorzystano odległość Gowera. Odległość między dwoma obiektami mierzona na podstawie odległości Gowera jest liczbą od 0 (w przypadku odległości między obiektami identycznymi) do 1 (w przypadku obiektów maksymalnie różnych).
grupa2<-credit[,c(1,2,3,5,7,9,12)]Aby wyznaczyć odległość Gowera między dwom obiektami wykorzystać można funkcję daisy() wskazując, jako metodę wyznaczenia odległości ““gower”.
gower_dist <- daisy(grupa2,
metric = "gower")Poniżej przedstawiono statystyki dotyczące odległości miedzy wszystkim obiektami ze zbioru grupa2 oraz pierwsze 15 odległości między obiektami. Wartości te oznaczają odpowiednio odległość między 1 a 2, 1 a 3, 1 a 4 obiektem, itd.
summary(gower_dist)## 499500 dissimilarities, summarized :
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0001729 0.4359000 0.4995800 0.5113400 0.6147900 0.9480800
## Metric : mixed ; Types = N, I, N, I, N, N, N
## Number of objects : 1000
head(gower_dist, 15)## [1] 0.6972529 0.3056060 0.5569694 0.4954783 0.6964419 0.4794822 0.6798797
## [8] 0.4560329 0.5109446 0.7278812 0.6843380 0.7300192 0.1809081 0.5921755
## [15] 0.6101319
Aby znaleźć w całym zbiorze obserwacji obiekty najbardziej i najmniej do siebie podobne pod względem analizowanych cech obiekt gower_dist należy przekształcić w macierz, a następnie wyszukując w niej wartości minimalne i maksymalne odszukać odpowiadające tym odległościom najbardziej i najmniej podobne obiekty.
gower_mat <- as.matrix(gower_dist)
# Output most similar pair
grupa2[
which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]),
arr.ind = TRUE)[1, ], ]## konto_czekowe czas historia kwota staz_pracy plec zabezpieczenie
## 537 < 0 6 istniejace_spł 1374 bezrobotny K ubezpieczenie
## 48 < 0 6 istniejace_spł 1352 bezrobotny K ubezpieczenie
# Output most dissimilar pair
grupa2[
which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]),
arr.ind = TRUE)[1, ], ]## konto_czekowe czas historia kwota staz_pracy plec zabezpieczenie
## 751 < 0 6 istniejace_spł 428 >7 K ubezpieczenie
## 638 brak 60 opoznienia 15653 4-7 M samochod
W celu przeprowadzenia grupowania niehierarchicznego potrzebne jest wstępne określenie liczby skupień, na które należy podzielić analizowane obiekty. Podobnie jak w przypadku analizy zmiennych ilościowych do wyznaczenia optymalnej liczby skupień wykorzystano wskaźnik sylwetkowy.
sil_width <- c(NA)
for(i in 2:15){
pam_gower <- pam(gower_dist,
diss = TRUE,
k = i)
sil_width[i] <- pam_gower$silinfo$avg.width
}
##Plot sihouette width (higher is better)
plot(1:15, sil_width,
xlab = "Number of clusters",
ylab = "Silhouette Width")
lines(1:15, sil_width)Przypisanie obiektów do poszczególnych skupień i charakterystyka obiektóW wchodzących w skład wybranych grupa:
klastry2 <- pam(gower_dist,
diss = TRUE,
k = 13)
grupa2$klastry <-as.factor(klastry2$clustering)
klaster1<-filter(grupa2, klastry == "1")
summary(klaster1)## konto_czekowe czas historia kwota
## < 0 : 5 Min. : 4.00 brak : 1 Min. : 522
## >200 : 7 1st Qu.: 9.00 istniejace_spł: 4 1st Qu.: 1074
## 0-200: 8 Median :12.00 krytyczne :65 Median : 1499
## brak :54 Mean :14.59 opoznienia : 3 Mean : 2221
## 3rd Qu.:15.00 wszystkie_spł : 1 3rd Qu.: 2172
## Max. :60.00 Max. :13756
##
## staz_pracy plec zabezpieczenie klastry
## <1 rok : 3 K:11 brak :14 1 :74
## >7 :59 M:63 nieruchomosc :45 2 : 0
## 1-4 : 0 samochod : 3 3 : 0
## 4-7 : 9 ubezpieczenie:12 4 : 0
## bezrobotny: 3 5 : 0
## 6 : 0
## (Other): 0
klaster2<-filter(grupa2, klastry == "2")
summary(klaster2)## konto_czekowe czas historia kwota
## < 0 : 5 Min. : 4.00 brak : 2 Min. : 343
## >200 : 6 1st Qu.: 9.00 istniejace_spł:56 1st Qu.: 813
## 0-200:43 Median :12.00 krytyczne : 4 Median :1295
## brak :13 Mean :14.42 opoznienia : 0 Mean :1895
## 3rd Qu.:18.00 wszystkie_spł : 5 3rd Qu.:2302
## Max. :48.00 Max. :9960
##
## staz_pracy plec zabezpieczenie klastry
## <1 rok :39 K:58 brak : 3 2 :67
## >7 : 2 M: 9 nieruchomosc :53 1 : 0
## 1-4 :12 samochod : 7 3 : 0
## 4-7 : 9 ubezpieczenie: 4 4 : 0
## bezrobotny: 5 5 : 0
## 6 : 0
## (Other): 0
klaster3<-filter(grupa2, klastry == "3")
summary(klaster3)## konto_czekowe czas historia kwota
## < 0 : 6 Min. : 5.0 brak : 0 Min. : 368
## >200 : 3 1st Qu.:11.0 istniejace_spł:50 1st Qu.: 1264
## 0-200:47 Median :15.0 krytyczne : 6 Median : 2273
## brak :13 Mean :18.7 opoznienia :10 Mean : 3075
## 3rd Qu.:24.0 wszystkie_spł : 3 3rd Qu.: 3976
## Max. :48.0 Max. :14555
##
## staz_pracy plec zabezpieczenie klastry
## <1 rok : 7 K: 5 brak : 2 3 :69
## >7 : 4 M:64 nieruchomosc : 9 1 : 0
## 1-4 : 7 samochod : 9 2 : 0
## 4-7 :46 ubezpieczenie:49 4 : 0
## bezrobotny: 5 5 : 0
## 6 : 0
## (Other): 0
klaster12<-filter(grupa2, klastry == "12")
summary(klaster12)## konto_czekowe czas historia kwota
## < 0 : 1 Min. : 6.00 brak : 2 Min. : 250
## >200 : 4 1st Qu.:12.00 istniejace_spł: 3 1st Qu.: 1312
## 0-200: 5 Median :18.00 krytyczne :47 Median : 1892
## brak :58 Mean :18.44 opoznienia :13 Mean : 2762
## 3rd Qu.:24.00 wszystkie_spł : 3 3rd Qu.: 3456
## Max. :60.00 Max. :10127
##
## staz_pracy plec zabezpieczenie klastry
## <1 rok : 5 K:14 brak : 8 12 :68
## >7 : 0 M:54 nieruchomosc :44 1 : 0
## 1-4 :59 samochod : 6 2 : 0
## 4-7 : 2 ubezpieczenie:10 3 : 0
## bezrobotny: 2 4 : 0
## 5 : 0
## (Other): 0
klaster13<-filter(grupa2, klastry == "13")
summary(klaster13)## konto_czekowe czas historia kwota
## < 0 :10 Min. : 6.00 brak : 0 Min. : 682
## >200 : 3 1st Qu.:18.50 istniejace_spł: 7 1st Qu.: 2057
## 0-200: 3 Median :24.00 krytyczne :48 Median : 2932
## brak :50 Mean :25.85 opoznienia : 6 Mean : 4357
## 3rd Qu.:32.25 wszystkie_spł : 5 3rd Qu.: 6129
## Max. :60.00 Max. :15653
##
## staz_pracy plec zabezpieczenie klastry
## <1 rok : 1 K:11 brak : 3 13 :66
## >7 :11 M:55 nieruchomosc : 2 1 : 0
## 1-4 : 1 samochod :54 2 : 0
## 4-7 :49 ubezpieczenie: 7 3 : 0
## bezrobotny: 4 4 : 0
## 5 : 0
## (Other): 0