A Covariância é uma medida descritiva que expressa o grau de variação conjunta entre duas variáveis aleatórias. Em outras palavras, ela mede a relação linear entre duas variáveis aleatórias.

Se a covariância entre duas variáveis é positiva, significa que elas variam juntas na mesma direção, enquanto que se a covariância é negativa, elas variam juntas em direções opostas. Se a covariância é zero, as duas variáveis são independentes uma da outra.

Origem Histórica

A ideia de covariância surgiu no final do século XIX, ligada aos trabalhos de Francis Galton (avô da estatística) e Karl Pearson , que formalizaram a correlação. Galton usou o conceito para estudar hereditariedade, analisando como características como altura se transmitiam entre gerações.

A covariância é amplamente utilizada em várias áreas, tais como:
Finanças Para avaliar o risco de um portfólio de investimentos, a covariância é utilizada para medir o grau de correlação entre as taxas de retorno de diferentes ativos.
Ciência de dados Em análise de dados, a covariância é frequentemente usada para entender a relação entre duas variáveis. Por exemplo, em um estudo de saúde, pode-se usar a covariância para entender a relação entre a ingestão de álcool e a pressão arterial.
Engenharia Em processos industriais, a covariância é usada para entender como as variáveis do processo estão relacionadas entre si. Por exemplo, pode-se usar a covariância para entender como a temperatura e a pressão de um processo estão correlacionadas.
Biologia A covariância é usada para entender a relação entre duas variáveis biológicas. Por exemplo, em um estudo de ecologia, pode-se usar a covariância para entender como a temperatura do ar está relacionada com a atividade de forrageamento de uma espécie de inseto.
Psicologia Em pesquisas psicológicas, a covariância pode ser usada para entender a relação entre duas variáveis. Por exemplo, pode-se usar a covariância para entender a relação entre a ansiedade e a depressão.

Diferenças entre Variância, Coeficiente de Variação e Covariância

Métrica O que mede? Unidade Interpretação
VariânciaDispersão dos dados em relação à média.Quadrado da unidade dos dadosQuanto maior, mais dispersos os dados estão em torno da média.
Coeficiente de VariaçãoDispersão relativa (em relação à média).Adimensional (porcentagem)Permite comparar variabilidade entre conjuntos de dados com diferentes escalas.
CovariânciaRelação linear entre duas variáveis.Produto das unidades das duas variáveisIndica se duas variáveis tendem a aumentar ou diminuir juntas.

Fórmula:

$\ \ \ \ Amostra:$
$$\large cov(x, y) = \frac{\sum_{i=1}^{n} (x_{i} – \bar{x}) \cdot (y_{i}- \bar{y})}{n-1}$$

$\ \ \ \ População:$

$$\large cov(x, y) = \frac{\sum_{i=1}^{N} (x_{i} – \mu_{x}) \cdot (y_{i}- \mu_{y})}{N}$$

Sendo:

  • $\bar{x}:$ média aritmética amostral dos elementos do conjunto X
  • $\mu_{x}:$ média aritmética populacional dos elementos do conjunto X
  • $\bar{y}:$ média aritmética amostral dos elementos do conjunto Y
  • $\mu_{y}:$ média aritmética populacional dos elementos do conjunto Y
  • $n – 1:$ total de elementos da amostra
  • $N:$ total de elementos da população

Python :

# Amostra
cov_xy = sum(list(map(lambda x, y: (x - mX) * (y - mY), X, Y))) / (len(X) - 1)

# População
cov_xy = sum(list(map(lambda x, y: (x - mX) * (y - mY), X, Y))) / len(X)

Julia :

# Amostra
cov_xy = sum((X .- mX) .* (Y .- mY)) / (length(X) - 1)

# População
cov_xy = sum((X .- mX) .* (Y .- mY)) / (length(X))

Libs:

Linguagem Biblioteca Função
Python Numpy Amostras

np.cov(X,Y, ddof=0)[0][1]

Populações

np.cov(X,Y, ddof=1)[0][1]
Julia Statistics Amostras

cov(X,Y, corrected=true)

Populações

cov(X,Y, corrected=false)

StatsBase

Exemplo

Determine a covariância dos elementos de X e Y:

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]  Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]


Python

''' Utilizando somente o Python '''

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]  
Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]

mX = sum(X) / len(X) # média de X
mY = sum(Y) / len(Y) # média de Y

# Descobrindo a covariância amostral
cov_a_xy = sum(list(map(lambda x, y: (x - mX) * (y - mY), X, Y))) / (len(X) - 1)

# Descobrindo a covariância populacional
cov_p_xy = sum(list(map(lambda x, y: (x - mX) * (y - mY), X, Y))) / len(X)

# cov_a_xy: -8.069444444444445
# cov_p_xy: -7.172839506172839

''' Utilizando o Pandas '''
import pandas as pd

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]  
Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]

# Criando o dataframe com os dados de X
df = pd.DataFrame(X, columns=['X'])
# Acrescentando uma coluna com os dados de Y
df['Y'] = Y
# Criando uma coluna com os valores de X - mX
df['X-mX'] = list(map(lambda x: x - df.X.mean(), X))
# Criando uma coluna com os valores de Y - mY
df['Y-mY'] = list(map(lambda y: y - df.Y.mean(), Y))
# Criando uma coluna com os valores de (X - mX) * (Y -mY)
df['(X-mX)x(Y-mY)'] = df['X-mX'] * df['Y-mY']

# Descobrindo a covariância amostral
cov_a_xy = sum(df['(X-mX)x(Y-mY)']) / (len(X) - 1)

# Descobrindo a covariância populacional
cov_p_xy = sum(df['(X-mX)x(Y-mY)']) / len(X)

# cov_a_xy: -8.069444444444445
# cov_p_xy: -7.172839506172839

Julia

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]  
Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]

mX = sum(X) / length(X) # média de X
mY = sum(Y) / length(Y) # média de Y

# Descobrindo a covariância amostral
cov_a_xy = sum((X .- mX) .* (Y .- mY)) / (length(X) - 1)

# Descobrindo a covariância populacional
cov_p_xy = sum((X .- mX) .* (Y .- mY)) / (length(X))



Covariância a partir da variância

Fórmula:
$$\large cov(x, y) = \frac{s^2_{X+Y}\ -\ s^2_{X}\ -\ s^2_{Y} }{2}$$

Sendo:

  • $s^2_{X+Y}:$ variância da soma dos elementos de X e Y
  • $s^2_{X}:$ variância de X
  • $s^2_{Y}:$ variância de Y

Python / Julia :

cov_xy = (var_xy - var_x - var_y) / 2

Exemplo

Python

''' Utilizando somente o Python '''

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]
Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]

''' Covariância Amostral '''

# Encontrando a media de X
mX = sum(X) / len(X)

# Encontrando a media de Y
mY = sum(Y) / len(Y)

# Encontrando a media de X + Y
mXY = sum(list(map(lambda x, y: x + y, X, Y))) / len(list(map(lambda x, y: x + y, X, Y)))

# Calculando a variância amostral de X
var_x = sum(list(map(lambda x: (x - mX)**2, X))) / (len(X) - 1)

# Calculando a variância amostral de X
var_y = sum(list(map(lambda y: (y - mY)**2, Y))) / (len(Y) - 1)

# Calculando a variância amostral de X + Y
var_xy = sum(list(map(lambda y: (y - mXY)**2, list(map(lambda x, y: x + y, X, Y))))) / (len(list(map(lambda x, y: x + y, X, Y))) - 1)

cov_a_xy = (var_xy - var_x - var_y) / 2

# cov_a_xy: -8.069444444444445

''' Covariância Populacional '''

# Encontrando a media de X
mX = sum(X) / len(X)

# Encontrando a media de Y
mY = sum(Y) / len(Y)

# Encontrando a media de X + Y
mXY = sum(list(map(lambda x, y: x + y, X, Y))) / len(list(map(lambda x, y: x + y, X, Y)))

# Calculando a variância amostral de X
var_x = sum(list(map(lambda x: (x - mX)**2, X))) / len(X)

# Calculando a variância amostral de Y
var_y = sum(list(map(lambda y: (y - mY)**2, Y))) / len(Y)

# Calculando a variância amostral de X + Y
var_xy = sum(list(map(lambda y: (y - mXY)**2, list(map(lambda x, y: x + y, X, Y))))) / len(list(map(lambda x, y: x + y, X, Y)))
#list(map(lambda x, y: x + y, X, Y))

cov_p_xy = (var_xy - var_x - var_y) / 2

# cov_p_xy: -7.172839506172839

''' Utilizando o Numpy'''

import numpy as np

''' Covariância Amostral '''

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]
Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]

var_xy = np.var(list(map(lambda x, y: x + y, X, Y)), ddof=1)
var_x = np.var(X, ddof=1)
var_y = np.var(Y, ddof=1)

cov_a_xy = (var_xy - var_x - var_y) / 2


''' Covariância Populacional '''

X = [1, 3, 2, 5, 8, 7, 12, 2, 4]
Y = [8, 6, 9, 4, 3, 3, 2, 7, 7]

var_xy = np.var(list(map(lambda x, y: x + y, X, Y)), ddof=0)
var_x = np.var(X, ddof=0)
var_y = np.var(Y, ddof=0)

cov_p_xy = (var_xy - var_x - var_y) / 2

# cov_a_xy: -8.069444444444445
# cov_p_xy: -7.172839506172839