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?
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);
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 pandas
options 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
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).
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).
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.
Il existe plusieurs façons de sauvegarder la trame de données stylisée:
render()
, puis écrivez le résultat dans un fichier..xslx
avec mise en forme conditionnelle en ajoutant la méthode to_Excel()
.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)
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);
Version Heatmap de Seaborn:
import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
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.
La corrélation entre l'épicerie et les détergents est élevée. De même:
À 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.
Remarque: Le graphique ci-dessus est identique à celui tiré des données, utilisé pour dessiner la carte thermique.
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()
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)