library(tidyverse)
library(GGally)
theme_set(theme_bw())
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:
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
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"), )
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"), )
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}\).
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`.
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"))