library(tidyverse)
library(GGally)

theme_set(theme_bw())

Sobre forma e medida

Em análise exploratória, com frequência queremos examinar se há associação entre duas variáveis numéricas. Para descrever uma associação como essa, há pelo menos quatro características importantes:

  1. Formato da associação: linear, exponencial, parabólica, linear e depois assintótica, outro formato arbitrário, etc.
  2. Força da associação: correlação forte, fraca, nenhuma.
  3. Sinal da associação: correlação positiva ou negativa, quando é perceptível.
  4. Pontos extremos fora da associação.

Força e sinal

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

da wikipedia


Formato

Relação linear:

set.seed(123)

var1 <- rnorm(100) * 100
tamanho_do_erro <- 50
var2 <- 0.5 * var1 + rnorm(100) * tamanho_do_erro + 20

dados <- tibble(var1, 
                var2)

dados %>% 
  ggplot(aes(x = var1, y = var2)) + 
  geom_point(colour = "darkgrey", size = 4)  

dados %>% 
  summarise(correlacao = cor(var1, var2, method = "pearson"))
# Dobro de erro em torno de uma função linear f(x)
dados$var2 <- 0.5 * var1 + rnorm(100) * tamanho_do_erro * 2 + 20

ggplot(dados, aes(x = var1, y = var2)) + 
  geom_point(colour = "darkgrey", size = 4)  

dados %>% 
  summarise(correlacao = cor(var1, var2, method = "pearson"))

Outros coeficientes:

dados %>% 
  summarise(pearson = cor(var1, var2, method = "pearson"), 
            spearman = cor(var1, var2, method = "spearman"), 
            kendall = cor(var1, var2, method = "kendall"), )

Relação não linear

n = 100
df <- tibble(
  x = runif(n, min= 1, max = 20)
) %>% 
  mutate(y = 100 * exp(-1.2 * x))

ggplot(df, aes(x = x, y = y)) + 
  geom_point(colour = "darkgrey", size = 4) 

ggplot(df, aes(x = x, y = y)) + 
  geom_point(colour = "darkgrey", size = 4) + 
  scale_y_log10()  

df %>% 
  summarise(pearson = cor(x, y, method = "pearson"), 
            spearman = cor(x, y, method = "spearman"), 
            kendall = cor(x, y, method = "kendall"), )

Transformações e correlação

Relações lineares normalmente são mais fáceis de visualizar, interpretar e por vezes quantificar. As mesmas transformações em escalas que usamos para visualizar dados muito enviesados pode ser usada para examinar correlações.

Por exemplo, se \(y\) cresce de maneira logarítmica em função de \(x\), ao visualizarmos a relação entre \(y\) e \(log(x)\) veremos uma relação linear.

Com escalas lineares:

mundo = gapminder::gapminder %>% 
  group_by(country, continent) %>% 
  arrange(-year) %>% 
  slice(1) 

mundo %>% 
  filter(continent %in% c("Americas", "Europe")) %>% 
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) + 
  geom_point(size = 3) 

Com \(x\) em escala de log, estamos vendo \(y = f(log(x))\)

mundo %>% 
  filter(continent %in% c("Americas", "Europe")) %>% 
  ggplot(aes(x = gdpPercap, y = lifeExp, color = continent)) + 
  geom_point(size = 3) + 
  scale_x_log10() +
  NULL

De maneira análoga, se o formato de \(y = f(x)\) é tal que y cresce exponencialmente com x (ou seja, \(y = ae^{bx}\)), e transformamos ambos os lados com log, temos que \(ln(y) = ln(ae^{bx}) = ln(a) + bx\). Essa expressão modela uma relação linear entre \(ln(y)\) e \(x\).

Nesse caso, uma visualização em uma escala linear para \(x\) e log para \(y\) (ou seja, com a posição vertical dada em função de \(ln(y)\)) terá um aspecto de linha reta.


Já se a relação \(y = f(x)\) é no formato \(y = ax^{b}\)), ao transformarmos os dois lados com log, temos que \(ln(y) = ln(ax^{b}) = ln(a) + b log(x)\). Essa expressão modela uma relação linear entre \(ln(y)\) e \(ln(x)\).

Os dados em escala linear-linear:

animais = MASS::Animals

animais %>% 
  ggplot(aes(x = body, y = brain)) + 
  geom_point(size = 4, color = "brown")

Uma escala de log apenas para x ou y não revela nenhuma relação perto de linear:

animais %>% 
  ggplot(aes(x = body, y = brain)) + 
  geom_point(size = 4, color = "brown") + 
  scale_x_log10()

animais %>% 
  ggplot(aes(x = body, y = brain)) + 
  geom_point(size = 4, color = "brown") + 
  scale_y_log10()

Já com ambas as escalas em log, veja só:

animais %>% 
  ggplot(aes(x = body, y = brain)) + 
  geom_point(size = 4, color = "brown") + 
  scale_x_log10() + 
  scale_y_log10()

Ou seja, existe uma relação linear \(log_{10}(brain) = c + b . log_{10}(body)\). Ou seja, x e y então tem uma relação polinomial da forma: \(brain = a.body^{b}\).


Dica prática

Quando considerando várias variáveis, o mais prático é usar uma matriz de gráficos de dispersão:

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
ggpairs(iris, progress = F)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


Sumários x todos os pontos

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
xs = anscombe %>% 
  select(1:4) %>% 
  gather(key = "v1", value = "value1")

ys = anscombe %>% 
  select(5:8) %>% 
  gather(key = "v2", value = "value2")

dados = bind_cols(xs, ys) %>% 
  mutate(vars = str_glue("{v1} e {v2}"))

Calculando a correlação linear:

dados %>% 
  group_by(vars) %>% 
  summarise(correlacao = cor(value1, value2, method = "pearson"))

E se olharmos os dados?

ggplot(dados, aes(value1, value2)) + 
  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(value1, value2, method = "pearson"), 
            spearman = cor(value1, value2, method = "spearman"),
            kendall = cor(value1, value2, method = "kendall"))