it-swarm.com.de

Diagrammkorrelationsmatrix mit pandas

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?

157
Gaurav Singh

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

correlation plot example

209
jrjc

Wenn Ihr Hauptziel darin besteht, die Korrelationsmatrix zu visualisieren, anstatt ein Diagramm an sich zu erstellen, ist die praktische pandasStyling-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

enter image description here

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


Styling

Sie können die Zifferngenauigkeit leicht einschränken:

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

enter image description here

Oder entfernen Sie die Ziffern ganz, wenn Sie die Matrix ohne Anmerkungen bevorzugen:

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

enter image description here

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


Zeitvergleich

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.


Speichern

Es gibt verschiedene Möglichkeiten, um den stilisierten Datenrahmen zu speichern:

  • Geben Sie den HTML-Code zurück, indem Sie die Methode render() anhängen, und schreiben Sie die Ausgabe in eine Datei.
  • Speichern Sie als .xslx -Datei mit bedingter Formatierung, indem Sie die to_Excel() -Methode anhängen.
  • Mit imgkit kombinieren, um eine Bitmap zu speichern
  • Machen Sie einen Screenshot (für weniger formelle Zwecke).

Update für pandas> = 0.24

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)

enter image description here

103
joelostblom

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

Seaborns Heatmap-Version:

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

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.

enter image description here

Die Korrelation zwischen Lebensmittel und Waschmitteln ist hoch. Ähnlich:

  1. Lebensmittel und Waschmittel.
  1. Milch und Lebensmittel
  2. Milch und Waschmittel_Papier
  1. Milch und Deli
  2. Gefroren und frisch.
  3. Gefroren und Deli.

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.

enter image description here

Hinweis: Das obige Diagramm stammt aus den Daten, die zum Zeichnen der Heatmap verwendet werden.

68
phanindravarma

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

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)
1
Harvey