[PYTHON] Créer une matrice de corrélation partielle et dessiner un graphique indépendant

Je vais introduire la procédure pour dessiner un graphe indépendant avec graphviz

Matrice de corrélation partielle et graphe indépendant

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

1. Installez graphviz

Je ne l'ai pas encore confirmé, mais je pense que ce sera probablement ci-dessous

Installer le wrapper python de graphviz avec pip

terminal


pip install graphviz

Installez le corps principal de graphviz et rendez-le disponible à partir du notebook jupyter

terminal


conda install -c conda-forge python-graphviz

2. Comment dessiner un graphique

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

Graphique non orienté

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

ダウンロード (2).png

Graphique dirigé

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

ダウンロード (3).png

3. Préparation des données

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

ダウンロード (8).png

4. Création d'une matrice de corrélation

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

ダウンロード (4).png

5. Création d'une matrice de corrélation partielle

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

ダウンロード (5).png

6. Dessinez un graphique

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)

Graphique réalisé à partir de la matrice de corrélation

ダウンロード (6).png

Graphique réalisé à partir d'une matrice de corrélation partielle

ダウンロード (7).png

Résumé

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

Créer une matrice de corrélation partielle et dessiner un graphique indépendant
Créez un générateur d'axes et dessinez un nombre infini de graphiques
[Python] Comment créer une matrice de corrélation et une carte thermique
Dessinez un graphique avec NetworkX
Dessinez un graphique avec networkx
Tracez un graphe avec Julia + PyQtGraph (2)
Dessinez une matrice de diagramme de dispersion avec python
Dessinez un graphique lâche avec matplotlib
Tracez un graphique avec Julia + PyQtGraph (1)
Dessinez un graphique avec Julia + PyQtGraph (3)
Dessinez un graphique avec des pandas + XlsxWriter
Dessinez un graphique avec l'interface graphique PySimple
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Créez un environnement Python 3 avec pyenv sur Mac et affichez des graphiques Network X
Comment dessiner un graphique avec Matplotlib
Créer un graphique à l'aide du module Sympy
Dessinez simplement un graphique en spécifiant un fichier
Créer une matrice avec PythonGUI (zone de texte)
Dessinez un graphique avec PyQtGraph Part 1-Drawing
Créer un graphique avec des bordures supprimées avec matplotlib
Créez un graphique empilé correspondant aux directions positives et négatives avec matplotlib
Créez un filtre pour obtenir un jeton d'accès avec l'API Graph (Flask)