Python en Español

Tutorial de la matrix de correlacion de Python

En este blog, revisaremos una importante estadística descriptiva de datos multivariables llamada matriz de correlación. Aprenderemos a crear, trazar y manipular matrices de correlación en Python.

Estaremos viendo los siguientes temas

 

 

¿Qué es una matriz de correlación?

Una matriz de correlación es un dato tabular que representa las “correlaciones” entre pares de variables en un dato dado.

matrix de correlacion

Construiremos esta matriz de correlación al final de este blog.

Cada fila y columna representa una variable, y cada valor de esta matriz es el coeficiente de correlación entre las variables representadas por la fila y columna correspondientes.

La matriz de correlación es una importante métrica de análisis de datos que se calcula para resumir los datos a fin de comprender la relación entre las diversas variables y tomar decisiones en consecuencia.

También es un importante paso de preprocesamiento en los conductos de aprendizaje automático para calcular y analizar la matriz de correlación cuando se desea reducir la dimensionalidad de un dato de alta dimensión.

Hemos mencionado cómo cada celda de la matriz de correlación es un “coeficiente de correlación” entre las dos variables correspondientes a la fila y la columna de la celda.

Entendamos qué es un coeficiente de correlación antes de seguir adelante.

¿Qué es el coeficiente de correlación?

Un coeficiente de correlación es un número que denota la fuerza de la relación entre dos variables.

Hay varios tipos de coeficientes de correlación, pero el más común de todos ellos es el coeficiente de Pearson denotado por la letra griega ρ (rho).

Se define como la covarianza entre dos variables dividida por el producto de las desviaciones estándar de las dos variables.
fórmula para el coeficiente de correlación entre dos variables
Donde la covarianza entre X e Y COV(X, Y) se define además como el “valor esperado del producto de las desviaciones de X e Y de sus respectivas medias”.

La fórmula de la covarianza lo haría más claro.
fórmula para la covarianza entre dos variables
Por lo que la fórmula de la correlación de Pearson se convertirá en:
fórmula ampliada del coeficiente de correlación sustituyendo la covarianza
El valor de ρ se encuentra entre -1 y +1.

Los valores cercanos a +1 indican la presencia de una fuerte relación positiva entre X e Y, mientras que los cercanos a -1 indican una fuerte relación negativa entre X e Y.

Los valores cercanos a cero significan que no existe ninguna relación entre X e Y.

Encontrar la matriz de correlación de un grupo de datos dados

Generemos datos aleatorios para dos variables y luego construyamos la matriz de correlación para ellas.

import numpy as np

np.random.seed(10)

# generating 10 random values for each of the two variables
X = np.random.randn(10)

Y = np.random.randn(10)

# computing the corrlation matrix
C = np.corrcoef(X,Y)

print(C)

Salida:
matriz de correlación de salida de datos generados aleatoriamente
Como calculamos la matriz de correlación de 2 variables, sus dimensiones son 2 x 2.

El valor 0,02 indica que no existe una relación entre las dos variables. Esto era de esperar ya que sus valores se generaron al azar.

En este ejemplo, usamos el método “corchoef” de NumPy para generar la matriz de correlación.

Sin embargo, este método tiene la limitación de que puede calcular la matriz de correlación entre 2 variables solamente.

Por lo tanto, a continuación, vamos a utilizar pandas DataFrames para almacenar los datos y calcular la matriz de correlación en ellos.

Graficar la matriz de correlación

Para esta explicación, usaremos un conjunto de datos que tiene más de dos características.

Usaremos los datos del cáncer de mama, una clasificación binaria popular usada en las lecciones introductorias de ML.

Cargaremos este conjunto de datos del módulo de datos de Scikit-learn.
Se devuelve en forma de matrices NumPy, pero las convertiremos en Pandas DataFrame.

from sklearn.datasets import load_breast_cancer

import pandas as pd

breast_cancer = load_breast_cancer()

data = breast_cancer.data

features = breast_cancer.feature_names

df = pd.DataFrame(data, columns = features)

print(df.shape)

print(features)

Salida:
forma y características de los datos sobre el cáncer de seno
Hay 30 características en los datos, todas las cuales se enumeran en el resultado anterior.

Nuestro objetivo es ahora determinar la relación entre cada par de estas columnas. Lo haremos trazando la matriz de correlación.

Para mantener las cosas sencillas, sólo usaremos las primeras seis columnas y graficaremos su matriz de correlación.

Para graficar la matriz, usaremos una biblioteca de visualización popular llamada seaborn, que está incorporada en matplotlib.

import seaborn as sns

import matplotlib.pyplot as plt

# taking all rows but only 6 columns
df_small = df.iloc[:,:6]

correlation_mat = df_small.corr()

sns.heatmap(correlation_mat, annot = True)

plt.show()

Salida:
matriz de correlación de datos de cáncer de mama
El gráfico muestra una matriz de 6 x 6 y llena de color cada celda en base al coeficiente de correlación del par que la representa.

El método corr() de Pandas DataFrame se utiliza para calcular la matriz. Por defecto, calcula el coeficiente de correlación de Pearson.

