[PYTHON] Versuchen Sie eine multivariate Korrelationsanalyse mit grafischem Lasso bei explosiver Geschwindigkeit

Motivation

Bei der Analyse der Daten stoße ich manchmal auf folgende Situationen.

――Ich möchte die Beziehung zwischen vielen Datentypen kennen ――Es ist relativ laut, aber ich möchte es mit anderen Daten vergleichen

Versuchen wir in einem solchen Fall vorerst, ** Grafisches Lasso ** zu verwenden.

Was ist grafisches Lasso?

Grob gesagt handelt es sich um eine Methode zur grafischen Darstellung der Beziehungen zwischen Variablen. Da diese Methode auf der multivariaten Gaußschen Verteilung basiert, kann sie meiner Meinung nach an einer Vielzahl von Orten angewendet werden. Weitere Informationen [dieses Buch](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 ) Erklärt auf sehr leicht verständliche Weise. Wenn Sie sich für Theorie interessieren, besorgen Sie sie sich bitte.

Implementierung

Das diesmal implementierte Programm ist ein Programm, das die geschätzte Genauigkeitsmatrix in eine Korrelationsmatrix konvertiert und als Diagramm ausgibt. Es gibt noch Raum für Verbesserungen, aber ich denke, dies wird ein Indikator für die Weiterentwicklung der Datenanalyse sein.

Vorbereitung der Testdaten


#Bereiten Sie die Testdaten vor.
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
feature_names = boston.feature_names

Hauptverarbeitung


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

#Standardisieren Sie innerhalb derselben Merkmalsmenge.
X = sp.stats.zscore(X, axis=0)

#Führen Sie GraphicalLassoCV aus.
model = GraphicalLassoCV(alphas=4, cv=5)
model.fit(X)

#Generieren Sie Diagrammdaten.
grahp_data = glasso_graph_make(model, feature_names, threshold=0.2)

#Zeigen Sie das Diagramm an.
grahp_data

Graphgenerierungsfunktion


def glasso_graph_make(model, feature_names, threshold):
    #Holen Sie sich die Verteilungs-Co-Verteilungsmatrix.
    # ->Referenz-URL: https://scikit-learn.org/stable/modules/generated/sklearn.covariance.GraphicalLassoCV.html
    covariance_matrix = model.covariance_

    #Konvertieren Sie die Varianz-Co-Dispersionsmatrix in eine Korrelationsmatrix.
    diagonal = np.sqrt(covariance_matrix.diagonal())
    correlation_matrix = ((covariance_matrix.T / diagonal).T) / diagonal
    
    #Generieren Sie eine Matrix mit null diagonalen Komponenten für die Diagrammanzeige.
    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() )

    #Vorbereitung der Graphgenerierung
    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 = []

    #Graphgenerierung
    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)

Ergebnis

data.png

Wahrscheinlich, weil der Schwellenwert ziemlich niedrig eingestellt ist, wurde die direkte Korrelation so gefunden, wie sie ist. Werfen wir einen Blick auf die Variablen, die die stärkste Korrelation zu haben scheinen. Die höchsten Korrelationskoeffizienten sind RAD (Autobahnzugänglichkeit) und TAX (Gesamtsteuersatz für Immobilien pro 10.000 USD). Mit anderen Worten, die Steuer ist hoch, wenn die Autobahn leicht zugänglich ist. Um ehrlich zu sein, kann ich mit diesen Daten allein nichts sagen, aber es scheint, dass das Ergebnis nicht falsch ist.

Schließlich

Die Umgebung, in der Sie es vorerst ausprobieren können, ist die beste. In Bezug auf das Ergebnis war es möglicherweise einfacher zu verstehen, ob die Daten etwas lauter und verrauscht waren. Ist es nicht irgendwo?

Dieses Mal habe ich grafisches Lasso verwendet, um die Beziehungen zwischen Variablen grafisch darzustellen. Darüber hinaus gibt es Methoden zur Änderungserkennung, die sich auf die Diagrammstruktur konzentrieren, und ich bin der Meinung, dass es sich immer noch lohnt, sie zu untersuchen. Ich bin.

Achtung und Haftungsausschluss

Der Inhalt dieses Artikels ist meine persönliche Meinung, nicht die offizielle Meinung der Organisation, der ich angehöre. Der Autor und die Organisation, der er angehört, sind nicht verantwortlich für Probleme, die Benutzern oder Dritten nach der Implementierung des Inhalts dieses Artikels auftreten können.

Recommended Posts

Versuchen Sie eine multivariate Korrelationsanalyse mit grafischem Lasso bei explosiver Geschwindigkeit
Versuchen Sie, Sudoku mit explosiver Geschwindigkeit mit Numpy zu lösen
Python-Vorlage, die eine Protokollanalyse mit explosiver Geschwindigkeit durchführt
[PyStan] Probieren Sie Graphical Lasso mit Stan aus.
Versuchen Sie die Clusteranalyse mit K-Mitteln
[TPU] [Transformatoren] Machen Sie BERT mit explosiver Geschwindigkeit