Wie visualisiere ich eine große Korrelationsmatrix?
Ich habe einen Datensatz mit 24 Variablen, von denen 21 numerisch sind. Im Rahmen der Modellbildung habe ich mich entschlossen, die Korrelation zwischen Merkmalen zu untersuchen. Daher erhalte ich eine große Korrelationsmatrix (21 * 21).
Jetzt wird das Visualisieren so großer Matrizen zu einer sehr unordentlichen Aufgabe, und Sie verletzen sich am Ende die Augen. Ich habe also einen Schwellenwert festgelegt und die Zeilen herausgeschnitten, die größer als dieser Wert sind (z. B. 0,60). Ich erhalte jedoch eine Matrix, die jetzt mehrere NaNs enthält. Wenn ich versuche, diese Nullwerte zu löschen, verliert die Matrix alle Daten und ich habe eine 0 * 0-Matrix übrig.
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 = []
Die Visualisierung der Matrix mit nans ist eine gute Idee, führt aber auch zu leeren Quadraten. Ich suche nach einer Möglichkeit, bei der nur die Zeilen mit den Werten> = Schwellenwert ohne Nans beibehalten werden. Das würde eine viel kleinere Matrix ergeben, die viel weniger chaotisch ist, wenn sie in matplotlib geplottet wird. Ich konnte es jedoch nicht so codieren. Kann jemand Strategien vorschlagen, um mit so großen Matrizen umzugehen?
Antworten
Versuchen Sie dies (beachten Sie, dass ich keine Fehlerprüfung hinzugefügt habe, sodass es abstürzt, wenn Ihr Schwellenwert alle Werte entfernt). Außerdem habe ich es eher zu einem absoluten Hochpass als zu einem normalen Hochpass gemacht, weil ich davon ausgehe, dass Sie auch an einer starken negativen Korrelation interessiert sind? Wenn nicht, entfernen Sie einfach abs()die Filterfunktion.
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()
Dies ist die gefilterte Heatmap:
Und dies ist ein weiterer Lauf, aber mit der ungefilterten Heatmap: