require(ggplot2, quietly = TRUE)
require(GGally, quietly = TRUE)
require(reshape, quietly = TRUE)
require(dplyr, quietly = TRUE)
Em análise exploratória, com frequência queremos examinar se há associação entre duas variáveis numéricas. Conselho importante: não há um número apenas que possa lhe responder tudo sobre a associação entre as duas variáveis. As medidas de correlação que você usará servirão mais para complementar e quantificar observações feitas em gráficos de dispersão do que para lhe guiar.
Um exemplo classico com quatro pares de variáveis cujas associações interessam: x1 e y1, x2 e y2, etc., o quarteto de Anscombe:
summary(anscombe)
## x1 x2 x3 x4
## Min. : 4.0 Min. : 4.0 Min. : 4.0 Min. : 8
## 1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 8
## Median : 9.0 Median : 9.0 Median : 9.0 Median : 8
## Mean : 9.0 Mean : 9.0 Mean : 9.0 Mean : 9
## 3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.: 8
## Max. :14.0 Max. :14.0 Max. :14.0 Max. :19
## y1 y2 y3 y4
## Min. : 4.260 Min. :3.100 Min. : 5.39 Min. : 5.250
## 1st Qu.: 6.315 1st Qu.:6.695 1st Qu.: 6.25 1st Qu.: 6.170
## Median : 7.580 Median :8.140 Median : 7.11 Median : 7.040
## Mean : 7.501 Mean :7.501 Mean : 7.50 Mean : 7.501
## 3rd Qu.: 8.570 3rd Qu.:8.950 3rd Qu.: 7.98 3rd Qu.: 8.190
## Max. :10.840 Max. :9.260 Max. :12.74 Max. :12.500
# um pouco de rearrumação primeiro.
# (para entender melhor, você pode procurar sobre dados em formato
# wide ou long no R)
t1 <- melt(select(anscombe, 1:4), id = c())
t2 <- melt(select(anscombe, 5:8), id = c())
names(t2) <- c("v2", "value2")
dados <- data.frame(vars = paste(t1$variable, "e", t2$v2),
v1 = t1$value,
v2 = t2$value2)
Calculando a correlação linear:
dados %>%
group_by(vars) %>%
summarise(correlacao = cor(v1, v2, method = "pearson"))
## Source: local data frame [4 x 2]
##
## vars correlacao
## 1 x1 e y1 0.8164205
## 2 x2 e y2 0.8162365
## 3 x3 e y3 0.8162867
## 4 x4 e y4 0.8165214
E se olharmos os dados?
ggplot(dados, aes(v1, v2)) +
geom_point(color = "darkorange", size = 4, alpha = 0.7) +
theme_bw() +
scale_x_continuous(breaks = seq(0, 20, 2)) +
scale_y_continuous(breaks = seq(0, 12, 2)) +
expand_limits(x = 0, y = 0) +
facet_wrap(~ vars)
Quatro relações diferentes, mesma quantificação. Para o segundo grupo, não há uma relação linear. No 3o, há uma relação perfeita entre a maioria das observações, com uma exceção. No 4o grupo não há relação; há uma exceção que faz parecer que há uma relação.
O que os outros coeficientes podem nos dizer?
dados %>%
group_by(vars) %>%
summarise(pearson = cor(v1, v2, method = "pearson"),
spearman = cor(v1, v2, method = "spearman"),
kendall = cor(v1, v2, method = "kendall"))
## Source: local data frame [4 x 4]
##
## vars pearson spearman kendall
## 1 x1 e y1 0.8164205 0.8181818 0.6363636
## 2 x2 e y2 0.8162365 0.6909091 0.5636364
## 3 x3 e y3 0.8162867 0.9909091 0.9636364
## 4 x4 e y4 0.8165214 0.5000000 0.4264014
Dito isso, essa figura ajuda a lembrar a relação entre o valor esperado do coeficiente (linear) e vários tipos de associação entre duas variáveis:
Relação linear:
set.seed(123)
x <- rnorm(100) * 100
tamanho_do_erro <- 50
y <- 0.5 * x + rnorm(100) * tamanho_do_erro + 20
df <- data.frame(x = x,
y = y)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4) +
theme_bw()
cor(df$x, df$y, method = "pearson")
## [1] 0.66713
# Dobro de erro em torno de uma função linear f(x)
df$y <- 0.5 * x + rnorm(100) * tamanho_do_erro * 2 + 20
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4) +
theme_bw()
cor(df$x, df$y, method = "pearson")
## [1] 0.3339445
Relação não linear
n = 100
df <- data.frame(x = runif(n, min= 1, max = 20))
df$y = 100 * exp(-1.2 * df$x) #+ rnorm(n, mean = 0.05, sd = 1)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4) +
theme_bw()# + scale_y_log10()
# tente descomentando o scale_y_log10 acima e veja o que acontece
cor(df$x, df$y)
## [1] -0.5252222
cor(df$x, df$y, method = "spearman")
## [1] -1
cor(df$x, df$y, method = "kendall")
## [1] -1
Quando considerando várias variáveis, o mais prático é usar uma matriz de gráficos de dispersão:
dados <- read.csv("dados//Dados de alunos para as aulas de FPCC-report.csv")
dados <- dados %>% select(2, 3, 5, 7, 9) %>% filter(complete.cases(dados))
names(dados) <- c("curso", "sexo", "repositorios", "confianca.em.estatistica",
"altura")
str(dados)
## 'data.frame': 73 obs. of 5 variables:
## $ curso : Factor w/ 2 levels "Doutorado","Mestrado": 1 2 2 1 2 1 1 1 1 2 ...
## $ sexo : Factor w/ 2 levels "Homem","Mulher": 1 1 1 1 1 1 2 1 1 1 ...
## $ repositorios : int 0 3 15 0 0 2 0 4 1 2 ...
## $ confianca.em.estatistica: int 3 8 7 7 5 8 6 8 8 2 ...
## $ altura : int 170 167 175 173 185 192 164 178 180 180 ...
# require(GGally)
ggpairs(dados, params = c(binwidth = 2, alpha = 0.7))