Cálculo y visualización de la matriz de correlación con pandas

35

Tengo un marco de datos de pandas con varias entradas, y quiero calcular la correlación entre los ingresos de algún tipo de tiendas. Hay una serie de tiendas con datos de ingresos, clasificación del área de actividad (teatro, tiendas de ropa, comida ...) y otros datos.

Intenté crear un nuevo marco de datos e insertar una columna con los ingresos de todo tipo de tiendas que pertenecen a la misma categoría, y el marco de datos que regresa solo tiene la primera columna llena y el resto está lleno de NaN. El código que me cansé:

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

Quiero hacerlo, así puedo usar .corr()para dar la matriz de correlación entre la categoría de tiendas.

Después de eso, me gustaría saber cómo puedo trazar los valores de la matriz (-1 a 1, ya que quiero usar la correlación de Pearson) con matplolib.

gdlm
fuente

Respuestas:

24

Sugiero algún tipo de juego sobre lo siguiente:

Usando los datos de abulón UCI para este ejemplo ...

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

ingrese la descripción de la imagen aquí

Función de trazado de matriz de correlación:

# Función de trazado matricial de correlación

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)

ingrese la descripción de la imagen aquí

¡Espero que esto ayude!

AN6U5
fuente
La segunda parte fue realmente muy útil, pero todavía tengo el primer problema y necesito resolverlo antes de pasar a la segunda parte
gdlm
Es muy difícil entender lo que quieres en la primera parte sin algunos datos. ¿Puede agregar algunos datos para ilustrar la otra pieza sobre la que tiene una pregunta? Creo que esto se resuelve trivialmente en función de lo que has mencionado. Simplemente escriba 10 filas del marco de datos y el antes y el después de lo que tiene y quiere.
AN6U5
1
La línea import numpy as npno es necesaria, ¿verdad?
Martin Thoma el
1
No lo usas cbar, entonces ¿por qué lo asignas?
Martin Thoma el
1
@ Martin Thoma: tiene razón en que numpy no se usa. Estaba pensando que .corr () era una función numpy pero es pandas. Sí uso la barra de colores, pero tienes razón en que no necesité asignarla a cbar. He editado la respuesta en función de sus comentarios. ¡Gracias!
AN6U5
29

Otra alternativa es usar la función de mapa de calor en seaborn para trazar la covarianza. Este ejemplo utiliza el conjunto de datos automático del paquete ISLR en R (igual que en el ejemplo que mostró).

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)

ingrese la descripción de la imagen aquí

Si quieres ser aún más elegante, puedes usar Pandas Style , por ejemplo:

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

ingrese la descripción de la imagen aquí

mrandrewandrade
fuente
ver por primera vez usando el paquete R en python. Se puede usar mucha función R ahora. Genial
Diansheng
Las versiones de Pandas> 0.19 no contienen el rpymódulo. Necesita usar el proyecto independiente rpy2. Vea la advertencia de Pandas aquí .
n1k31t4
7

¿Por qué no simplemente hacer esto?

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

Puede cambiar la paleta de colores utilizando el cmapparámetro:

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