O presente projeto tem como objetivo aplicar em um dataset de vinhos algoritmos de Clusterização, mais especificamente o modelo de machine learning KMeans. Desta forma, pretende-se classificar os vinhos em grupos heterogêneos entre si de acordo com algumas características das composições químicas de cada amostra.
Segue uma lista com as bibliotecas em Python utilizadas no desenvolvimento e resolução do case.
- pandas
- numpy
- matplotlib
- sklearn
- yellowbrick
Este projeto foi todo desenvolvido utilizando o VS CODE. Portanto, se torna necessário a instalação deste ou de algum outro interpretador de código para o seu correto funcionamento. Em seguida, foram instaladas as extensões do Python e Jupyter Notebook dentro do VS CODE.
OBS: Versão do Python utilizada no projeto = 3.11.5
Feita as instalações dos requisitos base acima, agora é necessário instalar as bibliotecas, listadas no arquivo 'requirements.txt', que foram utilizadas no desenvolvimento do projeto. Para isso, executa-se no terminal do VS CODE, o comando abaixo.
pip install -r requirements.txt
Instaladas tais bibliotecas dentro do ambiente, agora pode-se rodar as linhas de código presentes no arquivos notebooks 'cluster_wines.ipynb'. Neste notebook estão todos os códigos desenvolvidos para a resolução deste projeto, desde as análises descritivas e estatísticas até a modelagem.
Para avaliar a distribuição dos dados de cada uma das colunas presentes no dataset, plotou-se um gráfico do tipo Boxplot. Com este gráfico, é possível observar a mediana, quartis e principalmente a possível presença de outliers. Isto último tópico é muito importante para o modelo de KMeans a ser utilizado posteriormente, visto que este tipo de modelo é sensível a outliers.
- Gráfico Boxplot das colunas com os dados originais:
Percebe-se que os dados estão, na sua maior parte, "comprimidos" ou "achatados" no gráfico. Isto acontece pois existem colunas com escalas numéricas muito diferentes entre si. Este também é um problema ao rodar o modelo de KMeans, visto que, para o seu correto funcionamento, os dados numéricos precisam estar na mesma escala. Assim, para corrigir isso aplicou-se a função scale() da biblioteca scikit-learn importada anteriormente. Esta função irá transformar os dados de todas as colunas de tal modo a convertê-los para valores onde distribuição dos dados por coluna terá média igual a zero e desvio padrão igual a 1. Este processo é demonstrado a seguir,
- Gráfico Boxplot das colunas com os dados escalonados:
Avaliando-se o resultado acima, agora fica evidente a presença de outliers neste dataset, representados pelos círculos no gráfico. Afim de identificá-los de forma mais exata, utilizou-se do padrão Z-score, onde |Z-score| > 3.
Feitos os devidos cálculos, identificou-se um total de 10 linhas no dataset com presença de outliers. Como são poucas linhas, optou-se por excluí-los da análise.
Feito o tratamento dos dados numéricos e excluídos os outliers, agora é possível partir para a parte de desenvolvimento do modelo.
Como não se sabe ao certo a quantidade de clusters em que se deseja dividir o dataset, é possível utilizar o chamado "Método do Cotovelo", no qual, utilizando a função kelbow_visualizer, da biblioteca yellowbrick importada anteriormente, temos um gráfico da variância em função do número de clusters. Com isto, é possível definir o ponto ótimo para o valor de k.
- Gráfico da variância em função da quantidade de clusters:
Analisando o gráfico acima, temos que o ponto ótimo se da com um valor de K = 4. É possível concluir isto pois, para valores maiores que 4, o score de variância dos dados diminui de forma não abrupta, se comparado a valores de K menores que 4, onde a redução da variância se da de forma mais drástica com o aumento gradual de clusters.
Outro fator importante é a interpretabilidade dos clusters. Quanto maior o valor de K, mais clusters, ou seja, em mais grupos serão divididos os dados. Avaliando do ponto de vista de negócio, isto pode ser ruim pois muitos grupos dificultam a própria interpretação das diferenças entre eles, ficando mais difícil também classificá-los e analisa-los.
Definido o número de clusters, treinou-se o modelo definitivo de KMeans. Após isto, analisou-se os resultados de cada cluster obtido.
- Gráfico de barras de cada uma das características dos vinhos para cada cluster calculado pelo modelo KMeans:
Avaliando-se os resultados dos gráficos acima, percebe-se que o "Cluster 1" é o grupo que apresenta os vinhos com maiores índices em "malic_acid" e "color_intensity", mas com índices baixíssimos em "flavanoids" por exemplo. Já o "Cluster 2" tem índices altos em "alcohol" e "proline". O "Cluster 3" se caracteriza como o grupo com menor teor de "alcohol" e "proline", enquanto que o "Cluster 4" tem os valores mais elevados em "alcalinity_of_ash" e "proanthocyanins". Esta é uma das formas de avaliar as diferenças nas características detectadas pelo modelo para cada cluster definido.
Outra forma de interpretar os resultados da clusterização seria agrupar os dados originais (desconsiderando os outliers) por cluster. Assim, pode-se utilizar funções de agregação em cada uma das características (média, mediana, mínimo, máximo, etc.).
- Tabela com valores médios de cada característica para cada cluster:
cluster | 0 | 1 | 2 | 3 |
---|---|---|---|---|
alcohol | 12.212000 | 13.778214 | 13.119592 | 12.364211 |
malic_acid | 1.896000 | 1.983929 | 3.380204 | 1.831316 |
ash | 2.418800 | 2.451250 | 2.420000 | 2.150263 |
alcalinity_of_ash | 21.656000 | 16.914286 | 21.255102 | 19.015789 |
magnesium | 92.760000 | 106.232143 | 98.653061 | 91.921053 |
total_phenols | 1.902800 | 2.855357 | 1.654286 | 2.460526 |
flavanoids | 1.663600 | 3.000179 | 0.796735 | 2.344474 |
nonflavanoid_phenols | 0.460800 | 0.286429 | 0.448776 | 0.299474 |
proanthocyanins | 1.308000 | 1.912679 | 1.124898 | 1.736842 |
color_intensity | 2.940000 | 5.616607 | 7.147347 | 3.193684 |
hue | 1.049040 | 1.063036 | 0.688571 | 1.060789 |
od280/od315_of_diluted_wines | 2.502400 | 3.168214 | 1.693469 | 2.980789 |
proline | 524.040000 | 1130.303571 | 621.673469 | 516.394737 |
Na tabela acima, quanto mais escura a cor, mais elevado o valor. Pornto, avaliando tais resultados com a média das características em cada cluster calculado pelo algoritmo KMeans, percebe-se que o cluster 1 é o cluster que apresenta, o maior índice em "proline" e "alcohol". Enquanto que o cluster 2 tem em média o índice de "color_intesity" mais elevado se comparado aos demais clusters. Outro ponto interessante é que todos os clusters apresentam o índice "hue" em torno de 1, exceto o cluster 2, com 0.68. Isto também é uma característica que pode diferenciar este grupo dos demais.
Por último, exibiu-se o gráfico da métrica de Silhoueta "silhouette_score".
- Gráfico de "silhouette_score":
Avaliando o todo, tem-se um "silhouette_score" médio de mais ou menos 0.25. A métrica está positiva, o que é um bom sinal, pois isto nos diz que os pontos de um mesmo cluster definido pelo modelo estão mais próximos entre si do que dos pontos de outro cluster. Contudo não estão tão próximos assim, visto que o valor do silhouette está consideravelmente distante de 1 (lembrando que o valor máximo de silhouette_score é 1). Quanto mais próximo 1, quer dizer que mais próximos estão os pontos de um mesmo cluster e mais distantes eles estão dos outros clusters, o que demonstra uma homogeneidade marcante dentre as características do cluster e uma heterogeneidade clara se comparada aos demais grupos definidos.
Por fim, os grupos que apresentam melhor métrica de "silhouette" foram os clusters 0 e 3, com valores próximos a 0.45. Portanto são este grupos os mais homogêneos entre os pontos dentro deles e mais heterogêneos se comparados aos demais. Enquanto que o grupo com silhouette mais baixo foi o cluster 1, com valores mais próximos de 0.2.