Definindo o problema de negócio

O objetivo é definirmos a qualidade de um vinho branco baseado em suas caracteristicas 'physicochemical'. Os vinhos possuem uma qualidade que varia entre 0 e 10, possuindo valores continuos. Sendo assim a variavel target será convertida para qualitativa.

Qualidade >= 6.5 -> Bom

Qualidade < 6.5 -> Ruim

-- Problema de Negócio
   Com os resultados de qualidade é possível melhorar a distribuição logistica e a precificação dos vinhos. Ainda é possível descartar vinhos de baixa qualidade ou reutilizar em outros processos industriais se possível.
   É esperado que os resultados auxiliem na tomada de decisão sobre o que fazer com um vinho de menor qualidade que o esperado. Uma das abordagens sugeridas é não enviar esse produto para o mercado de trabalho, visto que o cliente leal a empresa espera um nivel de qualidade que se não for atendido pode levar a perda de um cliente.
   Uma segunda abordagem seria identificar o por quê do produto estar possuindo uma qualidade inferior aos outros, pois pode tratar-se de um defeito em maquinas industriais, que minimanente causa impacto na qualidade do vinho.

   É esperado atingir uma acurácia de 85% com precisão de no minimo 70% para qualquer das classes de saida.

Dataset 01: https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009

Dataset 02: https://archive.ics.uci.edu/ml/datasets/wine+quality

Variáveis da base

O que cada uma das varíaveis presente representa:

fixed acidity (apenas ácido tartárico): O ácido tartárico, facilmente encontrado em uvas e na sua fermentação. Aumenta a ácidez e a longevidade do vinho.

volatile acidity (apenas ácido acético): Associado ao gosto e principalmente ao cheiro de vinagre, também relacionado a bactérias e a oxidação. Níveis elevados desse ácido podem não ser desejados.

citric acid (apenas ácido cítrico): Uvas que crescem em ambientes mais quentes normalmente são menos ácidos. O ácido cítrico, normalmente é adicionado no processo de fermentação para aumentar a ácidez do vinho. Elevados nível de ácido cítrico podem contribuir para a geração de bactérias não desejadas no vinho.

residual sugar: Quantidade de açucar que permanece após a fermentação. Diretamente ligado a classificação do vinho, normalmente dividido em: Bone Dry (0-1 G/L), Dry (0-17 G/L), Off-Dry(17-35 G/L, Medium-Sweet (35-120 G/L), Sweet(120 G/L +).

chlorides (Cloreto de sódio): Basicamente a quantidade de sal no vinho. Quantidades elevadas podem gerar um vinho mais salgado.

free sulfur dioxide: Protege o vinho de oxidação e deterioração, porém em grandes quantidades pode gerar um sabor amargo/metálico/queimado. Quanto maior for o pH do vinho menos efetivo vai ser esse reagente. Produzido naturalmente no processo de fermentação.

total sulfur dioxide (free sulfur dioxide + bound sulfur dioxide): Quantidade total de dióxido sulfúrico no vinho, todo o dióxido que estiver atrelado a alguma molécula não serve de proteção ao vinho. Grandes quantidades podem gerar um odor de podre.

density: A densidade do vinho esta relacionada com o seu plantio, quanto maior a densidade menor a sua qualidade, isso se da pois as videiras irão dividir os nutrientes no solo.

pH: Descreve o quão acido é um vinho, possuindo uma escala de 0 a 14, onde 0 é muito acido e 14 se forma uma base. Os vinhos possuem pH entre 3 e 4.

sulphates: Atua como antioxidante no vinho, reduzindo a sua oxidação e criação de bacterias. Os vinhos brancos não possuem antioxidantes naturais sendo assim é necessário doses maiores de SO2 (dioxido de enxofre).

alcohol: Diretamente ligado a qualidade do vinho a tendência é que vinhos de maior qualidade possuam maior teor alcolico, o que nem sempre se comprova.

Imports

Analise Exploratoria

Analise Exploratoria - Sem Processamento

Analisando algumas variaveis, percebemos que o 'residual sugar' médio dessa base é 6.39 g/l e o maximo 65.80 g/l (outlier), indicando que a nossa base não possui vinhos muito doces. Algumas colunas como chlorides, free sulfur dioxide e total sulfur dioxide possuem alguns valores muito altos, possivelmente outliers. O pH médio é de 3.18 com no maximo 3.82, indicando que essa base não possui altos niveis de pH. O nivel de alcool nessa base claramente não é muito alto, visto que a média é de 10.51 indicando vinhos de baixo teor alcolico. Porém observando o Q3 (75%) é perceptivel que alguns vinhos possui um teor alcolico significativo e com o valor maximo possuindo alto valor alcolico, possivelmente um outlier.

Conforme analisado a redução do uso de memoria trouxe consequencias significativas para o modelo, assim será descartada a sua utilização.

É perceptivel que as variaveis com maior correlação são: 'fixed acidity', 'volatile acidity', 'chlorides', 'total sulfur dioxide', 'density' e 'alchohol'. Dessa forma as outras variaveis não possuem grande relevância para a variavel target 'quality'.

Avaliando MultiColinearidade

Procurando pelo menor valor gerado no eigenvalues encontramos na posição 1 o valor 0.02064. Assim precisamos buscar essa posição no auto vetor para descobrir os valores com possivel multicolinearidade.

Avaliando os valores na lista de auto vetores. Percebe-se que os valores que mais se destacam estão nas posições 0, 3, 7, 8 e 10. Esses valores se destacam por estarem muito altos em relação aos outros, principalmente posição 3, 7 e 10.

Primeiramente é exibido as variaveis com os valores que mais se destacaram, após é exibido com os valores que tiveram um destaque menor. Avaliamos que as variaveis 'density', 'residual sugar' e 'alcohol' são muito bem representadas pela variavel 'density', então pode ser recomendado a remoção das outras duas mantendo somente 'density'. Essa relação pode ser bem visualizada no mapa de calor da correção entre as variaveis.

Avaliando a correlação entre as variaveis para ver qual se destaca entre as suas correlações, percebe que 'density' continua sendo a que melhor representa 'residual sugar' e 'alcohol'. Porém a variavel 'fixed acidity'apresentou uma boa representatividade sobre a variavel 'pH'. Pode ser uma boa ideia remover a variavel pH do dataset também.

Assim as variaveis 'fixed acidity', 'residual sugar', 'density', 'pH' e 'alcohol' poderiam ser resumidas para 'density' e 'fixed acidity'.

Para ter uma maior certeza sobre os resultados acima podemos montar um scatter plot para ver a representação dos pontos. Como analisado nos graficos abaixo essa tendência da representatividade das variaives é comprovada. Porém, deve-se ficar atento a variavel 'density' e 'residual sugar', pois diferente das outras variaveis a sua representatividade não parace ser tão forte, podendo ter sido puxada por um outlier identificado. Vale um teste de remoção do outlier para testar a nova correção entre as variaveis.

Pre-Processamento

Detectando e Removendo Outliers

Primeiramente para removermos outliers precisamos entender alguns detalhes sobre o nosso dataset. Entender se as suas variaives seguem uma distribuição normal Gaussiana. Para isso podemos utilizar o calculo de skewness, valores que distuarem muito de -1 e 1 podem ser ditos que não seguem uma distribuição normal Gaussiana. Como analisado abaixo possuimos algumas variaveis que não seguem a distribuição normal, como por exemplo 'volatile acidity', 'citric acid', 'chlorides' e 'free sulfur dioxide'.

image.png

Uma das estatisticas que pode ser de grande importância para a detecção de outliers é a kurtosis, onde podemos entender facilmente as variaveis que possuem muitos valores distuantes. O ideal para uma variavel é ter a sua kurtosis proximo a 3. Onde valores acima de 3 estão relacionados a uma alta densidade de outliers acima da distribuição normal, o que pode passar uma informação falsa para o nosso modelo. Já valores abaixo de 3 estamos falando de outliers abaixo da distribuição normal, ou de poucos outliers, o que pode significar um sinal de alerta, já que é incomum datasets não possuirem outliers.

Mesokurtic -> Kurtosis ~= 3: Outliers proximo a distribuição normal, com um numero razoavel de outliers.

Leptokurtic -> Kurtosis > 3: Outliers acima da distribuição normal, com um numero acima do normal.

Platykurtic -> Kurtosis < 3: Outliers abaixo da distribuição normal, com um numero abaixo do normal.

image.png

Para verificarmos os valores outliers em um grafico, podemos exibir o boxplot de cada variavel para visualizarmos melhor onde estão esses valores. Como visualizado abaixo as variaveis com exceção de 'alcohol' todas as outras possuem outliers. Dessa forma podemos definir como iremos tratar esses dados, removendo eles ou utilizando algum metodo de inputação.

Para termos uma diferente perspectiva podemos calcular o histograma para cada uma das variaveis e comparar com o skewness para ver se os valores fora do range de -1 e 1 se comportam fora de uma normal. E conforme a analise do skewness os valores 'volatile acidity', 'citric acid', 'chlorides' e 'free sulfur dioxide' estão fora de uma Distribuição Normal Gaussiana.

Após analisarmos os valores outliers e o comportamento do dataset precisamos tratar esses outliers. A melhor forma é tratarmos os dados que possuem uma distruição normal de uma forma e os que não possuem de outra. Para a nossa abordagem iremos utilizar tecnica de imputação para ambos os casos. Para os valores que seguem a distribuição normal podemos utilizar o calculo de z score delimitando um threshold. Já para as variaveis que não seguem a distribuição normal aplicar a transformação logaritmica.

Porém para essa abordagem, iremos preferir a mesma tecnica para ambos os casos. Assim iremos inputar os valores pela média da variavel (desconsiderando os outliers).

Após tratarmos os valores outliers é interessante verificarmos novamente o skewness, boxplot e histograma. É perceptivel que os outliers foram removidos, porém os histogramas não demonstram mais o comportamento de uma distribuição normal. Assim iremos ter que gerar novamente uma distribuição normal sobre os dados.

É notavel que após utilizar a tecnica de imputação para os nossos outliers a kurtosis negativa ou proxima a zero para todas as variaveis. Isso significa que removemos qquase todos os outliers ou que possuimos um baixo numero de outliers. Isso pode ser comprovado analisando o boxplot da nova base.

Feature Selecting

Para possuirmos um melhor resultado é ideal selecionarmos somente as variaveis necessárias para o nosso modelo, eliminando variaveis que não trazem um ganho significativo, assim podemos eliminar a especificidade consequentemente aumentando a generalização e evitando overfitting. Para isso iremos trazer abaixo as analises que foram feitas ao longo do notebook:

1 - 'residual sugar' e 'alcohol' são muito bem representadas pela variavel 'density'. Trazendo multicolinearidade para o modelo.

2 - 'fixed acidity'apresentou uma boa representatividade sobre a variavel 'pH'. Trazendo multicolinearidade para o modelo.

3 - 'alcohol' é a variavel com maior correlação com a variavel target, 'quality'.

4 - 'citric acid', 'free sulfur dioxide' e 'sulphates' não possuem correlação significativa com a variavel target, 'quality'.

Baseado nas hipoteses acima, iremos criar alguns modelos de Machine Learning da familia ensemble para verificar quais são as variaveis com maior importância.

Realizando o processo de feature selecting utilizando o algoritmo XGBoost notamos que 'density' possui uma das piores importâncias para o modelo, a variavel citric acid apesar de a analise indicar uma baixa relação foi de grande importância, porém a variavel 'sulphates' e 'free sulfur dioxide' apresentaram baixos resultados como esperado. Para um teste podemos manter 6 das variaveis mais importantes, de um total de 11. Portanto podemos realizar um modelo de teste para verificar seu desempenho.

Normalizando/Padronização

Conforme avaliado anteriormente, após os outliers serem tratados foram gerados problemas na normalizaçao. Para isso iremos normalizar os dados novamente. Porém, para normalizarmos os dados precisamos saber quais variaveis serão normalizadas, todas? E a variavel target que iremos entregar no final, necessita de uma normalização? Muito provavelmente não, então iremos removela do dataset antes.

Transformando os Dados

Após normalizarmos as variaveis independentes (X), iremos transformar a nossa variavel dependente (y) que é continua em qualitativa numérica. Todos valores de y igual ou acima a 6.5 irão ser transformados em 1 e o restante em 0.

Após a conversão para uma classe binária entre 0 e 1 precisamos verificar o balanceamento do dataset que conforme abaixo está totalmente desbalanceado, com um numero muito maior para classificação de 'Bad'. Isso se dá pois claramente possuiamos muitos valores abaixo de 6.5, principalmente entre 6.0 e 6.25.

BALANCEANDO OS DADOS

OVERSAMPLING BASICO

O Oversampling na sua forma mais crua, replicando os dados da amostra inicial, não será utilizado pois já foi documentado que não apresenta ganho significativo de precisão.

SMOTE

Treinando Modelos

Redes Neurais - MLPClassifier

XGBOOST