Aula 3 e Aula 4 - Visualização de dados

Visualização de dados

Além da apresentação de medidas resumo, também é possível resumir a informação nos dados por meio de gráficos. A seguir, discutimos alguns dos principais gráficos usados. Para ilustrar estes gráficos, usaremos o banco de dados iris e o banco de dados adubo.

library(tidyverse)
data(iris)
adubo = read.csv("adubo.csv")

iris = as.tibble(iris)
adubo = as.tibble(adubo)
adubo$nitrato = as.factor(adubo$nitrato)
adubo$fosfato = as.factor(adubo$fosfato)

Observação: No R, em geral existem muitas opções para gerar o mesmo gráfico. A seguir, mostraremos como gerar gráficos simples usando as funções de base do R e, também, gráficos mais elegantes, usando o pacote ggplot2. Mais informações sobre este pacote estão disponíveis aqui.

Visualizando uma variável

Strip chart

O strip chart é um gráfico para uma variável que é representado em um único eixo e é tal que, cada ponto corresponde ao valor de uma observação. Ainda que para poucas observações este gráfico possa ser informativo, quando há muitas observações ele é de difícil interpretação.

No R, o strip chart pode ser obtido pelo comando stripchart(). Por exemplo, no banco de dados de adubos, obtemos:

stripchart(adubo$efeito, xlab="efeito")

Por exemplo, note que enquanto que 7 das 20 observações, estão concentradas próximo a 1.5, as outras 13 estão dispersas ao redor de 5. O gráfico levanta uma pergunta: O que nestas 7 observações faz com que o efeito da adubação nelas seja tão menor do que o nas demais observações?

A utilidade do strip chart diminui muito quando existem muitos observações, uma vez que é difícil extrair informação quando há muitos pontos agrupados. A seguir, note como é difícil interpretar um strip chart produzido com 10.000 observações:

normais = rnorm(10000)
stripchart(normais)

Em casos como o acima, é necessário resumir as observações para obter informação.

Bar plot e histograma

O bar plot e o histograma são gráficos que resumem uma variável mais do que o strip chart. Ao invés de apresentarem um ponto para cada observação, estes gráficos indicam a frequência com que cada valor ocorre para uma variável.

O bar plot é usado para variáveis qualitativas e quantitativas discretas. Ele indica a contagem com que cada valor ocorre para esta variável. Para criar um barplot no R, utilizamos primeiramente o comando table(), que conta o número de ocorrências para cada observação. A seguir, a saída do comando table é usada no comando barplot(), que exibe o gráfico. Esta sequência é ilustrada para as espécies do banco de dados iris, a seguir:

contagens = table(iris$Species)
contagens
## 
##     setosa versicolor  virginica 
##         50         50         50
barplot(contagens, xlab = "espécie", ylab = "contagem")

Por sua vez, o histograma é usado para variáveis quantitativas contínuas. Nestas variáveis, não esperamos encontrar duas observações que assumem o mesmo valor. Assim, o bar plot é pouco informativo. Uma alternativa é dividir os possíveis valores em faixas e contar a quantidade de observações em cada uma destas faixas. O gráfico que indica estas faixas se chama histograma. Este gráfico pode ser obtido no R pelo comando hist(), conforme ilustrado a seguir:

hist(normais, xlab="valores", ylab="contagem")

Lembre que as 10.000 observações acima foram usadas para ilustrar as limitações do strip chart. Ao contrário do strip chart, o histograma evidencia que as observações estão concentradas em torno de 0.

Às vezes o formato de ``degraus’’ presente no histograma pode ser indesejável. Neste caso, podemos exibir um gráfico de densidade, que cria uma curva continua que suaviza os degraus do histograma. Uma das vantegens desta curva é eliminar do histograma os vãos que são gerados por faixas sem observações. A curva de densidade para 10.000 observações é apresentada em vermelha e sobreposta ao histograma para estas observações na figura a seguir:

