Covarianza

La estadística no sólo sirve para entender cada variable por separado, sino que también podemos entender las relaciones entre dos o más variables, gráficamente y a través de estadísticos. En este caso vamos a hablar acerca de las relaciones entre dos variables cuantitativas utilizando la Covarianza.

Diagrama de dispersión

Dada una muestra \((x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\) en la que se miden las variables \(X\) e \(Y\) para cada elemento, podríamos graficar estos pares de puntos en un eje cartesiano.

Vamos a descargar iris desde un repositorio público de github. Ya los nombres vienen en un formato legible y que cumple con las características del PEP8

import pandas as pd

iris = pd.read_csv("https://raw.githubusercontent.com/toneloy/data/master/iris.csv")
iris.head()
##    sepal_length  sepal_width  petal_length  petal_width species
## 0           5.1          3.5           1.4          0.2  setosa
## 1           4.9          3.0           1.4          0.2  setosa
## 2           4.7          3.2           1.3          0.2  setosa
## 3           4.6          3.1           1.5          0.2  setosa
## 4           5.0          3.6           1.4          0.2  setosa

Y ahora vamos a graficar el diagrama de dispersión entre petal_length y petal_width utilizando la función geom_point de plotnine.

from plotnine import *

(ggplot(iris, aes(x = "petal_length", y = "petal_width")) + 
  geom_point())
## <ggplot: (311719579)>

Por lo que podemos ver en el gráfico, pareciera que lo valores altos de petal_length van con valores altos de petal_width (y viceversa).

Covarianza

Si tenemos la misma muestra \((x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\) podemos calcular la covarianza Covarianza como

\[ S_{XY} = \frac{\sum_{i=1}^{n}(x_i-\bar{X})(y_i-\bar{Y})}{n-1} \]

Directamente utilizaremos el denominador \(n-1\) para ser consistentes con la mayoría de la literatura y con el cálculo en pandas.

Con este estadístico medimos el signo de la relación lineal entre \(X\) e \(Y\):

  • Si \(S_{XY} = 0\) entonces no existe relación lineal entre \(X\) e \(Y\)
  • Si \(S_{XY} > 0\) entonces existe una relación lineal directa o positiva entre \(X\) e \(Y\). Esto es, a mayores valores de \(X\), en promedio tenemos mayores valores de \(Y\) y viceversa.
  • Si \(S_{XY} < 0\) entonces existe una relación lineal inversa o negativa entre \(X\) e \(Y\). Esto es, a mayores valores de \(X\), en promedio tenemos menores valores de \(Y\) y viceversa.

Pregunta

Si \(S_{XY} = -1000\) ¿qué podemos decir acerca de la relación entre \(X\) e \(Y\)?

  • La relación lineal entre las variables es directa y fuerte
  • La relación lineal entre las variables es fuerte
  • La relación lineal entre las variables es directa
  • La relación lineal entre las variables es inversa
  • La relación lineal entre las variables es inversa y fuerte


Mostrar respuesta

Cálculo de la covarianza en python

En python, utilizamos el método cov para calcular la matriz de varianzas y covarianzas de las variables numéricas de un DataFrame. Si luego queremos una covarianza en particular, podemos utilizar .loc con los nombres de las variables que nos interesan.

cov_mat = iris.cov()
cov_mat
##               sepal_length  sepal_width  petal_length  petal_width
## sepal_length      0.685694    -0.042434      1.274315     0.516271
## sepal_width      -0.042434     0.189979     -0.329656    -0.121639
## petal_length      1.274315    -0.329656      3.116278     1.295609
## petal_width       0.516271    -0.121639      1.295609     0.581006
cov_mat.loc["petal_length", "petal_width"]
## 1.2956093959731547
cov_mat.loc["petal_length", "sepal_width"]
## -0.3296563758389261

Pregunta

Según la covarianza obtenida, ¿Cómo es la relación entre petal_length y sepal_width?


Mostrar respuesta

Propiedades de la covarianza

Dada una muestra \((x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\), se cumplen las siguientes propiedades relacionadas con la covarianza \(S_{XY}\):

  • Si transformamos linealmente las variables originales \(X'=a+bX\), \(Y'=c+dY\), la covarianza \(S_{X'Y'}\) entre \(X'\), \(Y'\) es la covarianza original multiplicada por \(bd\). Las constantes que se suman no alteran el resultado. En fórmula, tenemos

\[ S_{X'Y'} = bdS_{XY} \]

iris["petal_length_transform"] = 5 + 2*iris["petal_length"]
iris["petal_width_transform"] = 3 - 4*iris["petal_width"]

cov_mat = iris.cov()
cov_mat.loc["petal_length", "petal_width"]
## 1.2956093959731547
cov_mat.loc["petal_length_transform", "petal_width_transform"]
## -10.364875167785238
2*(-4)*cov_mat.loc["petal_length", "petal_width"]
## -10.364875167785238

  • La covarianza de una variable consigo misma es la varianza de la variable

\[ S_{XX}=S^2_X \]

iris["petal_length"].var()
## 3.116277852348993
cov_mat.loc["petal_length", "petal_length"]
## 3.1162778523489965

  • La covarianza entre \(X\) e \(Y\) es igual a la covarianza entre \(Y\) y \(X\)

\[ S_{XY} = S_{YX} \]

cov_mat.loc["petal_length", "petal_width"]
## 1.2956093959731547
cov_mat.loc["petal_width", "petal_length"]
## 1.2956093959731547

  • La covarianza puede calcularse también de la siguiente manera

\[ S_{XY} = \frac{\sum_{i=1}^{n}x_iy_i}{n-1} - \frac{n}{n-1}\bar{X}\bar{Y} \]

def cov_alt(x, y):
  n = len(x)
  
  return ((x * y).sum() / (n - 1)) - ((n / (n - 1)) * x.mean() * y.mean())

cov_mat.loc["petal_length", "petal_width"]
## 1.2956093959731547
cov_alt(iris["petal_length"], iris["petal_width"])
## 1.2956093959731527

En ocasiones, esta formulación es más sencilla de calcular que la de la definición, incluso para las computadoras.


  • Dada la variable \(Z = X + Y\), podemos calcular la varianza de \(Z\) en función de las varianzas de \(X\), \(Y\) y de su covarianza

\[ S^2_{Z}=S^2_X + 2S_{XY} + S^2_Y \]

(iris["petal_length"] + iris["petal_width"]).var()
## 6.288502908277405
iris["petal_length"].var() + 2*cov_mat.loc["petal_length", "petal_width"] + iris["petal_width"].var()
## 6.2885029082774055

  • Dada la variable \(Z = X - Y\), podemos calcular la varianza de \(Z\) en función de las varianzas de \(X\), \(Y\) y de su covarianza

\[ S^2_{Z}=S^2_X - 2S_{XY} + S^2_Y \]

La diferencia de esta propiedad con la anterior es el signo del coeficiente de la covarianza. En ambos casos, las varianzas se suman.

Pregunta

¿Puedes comprobar la propiedad de la covarianza de la diferencia de variables en R?


  • La covarianza de una variable \(X\) con una constante \(c\) es 0
iris["constant"] = 10
cov_mat = iris.cov()

cov_mat.loc["petal_length", "constant"]
## 0.0

Pregunta

¿Cuánto vale la covarianza entre dos constantes?

  • 0
  • 1
  • No se puede saber


Mostrar respuesta

Cómo se ve la cóvarianza

Si dibujamos el mismo gráfico agregando líneas para \(\bar{X}\) y \(\bar{Y}\), tendríamos algo como esto:

Para \(X\) comparamos con la línea vertical:
- \((x_i - \bar{X})\) es positivo a la derecha
- \((x_i - \bar{X})\) es negativo a la izquierda

Para \(Y\) comparamos con la línea horizontal:
- \((y_i - \bar{Y})\) es positivo arriba
- \((y_i - \bar{Y})\) es negativo abajo

La mayoría de los puntos están en los cuadrantes “++” y “–”, y en estos cuadrantes \((x_i - \bar{X})(y_i - \bar{Y})\) es positivo; por eso la covarianza es positiva.

Veamos otro caso:

Ahora la mayoría de los puntos están en los cuadrantes “+-” y “-+”, y en esos cuadrantes \((x_i - \bar{X})(y_i - \bar{Y})\) es negativo, así que tendremos una covarianza negativa.

Paradoja de Simpson

Es posible que este último sea un ejemplo de la paradoja de Simpson, en la que la relación entre variables cambia drásticamente cuando se observa dentro de distintos grupos en lugar de observarla en la muestra completa.

La covarianza entre petal_length y sepal_width es -0.3296564 cuando la calculamos usando todos los datos. Veamos qué sucede cuando agrupamos por species.

grouped_cov_mat = iris.groupby("species").cov()
idx = pd.IndexSlice
grouped_cov_mat.loc[idx[:, "petal_length"], "sepal_width"]
## species                 
## setosa      petal_length    0.011698
## versicolor  petal_length    0.082653
## virginica   petal_length    0.071380
## Name: sepal_width, dtype: float64

Y ahora todas las covarianzas de petal_length con sepal_width dentro de cada grupo de species son positivas. Por esta razón, es importante visualizar los datos antes de interpretar un estadístico. Otros ejemplos de por qué es sugerible visualizar los datos lo puedes encontrar en el famoso cuarteto de Ansconbe.

En el marco del aprendizaje automático o machine learning, también es importante analizar las variables que puedan tener un impacto sobre la variable dependiente; saber cuáles variables son potencialmente relevantes requiere conociemiento del tema sobre el que se está modelando.