require(ggplot2, quietly = TRUE)
require(GGally, quietly = TRUE)
require(reshape, quietly = TRUE)
require(dplyr, quietly = TRUE)

Sobre forma e medida

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

Força e também direção

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:

da wikipedia


Alguns testes gerando a relação

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

Dica prática

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))