Tutorial R Módulo 8. Análise de Classificação Não-hierárquica. K-Means

Disciplina de Ecologia Numérica1

Autores

Prof. Elvio S. F. Medeiros

Laboratório de Ecologia

Universidade Estadual da Paraíba

Campus V, João Pessoa, PB

Data de Publicação

24 de maio de 2023

Resumo
O método K-means é um algoritmo de aprendizado de máquina não supervisionado utilizado para agrupar dados em clusters. Ele é um dos métodos mais populares e amplamente utilizados para tarefas de clustering. O objetivo do algoritmo K-means é particionar um conjunto de dados em K clusters, onde K é um valor pré-definido pelo usuário. Cada cluster é representado por seu centróide, que é o ponto médio dos dados pertencentes a esse cluster. O algoritmo busca minimizar a variância intra-cluster, ou seja, a soma dos quadrados das distâncias entre os pontos de um cluster e o centróide desse cluster.

1 Introdução

O método K-means é um algoritmo de aprendizado de máquina não supervisionado utilizado para agrupar dados em clusters. Ele é um dos métodos mais populares e amplamente utilizados para tarefas de clustering.

O objetivo do algoritmo K-means é particionar um conjunto de dados em K clusters, onde K é um valor pré-definido pelo usuário. Cada cluster é representado por seu centróide, que é o ponto médio dos dados pertencentes a esse cluster. O algoritmo busca minimizar a variância intra-cluster, ou seja, a soma dos quadrados das distâncias entre os pontos de um cluster e o centróide desse cluster.

O processo de clustering pelo K-means envolve os seguintes passos:

  1. Inicialização: Seleção aleatória de K centróides iniciais ou usando outros métodos de inicialização.

  2. Atribuição: Cada ponto de dados é atribuído ao cluster cujo centróide está mais próximo.

  3. Atualização: Recalcula-se o centróide de cada cluster com base nos pontos de dados atribuídos a ele.

  4. Repetição: Os passos 2 e 3 são repetidos até que os centróides dos clusters se estabilizem ou um critério de parada seja atingido.

O algoritmo K-means é iterativo e pode convergir para uma solução ótima local. Portanto, é comum executar o algoritmo várias vezes com diferentes inicializações aleatórias para melhorar a qualidade do clustering. A escolha do número de clusters (K) é um parâmetro importante e pode afetar os resultados.

O K-means é amplamente aplicado em diversas áreas, como análise de dados, mineração de dados, reconhecimento de padrões e segmentação de imagens. Ele é eficiente e escalável, tornando-o uma opção popular para clustering de grandes conjuntos de dados. No entanto, é importante ressaltar que o K-means assume que os clusters são esféricos e de tamanho similar, o que nem sempre é o caso em todos os conjuntos de dados.

2 Organização básica

rm(list=ls(all=TRUE)) ##LIMPA A MEMORIA
cat("\014") #limpa o console 
dev.off() #apaga os graficos, se houver algum

Instalando os pacotes necessários para esse módulo

install.packages("tidyverse")
install.packages("openxlsx")
install.packages("vegan")
library(tidyverse)

Os códigos acima, são usados para instalar os pacotes necessários para este módulo. Depois de instalar um pacote, você precisa carregá-lo na sua sessão R com a função library(). Por exemplo, no código acima, carregamos o pacote tidyverse, usando a função library(tidyverse).

Agora vamos definir o diretório de trabalho. Esse código é usado para obter e definir o diretório de trabalho atual no R. O comando getwd() retorna o caminho do diretório onde o R está lendo e salvando arquivos. O comando setwd() muda esse diretório de trabalho para o caminho especificado entre aspas. No seu caso, você deve ajustar o caminho para o seu próprio diretório de trabalho. Lembre de usar a barra “/” entre os diretórios. E não a contra-barra “\”.

getwd()
setwd("C:/Seu/Diretório/De/Trabalho")

Alternativamente você pode ir na barra de tarefas e escolhes as opções:
SESSION -> SET WORKING DIRECTORY -> CHOOSE DIRECTORY

2.1 Sobre os dados do PPBio

A planilha ppbio contém os dados de abundância de espécies em diferentes unidades amostrais (UA’s). A base teórica dos dados do PPBio para o presente estudo pode ser vista em Base Teórica. Leia antes de prosseguir.

2.2 Importando a planilha de trabalho

Note que o sómbolo # em programação R significa que o texto que vem depois dele é um comentário e não será executado pelo programa. Isso é útil para explicar o código ou deixar anotações. Ajuste a segunda linha do código abaixo para refletir “C:/Seu/Diretório/De/Trabalho/Planilha.xlsx”.

library(openxlsx)
ppbio <- read.xlsx("D:/Elvio/OneDrive/Disciplinas/_EcoNumerica/5.Matrizes/ppbio06p.xlsx",
                   rowNames = T,
                   colNames = T,
                   sheet = "Sheet1")
str(ppbio)
ppbio_ma <- as.matrix(ppbio) #lê ppbio como uma matriz
str(ppbio_ma)
#ppbio
#ppbio_ma

2.3 Reset point

Aqui substitui-se uma nova matriz de dados, caso seja necessário refazer a análise com uma matriz gerada nesse código.
1#ppbio <- t(ppbio)
1
Substitua a nova matriz aqui. Caso seja necessário.

No interesse de sistematizar o uso das várias matrizes que são comumente usadas em uma AMD, a tabela a seguir (Tabela 1) resume seus tipos e abreviações.

Tabela 1: Nomenclatura das matrizes em AMD em relação aos atributos das colunas.
Nome Atributos (colunas) Abreviação no R
Matriz comunitaria Os atributos são táxons ou OTU's (Unidades Taxonômicas Operacionais) (ex. espécies, gêneros, morfotipos) m_com
Matriz ambiental Os atributos são dados ambientais e variáveis físicas e químicas (ex. pH, condutividade, temperatura) m_amb
Matriz de habitat Os atributos são elementos da estrutura do habitat (ex. macróficas, algas, pedras, lama, etc) m_hab
Matriz bruta Os atributos ainda não receberam nenhum tipo de tratamento estatísco (valores brutos, como coletados) m_brt
Matriz transposta Os atributos foram transpostos para as linhas m_t
Matriz relativizada Os atributos foram relativizados por um critério de tamanho ou de variação (ex. dividir os valores de cada coluna pela soma) m_rel
Matriz transformada Foi aplicado um operador matemático a todos os atributos (ex. raiz quadrada, log) m_trns
Matriz de trabalho Qualquer matriz que seja o foco da análise atual (ex. comunitária, relativizada, etc) m_trab

2.3.1 Outra forma de achar e importar uma planilha

getwd()
ppbio <- read.xlsx(file.choose(),
                   rowNames = T, colNames = T,
                   sheet = "Sheet1")

3 Classificação

Criando uma classificação baseada na distância Bray-Curtis e UPGMA como método de fusão, criada a partir da matriz de dados relativizada pelo total das colunas e transformada pelo arco seno da raiz quadrada.

library(vegan)
ppbio_asrq <- asin(sqrt(decostand(ppbio,
                               method="total", MARGIN = 2)))
vegdist <- vegdist(ppbio_asrq, method = "bray",
                   diag = TRUE,
                   upper = FALSE)
cluster <- hclust(vegdist, method = "average")
plot (cluster, main = "Cluster Dendrogram - Bray-Curtis")
rect.hclust(cluster, k = 3, h = NULL) 
#h = 0.8 fornece os grupos formados na altura h
as.matrix(vegdist)[1:6, 1:6]
          S-R-CT1   S-R-CP1   S-A-TA1   S-R-CT2   S-R-CP2   S-A-TA2
S-R-CT1 0.0000000 0.8743721 0.9338269 0.6274997 0.8106894 0.9420728
S-R-CP1 0.8743721 0.0000000 0.6833816 0.7759468 0.7726098 0.7342613
S-A-TA1 0.9338269 0.6833816 0.0000000 0.8789631 0.9178304 0.5700984
S-R-CT2 0.6274997 0.7759468 0.8789631 0.0000000 0.7280378 0.8836068
S-R-CP2 0.8106894 0.7726098 0.9178304 0.7280378 0.0000000 0.8915271
S-A-TA2 0.9420728 0.7342613 0.5700984 0.8836068 0.8915271 0.0000000

4 Histórico das fusões

Criamos agora o histórico das fusões dos objetos. Na tabela gerada, as duas primeiras colunas (No. e UA) representam o número (No.) atribuido a cada unidade amostral (UA). As duas colunas subsequentes (Cluster1 e Cluster2) representam o par de objetos (indicado pelo sinal de “-”) ou grupo de objetos (indicado pela ausência do sinall de “-”) que foram agrupadas. A coluna Height, indica o valor de similaridade na qual um dado par de objetos (ou grupo de objetos) foi agrupado. O valor aproximado de Height também pode ser visualizado no eixo do dendrograma. Por último, na coluna Histórico, é mostrada a sequência das fusões da primeira até a m-1 última fusão entre os dois últimos grupos. Nesse caso, 22.

merge <- as.data.frame(cluster$merge)
merge[nrow(merge)+1,] = c("0","0")
height <- as.data.frame(round(cluster$height, 2))
height[nrow(height)+1,] = c("1.0")
fusoes <- data.frame(Cluster = merge, Height = height)
colnames(fusoes) <- c("Cluster1", "Cluster2", "Height")
UA <- rownames_to_column(as.data.frame(ppbio_asrq[, 0]))
colnames(UA) <- c("No. e UA")
fusoes <- cbind(UA, fusoes)
fusoes$Histórico <- 1:nrow(fusoes)
fusoes
   No. e UA Cluster1 Cluster2 Height Histórico
1   S-R-CT1      -20      -23   0.14         1
2   S-R-CP1       -8      -11   0.26         2
3   S-A-TA1      -17        1   0.28         3
4   S-R-CT2      -19      -22   0.37         4
5   S-R-CP2       -6      -12   0.41         5
6   S-A-TA2       -4      -10   0.46         6
7   S-R-CT3      -16        4   0.48         7
8   S-R-CP3       -5        2   0.53         8
9   S-A-TA3      -13        7   0.56         9
10  S-R-CT4       -9        5   0.57        10
11  S-R-CP4       -7        6   0.59        11
12  S-A-TA4      -14        3   0.61        12
13  B-A-MU1       -2       -3   0.68        13
14  B-A-GU1       -1       11   0.68        14
15  B-R-PC2      -15      -18   0.69        15
16  B-A-MU2      -21       14   0.75        16
17  B-A-GU2       10       13   0.76        17
18  B-R-PC3        9       12   0.79        18
19  B-A-MU3        8       16    0.8        19
20  B-A-GU3       17       19   0.85        20
21  B-R-PC4       15       20   0.89        21
22  B-A-MU4       18       21   0.91        22
23  B-A-GU4        0        0    1.0        23

No código acima, h = 0.8 fornece os grupos formados na altura h do eixos das distâncias do dendrograma. Ou seja, no dendrograma, o eixo y (HEIGHT, “h”) representa o valor da distancia escolhida entre os objetos ou grupos de objetos. Portanto, se dois objetos ou grupos de objetos foram agrupados num dado valor (0.8, por exemplo) no eixo height, isso significa que a distancia entre esses objetos é 0.8.

5 Algoritmo K-Means - Versão simplificada

Este vídeo do YouTube é um bom exemplo de como fazer uma Classificação K-Means.

5.1 Organização básica primeiro

dev.off() #apaga os graficos

5.2 Instalar pacotes necessários

install.packages("factoextra")
install.packages("FactoMineR")
install.packages("cluster")
install.packages("gridExtra")

5.3 Importando matriz

library(openxlsx)
ppbioh <- read.xlsx("D:/Elvio/OneDrive/Disciplinas/_EcoNumerica/5.Matrizes/ppbio06h.xlsx",
                   rowNames = T, colNames = T,
                   sheet = "Sheet1")

5.4 Reset point

Aqui substitui-se uma nova matriz de dados, caso seja necessário refazer a análise com uma matriz gerada nesse código.
1m_trab <- (ppbioh)
#m_brt <- (ppbioh)
1
Substitua a nova matriz aqui. Caso seja necessário.

5.5 Algumas análises exploatórias

Dados brutos

range(m_trab)
boxplot(t(m_trab))
[1]   0 725

5.6 Relativização e transformação

Dados transformados pela função expressa em m_trns.

m_trns <- sqrt(m_trab)

range(m_trns)
boxplot(t(m_trns))
[1]  0.00000 26.92582

5.6.1 Gráficos comparativos

par (mfrow = c (1,2))
boxplot(t(m_trab), log = "", las = 2,
        ylim = c(floor(min(m_trab)), ceiling(max(m_trab))),
        main = "Dados brutos")
