[PYTHON] Überprüfen Sie die Korrelation mit Kaggles Titanic (kaggle③)

Einführung

Dies ist die Geschichte der erstmaligen Teilnahme am Kaggle </ b> -Wettbewerb. In Letztes "Lernen mit Kaggles Titanic" Ich habe alle Schritte durchlaufen, um zu lernen und einzureichen, aber ich habe an den Beispieldaten verloren (76%). Dieses Mal möchte ich die Daten überprüfen, um die Punktzahl im "Titanic-Wettbewerb" zu erhöhen.

Inhaltsverzeichnis

  1. Über Korrelation
  2. Variable Skala
  3. Korrelationskoeffizient
  4. Untersuchen Sie den Titanic-Korrelationskoeffizienten
  5. Ergebnis

Referenz Geschichte

1. Über Korrelation

Letztes Mal hat die Trainingsdaten entsprechend erfasst und mit "pclass", "sex", "Age" und "Tarif" trainiert. Dieses Mal möchte ich die Daten zum Lernen anhand der Gründe auswählen.

Ein Streudiagramm ist nützlich, um die Korrelation zu überprüfen. Das Streudiagramm ist wie folgt. 20191221_02.png

Wenn das Streudiagramm wie oben aussieht, können Sie sehen, dass der Anstieg der rechten Schulter relevant ist. Wenn beispielsweise die horizontale Achse die Höhe und die vertikale Achse das Gewicht ist, ist das Gewicht umso schwerer, je größer die Person ist. Das Streudiagramm ist also wie oben gezeigt. (Ich denke, es wird.)

Das Streudiagramm ist jedoch wirksam, wenn sowohl die horizontale als auch die vertikale Achse quantitative Variablen sind. Bei der Erstellung eines Streudiagramms von "Geschlecht" (qualitative Variable) und "Überleben" (qualitative Variable) der Titanic Es gibt zwei Arten von Geschlecht auf der horizontalen Achse, "männlich" und "weiblich", und zwei Arten des Überlebens auf der vertikalen Achse, "0" und "1". Nur vier Punkte sind verstreut, was nicht sehr aussagekräftig ist. Die Methode zur Untersuchung der Korrelation hängt von der Art der Daten ab (quantitative Variable, qualitative Variable).

2. Variable Skala

Zuvor wurden die Begriffe quantitative und qualitative Variablen verwendet. Die zu verarbeitenden Daten (Variablen) werden entsprechend ihrer Eigenschaften in die folgenden Skalen eingeteilt.

Variablentyp Skalentyp Bedeutung Beispiel
qualitative Variablen nominale Skala Skala zur Unterscheidung von Geschlecht, Präfektur
Ordnungsskala Skala, die nur für Größenbeziehungen von Bedeutung ist Rang, seismische Intensität
Quantitative Variable Intervallskala Die Skalen sind gleichmäßig verteilt und die Intervalle sind aussagekräftig td> Temperatur, AD
Proportionalmaßstab Aussagekräftige Intervalle und Verhältnisse (0 ist der Ursprung) Höhe, Preis

Das Streudiagramm ist wirksam, wenn beide Vergleichsziele "quantitative Variablen" sind. Ich denke, dass es auch für "quantitative Variablen" und "Ordnungsskalen" wirksam ist. Nicht sehr effektiv, wenn man eine nominelle Skala ist. Wenn beispielsweise das "Überleben (0, 1)" und der "Fahrpreis" der Titanic in einem Streudiagramm dargestellt sind, sieht es wie folgt aus.

20191221_03.png

Die horizontale Achse (Überleben) ist ein Binärwert von 0 und 1, und die Korrelation ist nicht klar. Für nominelle Skalen ist es unwahrscheinlich, dass Streudiagramme sehr effektiv sind.

Zusätzlich zum Streudiagramm wird die Korrelation manchmal als "Korrelationskoeffizient" ausgedrückt. Werfen wir hier einen Blick.

3. Korrelationskoeffizient

Der Korrelationskoeffizient wird als Indikator dafür verwendet, wie stark die beiden Datensätze zusammenhängen. numpy hat eine Funktion, um den Korrelationskoeffizienten zu finden.

numpy.corrcoef(x, y)[0, 1]

Das Corrcoef von Numpy wird zu Recht als "Pearson's Product Factor Correlation Coefficient" bezeichnet. Der "Pearson-Produktfaktorkorrelationskoeffizient" wird für die später beschriebene Korrelation zwischen "quantitativen Variablen" verwendet. Zu den Korrelationskoeffizienten gehören auch "Kramers Anzahl der Assoziationen" und "Korrelationsverhältnis", die gemäß der Skala verwendet werden. Ich habe die Skala der Variablen und den entsprechenden Korrelationskoeffizienten zusammengefasst.

Variable 1 Variable 2 Verwendeter Korrelationskoeffizient Titanic-Variable
Namensskala Namensskala Anzahl der Klamer-Assoziationen Geschlecht, Ticketnummer, Zimmernummer, Boarding Port
Auftragsskala Rangkorrelationsverhältnis Ticketklasse
Quantitative Variablen Korrelationsverhältnis Alter, Geschwister, Parch, Tarif

Das Codebeispiel für "Anzahl der Assoziationen von Klamer" und "Korrelationsverhältnis" ist wie folgt. Ich denke, das "Rangkorrelationsverhältnis" ist fast das gleiche wie das Korrelationsverhältnis.

import numpy 
import pandas 
######################################
#Anzahl der Klamer-Verbände
# Cramer's coefficient of association
# 0.5  >= :Sehr starke Korrelation
# 0.25 >= :Starke Korrelation
# 0.1  >= :Leicht schwache Korrelation
# 0.1 < :Keine Korrelation
######################################
def cramersV(x, y):
    """
    Calc Cramer's V.

    Parameters
    ----------
    x : {numpy.ndarray, pandas.Series}
    y : {numpy.ndarray, pandas.Series}
    """
    table = numpy.array(pandas.crosstab(x, y)).astype(numpy.float32)
    n = table.sum()
    colsum = table.sum(axis=0)
    rowsum = table.sum(axis=1)
    expect = numpy.outer(rowsum, colsum) / n
    chisq = numpy.sum((table - expect) ** 2 / expect)
    return numpy.sqrt(chisq / (n * (numpy.min(table.shape) - 1)))

######################################
#Korrelationsverhältnis
# Correlation ratio
# 0.5  >= :Sehr starke Korrelation
# 0.25 >= :Starke Korrelation
# 0.1  >= :Leicht schwache Korrelation
# 0.1 < :Keine Korrelation
######################################
def CorrelationV(x, y):
    """
    Calc Correlation ratio 

    Parameters
    ----------
    x : nominal scale {numpy.ndarray, pandas.Series}
    y : ratio   scale {numpy.ndarray, pandas.Series}
    """
    variation = ((y - y.mean()) ** 2).sum()
    inter_class = sum([((y[x == i] - y[x == i].mean()) ** 2).sum() for i in numpy.unique(x)])
    correlation_ratio = inter_class / variation
    return 1 - correlation_ratio

Der Korrelationskoeffizient ist eine Zahl von -1 bis 1. Das Gewicht des Wertes ändert sich je nach Formel. Die Richtlinie für den Wert des Korrelationskoeffizienten lautet wie folgt.

〇 Anzahl der Assoziationen und Korrelationsverhältnis von Kramer

Wert Korrelation
0.5 >= Sehr stark korreliert
0.25 >= Es besteht eine starke Korrelation
0.1 >= Es besteht eine leicht schwache Korrelation
0.1 < Keine Korrelation

〇 Pearson-Produktfaktorkorrelationskoeffizient

Wert Korrelation
0.7 >= Sehr stark korreliert
0.4 >= Es besteht eine starke Korrelation
0.2 >= Es besteht eine leicht schwache Korrelation
0.1 < Keine Korrelation

Zusätzlich zum Korrelationskoeffizienten kann die nominale Skala auch die Korrelation durch grafische Darstellung der "Kreuztabelle" anzeigen.

4. Untersuchen Sie den Titanic-Korrelationskoeffizienten

Betrachten wir nun die Korrelation zwischen dem Korrelationskoeffizienten und dem Diagramm für jede Titanic-Variable. Erstellen Sie ein "neues Notizbuch" in Titanic und definieren Sie die oben genannten "Anzahl der Klamer-Assoziationen" und "Korrelationsverhältnis". Lesen und bereiten Sie dann die Trainingsdaten mit dem folgenden Code vor.

import matplotlib.pyplot as plt

