Calcular el coeficiente de correlación de Pearson en Python con Numpy

C

Introducción

Este artículo es una introducción al coeficiente de correlación de Pearson, su cálculo manual y su cálculo a través de Python numpy módulo.

El coeficiente de correlación de Pearson mide la asociación lineal entre variables. Su valor se puede interpretar así:

  • +1 – Correlación positiva completa
  • +0,8 – Fuerte correlación positiva
  • +0,6 – Correlación positiva moderada
  • 0 – sin correlación alguna
  • -0,6 – Correlación negativa moderada
  • -0,8 – Fuerte correlación negativa
  • -1 – Correlación negativa completa

Ilustraremos cómo varía el coeficiente de correlación con diferentes tipos de asociaciones. En este artículo, también mostraremos que la correlación cero no siempre significa cero asociaciones. Las variables no relacionadas linealmente pueden tener coeficientes de correlación cercanos a cero.

¿Qué es el coeficiente de correlación de Pearson?

El coeficiente de correlación de Pearson también se conoce como el coeficiente de correlación producto-momento de Pearson. Es una medida de la relación lineal entre dos variables aleatorias: X y Y. Matemáticamente, si (σXY) es la covarianza entre X y Yy (σX) es la desviación estándar de X, luego el coeficiente de correlación de Pearson ρ es dado por:

$$
rho_ {X, Y} = frac { sigma_ {XY}} { sigma_X sigma_Y}
$$

Como la covarianza es siempre menor que el producto de las desviaciones estándar individuales, el valor de ρ varía entre -1 y +1. De lo anterior también podemos ver que la correlación de una variable consigo misma es una:

$$
rho_ {X, X} = frac { sigma_ {XX}} { sigma_X sigma_X} = 1
$$
Antes de comenzar a escribir código, hagamos un pequeño ejemplo para ver cómo se calcula este coeficiente.

¿Cómo se calcula el coeficiente de correlación de Pearson?

Supongamos que se nos dan algunas observaciones de las variables aleatorias X y Y. Si planea implementar todo desde cero o hacer algunos cálculos manuales, entonces necesita lo siguiente cuando se le proporcione X y Y:

X =

[


2


1

0

1

2

] T Y =

[

4

1

3

2

0

] T X 2 =

[

4

1

0

1

4

] T Y 2 =

[

16

1

9

4

0

] T X Y =

[


8


1

0

2

0

] T

Usemos lo anterior para calcular la correlación. Usaremos la estimación sesgada de covarianza y desviaciones estándar. Esto no afectará el valor del coeficiente de correlación que se calcula ya que el número de observaciones se cancela en el numerador y denominador:

σ XY = E (XY) – E (X) E (Y) = – 7/5 – (0) (2) = – 7/5 σ X = E (X 2) – (E (X)) 2 = 10/5 – (0) 2 = 2 σ Y = E (Y 2) – (E (Y)) 2 = 30/5 – (10/5) 2 = 2 ρ XY = – 7 5 2 2 = – 7 / 10

Coeficiente de correlación de Pearson en Python usando Numpy

El coeficiente de correlación de Pearson se puede calcular en Python usando corrcoef() método de Numpy.

La entrada para esta función suele ser una matriz, digamos de tamaño mxn, dónde:

  • Cada columna representa los valores de una variable aleatoria
  • Cada fila representa una sola muestra de n variables aleatorias
  • n representar el número total de diferentes variables aleatorias
  • m representa el número total de muestras para cada variable

por n variables aleatorias, devuelve un nxn matriz cuadrada M, con M(i,j) indicando el coeficiente de correlación entre la variable aleatoria i y j. Como el coeficiente de correlación entre una variable y ella misma es 1, todas las entradas diagonales (i,i) son iguales a uno.

En breve:

M (i, j) = {ρ i, j si i ≠ j 1 de lo contrario Tenga en cuenta que la matriz de correlación es simétrica ya que la correlación es simétrica, es decir, `M (i, j) = M (j, i)`. Tomemos nuestro ejemplo simple de la sección anterior y veamos cómo usar `corrcoef ()` con `numpy`.

Primero, importemos el numpy módulo, junto con el pyplot módulo de Matplotlib. Usaremos Matplotlib para visualizar la correlación más adelante:

import numpy as np
import matplotlib.pyplot as plt

Usaremos los mismos valores del ejemplo manual de antes. Guardemos eso en x_simple y calcular la matriz de correlación:

x_simple = np.array([-2, -1, 0, 1, 2])
y_simple = np.array([4, 1, 3, 2, 0])
my_rho = np.corrcoef(x_simple, y_simple)

print(my_rho)

La siguiente es la matriz de correlación de salida. Tenga en cuenta los de las diagonales, lo que indica que el coeficiente de correlación de una variable consigo misma es uno:

[[ 1.  -0.7]
[-0.7  1. ]]

Ejemplos de correlación positiva y negativa

Visualicemos los coeficientes de correlación para algunas relaciones. Primero, tendremos una correlación completa positiva (+1) y completa negativa (-1) entre dos variables. Luego, generaremos dos variables aleatorias, por lo que el coeficiente de correlación debería ser cercano a cero, a menos que la aleatoriedad tenga accidentalmente alguna correlación, lo cual es muy poco probable.

Usaremos un seed de modo que este ejemplo sea repetible al llamar al RandomState de Numpy:

seed = 13
rand = np.random.RandomState(seed)

x = rand.uniform(0,1,100)
x = np.vstack((x,x*2+1))
x = np.vstack((x,-x[0,]*2+1))
x = np.vstack((x,rand.normal(1,3,100)))

El primero rand.uniform() La llamada genera una distribución uniforme aleatoria:

[7.77702411e-01 2.37541220e-01 8.24278533e-01 9.65749198e-01
 9.72601114e-01 4.53449247e-01 6.09042463e-01 7.75526515e-01
 6.41613345e-01 7.22018230e-01 3.50365241e-02 2.98449471e-01
 5.85124919e-02 8.57060943e-01 3.72854028e-01 6.79847952e-01
 2.56279949e-01 3.47581215e-01 9.41277008e-03 3.58333783e-01
 9.49094182e-01 2.17899009e-01 3.19391366e-01 9.17772386e-01
 3.19036664e-02 6.50845370e-02 6.29828999e-01 8.73813443e-01
 8.71573230e-03 7.46577237e-01 8.12841171e-01 7.57174462e-02
 6.56455335e-01 5.09262200e-01 4.79883391e-01 9.55574145e-01
 1.20335695e-05 2.46978701e-01 7.12232678e-01 3.24582050e-01
 2.76996356e-01 6.95445453e-01 9.18551748e-01 2.44475702e-01
 4.58085817e-01 2.52992683e-01 3.79333291e-01 6.04538829e-01
 7.72378760e-01 6.79174968e-02 6.86085079e-01 5.48260097e-01
 1.37986053e-01 9.87532192e-02 2.45559105e-01 1.51786663e-01
 9.25994479e-01 6.80105016e-01 2.37658922e-01 5.68885253e-01
 5.56632051e-01 7.27372109e-02 8.39708510e-01 4.05319493e-01
 1.44870989e-01 1.90920059e-01 4.90640137e-01 7.12024374e-01
 9.84938458e-01 8.74786502e-01 4.99041684e-01 1.06779994e-01
 9.13212807e-01 3.64915961e-01 2.26587877e-01 8.72431862e-01
 1.36358352e-01 2.36380160e-01 5.95399245e-01 5.63922609e-01
 9.58934732e-01 4.53239333e-01 1.28958075e-01 7.60567677e-01
 2.01634075e-01 1.75729863e-01 4.37118013e-01 3.40260803e-01
 9.67253109e-01 1.43026077e-01 8.44558533e-01 6.69406140e-01
 1.09304908e-01 8.82535400e-02 9.66462041e-01 1.94297485e-01
 8.19000600e-02 2.69384695e-01 6.50130518e-01 5.46777245e-01]

Entonces, podemos llamar vstack() para apilar verticalmente otras matrices en él. De esta manera, podemos apilar un montón de variables como las de arriba en el mismo x referencia y acceder a ellos secuencialmente.

Después de la primera distribución uniforme, hemos apilado algunos conjuntos de variables verticalmente: el segundo tiene una relación positiva completa con el primero, el tercero tiene una correlación negativa completa con el primero y el cuarto es completamente aleatorio. por lo que debería tener una correlación de ~ 0.

Cuando tenemos un solo x referencia como esta, podemos calcular la correlación para cada uno de los elementos en la pila vertical pasándolo solo a np.corrcoef():

rho = np.corrcoef(x)

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 3))
for i in [0,1,2]:
    ax[i].scatter(x[0,],x[1+i,])
    ax[i].title.set_text('Correlation = ' + "{:.2f}".format(rho[0,i+1]))
    ax[i].set(xlabel="x",ylabel="y")
fig.subplots_adjust(wspace=.4)    
plt.show()

Comprensión de los cambios en el coeficiente de correlación de Pearson

Solo para ver cómo cambia el coeficiente de correlación con un cambio en la relación entre las dos variables, agreguemos algo de ruido aleatorio al x matriz generada en la sección anterior y vuelva a ejecutar el código.

En este ejemplo, agregaremos lentamente diversos grados de ruido a las gráficas de correlación y calcularemos los coeficientes de correlación en cada paso:

fig, ax = plt.subplots(nrows=2, ncols=4, figsize=(15, 8))

for noise, i in zip([0.05,0.2,0.8,2],[0,1,2,3]):
    # Add noise
    x_with_noise = x+rand.normal(0,noise,x.shape)
    
    # Compute correlation
    rho_noise = np.corrcoef(x_with_noise)
    
    # Plot column wise. Positive correlation in row 0 and negative in row 1
    ax[0,i].scatter(x_with_noise[0,],x_with_noise[1,],color="magenta")
    ax[1,i].scatter(x_with_noise[0,],x_with_noise[2,],color="green")
    ax[0,i].title.set_text('Correlation = ' + "{:.2f}".format(rho_noise[0,1])
                        + 'n Noise=" + "{:.2f}".format(noise) )
    ax[1,i].title.set_text("Correlation = ' + "{:.2f}".format(rho_noise[0,2])
                        + 'n Noise=" + "{:.2f}".format(noise))
    ax[0,i].set(xlabel="x',ylabel="y")    
    ax[1,i].set(xlabel="x",ylabel="y")
    
fig.subplots_adjust(wspace=0.3,hspace=0.4)    
plt.show()

Un error común: asociaciones sin correlación

Existe la idea errónea de que la correlación cero no implica asociación. Aclaremos que la correlación mide estrictamente la relación lineal entre dos variables.

Los ejemplos siguientes muestran variables que no están asociadas linealmente entre sí pero que tienen una correlación cero.

El último ejemplo de (y = ex) tiene un coeficiente de correlación de alrededor de 0.52, que nuevamente no es un reflejo de la verdadera asociación entre las dos variables:

# Create a data matrix
x_nonlinear = np.linspace(-10,10,100)
x_nonlinear = np.vstack((x_nonlinear,x_nonlinear*x_nonlinear))
x_nonlinear = np.vstack((x_nonlinear,-x_nonlinear[0,]**2))
x_nonlinear = np.vstack((x_nonlinear,x_nonlinear[0,]**4))
x_nonlinear = np.vstack((x_nonlinear,np.log(x_nonlinear[0,]**2+1)))
x_nonlinear = np.vstack((x_nonlinear,np.exp(x_nonlinear[0,])))

# Compute the correlation
rho_nonlinear = np.corrcoef(x_nonlinear)

# Plot the data
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(16, 3))
title = ['$y=x^2$','$y=-x^2$','$y=x^4$','$y=log(x^2+1)$','$y=exp(x)$']
for i in [0,1,2,3,4]:
    ax[i].scatter(x_nonlinear[0,],x_nonlinear[1+i,],color="cyan")
    ax[i].title.set_text(title[i] + 'n' + 
                         'Correlation = ' + "{:.2f}".format(rho_nonlinear[0,i+1]))
    ax[i].set(xlabel="x",ylabel="y")
fig.subplots_adjust(wspace=.4)    
plt.show()

Conclusiones

En este artículo, discutimos el coeficiente de correlación de Pearson. Usamos el corrcoef() método de Python numpy módulo para calcular su valor.

Si las variables aleatorias tienen asociaciones lineales altas, entonces su coeficiente de correlación es cercano a +1 o -1. Por otro lado, las variables estadísticamente independientes tienen coeficientes de correlación cercanos a cero.

También demostramos que las asociaciones no lineales pueden tener un coeficiente de correlación cero o cercano a cero, lo que implica que las variables que tienen asociaciones altas pueden no tener un valor alto del coeficiente de correlación de Pearson.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad