Pacotes utilizados

require(ggplot2, quietly=T)
require(NbClust, quietly=T)

Neste relatório será utilizada a biblioteca Iris que corresponde a observações com relação à medida (em centímetros) de covariáveis de 3 espécies de flores. Estas covariáveis são o tamanho e comprimento das sépalas e pétalas contendo 150 observações. As espécies são a setosa, a versicolor e a virginica. Foram utilizadas como variáveis explicativas o comprimento das sépalas e pétalas.

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
dim(iris)
## [1] 150   5

Análise gráfica das observações

ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) + geom_point()

No gráfico tem-se o comprimento da pétala na abscissa e o comprimento da pétala na ordenada. Para a espécie setosa há uma boa separação das demais espécies, já para as espécies versicolor e virginica há um entrelaçamento entre as observações. Será utilizado o K-means para gerar a separação dos cluster.

Utilização do K-means nos dados da biblioteca Iris

set.seed(20165678)
iris.k <- kmeans(iris[,3:4], center=3, nstart=10)

Utilizou-se K=3, pois são 3 espécies. Como há uma boa separação entre as espécies, utilizou-se um nstart=10. Esse parâmetro indica que serão feitas 10 diferentes atribuições aleatórias para cada observação em um dos K clusters (parâmetro inicial), e será escolhido o parâmetro inicial com a menor variação dentro do cluster. Para verificar como o método separou os dados pode-se utilizar a função table.

table(iris.k$cluster,iris$Species)
##    
##     setosa versicolor virginica
##   1     50          0         0
##   2      0          2        46
##   3      0         48         4

Como tinha sido verificado na análise gráfica, a espécie setosa foi totalmente separada em um cluster. Porém, ocorreram erros de separação para as espécies versicolor e virginica. 48 observações da espécie versicolor foram separadas no cluster 3 e 2 observações no cluster 2. O cluster 2 pertence à espécie virginica, sendo que das 50 observações dessa espécie, 46 foram inseridas no cluster 2 e 4 no cluster 3. Para verificar quais observações foram separadas erroneamente, fez-se um gráfico comparando as observações prévias das espécies e as observações divididas em clusters.

require(gridExtra)
## Loading required package: gridExtra
plot1 <- ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) + geom_point() + ggtitle("Observações prévias")

iris.k$cluster <- as.factor(iris.k$cluster)
plot2 <- ggplot(iris, aes(Petal.Length, Petal.Width, color = iris.k$cluster)) + geom_point() +
  ggtitle("Observações separadas em clusters")

grid.arrange(plot1, plot2, nrow=2)

Encontrando o K ideal

Para encontrar o K ideal para essas observações será utilizado o número de Clusters escolhidos por 26 critérios.

nc <- NbClust(iris[,3:4],
              min.nc = 2, max.nc = 10,
              method = "kmeans")

## *** : The Hubert index is a graphical method of determining the number of clusters.
##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
##                 significant increase of the value of the measure i.e the significant peak in Hubert
##                 index second differences plot. 
## 

## *** : The D index is a graphical method of determining the number of clusters. 
##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
##                 second differences plot) that corresponds to a significant increase of the value of
##                 the measure. 
##  
## ******************************************************************* 
## * Among all indices:                                                
## * 10 proposed 2 as the best number of clusters 
## * 8 proposed 3 as the best number of clusters 
## * 1 proposed 4 as the best number of clusters 
## * 4 proposed 9 as the best number of clusters 
## * 1 proposed 10 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  2 
##  
##  
## *******************************************************************
par(mfrow=c(1,1))
barplot(table(nc$Best.n[1,]),
        xlab = "Número do Clusters",
        ylab = "Frequência da escolha do k - Cluster",
        main = "Número de Clusters escolhido por 26 critérios")

Verifica-se que dos 26 critérios utilizados, 10 indicam que o melhor K a ser utilizado seja o 2.