Exercícios

Análise Exploratória do dataset Boston

Este dataset descreve preços de habitações nas zonas suburbanas de Boston:

library(tidyr)
library(dplyr)
library(ggplot2)

data(Boston, package = "MASS")

df <- tbl_df(Boston)
df
# A tibble: 506 x 14
      crim    zn indus  chas   nox    rm   age    dis   rad   tax ptratio
*    <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl>  <dbl> <int> <dbl>   <dbl>
1  0.00632  18.0  2.31     0 0.538 6.575  65.2 4.0900     1   296    15.3
2  0.02731   0.0  7.07     0 0.469 6.421  78.9 4.9671     2   242    17.8
3  0.02729   0.0  7.07     0 0.469 7.185  61.1 4.9671     2   242    17.8
4  0.03237   0.0  2.18     0 0.458 6.998  45.8 6.0622     3   222    18.7
5  0.06905   0.0  2.18     0 0.458 7.147  54.2 6.0622     3   222    18.7
6  0.02985   0.0  2.18     0 0.458 6.430  58.7 6.0622     3   222    18.7
7  0.08829  12.5  7.87     0 0.524 6.012  66.6 5.5605     5   311    15.2
8  0.14455  12.5  7.87     0 0.524 6.172  96.1 5.9505     5   311    15.2
9  0.21124  12.5  7.87     0 0.524 5.631 100.0 6.0821     5   311    15.2
10 0.17004  12.5  7.87     0 0.524 6.004  85.9 6.5921     5   311    15.2
# ... with 496 more rows, and 3 more variables: black <dbl>, lstat <dbl>,
#   medv <dbl>

Exercício

Faça o histograma da variável medv

plot of chunk unnamed-chunk-2

Solução

Passamos o data frame para o ggplot e definimos o geom histogram:

df %>% 
  ggplot(aes(x=medv)) +
    geom_histogram()

Nota-se de imediato que a variável não parece seguir uma distribuição normal.

Exercício

Apresentar as distribuições empíricas de todas as variáveis:

plot of chunk unnamed-chunk-4

Solução

A ideia chave é usar as facetas do ggplot. Para isso é preciso colocarmos todos os valores das colunas numa coluna única para que as facetas possam funcionar:

df %>% 
  gather("key", "val", 1:14)  
# A tibble: 7,084 x 2
     key     val
   <chr>   <dbl>
1   crim 0.00632
2   crim 0.02731
3   crim 0.02729
4   crim 0.03237
5   crim 0.06905
6   crim 0.02985
7   crim 0.08829
8   crim 0.14455
9   crim 0.21124
10  crim 0.17004
# ... with 7,074 more rows

Solução

Com a tabela neste formato podemos usar as facetas do ggplot:

df %>% 
  gather("key", "val", 1:14) %>%  
  ggplot(aes(x = val)) +
    geom_area(stat="density") +
    facet_wrap(~key, scales="free")

plot of chunk unnamed-chunk-6

Exercício

Mostrar a regressão linear entre as variáveis medv e rm:

plot of chunk unnamed-chunk-7

Solução

O modelo linear é feito pela função R, lm:

mdl <- lm(medv ~ rm, data=df) # aplicar a regressão linear

coef.icept <- coef(mdl)[1]    # ir buscar a interseção
coef.slope <- coef(mdl)[2]    # ir buscar o declive

Solução

Agora o ggplot já pode desenhar a linha juntamente com os pontos:

df %>% 
  ggplot(aes(x=rm, y=medv)) +
  geom_point() +
  geom_abline(intercept=coef.icept, slope=coef.slope, color="red", lwd=1.25)

plot of chunk unnamed-chunk-9

Exercício

Fazer o histograma dos residuais para confirmar visualmente se a relação entre as duas variáveis é linear:

plot of chunk unnamed-chunk-10

Solução

residuals <- data.frame(res=mdl$residuals, 
                        fit=mdl$fitted.values)

residuals %>% 
  ggplot(aes(res)) +
  geom_histogram()

O histograma dos residuais não parece ser seguir uma normal, o que é indicação que a relação entre as duas variáveis não deve ser linear.

Exercício

Fazer o diagrama entre os residuais e os valores ajustados:

plot of chunk unnamed-chunk-12

Solução

residuals %>% 
  ggplot(aes(x = fit, y = res)) +
    geom_point() + 
    geom_smooth(se = FALSE) +
    labs(x = "fitted", y = "residual")

Se a relação fosse linear então a relação entre os residuais e os valores ajustados deveria ser aleatória, o que não ocorre.

Solução

Um exemplo de uma relação linear:

set.seed(100)
x <- 1:100
y <- 1.3*x + rnorm(100, 0, 5)
df2 <- data.frame(x=x, y=y)

mdl2 <- lm(y ~ x, data=df2)

residuals2 <- 
  data.frame(res=mdl2$residuals, 
             fit=mdl2$fitted.values)

Neste dataset os residuais estão distribuídos mais aleatoriamente:

residuals2 %>% 
  ggplot(aes(x = fit, y = res)) +
    geom_point() + 
    geom_smooth(se = FALSE) +
    labs(x = "fitted", y = "residual")

plot of chunk unnamed-chunk-15