with - python correlation matrix sns




Matrice de corrélation de parcelles à l'aide de pandas (6)

J'ai un ensemble de données avec un grand nombre de fonctionnalités, donc l'analyse de la matrice de corrélation est devenue très difficile. Je veux tracer une matrice de corrélation dataframe.corr() aide de la fonction dataframe.corr() de la bibliothèque pandas. Existe-t-il une fonction intégrée fournie par la bibliothèque de pandas pour tracer cette matrice?


Essayez cette fonction, qui affiche également les noms de variables pour la matrice de corrélation:

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);

Les graphiques de statmodels donnent également une belle vue de la matrice de corrélation

 import statsmodels.api as sm import matplotlib.pyplot as plt corr = dataframe.corr() sm.graphics.plot_corr(corr, xnames=list(corr.columns)) plt.show() 

Si votre objectif principal est de visualiser la matrice de corrélation plutôt que de créer un tracé, les options de style pratiques pour les pandas constituent une solution intégrée 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

Notez que cela doit se trouver dans un backend prenant en charge le rendu HTML, tel que le JupyterLab Notebook. (Le texte clair automatique sur les arrière-plans sombres provient d'un PR existant et non de la dernière version publiée, pandas 0.23).

Coiffant

Vous pouvez facilement limiter la précision des chiffres:

corr.style.background_gradient(cmap='coolwarm').set_precision(2)

Ou supprimez complètement les chiffres si vous préférez la matrice sans annotations:

corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})

La documentation de style inclut également des instructions sur les styles plus avancés, telles que la modification de l'affichage de la cellule survolée par le pointeur de la souris. Pour enregistrer la sortie, vous pouvez renvoyer le code HTML en ajoutant la méthode render() , puis en l'écrivant dans un fichier (ou en prenant simplement une capture d'écran à des fins moins formelles).

Comparaison de temps

Lors de mes tests, style.background_gradient() était 4x plus rapide que plt.matshow() et 120x plus rapide que sns.heatmap() avec une matrice 10x10. Malheureusement, sa mise à l'échelle est moins bonne que celle de plt.matshow() : les deux prennent à peu près le même temps pour une matrice 100x100 et plt.matshow() est 10 fois plus rapide pour une matrice 1000x1000.

Économie

Il existe plusieurs façons de sauvegarder la trame de données stylisée:

  • Renvoyez le code HTML en ajoutant la méthode render() , puis écrivez le résultat dans un fichier.
  • Enregistrez en tant que fichier .xslx avec mise en forme conditionnelle en ajoutant la méthode to_excel() .
  • Combinez avec imgkit pour enregistrer une image bitmap
  • Prenez une capture d'écran (à des fins moins formelles).

Mise à jour pour les pandas> = 0.24

En définissant axis=None , il est maintenant possible de calculer les couleurs en fonction de la matrice entière plutôt que par colonne ou par ligne:

corr.style.background_gradient(cmap='coolwarm', axis=None)


Version Heatmap de Seaborn:

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)

Vous pouvez utiliser pyplot.matshow() partir de matplotlib :

import matplotlib.pyplot as plt

plt.matshow(dataframe.corr())
plt.show()

Modifier:

Dans les commentaires figurait une demande de modification des libellés de ticks d'axe. Voici une version de luxe dessinée sur une taille de figure plus grande, comportant des étiquettes d'axe correspondant à la trame de données et une légende de la barre de couleur permettant d'interpréter l'échelle des couleurs.

J'inclus comment ajuster la taille et la rotation des étiquettes, et j'utilise un rapport de figure qui fait en sorte que la barre de couleur et la figure principale aient la même hauteur.

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);


Vous pouvez utiliser la méthode 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()






information-visualization