rm(list=ls(all=TRUE)) ##LIMPA A MEMORIA
cat("\014") #limpa o console
dev.off() #apaga os graficos, se houver algum
Tutorial R Módulo 8. Análise de Classificação Não-hierárquica. K-Means
Disciplina de Ecologia Numérica1
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:
Inicialização: Seleção aleatória de K centróides iniciais ou usando outros métodos de inicialização.
Atribuição: Cada ponto de dados é atribuído ao cluster cujo centróide está mais próximo.
Atualização: Recalcula-se o centróide de cada cluster com base nos pontos de dados atribuídos a ele.
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
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)
<- read.xlsx("D:/Elvio/OneDrive/Disciplinas/_EcoNumerica/5.Matrizes/ppbio06p.xlsx",
ppbio rowNames = T,
colNames = T,
sheet = "Sheet1")
str(ppbio)
<- as.matrix(ppbio) #lê ppbio como uma matriz
ppbio_ma str(ppbio_ma)
#ppbio
#ppbio_ma
2.3 Reset point
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.
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()
<- read.xlsx(file.choose(),
ppbio 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)
<- asin(sqrt(decostand(ppbio,
ppbio_asrq method="total", MARGIN = 2)))
<- vegdist(ppbio_asrq, method = "bray",
vegdist diag = TRUE,
upper = FALSE)
<- hclust(vegdist, method = "average")
cluster 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.
<- as.data.frame(cluster$merge)
merge nrow(merge)+1,] = c("0","0")
merge[<- as.data.frame(round(cluster$height, 2))
height nrow(height)+1,] = c("1.0")
height[<- data.frame(Cluster = merge, Height = height)
fusoes colnames(fusoes) <- c("Cluster1", "Cluster2", "Height")
<- rownames_to_column(as.data.frame(ppbio_asrq[, 0]))
UA colnames(UA) <- c("No. e UA")
<- cbind(UA, fusoes)
fusoes $Histórico <- 1:nrow(fusoes)
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)
<- read.xlsx("D:/Elvio/OneDrive/Disciplinas/_EcoNumerica/5.Matrizes/ppbio06h.xlsx",
ppbioh rowNames = T, colNames = T,
sheet = "Sheet1")
5.4 Reset point
1<- (ppbioh)
m_trab #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
.
<- sqrt(m_trab)
m_trns
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)
<- scale(m_trns)
m_trns_s
<- c("silhouette", "wss", "gap_stat")
methods <- list()
plots for (method in methods) {
<- paste("No. de clusteres método ", method)
plot_title
if (method == "silhouette") {
<- fviz_nbclust(m_trns_s, kmeans, method = method) +
plot ggtitle(plot_title)
else {
} <- fviz_nbclust(m_trns_s, kmeans, method = method, nstart = 25) +
plot ggtitle(plot_title)
}<- plot
plots[[method]] }
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(m_trns_s, centers = 3)
kmeans 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$cluster
kmeans<- kmeans$cluster
grupos
grupos<- cbind(grupos, m_trab)
grupos2 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.
<- rownames_to_column(m_trab, var = "UAs")
unid.as <- substr(unid.as[, 1], 5,6)
agrup <- unid.as %>% mutate(spp=c(agrup),.before=UAs)
uas2 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é
Semestre 2023.1↩︎