web-dev-qa-db-fra.com

Matrice de corrélation de parcelles en utilisant pandas

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

157
Gaurav Singh

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 deluxe dessinée sur une taille de figure plus grande, avec des étiquettes d'axe pour correspondre à la structure de données et une légende de barre de couleurs pour interpréter l'échelle de 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);

correlation plot example

209
jrjc

Si votre objectif principal est de visualiser la matrice de corrélation, plutôt que de créer un tracé en tant que tel, l'option pratique pandasoptions de style est 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

enter image description here

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)

enter image description here

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'})

enter image description here

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 n'est pas aussi 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 pandas> = 0.24

En définissant axis=None, il est désormais 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)

enter image description here

103
joelostblom

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

Version Heatmap de Seaborn:

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

Vous pouvez observer la relation entre les caractéristiques en dessinant une carte thermique à partir de la source marine ou une matrice diffusée à partir de pandas.

Matrice de dispersion:

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');

Si vous souhaitez également visualiser l'asymétrie de chaque fonction, utilisez des tracés par paires créés en mer.

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)

La sortie sera une carte de corrélation des entités. c'est-à-dire voir l'exemple ci-dessous.

enter image description here

La corrélation entre l'épicerie et les détergents est élevée. De même:

  1. Epicerie et Détergents.
  1. Lait et épicerie
  2. Lait et détergents
  1. Lait et charcuterie
  2. Congelé et frais.
  3. Frozen et Deli.

À partir des graphiques en paires: Vous pouvez observer le même ensemble de relations à partir des graphiques en paires ou de la matrice de dispersion. Mais à partir de ceux-ci, nous pouvons dire que les données sont normalement distribuées ou non.

enter image description here

Remarque: Le graphique ci-dessus est identique à celui tiré des données, utilisé pour dessiner la carte thermique.

68
phanindravarma

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()
6
Khandelwal-manik

Si votre image de données est df, vous pouvez simplement utiliser:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)
1
Harvey