Calcul et visualisation de la matrice de corrélation avec les pandas

35

J'ai un bloc de données de pandas avec plusieurs entrées et je veux calculer la corrélation entre les revenus de certains types de magasins. Il existe un certain nombre de magasins avec des données sur le revenu, une classification du domaine d'activité (théâtre, magasins de tissus, alimentation ...) et d'autres données.

J'ai essayé de créer un nouveau bloc de données et d'insérer une colonne avec le revenu de tous les types de magasins appartenant à la même catégorie. Le bloc de données renvoyé n'a que la première colonne remplie et le reste est rempli de NaN. Le code que j'ai fatigué:

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

Je souhaite le faire afin de .corr()pouvoir donner la matrice de corrélation entre les catégories de magasins.

Après cela, j'aimerais savoir comment tracer les valeurs de la matrice (-1 à 1, car je veux utiliser la corrélation de Pearson) avec matplolib.

Gdlm
la source

Réponses:

24

Je suggère une sorte de jeu sur ce qui suit:

Utiliser les données UCI Abalone pour cet exemple ...

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

entrez la description de l'image ici

Fonction de tracé de la matrice de corrélation:

# Fonction de tracé matriciel de corrélation

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)

entrez la description de l'image ici

J'espère que cela t'aides!

AN6U5
la source
La deuxième partie était vraiment très utile, mais j'ai toujours le premier problème et je dois le résoudre avant de passer à la deuxième partie
gdlm
Il est très difficile de comprendre ce que vous voulez dans la première partie sans quelques données. Pouvez-vous ajouter des données pour illustrer l’autre élément sur lequel vous avez une question? Je crois que ceci est résolu de manière triviale sur la base de ce que vous avez mentionné. Il suffit d’écrire 10 lignes de la structure de données et l’avant et l’après de ce que vous avez et ce que vous voulez.
AN6U5
1
La ligne import numpy as npn'est pas nécessaire, n'est-ce pas?
Martin Thoma
1
Vous n'utilisez pas cbar, alors pourquoi l'assignez-vous?
Martin Thoma
1
@Martin Thoma - Vous avez raison de dire que numpy n'est pas utilisé. Je pensais que .corr () était une fonction numpy mais ce sont des pandas. J'utilise bien la barre de couleurs, mais vous avez raison, je n'ai pas eu besoin de l'assigner à cbar. J'ai édité la réponse en fonction de vos commentaires. Merci!
AN6U5
29

Une autre alternative consiste à utiliser la fonction heatmap dans seaborn pour tracer la covariance. Cet exemple utilise l'ensemble de données automatique du package ISLR dans R (le même que dans l'exemple que vous avez présenté).

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)

entrez la description de l'image ici

Si vous voulez être encore plus chic, vous pouvez utiliser Pandas Style , par exemple:

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

entrez la description de l'image ici

mrandrewandrade
la source
première fois, voir l’utilisation du paquet R en python. Beaucoup de fonctions R peuvent être utilisées maintenant. Super
Diansheng
Les versions de pandas> 0.19 ne contiennent pas le rpymodule. Vous devez utiliser le projet autonomerpy2 . Voir l' avertissement des Pandas ici .
n1k31t4
7

Pourquoi ne pas simplement faire ceci:

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

Vous pouvez changer la palette de couleurs en utilisant le cmapparamètre:

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