boxplot(t(m_trns), log = "", las = 2,
        ylim = c(floor(min(m_trns)), ceiling(max(m_trns))),
        main = "Dados relativisados e transformados")

dev.off() #apaga os graficos

6 Determinando o número ideal de clusteres

6.1 Reescalar os dados primeiro usando a função scale()

library(factoextra)
library(gridExtra)

m_trns_s <- scale(m_trns)

methods <- c("silhouette", "wss", "gap_stat")
plots <- list()
for (method in methods) {
  plot_title <- paste("No. de clusteres método ", method)
  
  if (method == "silhouette") {
    plot <- fviz_nbclust(m_trns_s, kmeans, method = method) +
      ggtitle(plot_title)
  } else {
    plot <- fviz_nbclust(m_trns_s, kmeans, method = method, nstart = 25) +
      ggtitle(plot_title)
  }
  plots[[method]] <- plot
}

No código acima, as funções scale(), reescala a matriz, fviz_ cria um gráfico que sugere o número ideal de clusteres para serem usados, e o argumento method= indica o método usado para propor o número de clusteres, que podem ser “silhouette”, “wss” e “gap_stat” (Veja Métodos de determinação de clusters em k-means nos Apêndices).

Aqui criamos uma figura com os resultados dos gráficos para cada método de proposição para o número de clusteres.

grid.arrange(grobs = plots, nrow = 3)

Com os dados reescalados, agora fazemos uma primeira tentativa. A função set.seed() estabelece um número inicial de partida de onde serã feitas as permutações aleatórias. Nesse caso, foi usado centers=n centros para calcular os agrupamentos K-Means.

set.seed(666)
kmeans <- kmeans(m_trns_s, centers = 3)
fviz_cluster(kmeans, data = m_trns_s, outlier.color = "black", outlier.shape = 19,
             ellipse.type = "convex") #ou "confidence"

6.1.1 Usando os agrupamentos do kmeans$cluster

kmeans
kmeans$cluster
grupos <- kmeans$cluster
grupos
grupos2 <- cbind(grupos, m_trab)
grupos2
K-means clustering with 3 clusters of sizes 4, 12, 7

Cluster means:
   h.macroph    h.grass   h.subveg h.overhveg   h.litter h.filalgae  h.attalgae
1 -0.3150280  0.2787469 -0.1545528 -0.5463331 -0.4568735 -0.6196900  0.17221914
2 -0.0792459  0.1399927  0.1291858 -0.4431336 -0.2631996 -0.3776205 -0.07389364
3  0.3158661 -0.3992715 -0.1331454  1.0718479  0.7122699  1.0014580  0.02826388
     h.roots      h.lrgdeb    h.smldeb      s.mud     s.sand  s.smlgrav
1 -0.3600567 -3.383080e-01 -0.31809138  0.4495893 -0.3873226 -0.8616320
2 -0.3600567  2.729861e-05 -0.09147053  0.3502293 -0.1796441 -0.1055180
3  0.8229868  1.932721e-01  0.33857313 -0.8573013  0.5292885  0.6732491
   s.lrggrav  s.cobbles     s.rocks  s.bedrock m.elevation    m.river
1 -0.5098978  0.6609166  0.61609152  0.3606712  -0.8143403  0.1064706
2 -0.3597957 -0.4852326 -0.16241204 -0.2937783   0.8040548  0.7229130
3  0.9081629  0.4541607 -0.07363165  0.2975220  -0.9130424 -1.3001197
    m.stream m.distsource m.distmouth  m.maxslope  m.maxdepth m.habdepth
1  2.0423465    2.1167522  -0.5023808 -0.87201824  0.20028902  0.8625907
2 -0.4185054   -0.3880947   0.4929779 -0.08018647 -0.01953190 -0.3796926
3 -0.4496172   -0.5442674  -0.5580303  0.63575865 -0.08096762  0.1579926
     m.width a.velocity     a.temp         a.do   a.transp
1 -1.0252345  0.8768387  0.6741010  0.180352102 -0.9252308
2  0.6315361 -0.4460512 -0.5656680 -0.005584604  0.1295467
3 -0.4967851  0.2636086  0.5845161 -0.093484737  0.3066232

