[PYTHON] Ich möchte eine wunderschön angepasste Wärmekarte der Korrelationsmatrix ausgeben. matplotlib edition

Überblick

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.

fig2.png

Ausführungsumgebung

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    

Vorbereitung für die Verwendung von Japanisch mit Matplotlib

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

Finden Sie die Korrelationsmatrix und erstellen Sie vorerst eine Wärmekarte

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)

table1.png

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)

Ausführungsergebnis

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.

fig1.png

Um ehrlich zu sein, ist es nicht möglich, mit den Standardeinstellungen eine leicht verständliche Heatmap zu erstellen.

Wunderschön ausgegeben

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) 

Ausführungsergebnis

fig2.png

Recommended Posts

Ich möchte eine wunderschön angepasste Wärmekarte der Korrelationsmatrix ausgeben. matplotlib edition
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich möchte ein Histogramm erstellen und die Normalverteilungskurve darauf überlagern. matplotlib edition
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Ich möchte das Ausführungsergebnis von strace erfassen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte ein Paket von Php Redis installieren
[Python] So erstellen Sie eine Korrelationsmatrix und eine Heatmap
Ich möchte manuell eine Legende mit matplotlib erstellen
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich möchte viele Prozesse von Python aus starten
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich möchte den Schnittpunkt einer Bezier-Kurve und einer geraden Linie finden (Bezier-Clipping-Methode)
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich möchte die Natur von Python und Pip kennenlernen
Ich möchte den EDINET-Code und die Wertpapiernummer zuordnen
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich möchte vorerst eine Docker-Datei erstellen.
Wenn ich mit matplotlib eine große Anzahl von Diagrammen generiere, möchte ich das Diagramm nicht auf dem Bildschirm anzeigen (Jupyter-Umgebung).
Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).
[Twitter] Ich möchte die heruntergeladenen vergangenen Tweets (meines Kontos) in eine schöne CSV verwandeln
Ich möchte die Frage nach der Methode "__init__" und dem Argument "self" der Python-Klasse klären.
Ich möchte Tag-Informationen (Titel und Künstler) einer Musikdatei (flac, wav) extrahieren.
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
Ich möchte die Ausführungszeit aufzeichnen und ein Protokoll führen.
Ich möchte die HTML-Version der OpenCV 3.1-Version "OpenCV-Python Tutorials" lesen
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich möchte ein System erstellen, um zu verhindern, dass vergessen wird, den Schlüssel 1 festzuziehen
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Ich habe versucht, Objekte aus dem Bild des Steak-Set-Essens zu sortieren - Ähnliches Bild Wärmekartenerkennung
Ich möchte komplizierte vier Regeln in der IF-Anweisung der Django-Vorlage verwenden! → Verwenden Sie eine benutzerdefinierte Vorlage
Ich möchte die Farbe ändern, indem ich auf den Streupunkt in matplotlib klicke
Ich möchte nur ein Signal vom Sub-Thread zum Haupt-Thread senden
(Matplotlib) Ich möchte ein Diagramm mit einer in Pixel angegebenen Größe zeichnen
Ich möchte es nicht zugeben ... Die dynamische Systemdarstellung von Neural Network
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich möchte meine Gefühle mit den Texten von Mr. Children ausdrücken
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Ich möchte die Gefühle von Menschen analysieren, die sich treffen und zittern wollen
Ich möchte den Erfolg von NBA-Spielern mit dem Qore SDK vorhersagen
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen