Berechnung und Visualisierung der Korrelationsmatrix mit Pandas

35

Ich habe einen Pandadatenrahmen mit mehreren Einträgen und möchte die Korrelation zwischen dem Einkommen einer Art von Geschäften berechnen. Es gibt eine Reihe von Geschäften mit Einkommensdaten, Klassifizierung des Tätigkeitsbereichs (Theater, Tuchläden, Lebensmittel ...) und anderen Daten.

Ich habe versucht, einen neuen Datenrahmen zu erstellen und eine Spalte mit den Einnahmen aller Arten von Geschäften einzufügen, die derselben Kategorie angehören. Im zurückgegebenen Datenrahmen ist nur die erste Spalte ausgefüllt, und der Rest ist mit NaNs gefüllt. Der Code, den ich müde:

corr = pd.DataFrame()
for at in activity:
    stores.loc[stores['Activity']==at]['income']

Ich möchte dies tun, damit ich .corr()die Korrelationsmatrix zwischen den Kategorien der Geschäfte angeben kann.

Danach möchte ich wissen, wie ich die Matrixwerte (-1 bis 1, da ich die Pearson-Korrelation verwenden möchte) mit Matplolib darstellen kann.

gdlm
quelle

Antworten:

24

Ich schlage eine Art Spiel vor:

Verwenden der UCI Abalone-Daten für dieses Beispiel ...

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# Read file into a Pandas dataframe
from pandas import DataFrame, read_csv
f = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'
df = read_csv(f)
df=df[0:10]
df

Bildbeschreibung hier eingeben

Korrelationsmatrix-Darstellungsfunktion:

# Korrelationsfunktion für Matrizen

def correlation_matrix(df):
    from matplotlib import pyplot as plt
    from matplotlib import cm as cm

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    cmap = cm.get_cmap('jet', 30)
    cax = ax1.imshow(df.corr(), interpolation="nearest", cmap=cmap)
    ax1.grid(True)
    plt.title('Abalone Feature Correlation')
    labels=['Sex','Length','Diam','Height','Whole','Shucked','Viscera','Shell','Rings',]
    ax1.set_xticklabels(labels,fontsize=6)
    ax1.set_yticklabels(labels,fontsize=6)
    # Add colorbar, make sure to specify tick locations to match desired ticklabels
    fig.colorbar(cax, ticks=[.75,.8,.85,.90,.95,1])
    plt.show()

correlation_matrix(df)

Bildbeschreibung hier eingeben

Hoffe das hilft!

AN6U5
quelle
Der zweite Teil war wirklich sehr hilfreich, aber ich habe immer noch das erste Problem und muss es lösen, bevor ich zum zweiten Teil
gehe
Es ist sehr schwer zu verstehen, was Sie im ersten Teil ohne einige Daten wollen. Können Sie einige Daten hinzufügen, um das andere Teil zu veranschaulichen, zu dem Sie eine Frage haben? Ich glaube, das ist trivial gelöst, basierend auf dem, was Sie erwähnt haben. Schreiben Sie einfach 10 Zeilen des Datenrahmens und das Vorher und Nachher dessen, was Sie haben und wollen.
AN6U5
1
Die Leitung import numpy as npist nicht nötig, oder?
Martin Thoma
1
Sie verwenden es nicht. cbarWarum weisen Sie es zu?
Martin Thoma
1
@ Martin Thoma - Sie sind richtig, dass numpy nicht verwendet wird. Ich dachte, dass .corr () eine numpy Funktion ist, aber es ist Pandas. Ich verwende die Farbleiste, aber Sie haben Recht, dass ich sie nicht der cbar zuweisen musste. Ich habe die Antwort basierend auf Ihren Kommentaren bearbeitet. Vielen Dank!
AN6U5
29

Eine andere Alternative ist die Verwendung der Heatmap-Funktion in Seaborn, um die Kovarianz zu zeichnen. In diesem Beispiel wird der Auto-Datensatz aus dem ISLR-Paket in R verwendet (derselbe wie in dem von Ihnen gezeigten Beispiel).

import pandas.rpy.common as com
import seaborn as sns
%matplotlib inline

# load the R package ISLR
infert = com.importr("ISLR")

# load the Auto dataset
auto_df = com.load_data('Auto')

# calculate the correlation matrix
corr = auto_df.corr()

# plot the heatmap
sns.heatmap(corr, 
        xticklabels=corr.columns,
        yticklabels=corr.columns)

Bildbeschreibung hier eingeben

Wenn Sie noch ausgefallener sein möchten, können Sie Pandas Style verwenden , zum Beispiel:

cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)

def magnify():
    return [dict(selector="th",
                 props=[("font-size", "7pt")]),
            dict(selector="td",
                 props=[('padding', "0em 0em")]),
            dict(selector="th:hover",
                 props=[("font-size", "12pt")]),
            dict(selector="tr:hover td:hover",
                 props=[('max-width', '200px'),
                        ('font-size', '12pt')])
]

corr.style.background_gradient(cmap, axis=1)\
    .set_properties(**{'max-width': '80px', 'font-size': '10pt'})\
    .set_caption("Hover to magify")\
    .set_precision(2)\
    .set_table_styles(magnify())

Bildbeschreibung hier eingeben

mrandrewandrade
quelle
Zum ersten Mal mit R-Paket in Python. Viele R-Funktionen können jetzt verwendet werden. Großartig
Diansheng
Versionen von Pandas> 0.19 enthalten das rpyModul nicht. Sie müssen das eigenständige Projekt verwenden rpy2. Siehe die Warnung von Pandas hier .
n1k31t4
7

Warum nicht einfach so vorgehen:

import seaborn as sns
import pandas as pd

data = pd.read_csv('Dataset.csv')

plt.figure(figsize=(40,40)) 
# play with the figsize until the plot is big enough to plot all the columns
# of your dataset, or the way you desire it to look like otherwise

sns.heatmap(data.corr())

Sie können die Farbpalette mit dem folgenden cmapParameter ändern :

sns.heatmap(data.corr(), cmap='BuGn')
Kristada673
quelle