Clustering vector:
S-R-CT1 S-R-CP1 S-A-TA1 S-R-CT2 S-R-CP2 S-A-TA2 S-R-CT3 S-R-CP3 S-A-TA3 S-R-CT4 
      1       3       3       1       3       3       1       3       3       1 
S-R-CP4 S-A-TA4 B-A-MU1 B-A-GU1 B-R-PC2 B-A-MU2 B-A-GU2 B-R-PC3 B-A-MU3 B-A-GU3 
      3       2       2       2       2       2       2       2       2       2 
B-R-PC4 B-A-MU4 B-A-GU4 
      2       2       2 

Within cluster sum of squares by cluster:
[1]  44.74576 230.97314 187.10019
 (between_SS / total_SS =  29.9 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      
S-R-CT1 S-R-CP1 S-A-TA1 S-R-CT2 S-R-CP2 S-A-TA2 S-R-CT3 S-R-CP3 S-A-TA3 S-R-CT4 
      1       3       3       1       3       3       1       3       3       1 
S-R-CP4 S-A-TA4 B-A-MU1 B-A-GU1 B-R-PC2 B-A-MU2 B-A-GU2 B-R-PC3 B-A-MU3 B-A-GU3 
      3       2       2       2       2       2       2       2       2       2 
B-R-PC4 B-A-MU4 B-A-GU4 
      2       2       2 
S-R-CT1 S-R-CP1 S-A-TA1 S-R-CT2 S-R-CP2 S-A-TA2 S-R-CT3 S-R-CP3 S-A-TA3 S-R-CT4 
      1       3       3       1       3       3       1       3       3       1 
S-R-CP4 S-A-TA4 B-A-MU1 B-A-GU1 B-R-PC2 B-A-MU2 B-A-GU2 B-R-PC3 B-A-MU3 B-A-GU3 
      3       2       2       2       2       2       2       2       2       2 
B-R-PC4 B-A-MU4 B-A-GU4 
      2       2       2 
        grupos h.macroph    h.grass  h.subveg h.overhveg   h.litter h.filalgae
S-R-CT1      1  8.333333 20.0000000 10.000000   0.000000  0.6666667  0.0000000
S-R-CP1      3  0.000000 23.3333340  3.000000  26.666666  2.3333333  3.3333333
S-A-TA1      3  5.833333  0.0000000 16.666666  33.333332 23.6666660 25.0000000
S-R-CT2      1  0.000000 20.0000000  0.000000   0.000000  0.0000000  0.0000000
S-R-CP2      3  0.000000  0.0000000  0.000000  33.333332  1.0000000  0.0000000
S-A-TA2      3 54.833332  0.3333333  0.000000   8.333333  1.0000000 33.3333321
S-R-CT3      1  0.000000  0.1111111  0.000000   0.000000  0.0000000  0.0000000
S-R-CP3      3  0.000000  0.0000000  0.000000   0.000000  1.5000000  6.2500000
S-A-TA3      3 44.629631  8.1111107  0.000000   0.000000  0.6666667  9.0000000
S-R-CT4      1  0.000000  4.1666665  0.000000   0.000000  0.8333333  0.0000000
S-R-CP4      3  0.000000  0.0000000  0.000000   8.333333  1.0000000 25.0000000
S-A-TA4      2 37.309525  0.0000000  0.000000   0.000000  0.5714286  0.0000000
B-A-MU1      2  0.000000 50.0000000  0.000000   0.000000  1.0000000  0.0000000
B-A-GU1      2 46.666668  0.0000000  3.333333   3.333333  0.0000000  0.0000000
B-R-PC2      2  0.000000  2.0000000  0.000000   0.000000  0.4000000  0.0000000
B-A-MU2      2  0.000000 54.0000000 36.599998   0.000000  5.0000000  0.0000000
B-A-GU2      2  2.600000  7.5000000 26.000000   0.400000  0.0000000  0.0000000
B-R-PC3      2  0.000000  0.0000000  0.000000   0.000000  0.3333333  0.0000000
B-A-MU3      2  0.000000 28.3333340  8.333333   0.000000  1.0000000  0.0000000
B-A-GU3      2  0.000000 13.3333330  0.000000   0.000000  0.0000000 25.0000000
B-R-PC4      2  0.000000  0.0000000  0.000000   0.000000  0.5000000  0.0000000
B-A-MU4      2  0.000000  5.5555553  0.000000   0.000000  0.4444444  0.0000000
B-A-GU4      2  2.083333  0.0000000  0.000000   0.000000  0.0000000  0.8333333
        h.attalgae  h.roots   h.lrgdeb   h.smldeb      s.mud    s.sand
S-R-CT1 12.0000000 0.000000  1.6666666  1.6666666 65.0000000 30.000000
S-R-CP1  0.6666667 3.333333  1.6666666  2.0000000 16.6666660 70.000000
S-A-TA1  3.3333333 0.000000  0.0000000 10.0000000 81.6666641  8.333333
S-R-CT2  1.0000000 0.000000  0.0000000  0.0000000 40.0000000 40.000000
S-R-CP2  0.0000000 5.000000  3.3333333  7.0000000  0.6666667 87.666664
S-A-TA2  0.0000000 0.000000  8.3333330  5.3333335  5.0000000 95.000000
S-R-CT3  0.0000000 0.000000  0.0000000  2.2222223 65.5555573 23.111111
S-R-CP3  0.5000000 1.000000  0.6666667  3.0000000 48.7500000 22.500000
S-A-TA3  0.0000000 0.000000  0.0000000  1.6666666 46.6666679 40.000000
S-R-CT4  7.5000000 0.000000  0.0000000  5.0000000 95.0000000  1.833333
S-R-CP4 50.0000000 0.000000  0.0000000  1.0000000  5.0000000 60.000000
S-A-TA4  0.0000000 0.000000  0.0000000  3.2857144 59.1428566 38.714287
B-A-MU1  1.0000000 0.000000 20.0000000 10.0000000 33.3333321 65.000000
B-A-GU1  0.0000000 0.000000  0.0000000  0.0000000 96.6666641  3.333333
B-R-PC2  0.4000000 0.000000  0.0000000  0.4000000 39.0000000 56.000000
B-A-MU2  0.0000000 0.000000  0.0000000 10.0000000 20.6000004 77.000000
B-A-GU2  1.0000000 0.000000  0.0000000  0.0000000 98.0000000  2.000000
B-R-PC3  0.0000000 0.000000  0.0000000  0.4444444 33.6666679 63.000000
B-A-MU3  0.3333333 0.000000  6.6666665  5.0000000 65.0000000 35.000000
B-A-GU3  0.0000000 0.000000  0.0000000  0.0000000 87.7777786  6.666667
B-R-PC4  0.0000000 0.000000  0.0000000  2.5000000 48.8750000 47.875000
B-A-MU4 30.0000000 0.000000  3.2222223  7.2222223 91.7777786  3.222222
B-A-GU4 42.5000000 0.000000  0.0000000  3.7500000 95.1666641  3.416667
        s.smlgrav   s.lrggrav  s.cobbles   s.rocks s.bedrock m.elevation
S-R-CT1  0.000000  0.00000000  1.6666666  0.000000  3.333333         226
S-R-CP1  5.000000  5.00000000  3.3333333  0.000000  0.000000         169
S-A-TA1  1.666667  0.00000000  0.0000000  0.000000  8.333333         270
S-R-CT2  0.000000  0.00000000 20.0000000  0.000000  0.000000         226
S-R-CP2  3.333333  3.33333325  5.0000000  0.000000  0.000000         169
S-A-TA2  0.000000  0.00000000  0.0000000  0.000000  0.000000         270
S-R-CT3  0.000000  0.00000000  3.0000000  8.333333  0.000000         226
S-R-CP3 10.000000 10.00000000  8.7500000  0.000000  0.000000         169
S-A-TA3  6.666667  6.66666651  0.0000000  0.000000  0.000000         270
S-R-CT4  0.000000  0.00000000  0.3333333  2.833333  0.000000         226
S-R-CP4  0.000000  0.00000000 25.0000000 10.000000  0.000000         169
S-A-TA4  2.142857  0.00000000  0.0000000  0.000000  0.000000         270
B-A-MU1  0.000000  0.00000000  1.6666666  0.000000  0.000000         725
B-A-GU1  0.000000  0.00000000  0.0000000  0.000000  0.000000         713
B-R-PC2  3.000000  0.00000000  1.0000000  1.000000  0.000000         402
B-A-MU2  0.000000  0.00000000  2.4000001  0.000000  0.000000         725
B-A-GU2  0.000000  0.00000000  0.0000000  0.000000  0.000000         713
B-R-PC3  3.333333  0.00000000  0.0000000  0.000000  0.000000         402
B-A-MU3  0.000000  0.00000000  0.0000000  0.000000  0.000000         725
B-A-GU3  3.333333  2.22222233  0.0000000  0.000000  0.000000         713
B-R-PC4  1.875000  0.00000000  0.1250000  1.250000  0.000000         402
B-A-MU4  0.000000  0.00000000  0.0000000  5.000000  0.000000         725
B-A-GU4  1.333333  0.08333334  0.0000000  0.000000  0.000000         713
         m.river  m.stream m.distsource m.distmouth m.maxslope m.maxdepth
S-R-CT1 163.2000 163.20000    84.450000    217.1500         30        106
S-R-CP1  83.0500  13.55000     6.150000    185.5500         60         60
S-A-TA1 110.2000  37.10000     8.850000    254.5500         60        154
S-R-CT2 163.2000 163.20000    84.450000    217.1500         30        105
S-R-CP2  83.0500  13.55000     6.150000    185.5500         60         68
S-A-TA2 110.2000  37.10000     8.850000    254.5500         60        118
S-R-CT3 163.2000 163.20000    84.450000    217.1500         30        110
S-R-CP3  83.0500  13.55000     6.150000    185.5500         60         79
S-A-TA3 110.2000  37.10000     8.850000    254.5500         60        109
S-R-CT4 163.2000 163.20000    84.450000    217.1500         30         74
S-R-CP4  83.0500  13.55000     6.150000    185.5500         60         64
S-A-TA4 110.2000  37.10000     8.850000    254.5500         60         87
B-A-MU1 214.0200  19.83333     7.583333    290.8767         30        152
B-A-GU1 212.6667  32.33333    10.166667    203.8333         30         60
B-R-PC2 196.8333  13.75000    11.416667    401.6667         90        110
B-A-MU2 214.0200  19.83333     7.583333    290.8767         30        115
B-A-GU2 212.6667  32.33333    10.166667    203.8333         30         69
B-R-PC3 196.8333  13.75000    11.416667    401.6667         90         80
B-A-MU3 214.0200  19.83333     7.583333    290.8767         30        117
B-A-GU3 212.6667  32.33333    10.166667    203.8333         30         68
B-R-PC4 196.8333  13.75000    11.416667    401.6667         90         95
B-A-MU4 214.0200  19.83333     7.583333    290.8767         30        112
B-A-GU4 212.6667  32.33333    10.166667    203.8333         30         63
        m.habdepth m.width a.velocity   a.temp     a.do a.transp
S-R-CT1  81.333333   19.64  0.1666667 32.90000 6.510000 46.00000
S-R-CP1  22.666667   17.24  0.1591512 35.20000 6.863333 26.00000
S-A-TA1  54.666667  102.00  0.1000000 34.00000 4.820000 61.00000
S-R-CT2  67.000000   16.10  0.1250000 32.00000 5.375000 44.00000
S-R-CP2  32.666667   18.47  0.0000000 29.00000 3.015000 33.00000
S-A-TA2  37.666667  100.00  0.0000000 29.00000 5.000000 90.00000
S-R-CT3  32.333333    6.20  0.0000000 28.26667 6.000000 17.33333
S-R-CP3  32.666667   15.10  0.0000000 29.66667 5.000000 50.33333
S-A-TA3  22.333333   88.00  0.0000000 34.00000 9.000000 51.66667
S-R-CT4  32.333333    5.40  0.0000000 32.60000 6.000000 16.00000
S-R-CP4  45.333333   10.70  0.0000000 27.60000 4.900000 60.00000
S-A-TA4  30.333333   72.20  0.0000000 29.53333 9.433333 67.00000
B-A-MU1  32.666667  270.00  0.0000000 29.83333 5.666667 48.00000
B-A-GU1   8.166667  330.00  0.0000000 29.23333 5.136667 25.66667
B-R-PC2  49.333333   29.60  0.0000000 29.00000 5.635000 50.00000
B-A-MU2  22.000000  247.63  0.0000000 29.00000 1.815000 43.00000
B-A-GU2   7.000000  321.00  0.0000000 29.00000 1.850000 55.00000
B-R-PC3  50.000000   27.30  0.0000000 29.00000 5.000000 32.33333
B-A-MU3  25.666667  234.53  0.0000000 26.00000 5.700000 63.00000
B-A-GU3   6.833333  314.20  0.0000000 24.00000 8.800000 51.66667
B-R-PC4  52.833333   20.00  0.0000000 28.85000 5.100000 30.00000
B-A-MU4  41.333333  239.00  0.0000000 25.95000 7.300000 89.00000
B-A-GU4   4.666667  289.50  0.0000000 24.70000 8.750000 36.00000

6.1.1.1 Descendo os nomes das UA’s

Agora vamos criar duas tabelas cruzadas entre as unidades amostrais e seu pertencimento a um dos agrupamentos criados pela análises de K-Means. Essas tabelas mostram a contagem de ocorrências de cada UA para cada cluster.

unid.as <- rownames_to_column(m_trab, var = "UAs")
agrup <- substr(unid.as[, 1], 5,6)
uas2 <- unid.as %>% mutate(spp=c(agrup),.before=UAs)
table(unid.as$UAs, kmeans$cluster)
table(uas2$spp, kmeans$cluster)
         
          1 2 3
  B-A-GU1 0 1 0
  B-A-GU2 0 1 0
  B-A-GU3 0 1 0
  B-A-GU4 0 1 0
  B-A-MU1 0 1 0
  B-A-MU2 0 1 0
  B-A-MU3 0 1 0
  B-A-MU4 0 1 0
  B-R-PC2 0 1 0
  B-R-PC3 0 1 0
  B-R-PC4 0 1 0
  S-A-TA1 0 0 1
  S-A-TA2 0 0 1
  S-A-TA3 0 0 1
  S-A-TA4 0 1 0
  S-R-CP1 0 0 1
  S-R-CP2 0 0 1
  S-R-CP3 0 0 1
  S-R-CP4 0 0 1
  S-R-CT1 1 0 0
  S-R-CT2 1 0 0
  S-R-CT3 1 0 0
  S-R-CT4 1 0 0
    
     1 2 3
  CP 0 0 4
  CT 4 0 0
  GU 0 4 0
  MU 0 4 0
  PC 0 3 0
  TA 0 1 3

7 Referências

Apêndices

Restos de códigos

Código simples para a função fviz/no. de clusteres ppbioh_rqs <- scale(ppbioh_rq) #reescala a matriz ?scale fviz_nbclust(ppbioh_rqs, kmeans, #sugere o no. ideal de clusteres method = “silhouette”) #outros métodos são “wss” e “gap_stat”

Métodos de determinação de clusters em k-means

Os métodos “silhouette”, “wss” e “gap_stat” são usados para determinar o número ideal de clusters em uma análise de cluster utilizando o algoritmo K-means.

Método “silhouette”:

  • O método “silhouette” avalia a qualidade dos clusters formados pelo K-means. Ele calcula a medida de silhouette para diferentes números de clusters e identifica o número de clusters com a maior média de silhouette, indicando uma melhor separação e compactação dos clusters. Método “wss” (Within-Cluster Sum of Squares):

O método “wss”:

  • O método “wss” calcula a soma dos quadrados das distâncias dos pontos em cada cluster em relação ao centróide desse cluster. Ele avalia a variabilidade dentro de cada cluster. O objetivo é encontrar o número de clusters que minimiza o valor do WSS, indicando uma melhor compactação dos pontos dentro dos clusters. Método “gap_stat” (Gap statistic):

O método “gap_stat”:

  • O método “gap_stat” compara a variação da dispersão dos dados dentro dos clusters em relação àquela esperada em um conjunto de dados aleatórios (dados de referência sem estrutura de cluster). Ele calcula a diferença entre a métrica de dispersão intra-cluster dos dados reais e dos dados de referência para diferentes números de clusters. O número de clusters com o maior valor de lacuna estatística indica um melhor ajuste dos dados reais em relação aos dados aleatórios, sugerindo a presença de estrutura de cluster.

Esses métodos ajudam a determinar o número ideal de clusters de forma objetiva, utilizando diferentes critérios de avaliação. Cada método tem suas próprias vantagens e pode ser mais adequado dependendo do conjunto de dados e do objetivo da análise.

Notas de rodapé

  1. Semestre 2023.1↩︎