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

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *