MÉTRICAS DE CORRELACIÓN


CORRELACIÓN

El análisis de correlación tiene como objetivo estudiar el comportamiento conjunto de dos variables aleatorias \(X\) e \(Y\), es decir, el grado en que ambas varían o “cambian” conjuntamente.

EJEMPLO

A lo largo de la clase, utilizaremos el dataset penguins, que contiene datos recolectados sobre una serie de 344 pingüinos de tres especies diferentes que anidan en una colonia del Archipiélago Palmer, en la Antártida.

EJEMPLO

El dataset puede cargarse directamente de la librería seaborn.

import seaborn as sns
df = sns.load_dataset('penguins')

df.head()
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female

FLIPPER LENGTH y BODY MASS

Si estuviéramos particularmente interesados en el largo de la aleta (flipper_length_mm) y en el peso (body_mass_g) de los pingüinos del Archipiélago Palmer, podríamos explorar ambas variables individualmente, haciendo un análisis descriptivo de la información con la que se cuenta para cada una (clase anterior).

¿Cómo podemos resumir la información sobre cada una de estas variables, individualmente?

print(df[['flipper_length_mm', 'body_mass_g']].describe().round(2))
       flipper_length_mm  body_mass_g
count             342.00       342.00
mean              200.92      4201.75
std                14.06       801.95
min               172.00      2700.00
25%               190.00      3550.00
50%               197.00      4050.00
75%               213.00      4750.00
max               231.00      6300.00

🌱 ¿Cuál es la longitud de aleta promedio de los pingüinos?

🔥 ¿Qué porcentaje de los pingüinos pesa más de 4750 g?

🧠 ¿Cuál de los dos conjuntos de observaciones presenta mayor variabilidad?

También podemos representar ambas variables mediante boxplots:

🌱 ¿Qué nos dicen los gráficos sobre la simetría de cada set de datos? ¿Se observan valores atípicos?

FLIPPER LENGTH vs. BODY MASS

Pero quizás también puede interesarnos estudiar si existe algún tipo de asociación entre ambas.

El primer paso en el análisis conjunto de dos variables, antes de calcular cualquier métrica de correlación, es GRAFICAR los datos registrados de ambas medidas para todos los pingüinos del dataset.

¿Qué tipo de gráfico podemos construir para representar esa información?

GRÁFICO DE DISPERSIÓN (Scatterplot)

Un scatterplot muestra la relación entre dos variables cuantitativas. Los valores de una variable se grafican en el eje de abscisas y los de la otra, en el de las ordenadas. Cada par de observaciones viene representado en el gráfico por un punto.

sns.scatterplot(x = 'body_mass_g', y = 'flipper_length_mm', data = df);

GRÁFICO DE DISPERSIÓN (Scatterplot)

🤓 ¿Qué tipo de información nos brinda este gráfico sobre la relación entre la longitud la aleta y el peso de los pingüinos?

LA COVARIANCIA: intuición

Las medias de ambas variables nos definen 4 cuadrantes. ¿Qué ocurre con la mayoría de los productos \((x_{i} - \bar{x})(y_{i} - \bar{y})\)?

LA COVARIANCIA (Sxy)

La covariancia es una medida estadística que brinda información acerca del grado en que dos variables varían linealmente en forma conjunta.

Suponiendo que se cuenta con un conjunto de n pares de observaciones de dos variables, \(X\) e \(Y\), se calcula de la siguiente forma:

\[S_{xy} = \frac{1}{n-1}\sum_{i=1}^{n}(x_{i} - \bar{x})(y_{i} - \bar{y})\]

LA COVARIANCIA (Sxy)

La covariancia provee información acerca de la dirección de la asociación lineal entre las dos variables.

  • Si la relación entre ambas variables es directa o positiva, Sxy > 0.

  • Si la relación entre ambas variables es inversa o negativa, Sxy < 0.

Se puede demostrar que para dos variables estadísticamente independientes Sxy = 0 (\(\sigma_{xy}\) a nivel poblacional). Sin embargo, lo opuesto no es necesariamente cierto: 2 variables pueden tener una Sxy = 0 y aún así no ser estadísticamente independientes (asociaciones no lineales).

LA COVARIANCIA (Sxy)

En nuestro ejemplo, podemos calcular la covariancia entre el largo de la aleta y la masa corporal utilizando el método cov() de la librería Pandas:

import pandas as pd

df[['body_mass_g','flipper_length_mm']].cov()
body_mass_g flipper_length_mm
body_mass_g 643131.077327 9824.416062
flipper_length_mm 9824.416062 197.731792

LIMITACIONES DE LA COVARIANCIA

  • La covariancia no tiene un rango de variación acotado, por lo que su magnitud no indica nada con respecto a la fuerza de la asociación.

  • La covariancia es sensible a las unidades de medida de las variables, por lo que puede hacerse arbitrariamente grande o pequeña si alguna de ellas es modificada.

COFICIENTE DE CORRELACIÓN DE PEARSON (r)

El coeficiente de correlación lineal de Pearson mide el grado de asociación lineal que existe entre dos variables cuantitativas continuas. Se calcula de la siguiente manera:

\[r = \frac{S_{xy}}{S_{x}S_{y}}\]

PROPIEDADES DE r

  • Su signo indica si la relación es positiva o negativa.

  • Está acotado (\(-1 \leq r \leq 1\))

  • Su magnitud es indicativa de la fuerza de la asociación lineal entre las variables: cuanto más cercano a 0, más débil es la asociación; cuanto más cercano a 1 se encuentre en valor absoluto, más fuertemente relacionadas están las variables.

  • Si \(X\) e \(Y\) son dos variables independientes, entonces r = 0 (\(\rho\), a nivel poblacional). Sin embargo, la recíproca no es cierta. r = 0 no implica necesariamente falta de asociación, sino que podría indicar falta de linealidad en la relación entre las variables.

PROPIEDADES DE r

Una regla práctica que puede emplearse como una guía para la interpretación de la intensidad de la relación es la siguiente (es un criterio arbitrario):

  • |r| < 0.5: la relación lineal entre las variables es débil.

  • 0.5 ≤ |r| < 0.8: la relación lineal entre las variables es moderada.

  • |r| ≥ 0.8: la relación lineal entre las variables es intensa.

EJEMPLOS

CÁLCULO DE r

Para calcular el r de Pearson en el ejemplo, podemos recurrir al método corr() de Pandas, que por default usa el método de Pearson (hay otros).

El resultado es una matriz de correlación que incluye las variables de interés.

CÁLCULO DE r

df[['body_mass_g','flipper_length_mm']].corr(method = 'pearson')
body_mass_g flipper_length_mm
body_mass_g 1.000 0.871
flipper_length_mm 0.871 1.000

A partir del valor obtenido, ¿cómo caracterizaríamos a la relación entre ambas variables?

PROBLEMAS DE INTERPRETACIÓN/USO DE r

Asumir que un alto valor de r implica causalidad. El hecho de que dos variables estén fuertemente correlacionadas no implica que una cause a la otra: correlación no implica causalidad.

PROBLEMAS DE INTERPRETACIÓN/USO DE r

Calcular e informar el valor de r cuando la relación entre ambas variables no es lineal. La correlación de Pearson mide fuerza de asociación lineal y no nos dice nada acerca de la intensidad de otro tipo de asociación (cuadrática, hiperbólica, cosenoidal, etc.). Por lo tanto, en estos casos calcular e informar r es inapropiado.

Por este motivo, es más que importante graficar previamente los datos para evaluar si tiene o no sentido calcular el coeficiente de correlación de Pearson.

PROBLEMAS DE INTERPRETACIÓN/USO DE r

Se ve afectado por la presencia de outliers. Un punto importante a marcar sobre el coeficiente de correlación de Pearson es que es una métrica bastante sensible a la presencia de valores atípicos en las observaciones, los cuales pueden distorsionar enormemente su valor y, en ciertos casos, conducir a conclusiones equivocadas.

CORRELACIÓN DE SPEARMAN

Vimos que el coeficiente de Pearson presenta algunas limitaciones: es sensible a la presencia de outliers y solo mide asociaciones lineales. El coeficiente de correlación de Spearman surge como una alternativa útil en ciertos contextos.

Se calcula rankeando los datos de las dos variables y luego computando el coeficiente de correlación de Pearson sobre los rangos asignados:

\[r_{s} = \frac{S_{RxRy}}{S_{Rx}S_{Ry}}\]

CORRELACIÓN DE SPEARMAN

El uso de rangos lo hace especialmente útil en tres situaciones:

  • cuando se trabaja con datos ordinales,

  • cuando la relación entre las variables es monótona pero no lineal (toda relación lineal es monótona, pero no toda relación monótona es lineal),

  • cuando hay outliers que podrían distorsionar el coeficiente de correlación de Pearson.

🔎 Una relación es monótona si, en términos generales, al aumentar una variable la otra tiende siempre a aumentar o siempre a disminuir.

PROPIEDADES DE rs