# train.Laden Sie csv
# Load train.csv
df = pandas.read_csv('/kaggle/input/titanic/train.csv')

##############################
#Datenvorverarbeitung
#Behandeln Sie fehlende Werte
# Data preprocessing
# Fill or remove missing values
##############################
#Nan volljährig-In 1 konvertieren
# Convert age Nan to -1
df = df.fillna({'Age':-1})
#Eingeschifft Nan-In 1 konvertieren
# Convert Embarked Nan to -1
df = df.fillna({'Embarked':'null'})

##############################
#Datenvorverarbeitung
#Quantifizieren Sie das Etikett (Name)
# Data preprocessing 
# Digitize labels
##############################
from sklearn.preprocessing import LabelEncoder
#Quantifizieren Sie das Geschlecht mit dem Label Encoder
# Digitize gender using LabelEncoder
encoder_sex = LabelEncoder()
df['Sex'] = encoder_sex.fit_transform(df['Sex'].values)
encoder_embarked = LabelEncoder()
df['Embarked'] = encoder_embarked.fit_transform(df['Embarked'].values)

Klasse (Ticketklasse)

Die Ticketklasse ist eine "Bestellskala". Überprüfen Sie mit dem Korrelationsverhältnis.

######################################################
#Datenanalyse 1
#Untersuchen Sie die Korrelation zwischen Survived und Pclass (nominale Skala)
# Data analysis 1
# Examine the correlation between Survived and Pclass(nominal scale)
######################################################
CorrelationV(df['Survived'], df['Pclass'])
0.11456941170524215

Es wurde "schwach korreliert". Lassen Sie uns die Kreuztabelle grafisch darstellen.

cross_pclass = pandas.crosstab(df['Survived'], df['Pclass'])
cross_pclass.T.plot(kind='bar', stacked=True)
plt.show()

20191222_01.png

Wenn die Klasse 1 ist, überschreitet das Überleben "1" 50%. Wenn die Klasse 3 wird, ist das Überleben "1" ungefähr 1/4? Der Korrelationskoeffizient ist mit 0,1 schwach, aber wenn man sich die Grafik ansieht, scheint es einen angemessenen Korrelationsgrad zu geben.

Name

Ich werde den Namen jetzt überspringen. Die Reihenfolge kann sich ändern, es ist jedoch auch erforderlich, "die Daten zu beachten". Ich möchte meinen Namen im Abschnitt "Daten beobachten" ansprechen, auf den ich noch einmal eingehen werde.

Sex

Das Geschlecht ist eine "nominale Skala". Überprüfen Sie die Anzahl der Klamer-Assoziationen.

######################################################
#Datenanalyse 2
#Untersuchen Sie die Korrelation zwischen Überleben und Geschlecht (nominale Skala)
# Data analysis 2
# Examine the correlation between Survived and Sex(nominal scale)
######################################################
cramersV(df['Survived'], df['Sex'])
0.5433513740027712

Es wurde "sehr starke Korrelation". Lassen Sie uns die Kreuztabelle grafisch darstellen.

cross_sex = pandas.crosstab(df['Survived'], df['Sex'])
cross_sex.T.plot(kind='bar', stacked=True)
plt.show()

20191222_02.png

Sicherlich unterscheiden sich die Ergebnisse stark zwischen Männern und Frauen.

Alter

Das Alter ist eine "Ordnungsskala". Überprüfen Sie mit dem Korrelationsverhältnis.

######################################################
#Datenanalyse 3
#Untersuchen Sie die Korrelation zwischen Überleben und Alter (proportionale Skala)
# Data analysis 3
# Examine the correlation between Survived and Age(ratio scale)
######################################################
CorrelationV(df['Survived'], df['Age'])
0.0001547299039139638

"Keine Korrelation". Lassen Sie uns die Kreuztabelle grafisch darstellen. Grafik in 10-Jahres-Schritten.

cross_age = pandas.crosstab(df['Survived'], round(df['Age'],-1))
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191222_03.png

Ich habe das Gefühl, dass es nach den 50ern nur wenige Überlebensraten "1" gibt, aber das Ergebnis ist "keine Korrelation". Es war überraschend, dass das Alter wenig Einfluss hatte.

SibSp (Anzahl der Geschwister / Ehepartner)

SibSp ist eine "quantitative Variable (proportionale Skala)". Überprüfen Sie mit dem Korrelationsverhältnis.

######################################################
#Datenanalyse 4
#Untersuchen Sie die Korrelation zwischen Survived und SibSp (proportionale Skala)
# Data analysis 4
# Examine the correlation between Survived and SibSp(ratio scale)
######################################################
CorrelationV(df['Survived'], df['SibSp'])
0.0012476789275327471

"Keine Korrelation". Lassen Sie uns die Kreuztabelle grafisch darstellen.

cross_age = pandas.crosstab(df['Survived'], df['SibSp'])
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191222_05.png

In der Grafik ist keine signifikante Korrelation erkennbar.

Parch (Anzahl der Eltern / Kinder)

Parch ist eine "quantitative Variable (proportionale Skala)". Überprüfen Sie mit dem Korrelationsverhältnis.

######################################################
#Datenanalyse 5
#Untersuchen Sie die Korrelation zwischen Survived und Parch (proportionale Skala)
# Data analysis 5
# Examine the correlation between Survived and Parch(ratio scale)
######################################################
CorrelationV(df['Survived'], df['Parch'])
0.006663360100801152

"Keine Korrelation". Lassen Sie uns die Kreuztabelle grafisch darstellen.

cross_age = pandas.crosstab(df['Survived'], df['Parch'])
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191222_05.png

Auch hier ist keine signifikante Korrelation zu erkennen.

Ticket (Ticketnummer)

Ich werde diesmal auch die Ticketnummer überspringen. Ich möchte dies im Abschnitt "Daten beobachten" ansprechen, auf den ich noch einmal eingehen werde.

Fahrpreis

Der Tarif ist eine "quantitative Variable (proportionale Skala)". Überprüfen Sie mit dem Korrelationsverhältnis. Überprüfen Sie nach der Standardisierung das Korrelationsverhältnis. (Ich denke, das Ergebnis wird ohne Standardisierung das gleiche sein)

##############################
#Datenvorverarbeitung
#Zahlen standardisieren
# Data preprocessing
# Standardize numbers
##############################
from sklearn.preprocessing import StandardScaler

#Standardisierung
# Standardize numbers
standard = StandardScaler()
df_std = pandas.DataFrame(standard.fit_transform(df[['Pclass', 'Sex', 'Fare']]), columns=['Pclass', 'Sex', 'Fare'])

#Tarif standardisieren
# Standardize Fare
df['Fare'] = df_std['Fare']

######################################################
#Datenanalyse 6
#Untersuchen Sie die Korrelation zwischen Survived und Fare (proportionale Skala)
# Data analysis 6
# Examine the correlation between Survived and Fare(ratio scale)
######################################################
CorrelationV(df['Survived'], df['Fare'])
0.06620664646184327

"Keine Korrelation". Lassen Sie uns die Kreuztabelle grafisch darstellen. Wenn es so bleibt, wie es ist, ist die Skala feiner. Stellen Sie sie daher in Intervallen von 0,2 zusammen.

######################################
# -1.0 < x < -0.8 ⇒-1.0
# -0.8 < x < -0.6 ⇒-0.8
# -0.6 < x < -0.4 ⇒-0.6
# -0.4 < x < -0.2 ⇒-0.4
# -0.2 < x <    0 ⇒-0.2
#  0   < x <  0.2 ⇒ 0.0
#  0.2 < x <  0.4 ⇒ 0.2
#  0.4 < x <  0.6 ⇒ 0.4
#  0.6 < x <  0.8 ⇒ 0.6
#  0.8 < x <  1.0 ⇒ 0.8
#  1.0 < x        ⇒ 1.0
######################################
def one_fifth(x):
    if  x < -0.8:
        return -1.0
    elif -0.8 <= x and x < -0.6:
        return -0.8
    elif -0.6 <= x and x < -0.4:
        return -0.6
    elif -0.4 <= x and x < -0.2:
        return -0.4
    elif -0.2 <= x and x < 0:
        return -0.2
    elif 0 <= x and x < 0.2:
        return 0.0
    elif 0.2 <= x and x < 0.4:
        return 0.2
    elif 0.4 <= x and x < 0.6:
        return 0.4
    elif 0.6 <= x and x < 0.8:
        return 0.6
    elif 0.8 <= x and x < 1.0:
        return 0.8
    else:
        return 1.0

df['Fare_convert'] = df['Fare'].apply(one_fifth)
cross_age = pandas.crosstab(df['Survived'], df['Fare_convert'])
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191225_01.png

Wenn der Fahrpreis zurückgelassen wird, erhöht sich das Überleben "1". Der Koeffizient ist niedrig, es kann jedoch eine Korrelation bestehen.

Kabine (Zimmernummer)

Die Zimmernummer wird diesmal ebenfalls übersprungen. Ich möchte dies im Abschnitt "Daten beobachten" ansprechen, auf den ich noch einmal eingehen werde.

Eingeschifft (Boarding Port)

Der Einschiffungshafen ist eine "Namensskala". Überprüfen Sie die Anzahl der Klamer-Assoziationen.

######################################################
#Datenanalyse 7
#Untersuchen Sie die Korrelation zwischen überlebt und eingeschifft (nominale Skala)
# Data analysis 7
# Examine the correlation between Survived and Embarked(nominal scale)
######################################################
cramersV(df['Survived'], df['Embarked'])
0.18248384812341217

Es ist gut, aber es ist jetzt "keine Korrelation". Lassen Sie uns die Kreuztabelle grafisch darstellen.

cross_embarked = pandas.crosstab(df['Survived'], df['Embarked'])
cross_embarked.T.plot(kind='bar', stacked=True)
plt.show()

20191225_02.png

Es scheint eine Korrelation zu geben, es scheint keine ...

5. Ergebnis

Korreliert sind Pclass (Ticketklasse) und Sex (Geschlecht). Der Tarif erreicht ebenfalls nicht den Standardwert, aber es scheint eine kleine Korrelation in der Grafik zu geben.

6. Zusammenfassung

Ich möchte Pclass (Ticketklasse), Geschlecht (Geschlecht) und Tarif (Tarif) als Eingabeparameter verwenden, die auf dem Korrelations- und Kreuztabellendiagramm basieren. Als nächstes folgt die Auswahl der Modelle, dies ist jedoch Nächstes Mal.

Referenz

Berechnen Sie die Beziehungen zwischen Variablen verschiedener Skalen (Python) https://qiita.com/shngt/items/45da2d30acf9e84924b7

Berechnung der Anzahl der Assoziationen von Klamer https://qiita.com/canard0328/items/5ea4115d964b448903ba

Geschichte

25.12.2019 Erstausgabe veröffentlicht 29.12.2019 Nächster Link hinzugefügt

Recommended Posts

Überprüfen Sie die Korrelation mit Kaggles Titanic (kaggle③)
Überprüfen Sie die Rohdaten mit Kaggles Titanic (kaggle ⑥)
Wählen Sie Modelle von Kaggles Titanic (kaggle ④)
Vorhersage der Titanic von Kaggle mit Keras (kaggle ⑦)
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Überprüfen Sie den Code mit flake8
Herausforderungen des Titanic-Wettbewerbs für Kaggle-Anfänger
Überprüfen Sie die Existenz der Datei mit Python
Überprüfen Sie die Dateigröße mit du -sh *
Probieren Sie alle Modelle des Scikit-Lernens mit Kaggles Titanic (kaggle ⑤) aus.
Bis Sie die Kaggle-API mit Colab verwenden
Überprüfen Sie das Datum der Flaggenpflicht mit Python
Fordern Sie die Kaggle Titanic heraus
Tag 66 [Einführung in Kaggle] Die einfachste Titanic-Vorhersage
Untersuchen Sie die Parameter von RandomForestClassifier im Kaggle / Titanic-Tutorial
Überprüfen Sie, wann die Version nicht in pyenv wechselt
Kaggle Tutorial Titanic Know-how, um in den Top 2% zu sein
Schauen Sie sich das Kaggle / Titanic-Tutorial genauer an
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic, durch logistische Regression vorhersagen.
Domaincheck mit Python
Probieren Sie Kaggles Titanic-Tutorial aus
Überprüfen Sie die Version mit Python
Überdenken Sie den Korrelationskoeffizienten
Ich habe versucht, Überlebende der Titanic mit Kaggle vorherzusagen und einzureichen
Überprüfen Sie mit apply () (dataframe, Pandas), welche Zeile den Fehler verursacht hat.
Überprüfen Sie den Betriebsstatus des Servers mit dem Linux-Befehl top
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic durch logistische Regression vorhersagen - Vorhersage / Bewertung