ANÁLISE EXPLORATÓRIA DO BANCO DE DADOS: RED WINE QUALITY


no

Conforme consta no site da IBM, a análise exploratória de dados (EDA) é usada por cientistas de dados para analisar e investigar
conjuntos de dados e resumir suas principais características, muitas vezes usando métodos de visualização de dados. Ela permite
determinar a melhor forma de controlar as fontes de dados para obter as respostas que você precisa, tornando mais fácil para os
cientistas de dados descobrir padrões, detectar anomalias, testar uma hipótese ou verificar suposições.

O objetivo principal da EDA é ajudar a analisar dados antes de fazer qualquer suposição.Ela pode ajudar na identificação de erros
óbvios e entender melhor os padrões presentes dos dados, detectar desvios ou eventos anômalos, além de encontrar relações
interessantes entre as variáveis.

Para realizarmos nossas análise, utilizaremos o banco de dados sobre qualidade de vinho, disponível no site UCI Machine Learning Repository.


Contexto
Os dois conjuntos de dados estão relacionados com variantes tinto e branco do vinho português. Para mais detalhes, consulte a referência [Cortez et al., 2009]. Por questões de privacidade e logística, apenas variáveis físico-químicas (entradas) e sensoriais (saídas) estão disponíveis (por exemplo, não há dados sobre tipos de uva, marca de vinho, preço de venda do vinho, etc.).Esses conjuntos de dados podem ser vistos como tarefas de classificação ou regressão. As classes são ordenadas e não equilibradas (por exemplo, há muito mais vinhos normais do que excelentes ou pobres).


As variáveis contidas nesse dataset são:
Variáveis de entrada (com base em testes físico-químicos:
1 - acidez fixa
2 - acidez volátil
3 - ácido cítrico
4 - açúcar residual
5 - cloretos
6 - dióxido de enxofre livre
7 - dióxido de enxofre total
8 - densidade
9 - pH
10 - sulfatos
11 - álcool

Variável de saída (com base em dados sensoriais):
12 - qualidade (pontuação entre 0 e 10)


Passo a passo
Após fazer o download do arquivo, salve ele dentro da pasta do seu projeto. Faça o carregamento do arquivo usando read.csv (perceba que a extensão do arquivo baixo é .csv).
Nomearemos o nosso dataset para redwine e então faremos o carregamento do arquivo.

redwine <- read.csv('winequality-red.csv')


Conhecendo nosso dataset
Usamos a função dim para mostrar a dimensão do nosso dataset:

dim(redwine)
## [1] 1599   12

Neste caso percebemos que nosso dataset tem 1599 observações (linhas) e 12 variáveis (colunas)


Inicialmente podemos usar a função str para observarmos quais são os tipos de dados que constam em cada variável:

str(redwine)
## 'data.frame':    1599 obs. of  12 variables:
##  $ fixed.acidity       : num  7.4 7.8 7.8 11.2 7.4 7.4 7.9 7.3 7.8 7.5 ...
##  $ volatile.acidity    : num  0.7 0.88 0.76 0.28 0.7 0.66 0.6 0.65 0.58 0.5 ...
##  $ citric.acid         : num  0 0 0.04 0.56 0 0 0.06 0 0.02 0.36 ...
##  $ residual.sugar      : num  1.9 2.6 2.3 1.9 1.9 1.8 1.6 1.2 2 6.1 ...
##  $ chlorides           : num  0.076 0.098 0.092 0.075 0.076 0.075 0.069 0.065 0.073 0.071 ...
##  $ free.sulfur.dioxide : num  11 25 15 17 11 13 15 15 9 17 ...
##  $ total.sulfur.dioxide: num  34 67 54 60 34 40 59 21 18 102 ...
##  $ density             : num  0.998 0.997 0.997 0.998 0.998 ...
##  $ pH                  : num  3.51 3.2 3.26 3.16 3.51 3.51 3.3 3.39 3.36 3.35 ...
##  $ sulphates           : num  0.56 0.68 0.65 0.58 0.56 0.56 0.46 0.47 0.57 0.8 ...
##  $ alcohol             : num  9.4 9.8 9.8 9.8 9.4 9.4 9.4 10 9.5 10.5 ...
##  $ quality             : int  5 5 5 6 5 5 5 7 7 5 ...

Conforme função utilizada acima, 11 das 12 variáveis são consideradas variáveis numéricas, apenas a variável 12 que faz referência a qualidade é considerada uma variável de tipo inteiro.


Utilizaremos a função head para lermos os primeiros dados do nosso dataset e a função tail para lermos os últimos dados:

head(redwine)
##   fixed.acidity volatile.acidity citric.acid residual.sugar chlorides
## 1           7.4             0.70        0.00            1.9     0.076
## 2           7.8             0.88        0.00            2.6     0.098
## 3           7.8             0.76        0.04            2.3     0.092
## 4          11.2             0.28        0.56            1.9     0.075
## 5           7.4             0.70        0.00            1.9     0.076
## 6           7.4             0.66        0.00            1.8     0.075
##   free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol
## 1                  11                   34  0.9978 3.51      0.56     9.4
## 2                  25                   67  0.9968 3.20      0.68     9.8
## 3                  15                   54  0.9970 3.26      0.65     9.8
## 4                  17                   60  0.9980 3.16      0.58     9.8
## 5                  11                   34  0.9978 3.51      0.56     9.4
## 6                  13                   40  0.9978 3.51      0.56     9.4
##   quality
## 1       5
## 2       5
## 3       5
## 4       6
## 5       5
## 6       5
tail(redwine)
##      fixed.acidity volatile.acidity citric.acid residual.sugar chlorides
## 1594           6.8            0.620        0.08            1.9     0.068
## 1595           6.2            0.600        0.08            2.0     0.090
## 1596           5.9            0.550        0.10            2.2     0.062
## 1597           6.3            0.510        0.13            2.3     0.076
## 1598           5.9            0.645        0.12            2.0     0.075
## 1599           6.0            0.310        0.47            3.6     0.067
##      free.sulfur.dioxide total.sulfur.dioxide density   pH sulphates alcohol
## 1594                  28                   38 0.99651 3.42      0.82     9.5
## 1595                  32                   44 0.99490 3.45      0.58    10.5
## 1596                  39                   51 0.99512 3.52      0.76    11.2
## 1597                  29                   40 0.99574 3.42      0.75    11.0
## 1598                  32                   44 0.99547 3.57      0.71    10.2
## 1599                  18                   42 0.99549 3.39      0.66    11.0
##      quality
## 1594       6
## 1595       5
## 1596       6
## 1597       6
## 1598       5
## 1599       6


Também podemos ver o nosso dataset utizando a função View, note que a letra V é maiúscula.

View(redwine)


Verificaremos se há valores nulos no nosso dataset.

#is.null(redwine)
A informação foi falsa, portanto não há valores nulos no nosso banco de dados.
Obs.: Nao rodei este código para não “poluir” nosso texto, mas você pode rodar no seu computador para ver o resultado.

Caso existisse valores nulos, poderíamos contabilizá-los da seguinte forma:

sum(is.null(redwine))
## [1] 0

Para verificarmos a existência de valores NA (not availaible), usamos is.na
Caso existisse valores NA, poderíamos contabilizá-los da seguinte forma:

#is.na(redwine)
sum(is.na(redwine))
## [1] 0
Obs.: Nao rodei este código para não “poluir” nosso texto, mas você pode rodar no seu computador para ver o resultado.


MEDIDAS DE CENTRALIDADE (MÉDIA / MEDIANA)

Média
O conceito e a ideia de média estão sempre relacionados com a soma dos valores de um determinado conjunto de medidas, dividindo-se o resultado dessa soma pela quantidade dos valores que foram somados. Veja mais

Qual é a média da variável alcohol?

mean(redwine$alcohol)
## [1] 10.42298

Mediana
A mediana é valor que divide os dados em 50%.

Qual é a mediana da variável residual.sugar?

median(redwine$residual.sugar)
## [1] 2.2

Moda
Representa o valor mais frequente de um conjunto de dados, sendo assim, para defini-la basta observar a frequência com que os valores aparecem. Veja mais
Precisaremos montar a função que nos dará o resultado da moda, pois não há um padrão pré-definido no R base.

Qual é a moda da variável pH?

Primeiro vamos encontrar a frequência:

frequencia <- table(redwine$pH)
frequencia
## 
## 2.74 2.86 2.87 2.88 2.89  2.9 2.92 2.93 2.94 2.95 2.98 2.99    3 3.01 3.02 3.03 
##    1    1    1    2    4    1    4    3    4    1    5    2    6    5    8    6 
## 3.04 3.05 3.06 3.07 3.08 3.09  3.1 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 
##   10    8   10   11   11   11   19    9   20   13   21   34   36   27   30   25 
##  3.2 3.21 3.22 3.23 3.24 3.25 3.26 3.27 3.28 3.29  3.3 3.31 3.32 3.33 3.34 3.35 
##   39   36   39   32   29   26   53   35   42   46   57   39   45   37   43   39 
## 3.36 3.37 3.38 3.39  3.4 3.41 3.42 3.43 3.44 3.45 3.46 3.47 3.48 3.49  3.5 3.51 
##   56   37   48   48   37   34   33   17   29   20   22   21   19   10   14   15 
## 3.52 3.53 3.54 3.55 3.56 3.57 3.58 3.59  3.6 3.61 3.62 3.63 3.66 3.67 3.68 3.69 
##   18   17   16    8   11   10   10    8    7    8    4    3    4    3    5    4 
##  3.7 3.71 3.72 3.74 3.75 3.78 3.85  3.9 4.01 
##    1    4    3    1    1    2    1    2    2
Como podemos observar, não fica nada fácil visualizar o resultado com rapidez.

Como segundo passo vamos encontrar qual é o valor que mais se repete:

frequencia[frequencia == max(frequencia)]
## 3.3 
##  57
Isso nos mostra que o valor 3.3 é o valor que mais aparece (57 vezes).

No terceiro e último passo, criaremos nossa função para Moda.

moda <- function(x) {
  tab = table(x)
  tab[tab == max(tab)]
}

Eba, função criada! Vamos rodar a nossa variável nela:

moda(redwine$pH)
## 3.3 
##  57

Bem mais simples depois que criamos a função!


MEDIDAS DE DISPERSÃO ((DESVIO PADRÃO, VARIÂNCIA, COEFICIENTE DE VARIAÇÃO, AMPLITUDE E QUARTIS)

Desvio padrão
Indica o quanto um conjunto de dados é uniforme. Quanto mais próximo de 0 for o desvio padrão, mais homogêneo são os dados.

Desvio padrão da variável density:

sd(redwine$density, na.rm = TRUE)
## [1] 0.001887334

Variância
Indica “o quão longe” em geral os seus valores se encontram do valor esperado.

Variância da variável density:

var(redwine$density, na.rm = TRUE)
## [1] 3.562029e-06

Coeficiente de variação
O coeficiente de variação fornece a variação dos dados obtidos em relação à média. Quanto menor for o seu valor, mais homogêneos serão os dados.

Coeficiente de variação da variável density:

sd(redwine$density, na.rm = TRUE)/mean(redwine$density, na.rm = TRUE)
## [1] 0.001893494

Valor mínimo da variável density:

min(redwine$density, na.rm = TRUE)
## [1] 0.99007

Valor máximo da variável density:

max(redwine$density, na.rm = TRUE)
## [1] 1.00369

Apresentando os valores mínimos e máximosapenas com uma função (variável density):

range(redwine$density, na.rm = TRUE)
## [1] 0.99007 1.00369

Amplitude
A amplitude é a diferença entre o valor mínimo e o valor máximo.

Amplitude da varivável density:

diff(range(redwine$density, na.rm = TRUE))
## [1] 0.01362

Quartil
É a divisão dos dados em 4 partes (Q1 = 25%, Q2 = 50%, Q3 = 75%, Q4 = 100%.

Quartis da variávelalcohol:

quantile(redwine$alcohol)
##   0%  25%  50%  75% 100% 
##  8.4  9.5 10.2 11.1 14.9

Podemos utilizar a função summary para resumir os dados da variável alcohol<

summary(redwine$alcohol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    8.40    9.50   10.20   10.42   11.10   14.90

Ou podemos mostrar os mesmos valores resumidos para o dataset inteiro:

summary(redwine)
##  fixed.acidity   volatile.acidity  citric.acid    residual.sugar  
##  Min.   : 4.60   Min.   :0.1200   Min.   :0.000   Min.   : 0.900  
##  1st Qu.: 7.10   1st Qu.:0.3900   1st Qu.:0.090   1st Qu.: 1.900  
##  Median : 7.90   Median :0.5200   Median :0.260   Median : 2.200  
##  Mean   : 8.32   Mean   :0.5278   Mean   :0.271   Mean   : 2.539  
##  3rd Qu.: 9.20   3rd Qu.:0.6400   3rd Qu.:0.420   3rd Qu.: 2.600  
##  Max.   :15.90   Max.   :1.5800   Max.   :1.000   Max.   :15.500  
##    chlorides       free.sulfur.dioxide total.sulfur.dioxide    density      
##  Min.   :0.01200   Min.   : 1.00       Min.   :  6.00       Min.   :0.9901  
##  1st Qu.:0.07000   1st Qu.: 7.00       1st Qu.: 22.00       1st Qu.:0.9956  
##  Median :0.07900   Median :14.00       Median : 38.00       Median :0.9968  
##  Mean   :0.08747   Mean   :15.87       Mean   : 46.47       Mean   :0.9967  
##  3rd Qu.:0.09000   3rd Qu.:21.00       3rd Qu.: 62.00       3rd Qu.:0.9978  
##  Max.   :0.61100   Max.   :72.00       Max.   :289.00       Max.   :1.0037  
##        pH          sulphates         alcohol         quality     
##  Min.   :2.740   Min.   :0.3300   Min.   : 8.40   Min.   :3.000  
##  1st Qu.:3.210   1st Qu.:0.5500   1st Qu.: 9.50   1st Qu.:5.000  
##  Median :3.310   Median :0.6200   Median :10.20   Median :6.000  
##  Mean   :3.311   Mean   :0.6581   Mean   :10.42   Mean   :5.636  
##  3rd Qu.:3.400   3rd Qu.:0.7300   3rd Qu.:11.10   3rd Qu.:6.000  
##  Max.   :4.010   Max.   :2.0000   Max.   :14.90   Max.   :8.000

Quais são os valores únicos desta variável?

unique(redwine$quality)
## [1] 5 6 7 4 8 3

HISTOGRAMA
Com base na Alura, um histograma é uma espécie de gráfico de barras que demonstra uma distribuição de frequências. No histograma, a base de cada uma das barras representa uma classe e a altura representa a quantidade ou frequência absoluta com que o valor de cada classe ocorre. Ao mesmo tempo, ele pode ser utilizado como um indicador de dispersão de processos.

Podemos plotar um histograma da nossa variável alcohol:

hist(redwine$alcohol, freq = TRUE, labels = TRUE)

A mesma variável, porém sem os dados de frequência:

color <- colorRampPalette(c("DeepPink","DeepSkyBlue"))
hist(redwine$alcohol,  
     main = "Histograma Frequência X Alcohol", 
     xlab = "Variável Alcohol", ylab = "Frequência", 
     col = c(color(15)),
     border = FALSE,
     labels = TRUE)

Outliers
São valores de dados que estão distantes dos outros valores de dados, podem afetar fortemente seus resultados.

Para encontrarmos outliers, podemos plotar um boxplot:

boxplot(redwine$quality)
Com isso finalizamos nossa demonstração de análise exploratória utilizando R base (sem instalação de pacotes adicionais).
O intuito deste projeto não foi analisar os dados, mas apenas mostrar como podemos ter uma primeira impressão do nosso dataset, como podemos conhecer os dados quando nunca o vimos antes.

Espero que este trabalho tenha ajudado quem não tinha conhecimento algum e estava perdido para iniciar seu próprio projeto.

Sendo assim, me coloco à disposição para elucidar quaisquer dúvidas que possam aparecer. Conte comigo!

Até breve,

Viviane Rocha