● Provee una medida de la fuerza y la dirección de asociaciones o relaciones monótonas entre dos variables cuantitativas.

● Toma valores entre -1 y 1, donde \(|r_{s}| = 1\) indica una relación monótona perfecta.

PROPIEDADES DE rs

● Como está basado en rangos, es menos sensible a la presencia de outliers que el coeficiente de correlación de Pearson.

● Puede cuantificar o medir la fuerza de cualquier tipo de relación monótona, a diferencia del coeficiente de correlación de Pearson que sólo se emplea para relaciones lineales.

UN EJEMPLO

Supongamos que contamos con información sobre los tiempos de reacción y edad de un conjunto de 9 gamers:

Edad (años) 10 15 20 25 30 35 45 60
Tiempo (ms) 115 120 170 150 210 180 175 220

UN EJEMPLO

¿Cómo luce un scatterplot de estos datos?

🤓 ¿Qué características de la relación entre la edad y el tiempo de reacción se observan en el gráfico?

CÁLCULO DE rs

Edad (años) Tiempo (ms) Redad Rtiempo
10 115 1 1
15 120 2 2
20 170 3 5
25 150 4 3
30 210 5 7
35 180 6 6
45 165 7 4
60 220 8 8

Para calcular el rs necesitamos tener los registros de las dos variables rankeados.

CÁLCULO DE rs

¿Cómo luce el scatterplot de los rangos?

El rs es el coeficiente de correlación lineal de Pearson calculado con los datos representados en el gráfico.

CÁLCULO DE rs

Afortunadamente, si queremos utilizar Pandas, la librería se encarga de realizar internamente el proceso de asignación de rangos. Lo que tenemos que hacer es setear el parámetro method=‘spearman’.

data_gamers.corr(method = 'spearman')
edad_anios tiempo_ms
edad_anios 1.000 0.786
tiempo_ms 0.786 1.000

🤔 ¿Cómo podemos caracterizar a la relación entre ambas variables en base al valor obtenido?

MATRIZ DE COVARIANCIA/CORRELACIÓN

En el caso de que contemos con información sobre múltiples variables cuantitativas en el dataset, podemos construir una matriz en la que se muestren las métricas de correlación (covariancia, coeficientes de correlación de Pearson, Spearman, etc.) para todos los pares.

MATRIZ DE COVARIANCIA/CORRELACIÓN

De todas las variables con las que contamos en el dataset penguins, sólo son variables cuantitativas las siguientes:

  • bill_length_mm

  • bill_depth_mm

  • flipper_length_mm

  • body_mass_g

Seleccionaremos únicamente estas variables para construir nuestra matriz.

MATRIZ DE COVARIANCIA/CORRELACIÓN

Para construir la matriz de covariancia, utilizamos el método cov() de Pandas:

df[['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']].cov()
bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
bill_length_mm 29.807 -2.534 50.376 2605.592
bill_depth_mm -2.534 3.900 -16.213 -747.370
flipper_length_mm 50.376 -16.213 197.732 9824.416
body_mass_g 2605.592 -747.370 9824.416 643131.077

🤔 ¿Qué mirar?

MATRIZ DE COVARIANCIA/CORRELACIÓN

Para construir la matriz de correlación de Pearson, utilizamos el método corr() de Pandas:

df[['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']].corr()
bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
bill_length_mm 1.000 -0.235 0.656 0.595
bill_depth_mm -0.235 1.000 -0.584 -0.472
flipper_length_mm 0.656 -0.584 1.000 0.871
body_mass_g 0.595 -0.472 0.871 1.000

¿Qué aporta en relación a la matriz de covariancia?

CORRELOGRAMA

Un correlograma es una representación gráfica que muestra las correlaciones entre todas las combinaciones posibles de variables en un conjunto de datos (es la versión gráfica de una matriz de correlación).

Podemos construirlo generando la matriz de correlación de nuestros datos y luego ploteándola con la función heatmap() de la librería seaborn. Hay algunas cuestiones impor tantes referidas a la escala de colores que las abordaremos en la próxima unidad.

CORRELOGRAMA

# Generamos la matriz de correlación
matriz = df[['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']].corr()

# Construimos el heatmap
sns.heatmap(matriz, annot = True)

CORRELOGRAMA

A partir del gráfico, ¿cómo podríamos caracterizar la asociación entre los distintos pares de variables?

¿NOS ESTÁ ENGAÑANDO r? 😲🚩

El coeficiente de correlación de Pearson entre profundidad de pico y longitud de aleta es \(r = -0.58\).

Pero…¿este valor es realmente un reflejo de lo que vemos en el gráfico de dispersión?