Cluster

Introdução

Você não precisa usar o R… pode usar o Python também.


Análise de Cluster

O nome Cluster contém um amplo conjunto de técnicas para localizar subgrupos de observações em um banco de dados. Quando agrupamos observações, queremos que as observações no mesmo grupo sejam semelhantes e as observações em grupos diferentes sejam diferentes. Como não há uma variável resposta, esse é um método não supervisionado. O agrupamento nos permite identificar quais observações são semelhantes e potencialmente categorizá-las.

Existem diferentes tipos de métodos de cluster. hoje vamos discutir como fazer:

  1. Cluster hierárquico
  2. Cluster via K-means e K-means++
  3. Cluster fuzzy
  4. Cluster para variaveis categóricas
  5. Cluster PAM
  6. t-SNE plot

Obs- essa lista não representa uma ordem.

No total, há três decisões (relacionadas entre si) que precisam acontecer em um método de análise de cluster:

  1. Cálculo de Distância.
  2. Escolher um algoritmo de cluster.
  3. Selecionando o número de clusteres.

Preparação do banco de dados

Para executar uma análise de cluster no R,o banco de dados devem ser preparados da seguinte maneira:

  1. As linhas são observações (indivíduos) e colunas são as variáveis.
  2. Qualquer valor ausente (missing) nos dados deve ser removido ou estimado.
  3. Os dados devem ser padronizados (ou seja, dimensionados) para tornar variáveis comparáveis. Lembre-se de que a padronização consiste em transformar as variáveis de forma que elas tenham média zero e desvio padrão igual a um.

Cluster hierárquico

De acordo com https://uc-r.github.io/hc_clustering, o agrupamento hierárquico pode ser dividido em dois tipos principais: AGNES e DIANA.

  1. AGNES (agrupamento aglomerado). Funciona de maneira ascendente. Ou seja, cada objeto é inicialmente considerado como um cluster de elemento único. Em cada etapa do algoritmo, os dois clusters mais semelhantes são combinados em um novo cluster maior (nós). Este procedimento é iterado até que todos os pontos sejam membros de apenas um único grande cluster (raiz). O resultado é uma árvore chamada dendograma.
  2. DIANA. Funciona de maneira descendente. O algoritmo é uma ordem inversa de AGNES. Começa com a raiz, na qual todos os objetos são incluídos em um único cluster. Em cada etapa da iteração, o cluster mais heterogêneo é dividido em dois. O processo é iterado até que todos os objetos estejam em seu próprio cluster.
#----------------------------------------------
# Hierarquico
#----------------------------------------------
library(cluster)    # clustering algorithms
library(factoextra) # clustering visualization
library(dendextend) # for comparing two dendrograms

# To standarize the variables
wine.stand <- scale(wine[-1])  

# Dissimilarity matrix
d <- dist(na.omit(wine.stand), method = "euclidean")

# Hierarchical clustering using Complete Linkage
hc1 <- hclust(d, method = "complete" )
plot(hc1, cex = 0.6, hang = -1)

#Agglomerative Nesting (Hierarchical Clustering)
hc2 <- agnes(na.omit(wine.stand), method = "ward")
pltree(hc2, cex = 0.6, hang = -1, main = "Dendrograma") 

# DIvisive ANAlysis Clustering - DIANA
hc3 <- diana(na.omit(wine.stand),metric = "manhattan")

# Cut tree into 5 groups
tres_gruspos <- cutree(as.hclust(hc3), k = 3)
#dados_completos<-merge(wine.stand,tres_grupos,by="row.names",all.x=TRUE)

Correlação Cofonética no R

A distância cofenética entre duas observações que foram agrupadas é definida como a dissimilaridade intergrupos na qual as duas observações são combinadas primeiro em um único agrupamento.

Pode-se argumentar que um dendrograma é um resumo apropriado de dados se a correlação entre as distâncias originais e as distâncias copenéticas for alta.

corr_coph<-cophenetic(hc1)
#corr_coph

Cluster K-means e K-means-plus-plus

O Cluster K-means é o método de agrupamento mais simples e mais usado para dividir um conjunto de dados em um conjunto de k grupos.

# K-Means
k_means_2 <- kmeans(wine.stand, 2) # k = 2
attributes(k_means_2)
$names
[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      

$class
[1] "kmeans"
# Centroids:
k_means_2$centers
     Alcohol      Malic         Ash Alcalinity  Magnesium    Phenols Flavanoids
1  0.3248845 -0.3529345  0.05207966 -0.4899811  0.3206911  0.7826625  0.8235093
2 -0.3106038  0.3374209 -0.04979045  0.4684435 -0.3065948 -0.7482598 -0.7873111
  Nonflavanoids Proanthocyanins      Color        Hue   Dilution    Proline
1    -0.5921337       0.6378483 -0.1024529  0.5633135  0.7146506  0.6051873
2     0.5661058      -0.6098110  0.0979495 -0.5385525 -0.6832374 -0.5785857
# Clusters:
k_means_2$cluster
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 2 1 1 2 2 1 2 1 2 1
 [75] 1 2 1 2 1 1 1 1 2 2 1 1 2 2 2 2 2 2 2 1 1 1 2 1 1 1 1 2 2 2 1 2 2 2 2 1 1
[112] 2 2 2 2 1 2 2 2 2 1 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[149] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# Cluster size:
k_means_2$size
[1] 87 91
# Visualização
fviz_cluster(k_means_2, data = wine.stand)