#Atividade de clusterização

A minha base de dados é um questionÔrio respondido. Cada coluna é uma questão e as alternativas escolhidas estão numeradas de acordo com a quantidade de alternativas - exemplo: as questões com apenas 3 alternativas terão suas alternativas numeradas de 1 a 3.

respCode <- read.csv("respCode.csv")[, -1]
df1 <- scale(respCode[,-6])
head(df1)
##              Q1         Q2         Q3        Q4        Q5
## [1,] -0.9192672 -0.4697426 -1.2451357 -1.899552 -1.312115
## [2,] -0.9192672 -0.4697426  0.3881894 -0.515238 -1.312115
## [3,] -0.3718798  1.1054845 -1.2451357 -0.515238 -1.312115
## [4,] -0.3718798 -0.4697426  0.3881894 -0.515238 -1.312115
## [5,] -0.9192672 -0.4697426 -1.2451357 -0.515238 -1.312115
## [6,] -0.9192672 -0.4697426 -1.2451357 -1.899552 -1.312115

Aplicou-se a função scale() para normalizar os dados para o processo que virÔ a seguir.
Esta atividade pretende identificar qual é o melhor algoritmo de clusterização para ser aplicada à minha base de dados.

Pacotes

Segue os pacotes a serem utilizados:

library(clValid)
library(factoextra)
library(gridExtra)
library(NbClust)
library(tidyverse)

Verificando melhor algoritmo de agrupamento

SerÔ utilizada a função clValid() para mostrar os scores dos algoritmos de clusterização que melhor representam os grupos da minha base de dados.

clmethods <- c("hierarchical","kmeans","pam")
intern <- clValid(df1, nClust = 3:6,
                  clMethods = clmethods, validation = "internal")
summary(intern)
## 
## Clustering Methods:
##  hierarchical kmeans pam 
## 
## Cluster sizes:
##  3 4 5 6 
## 
## Validation Measures:
##                                  3       4       5       6
##                                                           
## hierarchical Connectivity  12.1845 18.7988 23.8480 24.1480
##              Dunn           0.2729  0.2729  0.2729  0.2884
##              Silhouette     0.3703  0.3507  0.2619  0.3537
## kmeans       Connectivity  24.7738 26.0071 34.5536 41.1425
##              Dunn           0.2447  0.1061  0.1186  0.1278
##              Silhouette     0.3907  0.3990  0.3890  0.3914
## pam          Connectivity  44.2960 41.7345 32.0742 46.6496
##              Dunn           0.0940  0.1007  0.1153  0.1153
##              Silhouette     0.3710  0.4034  0.4351  0.4739
## 
## Optimal Scores:
## 
##              Score   Method       Clusters
## Connectivity 12.1845 hierarchical 3       
## Dunn          0.2884 hierarchical 6       
## Silhouette    0.4739 pam          6

Pretendia-se escolher uma quantidade de grupos entre 3 e 6. A função summary() indica 3 opções de algoritmos que melhor representam os grupos em Optimal scores com base na conectividade dentro dos clusters. O Escolhido foi o algoritmo hierÔrquico com 3 cluters.
Também é possível ver abaixo que o algoritmo de aglomeração hierÔrquica com 3 clusters apresenta um bom score para estabilidade.

stab <- clValid(df1, nClust = 3:6, clMethods = clmethods,
                validation = "stability")
optimalScores(stab)
##          Score       Method Clusters
## APN 0.04737359 hierarchical        3
## AD  1.75856314          pam        6
## ADM 0.38284581 hierarchical        3
## FOM 0.89807186       kmeans        6

Aplicando o agrupamento hierƔrquico

Para a aplicação desse algoritmo de agrupamento é exigido o que se escolha um método de clusterização e de distância. Levando em consideração que a nossa base de dados é formada por dados qualitativos (respostas de um questionÔrio), o recomendado por Ferreira e colaboradores, Filho, Betarelli Junior e Documentação R, são as técnicas de single, complete e average, e os métodos de distância euclidean, manhattan e maximum. Essas técnicas e métodos serão combinados e testados a fim de encontrar a melhor clusterização dos dados.

methodsHc <- c("single", "complete", "average")

methodsDist <- c("euclidean", "maximum", "manhattan")

Abaixo segue a função para auxiliar na testagem do método de distância.

res.dist <- function(x){
  dist(df1, method = methodsDist[x])
}

Para identificar qual combinação representa o melhor agrupamento dos meus dados, utilizar-se-Ô uma função (correlacao) que lista os coeficientes de correlação entre os itens combinados.

correlacao <- function(x,y){
  res.dist <- dist(df1, method = methodsDist[x])
  res.hc <- hclust(res.dist, method = methodsHc[y])
  res.coph <- cophenetic(res.hc)
  cor(res.dist, res.coph)
}
for(i in 1:3){
  for (j in 1:3){
    a <- paste("D:", methodsDist[i], "Hc:", methodsHc[j], "Cor:", correlacao(i, j))
    print(a)
  }
}
## [1] "D: euclidean Hc: single Cor: 0.732611719657094"
## [1] "D: euclidean Hc: complete Cor: 0.762922345507841"
## [1] "D: euclidean Hc: average Cor: 0.868420195330044"
## [1] "D: maximum Hc: single Cor: 0.71353676938375"
## [1] "D: maximum Hc: complete Cor: 0.739869150289472"
## [1] "D: maximum Hc: average Cor: 0.861234769855372"
## [1] "D: manhattan Hc: single Cor: 0.62487705718652"
## [1] "D: manhattan Hc: complete Cor: 0.633872457025551"
## [1] "D: manhattan Hc: average Cor: 0.825869022093778"

Percebe-se que a técnica average se destaca com maior coeficiente dentre as combinações. A combinação com maior coeficiente de relação é a average + euclidean.

Segue o plot do dendograma resultante da clusterização.

plot1 <- fviz_dend(
  hclust(d = res.dist(1), method = methodsHc[3]), 
  cex = 0.5, main = "Dend-D:euclidean-M:average")
plot1

Dividindo o dendograma em 3 grupos:

res.dist <- dist(df1, method = methodsDist[1])
res.hc <- hclust(res.dist, method = methodsHc[3])
grp <- cutree(res.hc, k = 3)

Ɖ possĆ­vel validar o agrupamento feito de maneira interna. Observe abaixo que a divisĆ£o em 3 clusters foi a melhor escolha.

b <- NbClust(df1, distance = methodsDist[1], min.nc = 3, max.nc = 6, method = methodsHc[3], index = "silhouette")

b[1:2]
## $All.index
##      3      4      5      6 
## 0.3703 0.3507 0.2619 0.3537 
## 
## $Best.nc
## Number_clusters     Value_Index 
##          3.0000          0.3703

Observe agora como ficou o agrupamento feito:

Outra forma de visualizar esse agrupamento Ʃ atravƩs de um scatterplot.