Ich habe einen Datensatz mit einer großen Anzahl von Merkmalen, so dass die Analyse der Korrelationsmatrix sehr schwierig geworden ist. Ich möchte eine Korrelationsmatrix zeichnen, die wir mit der Funktion dataframe.corr()
aus der Bibliothek pandas erhalten. Gibt es eine integrierte Funktion in der pandas Bibliothek, um diese Matrix zu zeichnen?
Sie können pyplot.matshow()
aus matplotlib
verwenden:
import matplotlib.pyplot as plt
plt.matshow(dataframe.corr())
plt.show()
Bearbeiten:
In den Kommentaren wurde nachgefragt, wie die Achsenmarkierungen geändert werden sollen. Hier ist eine Deluxe-Version, die auf einer größeren Figur gezeichnet ist, Achsenbeschriftungen für den Datenrahmen und eine Farbleistenlegende zur Interpretation der Farbskala enthält.
Ich gebe an, wie Größe und Drehung der Etiketten angepasst werden, und ich verwende ein Zahlenverhältnis, bei dem die Farbleiste und die Hauptfigur auf die gleiche Höhe gebracht werden.
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);
Wenn Ihr Hauptziel darin besteht, die Korrelationsmatrix zu visualisieren, anstatt ein Diagramm an sich zu erstellen, ist die praktische pandas
Styling-Optionen eine praktikable integrierte Lösung:
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
Beachten Sie, dass dies in einem Backend erfolgen muss, das das Rendern von HTML unterstützt, z. B. JupyterLab Notebook. (Der automatische helle Text auf dunklem Hintergrund stammt aus einer vorhandenen PR und nicht aus der neuesten veröffentlichten Version, pandas
0.23).
Sie können die Zifferngenauigkeit leicht einschränken:
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
Oder entfernen Sie die Ziffern ganz, wenn Sie die Matrix ohne Anmerkungen bevorzugen:
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
Die Styling-Dokumentation enthält auch Anweisungen zu weiterführenden Styles, z. B. zum Ändern der Anzeige der Zelle, über die der Mauszeiger schwebt. Um die Ausgabe zu speichern, können Sie den HTML-Code zurückgeben, indem Sie die render()
-Methode anhängen und ihn dann in eine Datei schreiben (oder einfach einen Screenshot für weniger formale Zwecke machen).
In meinen Tests war style.background_gradient()
mit einer 10x10-Matrix 4x schneller als plt.matshow()
und 120x schneller als sns.heatmap()
. Leider skaliert es nicht so gut wie plt.matshow()
: Für eine 100x100-Matrix dauern die beiden ungefähr die gleiche Zeit, und plt.matshow()
ist für eine 1000x1000-Matrix 10x schneller.
Es gibt verschiedene Möglichkeiten, um den stilisierten Datenrahmen zu speichern:
render()
anhängen, und schreiben Sie die Ausgabe in eine Datei..xslx
-Datei mit bedingter Formatierung, indem Sie die to_Excel()
-Methode anhängen.Durch Setzen von axis=None
ist es nun möglich, die Farben basierend auf der gesamten Matrix anstatt pro Spalte oder pro Zeile zu berechnen:
corr.style.background_gradient(cmap='coolwarm', axis=None)
Probieren Sie diese Funktion aus, die auch Variablennamen für die Korrelationsmatrix anzeigt:
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);
Seaborns Heatmap-Version:
import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
Sie können die Beziehung zwischen Merkmalen beobachten, indem Sie entweder eine Wärmekarte von Seebären oder eine Streumatrix von Pandas zeichnen.
Streumatrix:
pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');
Wenn Sie auch die Schräglage der einzelnen Features visualisieren möchten, verwenden Sie seeborene Pairplots.
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)
Die Ausgabe ist eine Korrelationskarte der Features. siehe das nachstehende Beispiel.
Die Korrelation zwischen Lebensmittel und Waschmitteln ist hoch. Ähnlich:
Aus Paarplots: Sie können dieselbe Menge von Beziehungen aus Paarplots oder der Streumatrix beobachten. Hieraus lässt sich jedoch ableiten, ob die Daten normal verteilt sind oder nicht.
Hinweis: Das obige Diagramm stammt aus den Daten, die zum Zeichnen der Heatmap verwendet werden.
Sie können die Methode imshow () aus matplotlib verwenden
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()
Wenn Ihr Datenframe df
ist, können Sie einfach Folgendes verwenden:
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)