Capítulo 15.1

Índice

  1. 1. O que é Ciência de Dados?
  2. 2. Causalidade e Experimentos
  3. 3. Progamando em Python
  4. 4. Tipos de Dados
  5. 5. Sequências
  6. 6. Tabelas
  7. 7. Visualização
  8. 8. Funções e Tabelas
  9. 9. Aleatoriedade
  10. 10. Amostragem e Distribuições Empíricas
  11. 11. Testando Hipóteses
  12. 12. Comparando Duas Amostras
  13. 13. Estimação
  14. 14. Por que a Média é Importante
  15. 15. Previsão

from datascience import *
%matplotlib inline
path_data = '../../../assets/data/'
import matplotlib.pyplot as plots
plots.style.use('fivethirtyeight')
import math
import numpy as np
from scipy import stats

 

Correlação

Nesta seção, desenvolveremos uma medida de quão fortemente agrupado um diagrama de dispersão está em relação a uma linha reta. Formalmente, isso é chamado de medição de associação linear.

def r_scatter(r):
    plots.figure(figsize=(5,5))
    "Gere um gráfico de dispersão com uma correlação aproximadamente r"
    x = np.random.normal(0, 1, 1000)
    z = np.random.normal(0, 1, 1000)
    y = r*x + (np.sqrt(1-r**2))*z
    plots.scatter(x, y)
    plots.xlim(-4, 4)
    plots.ylim(-4, 4)

 

A tabela hybrid contém dados sobre carros híbridos de passageiros vendidos nos Estados Unidos de 1997 a 2013. Os dados foram adaptados do arquivo de dados online do Prof. Larry Winner da Universidade da Flórida. As colunas são:

  • vehicle: modelo do carro
  • year: ano de fabricação
  • msrp: preço de varejo sugerido pelo fabricante em dólares de 2013
  • acceleration: taxa de aceleração em km por hora por segundo
  • mpg: economia de combustível em milhas por galão
  • class: classe do modelo.
hybrid = Table.read_table(path_data + 'hybrid.csv')

 

hybrid
vehicle year msrp acceleration mpg class
Prius (1st Gen) 1997 24509.7 7.46 41.26 Compact
Tino 2000 35355 8.2 54.1 Compact
Prius (2nd Gen) 2000 26832.2 7.97 45.23 Compact
Insight 2000 18936.4 9.52 53 Two Seater
Civic (1st Gen) 2001 25833.4 7.04 47.04 Compact
Insight 2001 19036.7 9.52 53 Two Seater
Insight 2002 19137 9.71 53 Two Seater
Alphard 2003 38084.8 8.33 40.46 Minivan
Insight 2003 19137 9.52 53 Two Seater
Civic 2003 14071.9 8.62 41 Compact

 

O gráfico abaixo é um gráfico de dispersão de msrp versus acceleration. Isso significa que msrp é plotado no eixo vertical e accelaration na horizontal.

hybrid.scatter('acceleration', 'msrp')

Observe a associação positiva. A dispersão dos pontos está inclinada para cima, indicando que os carros com maior aceleração tendem a custar mais, em média; por outro lado, os carros que custam mais tendem a ter maior aceleração, em média.

O diagrama de dispersão de MSRP versus quilometragem mostra uma associação negativa. Carros híbridos com maior quilometragem tendem a custar menos, em média. Isso parece surpreendente até que você considere que carros que aceleram rapidamente tendem a ser menos eficientes em termos de combustível e têm menor quilometragem. Como o gráfico de dispersão anterior mostrou, esses também eram os carros que tendiam a custar mais.

hybrid.scatter('mpg', 'msrp')

Juntamente com a associação negativa, o diagrama de dispersão de preço versus eficiência mostra uma relação não linear entre as duas variáveis. Os pontos parecem estar agrupados em torno de uma curva, não em torno de uma linha reta.

Se restringirmos os dados apenas à classe SUV, no entanto, a associação entre preço e eficiência ainda é negativa, mas a relação parece ser mais linear. A relação entre preço e aceleração dos SUV também mostra uma tendência linear, mas com uma inclinação positiva.

suv = hybrid.where('class', 'SUV')
suv.scatter('mpg', 'msrp')

