Header Ads Widget

Ticker

6/recent/ticker-posts

Tutorial de matriz de correlación de Python

 En este blog, repasaremos 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.

Examinaremos los siguientes temas:

¿Qué es la 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.

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 métrica importante de análisis de datos que se calcula para resumir los datos para comprender la relación entre varias variables y tomar decisiones en consecuencia.

También es un paso importante de preprocesamiento en las canalizaciones de Machine Learning para calcular y analizar la matriz de correlación donde se desea la reducción de dimensionalidad en datos de alta dimensión.

Mencionamos cómo cada celda en la matriz de correlación es un ' coeficiente de correlación ' entre las dos variables correspondientes a la fila y 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 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.

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 aclararía.

Entonces, la fórmula para la correlación de Pearson sería:

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 aquellos 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 los datos dados

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

01
02
03
04
05
06
07
08
09
10
11
12
13
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:

Ya que 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 aleatoriamente.

En este ejemplo, usamos el  método `corrcoef` 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 únicamente.

Por lo tanto, en el futuro, usaremos pandas DataFrames para almacenar los datos y calcular la matriz de correlación en ellos.

Trazar 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 de cáncer de mama, un dato de clasificación binario popular que se utiliza en las lecciones introductorias de AA.
Cargaremos este conjunto de datos desde el módulo de scikit-learn  dataset .
Se devuelve en forma de matrices NumPy , pero las convertiremos en Pandas DataFrame.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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 :

Hay 30 características en los datos, todas las cuales se enumeran en el resultado anterior.

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

Para simplificar las cosas, solo usaremos las primeras seis columnas y trazaremos su matriz de correlación.
Para trazar la matriz, usaremos una biblioteca de visualización popular llamada  seaborn,  que está construida sobre matplotlib .

01
02
03
04
05
06
07
08
09
10
11
12
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:

El gráfico muestra una matriz de 6 x 6 y llena de color cada celda en función del coeficiente de correlación del par que la representa.

El corr() método de Pandas DataFrame  se utiliza para calcular la matriz. De forma predeterminada, 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  'method'.

Hemos utilizado el heatmap() método 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 graficada.

Interpretando la matriz de correlaciones

Primero reproduzcamos la matriz generada en la sección anterior y luego analicémosla.

Debe 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 las características de la fila ay la columna b. Esto 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 entre 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. Las marcas de los ejes denotan la característica que representa cada uno de ellos.
  7. Un valor positivo grande (cercano a 1.0) indica una correlación positiva fuerte, es decir, si el valor de una de las variables aumenta, el valor de la otra variable también aumenta.
  8. Un valor negativo grande (cercano a -1,0) indica una fuerte correlación negativa, es decir, el valor de una variable disminuye con el aumento 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 tonos de un color. Aquí, 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 colores en el lado derecho del gráfico.

Agregar título y etiquetas a la trama

Podemos modificar la matriz de correlación generada, como cualquier otro diagrama de Matplotlib. Veamos cómo podemos agregar un título a la matriz y etiquetas a los ejes.

01
02
03
04
05
06
07
08
09
10
11
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:

Si queremos, también podemos cambiar la posición del título al final especificando la posición y.

01
02
03
04
05
06
07
08
09
10
11
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:

Ordenar la matriz de correlación

Si los datos dados tienen una gran cantidad de características, la matriz de correlación puede volverse muy grande y, por lo tanto, difícil de interpretar.

A veces, es posible que deseemos ordenar los valores en la matriz y ver la fuerza de la correlación entre varios pares de características en orden creciente o decreciente. Veamos cómo podemos lograrlo.

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

1
2
3
4
5
correlation_mat = df_small.corr()
 
corr_pairs = correlation_mat.unstack()
 
print(corr_pairs)

Salida:

El  unstack método en Pandas DataFrame 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.

Ordenemos ahora estos valores utilizando el  sort_values() método de la serie Pandas.

1
2
3
sorted_pairs = corr_pairs.sort_values(kind="quicksort")
 
print(sorted_pairs)

Salida:

Podemos ver que cada valor se repite dos veces en la salida ordenada. Esto se debe a que nuestra matriz de correlación era una matriz simétrica y cada par de características aparecía dos veces en ella.

No obstante, ahora tenemos los valores de coeficiente de correlación ordenados de todos los pares de características y podemos tomar decisiones en consecuencia.

Seleccionar pares de correlación negativa

Es posible que deseemos 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.

1
2
3
negative_pairs = sorted_pairs[sorted_pairs < 0]
 
print(negative_pairs)

Salida:

Selección de pares de correlación fuerte (magnitud superior a 0,5)

Usemos 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 que 0,5 o menores que -0,5.

1
2
3
strong_pairs = sorted_pairs[abs(sorted_pairs) > 0.5]
 
print(strong_pairs)

Salida:

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.

Entendamos cómo podemos calcular la matriz de covarianza de un dato dado en Python y luego convertirlo en una matriz de correlación. Lo compararemos con la matriz de correlación que habíamos generado usando una llamada directa al método.

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

1
2
3
cov = np.cov(df_small.T)
 
print(cov)

Salida:

Estamos pasando la transposición de la matriz porque el método espera una matriz en la que cada una de las características está representada 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 las características 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.

1
2
3
4
5
6
#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:

Ahora que tenemos la matriz de covarianza de forma (6,6) para las 6 características, y el producto por pares de la matriz de características de la forma (6,6), podemos dividir las dos y ver si obtenemos la matriz de correlación resultante deseada.

1
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 hicimos bien trazando la matriz de correlación y yuxtaponiéndola con la anterior generada directamente usando el método Pandas  corr().

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
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:

Podemos comparar las dos matrices y notar que son idénticas.

Exportar la matriz de correlación a una imagen

Trazar la matriz de correlación en un script de Python no es suficiente. Es posible que queramos guardarlo para su uso posterior.
Podemos guardar el gráfico generado como un archivo de imagen en el disco usando el  plt.savefig() método.

01
02
03
04
05
06
07
08
09
10
11
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, 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 qué es una matriz de correlación y cómo generarla en Python. Comenzamos centrándonos en el concepto de 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 cómo trazar la matriz de correlación y manipular las etiquetas de la trama, 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 correlacionados negativamente, encontrar pares fuertemente correlacionados, etc.

Luego discutimos cómo podríamos usar 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.

Publicar un comentario

0 Comentarios