Calcolo e visualizzazione della matrice di correlazione con i panda


35

Ho un frame di dati Panda con diverse voci e voglio calcolare la correlazione tra le entrate di un tipo di negozi. Esistono numerosi negozi con dati sul reddito, classificazione dell'area di attività (teatro, negozi di vestiti, cibo ...) e altri dati.

Ho provato a creare un nuovo frame di dati e inserire una colonna con le entrate di tutti i tipi di negozi che appartengono alla stessa categoria, e il frame di dati di ritorno ha solo la prima colonna riempita e il resto è pieno di NaN. Il codice che mi sono stancato:

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

Voglio farlo, quindi posso usare .corr()per dare la matrice di correlazione tra la categoria di negozi.

Successivamente, vorrei sapere come posso tracciare i valori della matrice (da -1 a 1, poiché voglio usare la correlazione di Pearson) con matplolib.


Risposte:


24

Suggerisco una sorta di gioco su quanto segue:

Utilizzo dei dati Ubal Abalone per questo esempio ...

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

inserisci qui la descrizione dell'immagine

Funzione di tracciamento matrice di correlazione:

# Funzione di tracciamento matric di correlazione

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)

inserisci qui la descrizione dell'immagine

Spero che sia di aiuto!


La seconda parte è stata davvero molto utile, ma ho ancora il primo problema e devo risolverlo prima di passare alla seconda parte
gdlm

È molto difficile capire cosa vuoi nella prima parte senza alcuni dati. Puoi aggiungere alcuni dati per illustrare l'altro pezzo di cui hai una domanda. Credo che questo sia banalmente risolto in base a ciò che hai menzionato. Basta scrivere 10 righe del frame di dati e il prima e il dopo di ciò che hai e vuoi.
AN6U5

1
La linea import numpy as npnon è necessaria, vero?
Martin Thoma,

1
Non usi cbar, quindi perché lo assegni?
Martin Thoma,

1
@Martin Thoma - Hai ragione sul non usare Numpy. Stavo pensando che .corr () era una funzione intorpidita ma è panda. Uso la barra dei colori, ma hai ragione sul fatto che non avevo bisogno di assegnarla a cbar. Ho modificato la risposta in base ai tuoi commenti. Grazie!
AN6U5,

29

Un'altra alternativa è utilizzare la funzione Heatmap in Seaborn per tracciare la covarianza. Questo esempio usa il set di dati Auto dal pacchetto ISLR in R (lo stesso dell'esempio che hai mostrato).

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)

inserisci qui la descrizione dell'immagine

Se vuoi essere ancora più fantasioso, puoi usare lo stile Pandas , ad esempio:

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

inserisci qui la descrizione dell'immagine


prima volta vedi usando il pacchetto R in python. Molte funzioni R ora possono essere utilizzate. Ottimo
Diansheng

Le versioni di Panda> 0,19 non contengono il rpymodulo. È necessario utilizzare il progetto autonomo rpy2. Vedi l' avvertimento di Panda qui .
n1k31t4,

7

Perché non farlo semplicemente:

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

È possibile modificare la tavolozza dei colori utilizzando il cmapparametro:

sns.heatmap(data.corr(), cmap='BuGn')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.