Nesse artigo foi construída uma analise de Cluster K-MEANS, utilizando o método Elbow.
Carregando pacotes
library(ggplot2)
library(dplyr)
library(knitr)
library(rmarkdown)
library(readxl)
library(kableExtra)
library(factoextra)
library(gridExtra)
Carregando banco de dados
dados <- read_excel("~/Bases/atv1.xlsx")
kable(head(dados, 10), col.names = c("Indivíduo", "Salário", "Posisão",
"Anos de Experiência","Sexo")) %>%
kable_styling(full_width = F, bootstrap_options = c("striped", "hover", "condensed", "responsive"))
| Indivíduo | Salário | Posisão | Anos de Experiência | Sexo |
|---|---|---|---|---|
| 1 | 148 | 7 | 16.7 | 1 |
| 2 | 165 | 7 | 6.7 | 1 |
| 3 | 145 | 5 | 14.8 | 1 |
| 4 | 139 | 7 | 13.9 | 0 |
| 5 | 142 | 6 | 6.4 | 0 |
| 6 | 144 | 5 | 9.1 | 1 |
| 7 | 128 | 3 | 8.5 | 0 |
| 8 | 143 | 6 | 18.2 | 1 |
| 9 | 157 | 7 | 13.0 | 1 |
| 10 | 150 | 7 | 21.6 | 1 |
Existem diferentes tipos de grupos ou cluster e cada um é adequado para um determinado cenário.O K-means é um algoritmo do tipo não supervisionado, ou seja, que não trabalha com dados rotulados.O objetivo desse algoritmo é encontrar similaridades entre os dados e agrupá-los conforme o número de cluster passado pelo argumento k. O algoritimo calcula a distancia entre dois ponto, utilizando a distancia euclidiana.
A distância Euclidiana é a distância mais conhecidas dentre as métricas. Essa distância é a menor distância entre dois pontos no \(R^n\), que pode ser representada pela hipotenusa, observada no Teorema de Pitágoras. A distancia Euclidiana é definida por:\[ d_E(x,y) =\sqrt{(x_1-y_1)^2+...+(x_n-y_n)^2}=\sqrt{{\sum_{i=1}^n}(x_i-Y_i)^2} \]
Importante retirar a coluna dos individuos antes de fazer a análise, caso não seja retirada o cluster ira computar essa coluna como parte da análise.
dados.quanti <- dados [,-1]
WSS é a distância total dos pontos de dados de seus respectivos centróides do cluster
k.max <- 15
data <- dados.quanti
wss <- sapply(1:k.max,function(k){kmeans(data, k, nstart=50,
iter.max = 15)$tot.withinss})
wss
## [1] 41036.696 17268.646 11577.494 8867.078 6909.456 5806.782 5011.212
## [8] 4410.778 3905.900 3401.095 3051.005 2719.358 2514.171 2316.940
## [15] 2170.172
O método elbow é conhecido como método do cotovelo. Basicamente o que o método faz é testar a variância dos dados em relação ao número de clusters. Podemos ver esse “cotovelo” quando plotamos seus resultados em um gráfico.
A partir do valor indicado pelo “cotovelo” no gráfico significa que não existe ganho em relação ao aumento de clusters.
Para determinar o número ótimo de clusters da classificação, antes de rodar a função kmeans(), é possível utilizar a função fviz_nbclust() do pacote factoextra. Desta forma, utilizando a noção da soma dos quadrados intra cluster é possível verificar que o número ótimo de clusters para a amostra é 3. Isto porque novos clusters acima de 3 possuem baixo ganho para aumentar a diferenciação dos demais.
fviz_nbclust(data, kmeans, method = "wss")+
geom_vline(xintercept = 3, linetype = 2)
Em seguida utilizamos o número determinado de clusters (neste caso 3) com o comando kmeans.Como resultado temos a média dos centros por clusters e a classificação de cada individuo da amostra dentro do respectivo cluster. Observa-se que o cluste 1 tem 95 Indivíduos, o cluster 2 tem 65 Indivíduos e o cluster 3 possui 60 Indivíduos.
set.seed(123)
km.res=kmeans(data, 3, nstart=25)
print(km.res)
## K-means clustering with 3 clusters of sizes 95, 65, 60
##
## Cluster means:
## salario posicao anosexperiencia sexo
## 1 143.7263 5.094737 9.845263 0.6000000
## 2 127.8615 3.230769 8.358462 0.5846154
## 3 157.7667 7.016667 13.778333 0.8333333
##
## Clustering vector:
## [1] 1 3 1 1 1 1 2 1 3 3 2 2 2 3 2 3 2 1 1 1 1 1 1 1 2 1 2 1 1 2 2 3 2 3 3 2 1
## [38] 2 3 3 1 3 3 1 2 2 1 2 3 1 3 1 1 1 2 1 1 1 1 2 1 2 3 1 1 2 2 2 1 1 3 3 3 1
## [75] 2 3 2 3 2 1 1 1 2 1 1 3 1 1 1 2 1 3 3 3 1 3 2 1 2 1 2 3 2 3 1 1 2 2 1 2 1
## [112] 1 1 1 2 3 3 2 1 2 1 2 1 3 3 2 2 3 1 3 2 3 2 1 1 1 1 1 2 3 2 1 1 2 1 1 1 3
## [149] 2 3 3 1 1 1 1 3 2 1 3 1 2 1 3 3 2 3 3 1 2 1 2 1 3 1 3 1 1 3 2 1 1 1 2 2 3
## [186] 2 1 1 3 1 3 3 3 3 2 1 3 1 1 3 1 2 1 1 3 2 2 2 3 2 2 1 3 2 2 1 1 3 2 3
##
## Within cluster sum of squares by cluster:
## [1] 3967.587 3665.815 3944.092
## (between_SS / total_SS = 71.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Após determinado o número de clusters ideal e calculado para qual cluster cada variável do banco de dados pertence, é possível verificar as características de cada aglomeração. Com o cálculo da média utilizando a função aggregate, observa-se que a média dos salários são menores no cluster 2, os Indivíduos com maior posição estão no cluster 3, e o cluster 1 se concentra sempre fica nas posições centrais de acordo com as médias observadas
aggregate(data, by=list(cluster=km.res$cluster), mean)
## cluster salario posicao anosexperiencia sexo
## 1 1 143.7263 5.094737 9.845263 0.6000000
## 2 2 127.8615 3.230769 8.358462 0.5846154
## 3 3 157.7667 7.016667 13.778333 0.8333333
Conseguimos observar que a partir do número de três clusters, as distâncias dos erros quadráticos praticamente se estabiliza. Neste ponto que seria o “cotovelo”, ou seja, a partir desse ponto que não existe uma discrepância tão significativa em termos de variância.