Comment visualiser une grande matrice de corrélation?

Sep 26 2020

J'ai un ensemble de données avec 24 variables, dont 21 numériques. Dans le cadre de la construction de modèles, j'ai décidé d'examiner la corrélation entre les caractéristiques et ce que j'obtiens est une grande matrice de corrélation (21 * 21).

Maintenant, visualiser des matrices aussi grandes devient une tâche très compliquée et vous finissez par vous faire mal aux yeux. Donc, ce que j'ai fait est de définir un seuil et de découper les lignes qui ont une valeur supérieure à cette valeur (disons 0,60). Cependant, j'obtiens une matrice qui a maintenant plusieurs NaN. Lorsque j'essaye de supprimer ces valeurs nulles, la matrice perd toutes les données et ce qu'il me reste est une matrice 0 * 0.

corr_matrix = data.corr()

threshold = 0.60

high_corr = corr_matrix.loc[corr_matrix >= 0.60]

high_corr.dropna(inplace=True)

print(high_corr)
Empty DataFrame
Columns = []

Visualiser la matrice avec nans est une bonne idée, mais cela donne également des carrés vides. Je cherche un moyen où seules les lignes qui ont des valeurs> = seuil sont conservées, sans nans. Cela ferait une matrice beaucoup plus petite qui est beaucoup moins compliquée lorsqu'elle est tracée dans matplotlib. Cependant, je n'ai pas pu le coder de cette façon; Quelqu'un peut-il suggérer des stratégies pour traiter de si grandes matrices?

Réponses

2 BenjiAlbert Sep 26 2020 at 08:20

Essayez ceci (notez que je n'ai pas ajouté de vérification des erreurs, donc ça plantera si votre seuil supprime toutes les valeurs). De plus, j'en ai fait un passe-haut absolu plutôt qu'un passe-haut normal parce que je suppose que vous seriez également intéressé par une forte corrélation négative? Si ce n'est pas le cas, supprimez simplement abs()la fonction de filtre.

from numpy.random      import randn
from pandas            import DataFrame
from seaborn           import heatmap
from matplotlib.pyplot import show
from itertools         import combinations

def absHighPass(df, absThresh):
    passed = set()
    for (r,c) in combinations(df.columns, 2):
        if (abs(df.loc[r,c]) >= absThresh):
            passed.add(r)
            passed.add(c)
    passed = sorted(passed)
    return df.loc[passed,passed]

labels = [chr(x) for x in range(65,91)]
corrDf = DataFrame(randn(26,26), index=labels, columns=labels).corr()

#heatmap(corrDf,cmap="YlGnBu")
heatmap(absHighPass(corrDf,0.5),cmap="YlGnBu")
show()

Voici la carte thermique filtrée:

Et ceci est une autre course mais avec la carte thermique non filtrée: