Cálculo e visualização da matriz de correlação com pandas

35

Eu tenho um quadro de dados do pandas com várias entradas e quero calcular a correlação entre a renda de algum tipo de loja. Existem várias lojas com dados de renda, classificação da área de atividade (teatro, lojas de roupas, alimentos ...) e outros dados.

Tentei criar um novo quadro de dados e inserir uma coluna com a renda de todos os tipos de lojas que pertencem à mesma categoria, e o quadro de dados retornado tem apenas a primeira coluna preenchida e o restante está cheio de NaNs. O código que eu cansei:

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

Eu quero fazer isso, para que eu possa usar .corr()para fornecer a matriz de correlação entre a categoria de lojas.

Depois disso, gostaria de saber como posso plotar os valores da matriz (-1 a 1, já que quero usar a correlação de Pearson) com o matplolib.

gdlm
fonte

Respostas:

24

Sugiro algum tipo de jogo sobre o seguinte:

Usando os dados do UCI Abalone para este exemplo ...

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

insira a descrição da imagem aqui

Função de plotagem da matriz de correlação:

Função de plotagem matricial de correlação

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)

insira a descrição da imagem aqui

Espero que isto ajude!

AN6U5
fonte
A segunda parte foi realmente muito útil, mas ainda tenho o primeiro problema e preciso resolvê-lo antes de ir para a segunda parte
gdlm
É muito difícil entender o que você deseja na primeira parte sem alguns dados. Você pode adicionar alguns dados para ilustrar a outra peça sobre a qual você tem alguma dúvida. Acredito que isso seja resolvido trivialmente com base no que você mencionou. Basta escrever 10 linhas do quadro de dados e o antes e o depois do que você tem e deseja.
AN6U5
11
A linha import numpy as npnão é necessária, é?
Martin Thoma
11
Você não usa cbar, então por que atribui isso?
Martin Thoma
11
@ Martin Thoma - Você está certo de que o numpy não é usado. Eu estava pensando que .corr () era uma função numpy, mas são pandas. Eu uso a barra de cores, mas você está certo de que não precisei atribuí-la à cbar. Editei a resposta com base nos seus comentários. Obrigado!
AN6U5
29

Outra alternativa é usar a função heatmap em seaborn para plotar a covariância. Este exemplo usa o conjunto de dados Auto do pacote ISLR em R (o mesmo que no exemplo que você mostrou).

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)

insira a descrição da imagem aqui

Se você quiser ser ainda mais chique, use o Pandas Style , por exemplo:

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

insira a descrição da imagem aqui

mrandrewandrade
fonte
veja pela primeira vez usando o pacote R em python. Muitas funções R podem ser usadas agora. Ótimo
Diansheng 04/04
Versões do Pandas> 0,19 não contêm o rpymódulo. Você precisa usar o projeto autônomo rpy2. Veja o aviso do Pandas aqui .
N1k31t4
7

Por que não fazer isso simplesmente:

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

Você pode alterar a paleta de cores usando o cmapparâmetro:

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