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>
Faça o histograma da variável medv
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.
Apresentar as distribuições empíricas de todas as variáveis:
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
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")
Mostrar a regressão linear entre as variáveis medv
e rm
:
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
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)
Fazer o histograma dos residuais para confirmar visualmente se a relação entre as duas variáveis é linear:
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.
Fazer o diagrama entre os residuais e os valores ajustados:
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.
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")