Ich werde das Verfahren zum Zeichnen eines unabhängigen Diagramms mit graphviz einführen
Es gibt zwei Gründe, warum die Korrelation beobachtet wird:
Die Teilkorrelation dient dazu, den Korrelationskoeffizienten nach Entfernen des letzteren Effekts zu erhalten, und der unabhängige Graph soll die Faktoren mit einer hohen Teilkorrelation verbinden. Siehe unten für Details.
Ableitung der Bedeutung des partiellen Korrelationskoeffizienten und der Formel https://mathtrain.jp/partialcor
Ich habe es noch nicht bestätigt, aber ich denke, es wird wahrscheinlich unten sein
terminal
pip install graphviz
terminal
conda install -c conda-forge python-graphviz
Sie können einen Knoten mit node () und eine Verkettung mit edge () wie unten gezeigt schreiben. Wenn render () ausgeführt wird, wird der graphviz-Quellcode einmal exportiert und das Diagramm basierend darauf als png oder pdf exportiert. Wenn cleanup = True ist, exportieren Sie die Bilddatei nach dem Export als PNG unten
python
from graphviz import Graph
g = Graph(format='png')
g.node('1')
g.node('2')
g.node('3')
g.edge('1', '2')
g.edge('2', '3')
g.edge('3', '1')
g.render(filename='../test', format='png', cleanup=True, directory=None)
display(Image.open('../test.png'))
python
from graphviz import Digraph
dg = Digraph(format='png')
dg.node('1')
dg.node('2')
dg.node('3')
dg.edge('1', '2') # 1 -> 2
dg.edge('2', '3') # 2 -> 3
dg.edge('3', '1') # 3 -> 1
dg.render(filename='../test', format='png', cleanup=True, directory=None)
display(Image.open('../test.png'))
Dieses Mal werde ich Iris als Beispieldaten verwenden
python
import numpy as np
import pandas as pd
from sklearn import datasets
import seaborn as sns
iris = datasets.load_iris()
df = pd.DataFrame(np.hstack([iris.data, iris.target.reshape(-1, 1)]),
columns=iris.feature_names + ['label'])
sns.pairplot(df, hue='label')
python
import matplotlib.pyplot as plt
cm = pd.DataFrame(np.corrcoef(df.T), columns=df.columns, index=df.columns)
sns.heatmap(cm, annot=True, square=True, vmin=-1, vmax=1, fmt=".2f", cmap="RdBu")
plt.savefig("pcor.png ")
plt.show()
Ich habe diesen Code ausgeliehen. Hatena Blog Hashikure Engineer Verspottungsnotizen
Es scheint eine Möglichkeit zu geben, es etwas sorgfältiger zu testen und die nicht signifikante Korrelation nicht zu subtrahieren, aber hier handelt es sich um eine einheitliche Subtraktion.
python
import scipy
def cor2pcor(R):
inv_cor = scipy.linalg.inv(R)
rows = inv_cor.shape[0]
regu_1 = 1 / np.sqrt(np.diag(inv_cor))
regu_2 = np.repeat(regu_1, rows).reshape(rows, rows)
pcor = (-inv_cor) * regu_1 * regu_2
np.fill_diagonal(pcor, 1)
return pcor
pcor = pd.DataFrame(cor2pcor(cm), columns=cm.columns, index=cm.index)
sns.heatmap(pcor, annot=True, square=True, vmin=-1, vmax=1, fmt=".2f", cmap="RdBu")
plt.savefig("pcor.png ")
plt.show()
Zeichnen Sie einen ungerichteten Graphen, indem Sie Stellen verketten, an denen der Absolutwert des Korrelationskoeffizienten größer als der entsprechend eingestellte Schwellenwert ist.
python
from graphviz import Graph
from PIL import Image
def draw_graph(cm, threshold):
edges = np.where(np.abs(cm) > threshold)
edges = [[cm.index[i], cm.index[j]] for i, j in zip(edges[0], edges[1]) if i > j]
g = Graph(format='png')
for k in range(cm.shape[0]):
g.node(cm.index[k])
for i, j in edges:
g.edge(j, i)
g.render(filename='../test', format='png', cleanup=True, directory=None)
display(Image.open('../test.png'))
threshold = 0.3
draw_graph(cm, threshold)
draw_graph(pcor, threshold)
Da der Korrelationskoeffizient niedrig ist, scheint es ein wenig schwierig zu sein, allein damit zu schließen, aber wenn dies korrekt ist, korrelieren Länge und Breite des Gaku nur mit der Länge und Breite der Blütenblätter, nicht direkt mit der Art der Iris. Es scheint eine Sache zu sein. Es ist besser, ein Diagramm zu erstellen, als die Korrelationsmatrix zu betrachten, damit das Bild leichter zu verstehen ist.
Lass es uns versuchen
Recommended Posts