suv.scatter('acceleration', 'msrp')

Você deve ter notado que podemos derivar informações úteis da orientação geral e da forma de um diagrama de dispersão mesmo sem prestar atenção às unidades em que as variáveis foram medidas.

De fato, poderíamos plotar todas as variáveis em unidades padrão e os gráficos teriam a mesma aparência. Isso nos dá uma maneira de comparar o grau de linearidade em dois diagramas de dispersão.

Lembre-se de que em uma seção anterior definimos a função standard_units para converter uma matriz de números em unidades padrão.

def standard_units(any_numbers):
    "Converte qualquer matriz de números em unidades padrão."
    return (any_numbers - np.mean(any_numbers))/np.std(any_numbers)  

 

Podemos usar esta função para redesenhar os dois diagramas de dispersão para os SUVs, com todas as variáveis medidas em unidades padrão.

Table().with_columns(
    'mpg (standard units)',  standard_units(suv.column('mpg')),
    'msrp (standard units)', standard_units(suv.column('msrp'))
).scatter(0, 1)
plots.xlim(-3, 3)
plots.ylim(-3, 3);

Table().with_columns(
    'acceleration (standard units)', standard_units(suv.column('acceleration')),
    'msrp (standard units)',         standard_units(suv.column('msrp'))
).scatter(0, 1)
plots.xlim(-3, 3)
plots.ylim(-3, 3);

As associações que vemos nestes gráficos são as mesmas que vimos antes. Além disso, como os dois diagramas de dispersão agora são desenhados exatamente na mesma escala, podemos ver que a relação linear no segundo diagrama é um pouco mais difusa do que no primeiro.

Agora definiremos uma medida que usa unidades padrão para quantificar os tipos de associação que vimos.

O coeficiente de correlação

O coeficiente de correlação mede a força da relação linear entre duas variáveis. Graficamente, ele mede o quão agrupado está o diagrama de dispersão em torno de uma linha reta.

O termo coeficiente de correlação não é fácil de dizer, então geralmente é abreviado para correlação e denotado por r.

Aqui estão alguns fatos matemáticos sobre r que vamos observar por simulação.

  • O coeficiente de correlação r é um número entre -1 e 1.
  • r mede até que ponto o diagrama de dispersão se agrupa em torno de uma linha reta.
  • r = 1 se o diagrama de dispersão for uma linha reta perfeita inclinada para cima, e r = -1 se o diagrama de dispersão for uma linha reta perfeita inclinada para baixo.

A função r_scatter recebe um valor de r como argumento e simula um gráfico de dispersão com uma correlação muito próxima de r. Devido à aleatoriedade na simulação, não se espera que a correlação seja exatamente igual a r.

Chame r_scatter algumas vezes, com diferentes valores de r como argumento, e veja como o gráfico de dispersão muda.

Quando r=1, o gráfico de dispersão é perfeitamente linear e inclinado para cima. Quando r=-1, o gráfico de dispersão é perfeitamente linear e inclinado para baixo. Quando r=0, o gráfico de dispersão é uma nuvem amorfa em torno do eixo horizontal, e as variáveis são ditas não correlacionadas.

r_scatter(0.9)

r_scatter(0.25)

r_scatter(0)

r_scatter(-0.55)

Calculando r

A fórmula para r não é aparente a partir de nossas observações até agora. Ela possui uma base matemática que está fora do escopo desta aula. No entanto, como veremos, o cálculo é direto e nos ajuda a entender várias das propriedades de r.

Fórmula para r:

r é a média dos produtos das duas variáveis, quando ambas as variáveis são medidas em unidades padrão.

Aqui estão os passos no cálculo. Vamos aplicar os passos a uma tabela simples de valores de x e y.

x = np.arange(1, 7, 1)
y = make_array(2, 3, 1, 5, 2, 7)
t = Table().with_columns(
        'x', x,
        'y', y
    )
t
x y
1 2
2 3
3 1
4 5
5 2
6 7

 

Com base no diagrama de dispersão, esperamos que r seja positivo, mas não igual a 1.

t.scatter(0, 1, s=30, color='red')

Passo 1. Converta cada variável em unidades padrão.

t_su = t.with_columns(
        'x (standard units)', standard_units(x),
        'y (standard units)', standard_units(y)
    )
t_su
x y x (standard units) y (standard units)
1 2 -1.46385 -0.648886
2 3 -0.87831 -0.162221
3 1 -0.29277 -1.13555
4 5 0.29277 0.811107
5 2 0.87831 -0.648886
6 7 1.46385 1.78444

 

Passo 2. Multiplique cada par de unidades padrão.

t_product = t_su.with_column('product of standard units', t_su.column(2) * t_su.column(3))
t_product
x y x (standard units) y (standard units) product of standard units
1 2 -1.46385 -0.648886 0.949871
2 3 -0.87831 -0.162221 0.142481
3 1 -0.29277 -1.13555 0.332455
4 5 0.29277 0.811107 0.237468
5 2 0.87831 -0.648886 -0.569923
6 7 1.46385 1.78444 2.61215

 

Passo 3. r é a média dos produtos computados no Passo 2.

# r é a média dos produtos das unidades padrão

r = np.mean(t_product.column(4))
r
Out[1]: 0.6174163971897709

 

Como esperado, r é positivo, mas não é igual a 1.

Propriedades de r

O cálculo mostra que:

  • r é um número puro. Ele não possui unidades. Isso ocorre porque r é baseado em unidades padrão.
  • r não é afetado pela mudança de unidades em nenhum dos eixos. Isso também ocorre porque r é baseado em unidades padrão.
  • r não é afetado pela troca dos eixos. Algebraicamente, isso ocorre porque o produto das unidades padrão não depende de qual variável é chamada de x e qual é y. Geometricamente, a troca de eixos reflete o gráfico de dispersão em relação à linha y=x, mas não altera a quantidade de agrupamento nem o sinal da associação.
t.scatter('y', 'x', s=30, color='red')

A função correlation

Estaremos calculando correlações repetidamente, então será útil definir uma função que as calcule executando todas as etapas descritas acima. Vamos definir uma função correlation que recebe uma tabela e os rótulos de duas colunas no tabela. A função retorna r, a média dos produtos desses valores de coluna em unidades padrão.

def correlation(t, x, y):
    return np.mean(standard_units(t.column(x))*standard_units(t.column(y)))

 

Vamos chamar a função nas colunas x e y de t. A função retorna a mesma resposta para a correlação entre x e y que obtivemos pela aplicação direta de a fórmula para r.

correlation(t, 'x', 'y')
Out[2]: 0.6174163971897709

 

Como notamos, a ordem em que as variáveis são especificadas não importa.

correlation(t, 'y', 'x')
Out[3]: 0.6174163971897709

 

Chamar correlation nas colunas da tabela suv nos dá a correlação entre preço e quilometragem, bem como a correlação entre preço e aceleração.

correlation(suv, 'mpg', 'msrp')
Out[4]: -0.6667143635709919

 

correlation(suv, 'acceleration', 'msrp')
Out[5]: 0.48699799279959155

 

Esses valores confirmam o que tínhamos observado:

  • Existe uma associação negativa entre preço e eficiência, enquanto a associação entre preço e aceleração é positiva.
  • A relação linear entre preço e aceleração é um pouco mais fraca (correlação cerca de 0,5) do que entre preço e quilometragem (correlação cerca de -0,67).

Correlação é um conceito simples e poderoso, mas às vezes é mal utilizado. Antes de usar r, é importante estar ciente do que a correlação mede e do que não mede.

Associação não implica Causalidade

Correlação mede apenas associação. Correlação não implica causalidade. Embora a correlação entre o peso e a habilidade matemática das crianças em um distrito escolar possa ser positiva, isso não significa que fazer matemática faça as crianças ficarem mais pesadas ou que ganhar peso melhore as habilidades matemáticas das crianças. Idade é uma variável de confusão: crianças mais velhas são tanto mais pesadas quanto melhores em matemática do que crianças mais novas, em média.

Correlação Mede Associação Linear

Correlação mede apenas um tipo de associação – linear. Variáveis que têm forte associação não linear podem ter correlação muito baixa. Aqui está um exemplo de variáveis que têm uma relação quadrática perfeita y = x^2, mas têm correlação igual a 0.

new_x = np.arange(-4, 4.1, 0.5)
nonlinear = Table().with_columns(
        'x', new_x,
        'y', new_x**2
    )
nonlinear.scatter('x', 'y', s=30, color='r')

correlation(nonlinear, 'x', 'y')
Out[6]: 0.0

 

A Correlação é Afetada por Outliers

Outliers podem ter um grande efeito na correlação. Aqui está um exemplo onde um gráfico de dispersão para o qual r é igual a 1 é transformado em um gráfico para o qual r é igual a 0, pela adição de apenas um ponto periférico .

line = Table().with_columns(
        'x', make_array(1, 2, 3, 4),
        'y', make_array(1, 2, 3, 4)
    )
line.scatter('x', 'y', s=30, color='r')

correlation(line, 'x', 'y')
Out[7]: 1.0

 

outlier = Table().with_columns(
        'x', make_array(1, 2, 3, 4, 5),
        'y', make_array(1, 2, 3, 4, 0)
    )
outlier.scatter('x', 'y', s=30, color='r')

correlation(outlier, 'x', 'y')
Out[8]: 0.0

 

As Correlações Ecológicas devem ser Interpretadas com Cuidado

Correlações baseadas em dados agregados podem ser enganosas. Como exemplo, aqui estão dados sobre as pontuações do SAT de Leitura Crítica e Matemática em 2014. Há um ponto para cada um dos 50 estados e um para Washington, D.C. A coluna Taxa de Participação contém a porcentagem de alunos do último ano do ensino médio que fizeram o teste. As três próximas colunas mostram a pontuação média no estado em cada parte do teste, e a coluna final é a média das pontuações totais no teste.

sat2014 = Table.read_table(path_data + 'sat2014.csv').sort('State')
sat2014
State Participation Rate Critical Reading Math Writing Combined
Alabama 6.7 547 538 532 1617
Alaska 54.2 507 503 475 1485
Arizona 36.4 522 525 500 1547
Arkansas 4.2 573 571 554 1698
California 60.3 498 510 496 1504
Colorado 14.3 582 586 567 1735
Connecticut 88.4 507 510 508 1525
Delaware 100 456 459 444 1359
District of Columbia 100 440 438 431 1309
Florida 72.2 491 485 472 1448

 

O diagrama de dispersão das pontuações em matemática versus pontuações em leitura crítica está fortemente agrupado em torno de uma linha reta; a correlação é próxima de 0,985.

sat2014.scatter('Critical Reading', 'Math')

correlation(sat2014, 'Critical Reading', 'Math')
Out[9]: 0.9847558411067434

 

Isso é uma correlação extremamente alta. Mas é importante observar que isso não reflete a força da relação entre as pontuações de Matemática e Leitura Crítica dos estudantes.

Os dados consistem em pontuações médias em cada estado. Mas os estados não fazem os testes – os estudantes sim. Os dados na tabela foram criados agrupando todos os estudantes de cada estado em um único ponto nas médias das duas variáveis naquele estado. Mas nem todos os estudantes no estado estarão nesse ponto, pois os estudantes variam em seu desempenho. Se você plotar um ponto para cada estudante em vez de apenas um para cada estado, haverá uma nuvem de pontos em torno de cada ponto na figura acima. A imagem geral será mais difusa. A correlação entre as pontuações de Matemática e Leitura Crítica dos estudantes será menor do que o valor calculado com base nas médias estaduais.

Correlações baseadas em agregações e médias são chamadas de correlações ecológicas e são frequentemente relatadas. Como acabamos de ver, elas devem ser interpretadas com cuidado.

Sério ou irônico?

Em 2012, um artigo no respeitado New England Journal of Medicine examinou a relação entre o consumo de chocolate e os Prêmios Nobel em um grupo de países. A Scientific American respondeu seriamente, enquanto outros foram mais descontraídos. Você é livre para tomar sua própria decisão! O seguinte gráfico, fornecido no artigo, deve motivá-lo a ir dar uma olhada.

from IPython.display import Image
Image("../../../images/chocoNobel.png")

← Capítulo 15 – Previsão Capítulo 15.2 – Linha de Regressão →