Erstellen Sie mit Python + Pandas + Matplotlib eine schön formatierte ** Heatmap ** aus der ** Korrelationsmatrix ** (einer Matrix von Korrelationskoeffizienten zwischen jeder Variablen).
Hier möchte ich als Beispiel eine Wärmekarte für die folgende Korrelationsmatrix ** ** Subjektklasse ** erstellen.
Wir haben die Ausführung und den Betrieb mit Google Colab (Python 3.6.9) bestätigt. Es ist fast das gleiche wie Jupyter Notebook.
!pip list
matplotlib 3.1.2
numpy 1.17.4
pandas 0.25.3
Stellen Sie Japanisch im Ausgabediagramm von matplotlib zur Verfügung.
!pip install japanize-matplotlib
import japanize_matplotlib
Mit dem oben genannten wird japanize-matplotlib-1.0.5
installiert und importiert, und selbst wenn Sie Japanisch für Etiketten usw. verwenden, werden die Zeichen nicht verstümmelt (Tofu).
Die Korrelationsmatrix kann leicht mit der Funktion von Pandas erhalten werden.
import pandas as pd
#Dummy-Daten
Landessprache= [76, 62, 71, 85, 96, 71, 68, 52, 85, 91]
Gesellschaft= [71, 85, 64, 55, 79, 72, 73, 52, 84, 84]
Mathematik= [50, 78, 48, 64, 66, 62, 58, 50, 50, 60]
Wissenschaft= [37, 90, 45, 56, 59, 56, 84, 86, 51, 61]
Englisch= [59, 97, 71, 85, 58, 82, 70, 61, 79, 70]
df = pd.DataFrame( {'Landessprache':Landessprache, 'Gesellschaft':Gesellschaft, 'Mathematik':Mathematik, 'Wissenschaft':Wissenschaft, 'Englisch':Englisch} )
#Korrelationskoeffizienten berechnen
df2 = df.corr()
display(df2)
Jedes Element der Matrix nimmt einen Wert im Bereich von $ -1,0 $ bis $ 1,0 $ an. Je näher dieser Wert an $ 1,0 $ liegt, desto positiver ist die Korrelation, und je näher er an -1,0 $ liegt, desto negativer ist die Korrelation. Im Bereich von $ -0,2 $ bis $ 0,2 $ wird es als ** unkorreliert (unkorreliert) ** beurteilt.
Da die diagonalen Elemente den Korrelationskoeffizienten zwischen denselben Elementen darstellen, beträgt sie $ 1,0 $ (= es besteht eine perfekte positive Korrelation).
Selbst wenn der Korrelationskoeffizient wie oben gezeigt als numerischer Wert angeordnet ist, ist es schwierig, das Ganze zu erfassen. Lassen Sie uns ihn daher mithilfe einer Wärmekarte visualisieren.
Lassen Sie uns zunächst eine Heatmap mit dem minimal erforderlichen Code erstellen, ohne das Erscheinungsbild anzupassen.
%reset -f
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
#Dummy-Daten
Landessprache= [76, 62, 71, 85, 96, 71, 68, 52, 85, 91]
Gesellschaft= [71, 85, 64, 55, 79, 72, 73, 52, 84, 84]
Mathematik= [50, 78, 48, 64, 66, 62, 58, 50, 50, 60]
Wissenschaft= [37, 90, 45, 56, 59, 56, 84, 86, 51, 61]
Englisch= [59, 97, 71, 85, 58, 82, 70, 61, 79, 70]
df = pd.DataFrame( {'Landessprache':Landessprache, 'Gesellschaft':Gesellschaft, 'Mathematik':Mathematik, 'Wissenschaft':Wissenschaft, 'Englisch':Englisch} )
#Korrelationskoeffizienten berechnen
df2 = df.corr()
display(df2)
#Geben Sie die Matrix der Korrelationskoeffizienten als Wärmekarte aus
plt.figure(dpi=120)
plt.imshow(df2,interpolation='nearest',vmin=-1.0,vmax=1.0)
plt.colorbar()
#Einstellung zur Ausgabe von Elementnamen (Landessprache, Gesellschaft, Mathematik, Naturwissenschaften, Englisch) auf der Achse
n = len(df2.columns) #Anzahl der Teile
plt.gca().set_xticks(range(n))
plt.gca().set_xticklabels(df2.columns)
plt.gca().set_yticks(range(n))
plt.gca().set_yticklabels(df2.columns)
Sie können die folgende Ausgabe erhalten: Basierend auf dem Farbbalken auf der rechten Seite gibt es eine ** negative Korrelation **, wo die dunkelvioletten und blauen Farben sind, und eine ** positive Korrelation, wo die hellgelben und grünen Farben sind. Ich werde lesen, ob es ** gibt.
Um ehrlich zu sein, ist es nicht möglich, mit den Standardeinstellungen eine leicht verständliche Heatmap zu erstellen.
Wir werden es anpassen, um eine schöne und intuitive Heatmap zu erhalten. Die Hauptpunkte sind wie folgt.
――Die diagonalen Komponenten sind weiß und schattiert.
Wenn codiert, sieht es so aus:
%reset -f
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
import matplotlib.ticker as ticker
import matplotlib.colors
#Dummy-Daten
Landessprache= [76, 62, 71, 85, 96, 71, 68, 52, 85, 91]
Gesellschaft= [71, 85, 64, 55, 79, 72, 73, 52, 84, 84]
Mathematik= [50, 78, 48, 64, 66, 62, 58, 50, 50, 60]
Wissenschaft= [37, 90, 45, 56, 59, 56, 84, 86, 51, 61]
Englisch= [59, 97, 71, 85, 58, 82, 70, 61, 79, 70]
df = pd.DataFrame( {'Landessprache':Landessprache, 'Gesellschaft':Gesellschaft, 'Mathematik':Mathematik, 'Wissenschaft':Wissenschaft, 'Englisch':Englisch} )
#Korrelationskoeffizienten berechnen
df2 = df.corr()
for i in df2.index.values :
df2.at[i,i] = 0.0
#Geben Sie die Matrix der Korrelationskoeffizienten als Wärmekarte aus
plt.figure(dpi=120)
#Benutzerdefinierte Farbkarte
cl = list()
cl.append( ( 0.00, matplotlib.colors.hsv_to_rgb((0.6, 1. ,1))) )
cl.append( ( 0.30, matplotlib.colors.hsv_to_rgb((0.6, 0.1 ,1))) )
cl.append( ( 0.50, matplotlib.colors.hsv_to_rgb((0.3, 0. ,1))) )
cl.append( ( 0.70, matplotlib.colors.hsv_to_rgb((0.0, 0.1 ,1))) )
cl.append( ( 1.00, matplotlib.colors.hsv_to_rgb((0.0, 1. ,1))) )
ccm = matplotlib.colors.LinearSegmentedColormap.from_list('custom_cmap', cl)
plt.imshow(df2,interpolation='nearest',vmin=-1.0,vmax=1.0,cmap=ccm)
#Einstellung der Farbleiste, die auf der linken Seite angezeigt werden soll
fmt = lambda p, pos=None : f'${p:+.1f}$' if p!=0 else ' $0.0$'
cb = plt.colorbar(format=ticker.FuncFormatter(fmt))
cb.set_label('Korrelationskoeffizient', fontsize=11)
#Einstellungen in Bezug auf die Ausgabe von Elementen (Landessprache, Gesellschaft, Mathematik, Naturwissenschaften, Englisch)
n = len(df2.columns) #Anzahl der Teile
plt.gca().set_xticks(range(n))
plt.gca().set_xticklabels(df.columns)
plt.gca().set_yticks(range(n))
plt.gca().set_yticklabels(df.columns)
plt.tick_params(axis='x', which='both', direction=None,
top=True, bottom=False, labeltop=True, labelbottom=False)
plt.tick_params(axis='both', which='both', top=False, left=False )
#Rastereinstellungen
plt.gca().set_xticks(np.arange(-0.5, n-1), minor=True);
plt.gca().set_yticks(np.arange(-0.5, n-1), minor=True);
plt.grid( which='minor', color='white', linewidth=1)
#Diagonale Linie
plt.plot([-0.5,n-0.5],[-0.5,n-0.5],color='black',linewidth=0.75)
#Korrelationskoeffizienten anzeigen (Text mit Rand)
tp = dict(horizontalalignment='center',verticalalignment='center')
ep = [path_effects.Stroke(linewidth=3, foreground='white'),path_effects.Normal()]
for y,i in enumerate(df2.index.values) :
for x,c in enumerate(df2.columns.values) :
if x != y :
t = plt.text(x, y, f'{df2.at[i,c]:.2f}',**tp)
t.set_path_effects(ep)