También podríamos utilizar otros métodos como el coeficiente de Spearman o el coeficiente de correlación de Kendall Tau pasando un valor apropiado al parámetro “método”.

Hemos utilizado el método heatmap() de Seaborn para trazar la matriz. El parámetro ‘annot=True’ muestra los valores del coeficiente de correlación en cada celda.

Entendamos ahora cómo interpretar la matriz de coeficientes de correlación trazada

 

Interpretar la matriz de correlación

Reproduzcamos primero la matriz generada en la sección anterior y luego discutamos sobre ella.
matriz de correlación de datos de cáncer de mama
Hay que tener en cuenta los siguientes puntos con respecto a las matrices de correlación como la que se muestra arriba:

  1. Cada celda de la cuadrícula representa el valor del coeficiente de correlación entre dos variables.
  2. El valor en la posición (a, b) representa el coeficiente de correlación entre los elementos de la fila a y la columna b. Será igual al valor en la posición (b, a)
  3. Es una matriz cuadrada – cada fila representa una variable, y todas las columnas representan las mismas variables que las filas, de ahí el número de filas = número de columnas.
  4. Es una matriz simétrica – esto tiene sentido porque la correlación entre a,b será la misma que la de b,a.
  5. Todos los elementos diagonales son 1. Dado que los elementos diagonales representan la correlación de cada variable consigo misma, siempre será igual a 1.
  6. Los marcadores de los ejes denotan el rasgo que cada uno de ellos representa.
  7. Un valor positivo grande (cercano a 1,0) indica una fuerte correlación positiva, es decir, si el valor de una de las variables aumenta, el valor de la otra variable aumenta también.
  8. Un valor negativo grande (cercano a -1,0) indica una fuerte correlación negativa, es decir, que el valor de una de las variables disminuye al aumentar el de la otra y viceversa.
  9. Un valor cercano a 0 (tanto positivo como negativo) indica la ausencia de cualquier correlación entre las dos variables, y por lo tanto esas variables son independientes entre sí.
  10. Cada celda de la matriz anterior también está representada por sombras de un color. En este caso, los tonos más oscuros del color indican valores más pequeños, mientras que los tonos más brillantes corresponden a valores más grandes (cerca de 1). Esta escala se da con la ayuda de una barra de color en el lado derecho del gráfico.

 

Agregar el titulo y las etiquetas al grafico

Podemos ajustar la matriz de correlación generada, como cualquier otra trama de Matplotlib. Veamos cómo podemos añadir un título a la matriz y etiquetas a los ejes.

correlation_mat = df_small.corr()

sns.heatmap(correlation_mat, annot = True)

plt.title("Correlation matrix of Breast Cancer data")

plt.xlabel("cell nucleus features")

plt.ylabel("cell nucleus features")

plt.show()

Salida:
título y etiquetas agregados a la matriz de correlación de datos de cáncer de seno
Si queremos, también podríamos cambiar la posición del título al fondo especificando la posición y.

correlation_mat = df_small.corr()

sns.heatmap(correlation_mat, annot = True)

plt.title("Correlation matrix of Breast Cancer data", y=-0.75)

plt.xlabel("cell nucleus features")

plt.ylabel("cell nucleus features")

plt.show()

Salida:
título agregado en la parte inferior de la matriz de correlación de datos de cáncer de seno

Ordenar la matriz de correlación

Si los datos dados tienen un gran número de características, la matriz de correlación puede llegar a ser muy grande y por lo tanto difícil de interpretar.

A veces podríamos querer clasificar los valores de la matriz y ver la fuerza de la correlación entre varios pares de características en un orden creciente o decreciente.

Veamos cómo podemos lograrlo.

Primero, convertiremos la matriz dada en una serie unidimensional de valores.

correlation_mat = df_small.corr()

corr_pairs = correlation_mat.unstack()

print(corr_pairs)

Salida:
Salida en serie de la operación de desapilamiento en DataFrame
El método de desapilamiento en el DataFrame de Pandas devuelve una serie con MultiIndex. Es decir, cada valor de la Serie está representado por más de un índice, que en este caso son los índices de fila y columna que resultan ser los nombres de las características.

Ahora vamos a ordenar estos valores utilizando el método sort_values() de la Serie de Pandas.

sorted_pairs = corr_pairs.sort_values(kind="quicksort")

print(sorted_pairs)

Salida:
pares de características ordenadas por su coeficiente de correlación
Podemos ver que cada valor se repite dos veces en la salida clasificada. Esto se debe a que nuestra matriz de correlación era una matriz simétrica, y cada par de características se produjo dos veces en ella.

Sin embargo, ahora tenemos los valores de los coeficientes de correlación ordenados de todos los pares de características y podemos tomar decisiones en consecuencia.

 

Seleccionar pares de correlación negativos

Puede que queramos seleccionar pares de características que tengan un rango particular de valores del coeficiente de correlación.

Veamos cómo podemos elegir pares con una correlación negativa de los pares ordenados que generamos en la sección anterior.

negative_pairs = sorted_pairs[sorted_pairs < 0]

print(negative_pairs)

Salida:
pares de características con coeficiente de correlación negativa

Seleccionar pares de correlación fuerte (magnitudes mayores a 0.5)

Utilicemos el mismo enfoque para elegir características fuertemente relacionadas. Es decir, intentaremos filtrar aquellos pares de características cuyos valores de coeficiente de correlación sean mayores de 0,5 o menores de -0,5.

strong_pairs = sorted_pairs[abs(sorted_pairs) > 0.5]

print(strong_pairs)

Salida:
pares de características con una fuerte correlación

Convertir una matriz de covarianza en la matriz de correlación

Hemos visto la relación entre la covarianza y la correlación entre un par de variables en las secciones introductorias de este blog.
ecuación de relación entre correlación y covarianza
Entendamos cómo podemos calcular la matriz de covarianza de un dato dado en Python y luego convertirlo en una matriz de correlación. La compararemos con la matriz de correlación que hemos generado usando una llamada de método directo.

En primer lugar, Pandas no proporciona un método para calcular la covarianza entre todos los pares de variables, así que usaremos el método cov() de NumPy.

cov = np.cov(df_small.T)

print(cov)

Salida:
matriz de covarianza de datos de cáncer de mama
Estamos pasando la transposición de la matriz porque el método espera una matriz en la que cada uno de los rasgos se representa por una fila en lugar de una columna.

Así que hemos acertado con nuestro numerador.
Ahora necesitamos calcular una matriz de 6×6 en la que el valor en i, j es el producto de las desviaciones estándar de los rasgos en las posiciones i y j.

Luego dividiremos la matriz de covarianza por esta matriz de desviaciones estándar para calcular la matriz de correlación.

Construyamos primero la matriz de desviaciones estándar.

#compute standard deviations of each of the 6 features
stds = np.std(df_small, axis = 0) #shape = (6,)

stds_matrix = np.array([[stds[i]*stds[j] for j in range(6)] for i in range(6)])

print("standard deviations matrix of shape:",stds_matrix.shape)

Salida:
forma de la matriz de productos de desviaciones estándar
Ahora que tenemos la matriz de covarianza de la forma (6,6) para los 6 rasgos, y la matriz del producto de los rasgos de la forma (6,6), podemos dividir las dos y ver si obtenemos la matriz de correlación resultante deseada.

new_corr = cov/std_matrix

Hemos almacenado la nueva matriz de correlación (derivada de una matriz de covarianza) en la variable new_corr.

Comprobemos si lo hemos hecho bien trazando la matriz de correlación y yuxtaponiéndola con la anterior generada directamente con el método de Pandas corr().

plt.figure(figsize=(18,4))

plt.subplot(1,2,1)

sns.heatmap(correlation_mat, annot = True)

plt.title("Earlier correlation matrix (from Pandas)")

plt.xlabel("cell nucleus features")

plt.ylabel("cell nucleus features")

plt.subplot(1,2,2)

sns.heatmap(correlation_mat, annot = True)

plt.title("Newer correlation matrix (from Covariance mat)")

plt.xlabel("cell nucleus features")

plt.ylabel("cell nucleus features")

plt.show()

Salida:
matriz de correlación generada a partir de la matriz de covarianza, y su comparación con la matriz de correlación anterior
POdemos comparar las dos matrices y notar que son identicas.

 

Exportar la matriz de correlación en una imagen

Trazar la matriz de correlación en una escritura Python no es suficiente. Podríamos querer guardarla para usarla más tarde.

Podemos guardar el gráfico generado como un archivo de imagen en el disco usando el método plt.savefig().

correlation_mat = df_small.corr()

sns.heatmap(correlation_mat, annot = True)

plt.title("Correlation matrix of Breast Cancer data")

plt.xlabel("cell nucleus features")

plt.ylabel("cell nucleus features")

plt.savefig("breast_cancer_correlation.png")

Después de ejecutar este código, se puede ver un archivo de imagen con el nombre ‘breast_cancer_correlation.png’ en el mismo directorio de trabajo.

 

Conclusión

En este tutorial, aprendimos lo que es una matriz de correlación y cómo generarla en Python. Comenzamos centrándonos en el concepto de una matriz de correlación y los coeficientes de correlación.

Luego generamos la matriz de correlación como una matriz NumPy y luego como un Pandas DataFrame. A continuación, aprendimos a trazar la matriz de correlación y a manipular las etiquetas de los gráficos, el título, etc. También discutimos varias propiedades utilizadas para interpretar la matriz de correlación de salida.

También vimos cómo podíamos realizar ciertas operaciones en la matriz de correlación, como ordenar la matriz, encontrar pares negativamente correlacionados, encontrar pares fuertemente correlacionados, etc.

Luego discutimos cómo podíamos utilizar una matriz de covarianza de los datos y generar la matriz de correlación a partir de ella dividiéndola con el producto de las desviaciones estándar de las características individuales.

Finalmente, vimos cómo podíamos guardar el gráfico generado como un archivo de imagen.

Mokhtar Ebrahim
Fundadora de LikeGeeks. Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja una respuesta

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