Técnicas de aprendizado não supervisionado

Guilherme Ferreira
2025-05-08

Introdução

Aprendizado não supervisionado consiste em um grupo de ferramentas que visam o reconhecimento de padrões em um conjunto de variáveis, enquanto o aprendizado supervisionado depende de dados rotulados para ajuste do modelo estatístico capaz de realizar predições ou classificações.

Abordaremos dois métodos: análise de componentes principais e agrupamento hierárquico aglomerativo.

PCA - Principal Components Analysis (Análise de Componentes Principais), empregada para exploração de dados, é popularmente utilizada como método para a redução de dimensionalidade, ou seja, como uma abordagem capaz de encontrar a menor representação n-dimensional, que explique a maior variabilidade de um conjunto de dados dotado de grande número de variáveis(atributos, parâmetros, características ou dimensões).1 Além disso, pode ser utilizada para clustering, conjunto de técnicas desenvolvidas para categorização e separação de um conjunto de dados em diferentes grupos, com base em reconhecimento de padrões. No entanto, para esse propósito, nossa escolha recai sobre o método denominado Agrupamento Hierárquico.

Dataset

O conjunto de dados seeds_dataset2 se refere a medidas geométricas de diferentes variedades de sementes de trigo.

Vamos utilizá-lo para realizar análises de reconhecimento de padrões (componentes principais e análise de agrupamento hierárquico).

São avaliados os seguintes parâmetros: area, perimeter, compactness, legth, width, asymmetry e length_grove.

Bibliotecas

Carregamos as seguintes bibliotecas do R:

Diretório de trabalho

Definimos o diretório onde se encontra o arquivo a ser importado:

setwd("/home/gf/Scripts/Moyses")

Importação dos dados

Carregamos o arquivo seeds_dataset.txt, com a função read.table():

dados <- read.table('seeds_dataset.txt', header=TRUE, sep=' ')

Detecção de valores nulos

Recomenda-se a varredura na base de dados para detectar a presença de valores nulos.

colSums(is.na(dados))
        area    perimeter  compactness       length        width 
           0            0            0            0            0 
   asymmetry length_grove 
           0            0 

Inspeção dos dados

Constatamos que o conjunto de dados da amostra é constituido por 210 observações de 7 variáveis numéricas.

str(dados)
'data.frame':   210 obs. of  7 variables:
 $ area        : num  15.3 14.9 14.3 13.8 16.1 ...
 $ perimeter   : num  14.8 14.6 14.1 13.9 15 ...
 $ compactness : num  0.871 0.881 0.905 0.895 0.903 ...
 $ length      : num  5.76 5.55 5.29 5.32 5.66 ...
 $ width       : num  3.31 3.33 3.34 3.38 3.56 ...
 $ asymmetry   : num  2.22 1.02 2.7 2.26 1.35 ...
 $ length_grove: num  5.22 4.96 4.83 4.8 5.17 ...

Apresentação das 6 primeiras linhas dos dados

Apresentamos as seis primeiras linhas dos dados, mediante uso da função head():

head(dados)
   area perimeter compactness length width asymmetry length_grove
1 15.26     14.84      0.8710  5.763 3.312     2.221        5.220
2 14.88     14.57      0.8811  5.554 3.333     1.018        4.956
3 14.29     14.09      0.9050  5.291 3.337     2.699        4.825
4 13.84     13.94      0.8955  5.324 3.379     2.259        4.805
5 16.14     14.99      0.9034  5.658 3.562     1.355        5.175
6 14.38     14.21      0.8951  5.386 3.312     2.462        4.956

Análise dos Componentes Principais

Para calcular os componentes principais, após definir o objeto que vai receber o resultado da função princomp(), atribuímos ao argumento cor o valor false, para trabalhar com a matriz de covariância e definimos que os escores sejam calculados automaticamente.

pca_Cov <- princomp(dados, cor = TRUE, scores = TRUE)

Resumo da análise dos componentes principais

Na primeira linha, temos o desvio-padrão, que é raiz qudrada dos autovalores; na segunda linha, temos a proporção da variância de cada componente, e na terceira e última linha, a proporção da variância acumulada.

summary(pca_Cov)
Importance of components:
                         Comp.1    Comp.2     Comp.3      Comp.4
Standard deviation     2.243034 1.0943367 0.82340964 0.261466015
Proportion of Variance 0.718743 0.1710818 0.09685763 0.009766354
Cumulative Proportion  0.718743 0.8898249 0.98668250 0.996448850
                            Comp.5       Comp.6       Comp.7
Standard deviation     0.136797694 0.0730208579 0.0285025753
Proportion of Variance 0.002673373 0.0007617208 0.0001160567
Cumulative Proportion  0.999122223 0.9998839433 1.0000000000

Obtenção dos pesos do componente principal

Os pesos são os autovetores da matriz de covariância: os espaços em branco indicam que os valores são muito próximos a zero.

pca_Cov$loadings

Loadings:
             Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
area          0.444                0.194  0.204  0.426  0.735
perimeter     0.442                0.295  0.174  0.476 -0.671
compactness   0.277 -0.529  0.630 -0.333 -0.333  0.142       
length        0.424  0.206 -0.212  0.263 -0.766 -0.274       
width         0.433 -0.117  0.216  0.200  0.465 -0.703       
asymmetry    -0.119  0.717  0.680                            
length_grove  0.387  0.377 -0.214 -0.804  0.111              

               Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
SS loadings     1.000  1.000  1.000  1.000  1.000  1.000  1.000
Proportion Var  0.143  0.143  0.143  0.143  0.143  0.143  0.143
Cumulative Var  0.143  0.286  0.429  0.571  0.714  0.857  1.000

Obtenção dos escores

head(pca_Cov$scores)
        Comp.1    Comp.2      Comp.3     Comp.4       Comp.5
1  0.317047052 -0.783669 -0.63101001 0.41684594 -0.107495661
2 -0.003386178 -1.913214 -0.66975446 0.43307058  0.044406418
3 -0.459443341 -1.907225  0.93248882 0.11129161 -0.008221904
4 -0.591935651 -1.931069  0.49931092 0.22897660  0.074852541
5  1.102910048 -2.068090  0.05670541 0.14242065  0.018774567
6 -0.336815150 -1.636916  0.43891315 0.09818949 -0.006180222
       Comp.6        Comp.7
1 -0.02257049 -0.0146966404
2 -0.01892117 -0.0054793583
3  0.05131304 -0.0041772673
4 -0.22950046 -0.0100508687
5 -0.05263862 -0.0006224257
6  0.02221499 -0.0087810925

Avaliação

  1. Para explicar no mínimo 80% da variação total dos dados, são necessários apenas 02 (dois) componentes.

  2. Os dois componentes cumulativamente explicam 89% da variância, ou para ser mais exato 88,98%.

  3. Exibimos a seguir gráfico com a dispersão dos indivíduos, o qual reforça a hipótese de que o conjunto de dados contenha 2 ou 3 grupos de sementes de trigo diferentes.:

  1. Exibimos a seguir o gráfico que demonstra como as variáveis estudadas estão relacionadas com os componentes:

Observamos, no gráfico, uma leve correlação entre as variáveis length grove, length, perimeter, área e width com a PC1 e uma acentuada correlação entre a variável asymmetry e a PC2. As variáveis correlacionadas com a PC1 estão positivamente correlacionadas entre si, enquanto as variáveis asymmetry e compactness possuem correlação negativa.

Análise de Agrupamentos

Medida de proximidade

Utilizaremos como medida de proximidade a distância euclidiana, pois as variáveis mensuradas possuem escalas similares, após a padronização do conjunto de dados numéricos.

df <- as.data.frame(scale(dados))

Cálculo da distância

D <- dist(df, method = "euclidian")
head(D)
[1] 1.181864 2.097044 1.874826 1.679029 1.550050 1.140048

Método de agrupamento

Escolhemos utilizar o método de agrupamento hierárquico aglomerativo, por meio das funções dist() e hclust(), que é um método alternativo à abordagem de otimização do k-means, por não requerer conhecimento prévio do número de grupos presente no conjunto de dados, que por ser pequeno, não exige nem velocidade de processamento nem recurso computacional avançado. Além disso, fornece como resultado a representação das observações em formato de árvore, chamado dendograma.

Critério de agrupamento

Como escolha do critério de agrupamento, utilizaremos o método Ward ou método da mínima variância dentro do grupo, que é o critério que apresentou a estrutura de agrupamento mais robusta, quando conjugado com a distância euclidiana, obtido mediante uso da seguinte função:

map_dbl(c(average = "average", single = "single", 
          complete = "complete", ward.D2 = "ward.D2"),
        ~cor(cophenetic(hclust(D, method = .x)), D))
  average    single  complete   ward.D2 
0.7146889 0.4266838 0.7129629 0.7285529 

Dendrograma

agr <- hclust(D,method="ward.D2")

plot(agr, xlab="Sementes", ylab="Distância Euclidiana", cex=0.3)

Medida de qualidade do agrupamento

A medida de qualidade do agrupamento é dada pelo coeficiente de correlação cofenética.
Para avaliarmos a qualidade do agrupamento, primeiro obtemos a matriz cofenética, depois obtemos a correlação entre a matrizes de distâncias cofenéticas e originais.

cof <- cophenetic(agr)
cor(cof,D)
[1] 0.7285529

O valor encontrado foi de 0.7285529, um pouco acima do mínimo sugerido pela literatura, que é 0,7, indicando um grau razoável de ajuste entre o dendrograma e a matriz de dissimilaridade.

Hipóteses sobre a quantidade de grupos

Ao visualizarmos o dendrograma, ficamos seguros em defender a hipótese de que há 3 grupos distintos no conjunto de dados, ou três diferentes populações. Embora haja diversas ferramentas para estimar o número de grupos, como os métodos Elbow, Silhouette e “Gap Estatístico”, vamos utilizar a ferramenta fviz_dend(), do pacote factoextra, para testar graficamente se a nossa hipótese se ajusta bem ao dendrograma.

grupos <- 3
suppressWarnings(
fviz_dend(agr, k=grupos, cex = 0.3,  
          rect = TRUE, 
          rect_fill=F, main = "Dendograma completo (k=3)",
          xlab = "Sementes", ylab = "Distância Euclidiana", sub = "",
          ggtheme = theme_minimal()))

Contagem

Por fim, fazemos a contagem de quantas observações foram atribuídas a cada grupo:

agrup <- cutree(agr, k=grupos)
sementes <- mutate(df, cluster = agrup)
count(sementes, cluster)
  cluster  n
1       1 73
2       2 70
3       3 67

Considerações finais

  1. Utilizamos a distância euclidiana, que melhor se ajusta a dados numéricos normalizados.

  2. Utilizamos o método de agrupamento hierárquico aglomerativo, pois desconhecíamos de antemão o número de grupos final. Utilizamos como critério de agrupamento o método UPGMA ou ligação média entre grupos, que foi o que apresentou melhor correlação cofenética, quando comparado com outros critérios.

  3. O dendrograma fortaleceu nossa hipótese inicial de que havia três grupos no conjunto de dados.

  4. A medida de qualidade do agrupamento, fornecida pelo coeficiente de correlação cofenética, ficou em 0,7285, um pouco acima do mínimo esperado pela literatura, que é de 0,70, indicando um leve grau de ajuste entre o dendrograma e a matriz de dissimilaridade.

  5. Utilizamos recursos gráficos, com retângulos coloridos sobrepostos sobre o dendrograma, para demonstrar conclusivamente nossa hipótese, de que há 3 grupos, ou três diferentes populações, no conjunto de dados.

Referências:

Jolliffe, I. T, Cadima, J. (2016). Principal component analysis: a review and recent developments. Published: 13 April 2016. DOI: https://doi.org/10.1098/rsta.2015.0202


  1. Veja o capítulo 12 do livro “An Introduction to Statistical Learning: with Applications in R”↩︎

  2. Dataset criado por Magorzata Charytanowicz, Jerzy Niewczas, Piotr Kulczycki, Piotr Kowalski e Szymon Lukasik, pesquisadores do Instituto de Agrofísica da Academia Polonesa de Ciências em Lublin, disponível sob a licença Creative Commons Attribution 4.0 International (CC BY 4.0)↩︎