Como visualizar uma grande matriz de correlação?

Sep 26 2020

Eu tenho um conjunto de dados com 24 variáveis, 21 delas numéricas. Como parte da construção do modelo, decidi examinar a correlação entre os recursos e, portanto, o que obtenho é uma grande matriz de correlação (21 * 21).

Agora, visualizar matrizes tão grandes se torna uma tarefa muito complicada e você acaba machucando seus olhos. Então, o que fiz foi definir um limite e cortar as linhas que têm maior que esse valor (digamos 0,60). No entanto, estou obtendo uma matriz que agora tem vários NaNs. Quando tento descartar esses valores nulos, a matriz perde todos os dados e o que me resta é uma matriz 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 = []

Visualizar a matriz com nans é uma boa ideia, mas também resulta em quadrados vazios. Estou procurando uma maneira em que apenas as linhas que têm valores> = limite sejam retidas, sem nans. Isso faria uma matriz muito menor que é muito menos bagunçada quando plotada em matplotlib. No entanto, não fui capaz de codificá-lo dessa forma; alguém pode sugerir algumas estratégias para lidar com matrizes tão grandes?

Respostas

2 BenjiAlbert Sep 26 2020 at 08:20

Tente isto (observe que eu não adicionei a verificação de erros, então ela travará se o seu limite remover todos os valores). Além disso, fiz um passe alto absoluto em vez de um passe alto normal, porque presumo que você também esteja interessado em uma correlação negativa forte. Se não estiver, apenas remova o abs()na função de filtro.

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

Este é o mapa de calor filtrado:

E esta é outra corrida, mas com o mapa de calor não filtrado: