Como visualizar uma grande matriz de correlação?
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
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: