#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.
Segue os pacotes a serem utilizados:
library(clValid)
library(factoextra)
library(gridExtra)
library(NbClust)
library(tidyverse)
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
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.