dados = data.frame(var1 = normais)
ggplot(aes(x = var1), 
       data = dados) + 
  geom_histogram(aes(y=..density..)) +
  geom_density(color="red") +
  xlab("valores") + ylab("densidade")

ggplot(data=iris,aes(x =  Sepal.Length, fill = Species)) +
  geom_histogram()

ggplot(data=iris,aes(x =  Sepal.Length)) +
  geom_histogram()+facet_grid(Species~.)

Às vezes, o histograma também não resume suficientemente as observações. Por exemplo, a figura abaixo apresenta histogramas de efeito para adubos com e sem nitrato. Como existe muita justaposição entre os histogramas é difícil comparar o efeito de cada adubo.

ggplot(aes(x =  efeito, fill = nitrato),
       data = adubo) +
  geom_histogram()

Para resolver este problema, veremos a seguir um gráfico que resume as observações ainda mais que o histograma.

Box plot

Um box plot (Tukey 1977) é um gráfico para visualizar uma única variável que consiste em apresentar visualmente 5 medidas resumo. Antes de descrever estas medidas, é útil visualizar um boxplot. A seguir, obtemos no R um box plot para o comprimento das sépalas no banco de dados iris:

boxplot(iris$Sepal.Length, ylab = "Comprimento da sépala")

O box plot contém 5 traços principais. O traço em negrito dentro do retângulo indicam a mediana (Q2) das observações. Os traços nos limites do retângulo indicam o primeiro (Q1) e o terceiro (Q3) quartis. Assim, observamos que cerca de 50% das observações estão dentro do retângulo e que um valor típico para as observações é representado pelo traço em negrito. A seguir, lembre que o intervalo interquartílico (IQR) é definido como \(Q3-Q1\). Definimos o limite superior (LS) e inferior (LI) como, respectivamente, \(LS=Q3+1.5*IQR\) e \(LI=Q1-1.5*IQR\). Os limites das linhas superior e inferior no boxplot são, respectivamente, a maior observação menor que LS e a menor observação maior que LI. Esta é uma faixa de valores tal que seria improvável obter uma observação fora dela. Observações fora destes limites são representadas no boxplot por asteriscos e são comumente chamadas de “outliers”.

Muitas vezes, é útil separar as observações em grupos e construir boxplots para cada um destes. O exemplo a seguir, constrói boxplots para o efeito do adubo quando separamos as observações em 2 grupos: sem ou com nitrato.

ggplot(aes(y = efeito, 
           x = nitrato, 
           fill = nitrato), 
       data = adubo) + 
  geom_boxplot()

Note que, ainda que a mediana no grupo com nitrato seja ligeiramente superior à mediana do grupo sem nitrato, a diferença entre estes valores é insignificante em relação à variabilidade dos dados. Esta conclusão é obtida visualmente vendo que os retângulos vermelho e azul estão praticamente sobrepostos. Este é um cenário em que esperamos que não exista diferença nos efeitos dos dois tipos de adubo.

Por outro lado, podemos separar as observações nos grupos: sem e com fosfato. Neste caso, obtemos as figuras:

ggplot(aes(y = efeito, 
           x = fosfato,
           fill = fosfato), 
       data = adubo) + geom_boxplot()

Neste caso, observe que a diferença entre as medianas de cada grupo é grande em relação à variabilidade dos dados. Por exemplo, verificamos que os boxplots não tem sobreposição. Neste caso, é razoável esperar que os adubos com fosfato tenham um efeito maior do que os adubos sem fosfato.

Visualizando duas variáveis

Gráfico de dispersão (Scatter plot)

Por vezes, estamos interessados em visualizar a relação entre duas variáveis contínuas. Neste caso, podemos designar um eixo para cada variável e desenhar um ponto para cada observação. Este tipo de gráfico é chamado de gráfico de dispersão.

No R é possível obter o gráfico de dispersão usando o comando plot(). A seguir, ilustramos este comando no banco de dados iris usando como variáveis o comprimento e largura das pétalas.

plot(iris$Petal.Length, iris$Petal.Width,
     xlab="Comprimento da petala",
     ylab="Largura da petala")

Note que, em média, quanto maior o comprimento da pétala, maior será a sua largura. Mais do que isso, parece haver uma relação linear entre estas quantidades. É possível ajustar uma reta que aproxima esta relação linear entre as observações usando o seguinte comando no R:

ggplot(aes(x = Petal.Length , y = Petal.Width),
       data = iris) +
  geom_point(color='blue') +
  geom_smooth(method='lm', color = "red") +
  xlab("Comprimento da petala") +
  ylab("Largura da petala")

Exercícios

  1. Construa um boxplot para os dados: 2.3, 2000, 0.1, 1.5, 0.3, 0.7, 0.2, 1.7 e 1.2.

  2. Parece haver uma relação linear entre o comprimento e largura das sépalas no banco de dados iris?

  3. No banco de dados iris, parece haver diferença entre o comprimento das sépalas entre as 3 espécies observadas?

  4. Uma pesquisadora mediu as alturas de \(9\) indivíduos, apresentadas a seguir:

## [1] 149 163 168 169 172 173 175 180 181
    1. Calcule a média e a variância das alturas.
    1. Verifique se há algum outlier neste banco de dados e descreva o significado deste termo.
  1. Um pesquisador está interessado em estudar como varia o percentual de aproveitamento do petróleo em função da temperatura de alimentação do destilador. Foram consideradas duas diferentes temperaturas (150 ou 300 graus Celsius) e uma amostra de tamanho \(9\) para cada uma destas.
    1. Indique uma medida de centralidade e uma medida de dispersão para cada uma das temperaturas testadas e interprete-as.
    1. Esboce um boxplot para o aproveitamento de petróleo para cada temperatura testada. Interprete os boxplots e compare a diferença entre os aproveitamentos para cada temperatura.
  1. O boxplot indica a mediana e o intervalo interquartílico de uma variável. Quais são possíveis vantagens destas medidas de centralidade e variabilidade em relação à média e ao desvio padrão?

  2. Pesquisadores mediram diversas vezes a quantidade de ozônio em New York. O gráfico abaixo resume estas medições separando-as por mês do ano em que ocorreram. A codificação é tal que o mês 1 é janeiro e os demais são dispostos sequencialmente.

    1. Indique de forma aproximada uma medida de centralidade e uma medida de dispersão para a quantidade de ozônio medido em cada mês estudado.
    1. Usando as medidas acima e o gráfico apresentado, argumente se há diferenças na quantidade de ozônio medido entre os meses estudados. Qual é o comportamento da quantidade de ozônio no ar ao longo dos meses estudados?
    1. Possíveis alternativas ao gráfico apresentado seriam um scatter plot por mês ou um histograma por mês. Estes gráficos facilitariam ou dificultariam a comparação realizada no item anterior?
    1. O gráfico apresenta alguns pontos isolados. Explique o significado destes pontos e indique algumas razões que poderiam explicar a existência deles.
  1. Um estudante cria um banco de dados com 2 variáveis. Na primeira variável, para cada dia, o estudante codifica o valor \(1\) se ele foi para a aula das \(8\) da manhã e \(0\) se ele não conseguiu acordar e faltou à aula. A segunda variável consiste no número de acidentes de carro por dia. Considere que o estudante mora em uma região em que há neve no inverno.
    1. O estudante verificou que, em geral, os dias em que há mais acidentes de carro são aqueles em que ele não acorda para a aula. Qual você espera que seja a correlação entre a primeira e a segunda variável (\(>0\), \(<0\) ou \(=0\))?
    1. Baseado nesta observação, o estudante conclui que pode reduzir o número de acidentes de trânsito frequentando mais as aulas das 8 da manhã. Explique a falha no raciocínio do estudante e indique uma possível justificativa para a correlação observada no item anterior.

Referências

Tukey, John W. 1977. Exploratory Data Analysis. Addison-Wesley.