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.
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.
Carregamos as seguintes bibliotecas do R:
Definimos o diretório onde se encontra o arquivo a ser importado:
setwd("/home/gf/Scripts/Moyses")
Carregamos o arquivo seeds_dataset.txt, com a função read.table():
dados <- read.table('seeds_dataset.txt', header=TRUE, sep=' ')
Recomenda-se a varredura na base de dados para detectar a presença de valores nulos.
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 ...
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
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)
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
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
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
Para explicar no mínimo 80% da variação total dos dados, são necessários apenas 02 (dois) componentes.
Os dois componentes cumulativamente explicam 89% da variância, ou para ser mais exato 88,98%.
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.:
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.
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))
[1] 1.181864 2.097044 1.874826 1.679029 1.550050 1.140048
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.
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
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.
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()))
Por fim, fazemos a contagem de quantas observações foram atribuídas a cada grupo:
cluster n
1 1 73
2 2 70
3 3 67
Utilizamos a distância euclidiana, que melhor se ajusta a dados numéricos normalizados.
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.
O dendrograma fortaleceu nossa hipótese inicial de que havia três grupos no conjunto de dados.
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.
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
Veja o capítulo 12 do livro “An Introduction to Statistical Learning: with Applications in R”↩︎
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)↩︎