Calcolo e visualizzazione di correlazione Matrix con i panda
-
16-10-2019 - |
Domanda
Ho un frame di dati panda con più voci, e voglio calcolare la correlazione tra il reddito di un certo tipo di negozi. Ci sono un certo numero di negozi con dati di conto, la classificazione delle aree di attività (teatro, negozi di stoffa, cibo ...) e altri dati.
Ho cercato di creare una nuova cornice di dati e inserire una colonna con il reddito 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 stanco:
corr = pd.DataFrame()
for at in activity:
stores.loc[stores['Activity']==at]['income']
Io voglio farlo, in modo da poter usare per .corr()
ha dato la matrice di correlazione tra la categoria dei negozi.
Dopo di che, vorrei sapere come posso tracciare i valori della matrice (da -1 a 1, dal momento che voglio usare correlazione di Pearson) con matplotlib.
Soluzione
Suggerisco una sorta di gioco sul seguente:
Utilizzando i dati UCI 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
funzione di matrice di correlazione plotting:
# Correlazione funzione plotting matriciale
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)
Spero che questo aiuti!
Altri suggerimenti
Un'altra alternativa è quella di utilizzare la funzione di mappa termica in Seaborn per tracciare la covarianza. Questo esempio utilizza il set di dati automatico dal pacchetto ISLR in R (lo stesso come nell'esempio che avete 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)
Se si voleva essere ancora più di fantasia, è possibile utilizzare Pandas Stile , 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())
Perché non semplicemente fare questo:
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 l' tavolozza dei colori utilizzando il parametro cmap
:
sns.heatmap(data.corr(), cmap='BuGn')