Cel

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

Grupowanie na podstawie cech ilościowych

Przygotowanie danych

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

Standaryzacja

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

Wyznaczenie odległości

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

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)

Grupowanie niehierarchiczne

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)

Grupowanie na podstawie cech ilościowych i jakościowych

Przygotowanie danych

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

Wyznaczenie odległości

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

Grupowanie niehierarchiczne

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)

Charakterystyka poszczególnych skupień

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