[PYTHON] So finden Sie die Korrelation für kategoriale Variablen

Einführung

Bei der Analyse von Daten betrachten Sie die Korrelation zwischen Variablen in den angegebenen Daten. Sie können den Korrelationskoeffizienten für die Korrelation zwischen numerischen Werten überprüfen. Was ist jedoch, wenn eine oder beide Kategorien sind? Ich habe es nachgeschlagen, also werde ich es zusammenfassen.

So überprüfen Sie die Korrelation

Numerisch vs Numerisch

In diesem Fall ist es berühmt und Sie können den Korrelationskoeffizienten überprüfen. Die Definition des Korrelationskoeffizienten ist wie folgt.

r=\frac{\sum_{i}(x_{i}-\bar{x})(y_{i}-\bar{y})}{\sqrt{\sum_{i}(x_{i}-\bar{x})^2}\sqrt{\sum_{i}(y_{i}-\bar{y})^2}}

Verwenden Sie die corr () -Methode von pandas.DataFrame, um den Korrelationskoeffizienten in Python zu ermitteln.

import numpy as np
import pandas as pd

x=np.random.randint(1, 10, 100)
y=np.random.randint(1, 10, 100)

data=pd.DataFrame({'x':x, 'y': y})

data.corr()
corr1.png

Wenn der Wert 0 ist, gibt es keine Korrelation, wenn er nahe bei 1 liegt, gibt es eine positive Korrelation, und wenn er nahe bei -1 liegt, gibt es eine negative Korrelation.

Kategorie vs Numerisch

Es wird als Statistik ausgedrückt, die als Korrelationsverhältnis bezeichnet wird. Die Definition ist wie folgt.

r=\frac{\sum_{Kategorie}Kategorie件数\times(Kategorieの平均-Gesamtdurchschnitt)^2}{Summe der Quadrate der Gesamtabweichung}

Ein konkretes Beispiel finden Sie unter hier. Das Molekül repräsentiert "wie weit jede Kategorie voneinander entfernt ist". Je weiter die Kategorien entfernt sind, desto größer ist das Molekül und desto stärker ist die Korrelation. corr_ratio.png

Dieses Korrelationsverhältnis bedeutet auch keine Korrelation, wenn es 0 ist, und eine starke positive Korrelation, wenn es sich 1 nähert.

In Python wird es wie folgt berechnet (siehe hier).

def correlation_ratio(cat_key, num_key, data):
    
    categorical=data[cat_key]
    numerical=data[num_key]
    
    mean=numerical.dropna().mean()
    all_var=((numerical-mean)**2).sum()  #Summe der Quadrate der Gesamtabweichung
    
    unique_cat=pd.Series(categorical.unique())
    unique_cat=list(unique_cat.dropna())
    
    categorical_num=[numerical[categorical==cat] for cat in unique_cat]
    categorical_var=[len(x.dropna())*(x.dropna().mean()-mean)**2 for x in categorical_num]  
    #Anzahl der Kategorien × (Durchschnitt der Kategorien-Gesamtdurchschnitt)^2

    r=sum(categorical_var)/all_var
    
    return r

Kategorie vs Kategorie

Wir werden eine Statistik verwenden, die als Anzahl der Assoziationen in Klamer bezeichnet wird. Die Definition ist

r=\sqrt{\frac{\chi^2}{n(k-1)}}

$ \ Chi ^ {2} $ ist jedoch die χ-Quadrat-Verteilung, n ist die Anzahl der Datenelemente und k ist die mit der geringeren Anzahl von Kategorien. Die χ-Quadrat-Verteilung finden Sie unter hier. Grob gesagt ist es eine Größe, die ausdrückt, wie unterschiedlich die Verteilung jeder Kategorie von der Gesamtverteilung ist. Wenn es nahe bei 0 liegt, gibt es keine Korrelation, und wenn es nahe bei 1 liegt, gibt es eine positive Korrelation.

Gehen Sie wie folgt vor, um mit Python zu rechnen (hier % 83% BC% E3% 83% AB% E3% 81% AE% E9% 80% A3% E9% 96% A2% E4% BF% 82% E6% 95% B0).

import scipy.stats as st

def cramerV(x, y, data):
    
    table=pd.crosstab(data[x], data[y])
    x2, p, dof, e=st.chi2_contingency(table, False)
    
    n=table.sum().sum()
    r=np.sqrt(x2/(n*(np.min(table.shape)-1)))

    return r

Erhalten Sie jeden Index gemeinsam

Und dies allein wäre das zweite Gebräu des vorherigen Artikels, daher habe ich eine Methode entwickelt, um jeden Index gemeinsam für DataFrame zu berechnen. Sie müssen es nicht einzeln nachschlagen!

def is_categorical(data, key):
    
    col_type=data[key].dtype
    
    if col_type=='int':
        
        nunique=data[key].nunique()
        return nunique<6
    
    elif col_type=="float":
        return False
    
    else:
        return True
def get_corr(data, categorical_keys=None):
    
    keys=data.keys()
        
    if categorical_keys is None:
        
        categorical_keys=keys[[is_categorycal(data, key) for ke in keys]]
        
    corr=pd.DataFrame({})
    corr_ratio=pd.DataFrame({})
    corr_cramer=pd.DataFrame({})

    for key1 in keys:
        for key2 in keys:

            if (key1 in categorical_keys) and (key2 in categorical_keys):

                r=cramerV(key1, key2, data)
                corr_cramer.loc[key1, key2]=r                

            elif (key1 in categorical_keys) and (key2 not in categorical_keys):

                r=correlation_ratio(cat_key=key1, num_key=key2, data=data)
                corr_ratio.loc[key1, key2]=r                

            elif (key1 not in categorical_keys) and (key2 in categorical_keys):

                r=correlation_ratio(cat_key=key2, num_key=key1, data=data)
                corr_ratio.loc[key1, key2]=r                

            else:

                r=data.corr().loc[key1, key2]
                corr.loc[key1, key2]=r                    

    return corr, corr_ratio, corr_cramer

Welcher Schlüssel eine kategoriale Variable ist, wird automatisch aus dem Variablentyp bestimmt, sofern nicht anders angegeben.

Wenden wir es auf Titandaten an.

data=pd.read_csv(r"train.csv")
data=data.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis=1)
category=["Survived", "Pclass", "Sex", "Embarked"]

corr, corr_ratio, corr_cramer=get_corr(data, category)
corr
corr2.png
corr_ratio
corr_ratio2.png
corr_cramer
corr_cramer2.png

Darüber hinaus kann es mit der Seaborn Heatmap visualisiert werden.

import seaborn as sns
sns.heatmap(corr_cramer, vmin=-1, vmax=1)

corr_cramer_heatmap.png

Schließlich

Die Erklärung der einzelnen Statistiken ist unübersichtlich geworden. Weitere Informationen finden Sie auf der in der Referenz genannten Seite. Selbst wenn ich es zusammenstelle, vergesse ich es am Ende und schaue nach, also versuche ich, eine Methode zu erstellen, die so viel wie möglich automatisiert. Die Quelle dieser Methode ist auch github. Sie können sie also gerne verwenden.

Referenz

[Berechnen Sie die Beziehung zwischen Variablen verschiedener Skalen (Python)](https://qiita.com/shngt/items/45da2d30acf9e84924b7#%E3%82%AF%E3%83%A9%E3%83%A1% E3% 83% BC% E3% 83% AB% E3% 81% AE% E9% 80% A3% E9% 96% A2% E4% BF% 82% E6% 95% B0) Korrelationsanalyse Korrelationsverhältnis Kai-Quadrat-Test / Cramer-Anzahl von Beziehungen

Recommended Posts

So finden Sie die Korrelation für kategoriale Variablen
So finden Sie den Bereich des Boronoi-Diagramms
So verwenden Sie MkDocs zum ersten Mal
Verwendung des Generators
So definieren Sie Go-Variablen
Wie man Maharanobis Entfernung findet
Wie benutzt man den Dekorateur?
So erhöhen Sie die Achse
So starten Sie die erste Projektion
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
[Für Anfänger] Verwendung der for-Anweisung unter Linux (Variablen usw.)
So definieren Sie mehrere Variablen in einer Python for-Anweisung
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
So ermitteln Sie die kumulative Summe für jede Gruppe mithilfe von DataFrame in Spark [Python-Version]
So legen Sie Variablen fest, die in der gesamten Django-App verwendet werden können ~ Praktisch für Vorlagen usw. ~
Wie berechnet man den Autokorrelationskoeffizienten?
Verwendung der Zip-Funktion
[Für Nicht-Programmierer] Wie man Kaggle läuft
Lesen des SNLI-Datensatzes
So erhalten Sie die Python-Version
So überschreiben Sie die Ausgabe auf die Konsole
Verwendung des ConfigParser-Moduls
So führen Sie den Befehl sed mit der for-Anweisung mehrmals aus
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
So ändern Sie die Protokollstufe von Azure SDK für Python
So bringen Sie den Druckertreiber für Oki Mac in Linux
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
[AtCoder] So finden Sie den Binomialkoeffizienten nCk mod.p [D --Knight]
So finden Sie heraus, wann Sie das Java-Installationsverzeichnis nicht kennen
Wie man für den Deep Learning Association G-Test (für Anfänger) lernt [Version 2020]
So zeigen Sie den Fortschrittsbalken an (tqdm)
Visualisieren Sie einfach den Korrelationskoeffizienten zwischen Variablen
Dynamisches Definieren von Variablen in Python
So überprüfen Sie die Version von Django
So erstellen Sie eine * .spec-Datei für pyinstaller.
So lösen Sie das Problem beim Verpacken des Behälters
Finde die Daten des verrückten Turniers heraus
So stellen Sie die Serverzeit auf japanische Zeit ein
So ermitteln Sie die Anzahl der CPUs ohne den Befehl sar
So aktualisieren Sie den AMP-Cache manuell
[Linux] Verwendung des Befehls echo
[Python] Organisieren der Verwendung für Anweisungen
So installieren Sie das Windows-Subsystem für Linux
So greifen Sie von außen auf den Datenspeicher zu
So finden Sie große Dateien unter Linux
Verwendung der Fingerabdruckauthentifizierung für KDE
[Django] So übergeben Sie Werte direkt von Vorlagen-Tags an JavaScript-Variablen
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
[Bash] Übergibt den Inhalt der Datei beim Lesen an Variablen für jede Spalte
So ermitteln Sie den Koeffizienten der ungefähren Kurve, die in Python durch die Scheitelpunkte verläuft
Checkliste, wie Sie vermeiden können, die Elemente des Numpy-Arrays mit for zu drehen
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
So weisen Sie der Matplotlib-Farbleiste mehrere Werte zu