[PYTHON] Essayez l'analyse de corrélation multivariée à l'aide du lasso graphique à une vitesse explosive

motivation

Lors de l'analyse des données, je rencontre parfois les situations suivantes.

――Je souhaite connaître la relation entre de nombreux types de données ――C'est relativement bruyant, mais je veux le comparer avec d'autres données --Je veux exclure la fausse corrélation «Je veux faire l'hypothèse qu'il n'y a que peu de choses qui sont vraiment pertinentes. ――Je veux essayer une méthode pour le moment

Dans un tel cas, essayons d'utiliser le ** lasso graphique ** pour le moment.

Qu'est-ce que le lasso graphique?

En gros, c'est une méthode de représentation graphique des relations entre les variables. Puisque cette méthode est basée sur la distribution gaussienne multivariée, je pense qu'elle peut être utilisée dans une grande variété d'endroits. Pour plus d'informations [ce livre](https://www.amazon.co.jp/%E7%95%B0%E5%B8%B8%E6%A4%9C%E7%9F%A5%E3%81%A8% E5% A4% 89% E5% 8C% 96% E6% A4% 9C% E7% 9F% A5-% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3 % 83% 97% E3% 83% AD% E3% 83% 95% E3% 82% A7% E3% 83% 83% E3% 82% B7% E3% 83% A7% E3% 83% 8A% E3% 83 % AB% E3% 82% B7% E3% 83% AA% E3% 83% BC% E3% 82% BA-% E4% BA% 95% E6% 89% 8B-% E5% 89% 9B / dp / 4061529080 ) Explique d'une manière très facile à comprendre. Si vous êtes intéressé par la théorie, veuillez l'obtenir.

la mise en oeuvre

Celui mis en œuvre cette fois est un programme qui convertit la matrice de précision estimée en une matrice de corrélation et la produit sous forme de graphique. Il y a encore place à l'amélioration, mais je pense que ce sera un indicateur pour faire progresser l'analyse des données.

Préparation des données de test


#Préparez les données de test.
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
feature_names = boston.feature_names

Traitement principal


import pandas as pd
import numpy as np
import scipy as sp
from sklearn.covariance import GraphicalLassoCV
import igraph as ig

#Standardisez dans la même quantité de fonctionnalités.
X = sp.stats.zscore(X, axis=0)

#Exécutez GraphicalLassoCV.
model = GraphicalLassoCV(alphas=4, cv=5)
model.fit(X)

#Générez des données graphiques.
grahp_data = glasso_graph_make(model, feature_names, threshold=0.2)

#Affichez le graphique.
grahp_data

Fonction de génération de graphes


def glasso_graph_make(model, feature_names, threshold):
    #Obtenez la matrice de co-distribution de distribution.
    # ->URL de référence: https://scikit-learn.org/stable/modules/generated/sklearn.covariance.GraphicalLassoCV.html
    covariance_matrix = model.covariance_

    #Convertissez la matrice de variance-co-dispersion en matrice de corrélation.
    diagonal = np.sqrt(covariance_matrix.diagonal())
    correlation_matrix = ((covariance_matrix.T / diagonal).T) / diagonal
    
    #Générez une matrice avec zéro composante diagonale pour l'affichage du graphique.
    correlation_matrix_diag_zero = correlation_matrix - np.diag( np.diag(correlation_matrix) )
    df_grahp_data = pd.DataFrame( index=feature_names, columns=feature_names, data=correlation_matrix_diag_zero.tolist() )

    #Préparation de la génération de graphes
    grahp_data = ig.Graph()
    grahp_data.add_vertices(len(feature_names))
    grahp_data.vs["feature_names"] = feature_names
    grahp_data.vs["label"] = grahp_data.vs["feature_names"]
    visual_style = {}
    edge_width_list = []
    edge_color_list = []

    #Génération de graphes
    for target_index in range(len(df_grahp_data.index)):
        for target_column in range(len(df_grahp_data.columns)):
            if target_column >= target_index:
                grahp_data_abs_element = df_grahp_data.iloc[target_index, target_column]
                if abs(grahp_data_abs_element) >= threshold:
                    edge = [(target_index, target_column)]
                    grahp_data.add_edges(edge)
                    edge_width_list.append(abs(grahp_data_abs_element)*10)
                    if grahp_data_abs_element > 0:
                        edge_color_list.append("red")
                    else:
                        edge_color_list.append("blue")

    visual_style["edge_width"] = edge_width_list
    visual_style["edge_color"] = edge_color_list

    return ig.plot(grahp_data, **visual_style, vertex_size=50, bbox=(500, 500), vertex_color="skyblue", layout = "circle", margin = 50)

résultat

data.png

Probablement parce que le seuil est fixé assez bas, la corrélation directe a été trouvée telle quelle. Jetons un coup d'œil aux variables qui semblent avoir la corrélation la plus forte. Les coefficients de corrélation les plus élevés sont RAD (accessibilité autoroutière) et TAX (taux d'imposition foncière total par 10 000 $). En d'autres termes, la taxe est élevée lorsque l'autoroute est facilement accessible. Pour être honnête, je ne peux rien dire avec ces seules données, mais il semble que le résultat ne soit pas erroné.

finalement

L'environnement dans lequel vous pouvez l'essayer pour le moment est le meilleur. Concernant le résultat, il aurait peut-être été plus facile de comprendre si les données étaient un peu plus et bruyantes. N'est-ce pas quelque part?

Cette fois, j'ai utilisé le lasso graphique pour représenter graphiquement les relations entre les variables, mais au-delà, il existe des méthodes de détection de changement qui se concentrent sur la structure du graphique, et je pense que cela vaut toujours la peine d'être étudié. Je suis.

Attention et avertissement

Le contenu de cet article est mon opinion personnelle, pas l'opinion officielle de l'organisation à laquelle j'appartiens. L'auteur et l'organisation à laquelle il appartient ne sont pas responsables des problèmes qui pourraient survenir aux utilisateurs ou à des tiers après la mise en œuvre du contenu de cet article.

Recommended Posts

Essayez l'analyse de corrélation multivariée à l'aide du lasso graphique à une vitesse explosive
Essayez de résoudre le Sudoku à une vitesse explosive en utilisant Numpy
Modèle Python qui effectue une analyse des journaux à une vitesse explosive
[PyStan] Essayez le lasso graphique avec Stan.
Essayez l'analyse de cluster par K-means
[TPU] [Transformers] Faites du BERT à une vitesse explosive