python - networks - Trazar la matriz de correlación usando pandas
python plot networks (7)
Tengo un conjunto de datos con una gran cantidad de características, por lo que analizar la matriz de correlación se ha vuelto muy difícil.
Quiero trazar una matriz de correlación que obtenemos usando la función
dataframe.corr()
de la biblioteca pandas.
¿Hay alguna función incorporada proporcionada por la biblioteca de pandas para trazar esta matriz?
Pruebe esta función, que también muestra nombres de variables para la matriz de correlación:
def plot_corr(df,size=10):
''''''Function plots a graphical correlation matrix for each pair of columns in the dataframe.
Input:
df: pandas DataFrame
size: vertical and horizontal size of the plot''''''
corr = df.corr()
fig, ax = plt.subplots(figsize=(size, size))
ax.matshow(corr)
plt.xticks(range(len(corr.columns)), corr.columns);
plt.yticks(range(len(corr.columns)), corr.columns);
Puede observar la relación entre las características, ya sea dibujando un mapa de calor de la matriz marina o dispersa de los pandas.
Matriz de dispersión:
pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = ''kde'');
Si desea visualizar también el sesgo de cada característica, use las parcelas nacidas en el mar.
sns.pairplot(dataframe)
Sns Heatmap:
import seaborn as sns
f, ax = pl.subplots(figsize=(10, 8))
corr = dataframe.corr()
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
square=True, ax=ax)
El resultado será un mapa de correlación de las características. es decir, ver el siguiente ejemplo.
La correlación entre comestibles y detergentes es alta. Similar:
Pdoductos con alta correlación:- Comestibles y detergentes.
- Leche y abarrotes
- Leche y Detergentes_Papel
- Leche y delicatessen
- Congelados y Frescos.
- Congelados y Deli.
Desde parcelas: puede observar el mismo conjunto de relaciones desde parcelas o matriz de dispersión. Pero de estos podemos decir que si los datos se distribuyen normalmente o no.
Nota: Lo anterior es el mismo gráfico tomado de los datos, que se utiliza para dibujar el mapa de calor.
Puede usar
pyplot.matshow()
de
matplotlib
:
import matplotlib.pyplot as plt
plt.matshow(dataframe.corr())
plt.show()
Editar:
En los comentarios había una solicitud de cómo cambiar las etiquetas de marca del eje. Aquí hay una versión de lujo que se dibuja en un tamaño de figura más grande, tiene etiquetas de eje para que coincidan con el marco de datos y una leyenda de barra de colores para interpretar la escala de colores.
Incluyo cómo ajustar el tamaño y la rotación de las etiquetas, y estoy usando una relación de figura que hace que la barra de colores y la figura principal salgan a la misma altura.
f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.shape[1]), df.columns, fontsize=14, rotation=45)
plt.yticks(range(df.shape[1]), df.columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title(''Correlation Matrix'', fontsize=16);
Puede usar el método imshow () de matplotlib
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use(''ggplot'')
plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation=''nearest'')
plt.colorbar()
tick_marks = [i for i in range(len(X.columns))]
plt.xticks(tick_marks, X.columns, rotation=''vertical'')
plt.yticks(tick_marks, X.columns)
plt.show()
Si su marco de datos es
df
, simplemente puede usar:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)
Si su objetivo principal es visualizar la matriz de correlación, en lugar de crear un gráfico per se, las convenientes
opciones de diseño de
pandas
son una solución integrada viable:
import pandas as pd
import numpy as np
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap=''coolwarm'')
# ''RdBu_r'' & ''BrBG'' are other good diverging colormaps
Tenga en cuenta que esto debe estar en un backend que admita la representación de HTML, como JupyterLab Notebook.
(El texto claro automático sobre fondos oscuros es de un RP existente y no de la última versión lanzada,
pandas
0.23).
Estilo
Puede limitar fácilmente la precisión de los dígitos:
corr.style.background_gradient(cmap=''coolwarm'').set_precision(2)
O elimine los dígitos por completo si prefiere la matriz sin anotaciones:
corr.style.background_gradient(cmap=''coolwarm'').set_properties(**{''font-size'': ''0pt''})
La documentación de estilo también incluye instrucciones de estilos más avanzados, como cómo cambiar la visualización de la celda sobre la que se mueve el puntero del mouse.
Para guardar el resultado, puede devolver el HTML agregando el método
render()
y luego escribirlo en un archivo (o simplemente tomar una captura de pantalla para fines menos formales).
Comparación de tiempo
En mis pruebas,
style.background_gradient()
fue 4 veces más rápido que
plt.matshow()
y 120 veces más rápido que
sns.heatmap()
con una matriz de 10x10.
Desafortunadamente, no escala tan bien como
plt.matshow()
: los dos toman aproximadamente el mismo tiempo para una matriz de 100x100, y
plt.matshow()
es 10 veces más rápido para una matriz de 1000x1000.
Ahorro
Hay algunas formas posibles de guardar el marco de datos estilizado:
-
Devuelva el HTML agregando el método
render()
y luego escriba el resultado en un archivo. -
Guarde como un archivo
.xslx
con formato condicional agregando el métodoto_excel()
. - Combinar con imgkit para guardar un mapa de bits
- Tome una captura de pantalla (para fines menos formales).
Actualización para pandas> = 0.24
Al establecer
axis=None
, ahora es posible calcular los colores basados en toda la matriz en lugar de por columna o por fila:
corr.style.background_gradient(cmap=''coolwarm'', axis=None)
Versión de mapa de calor de Seaborn:
import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)