Je vais introduire la procédure pour dessiner un graphe indépendant avec graphviz
Il y a deux raisons pour lesquelles la corrélation est observée:
--S'il existe une relation causale --Quand il y a un facteur commun qui a une relation causale
La corrélation partielle consiste à trouver le coefficient de corrélation après avoir supprimé ce dernier effet, et le graphique indépendant consiste à relier les facteurs à corrélation partielle élevée. Voir ci-dessous pour plus de détails.
Dérivation de la signification du coefficient de corrélation partielle et de la formule https://mathtrain.jp/partialcor
Je ne l'ai pas encore confirmé, mais je pense que ce sera probablement ci-dessous
terminal
pip install graphviz
terminal
conda install -c conda-forge python-graphviz
Vous pouvez écrire un nœud avec node () et une concaténation avec edge () comme indiqué ci-dessous. Lorsque render () est exécuté, le code source de graphviz est exporté une fois, et le graphique est exporté au format png ou pdf basé sur celui-ci. Si cleanup = True, après l'exportation du fichier image, exportez-le au format png ci-dessous
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'))
Cette fois, j'utiliserai l'iris comme exemple de données
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()
J'ai emprunté ce code. <a href = "https://cartman0.hatenablog.com/entry/2020/01/07/python%E3%81%A7%E5%81%8F%E7%9B%B8%E9%96%A2%E4 % BF% 82% E6% 95% B0% E8% A1% 8C% E5% 88% 97% 28pc ou% 29% E3% 82% 92% E8% A8% 88% E7% AE% 97 Notes moqueuses
Il semble y avoir un moyen de le tester un peu plus attentivement et de ne pas soustraire la corrélation qui n'est pas significative, mais ici c'est une soustraction uniforme.
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()
Dessinez un graphe non orienté en concaténant les endroits où la valeur absolue du coefficient de corrélation est supérieure au seuil correctement défini.
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)
Puisque le coefficient de corrélation est faible, il semble un peu difficile de conclure avec cela seul, mais si cela est correct, la longueur et la largeur du gaku ne sont corrélées qu'avec la longueur et la largeur des pétales, pas directement avec le type d'iris. Cela semble être une chose. Il est préférable de faire un graphique plutôt que de regarder la matrice de corrélation afin que l'image soit plus facile à comprendre.
Essayons
Recommended Posts