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.
Referenz Geschichte
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.
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).
Zuvor wurden die Begriffe quantitative und qualitative Variablen verwendet. Die zu verarbeitenden Daten (Variablen) werden entsprechend ihrer Eigenschaften in die folgenden Skalen eingeteilt.
Variablentyp td> | Skalentyp td> | Bedeutung td> | Beispiel td> tr> |
qualitative Variablen td> | nominale Skala td> | Skala zur Unterscheidung von td> | Geschlecht, Präfektur td > tr> |
Ordnungsskala td> | Skala, die nur für Größenbeziehungen von Bedeutung ist td> | Rang, seismische Intensität td> tr> | |
Quantitative Variable td> | Intervallskala td> | Die Skalen sind gleichmäßig verteilt und die Intervalle sind aussagekräftig tr> td> | Temperatur, AD td> tr> |
Proportionalmaßstab td> | Aussagekräftige Intervalle und Verhältnisse (0 ist der Ursprung) td> | Höhe, Preis td> tr> |
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.
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.
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 td> | Variable 2 td> | Verwendeter Korrelationskoeffizient td> | Titanic-Variable td> tr> |
Namensskala td> | Namensskala td> | Anzahl der Klamer-Assoziationen td> | Geschlecht, Ticketnummer, Zimmernummer, Boarding Port td> tr> |
Auftragsskala td> | Rangkorrelationsverhältnis td> | Ticketklasse td> tr> | |
Quantitative Variablen td> | Korrelationsverhältnis td> | Alter, Geschwister, Parch, Tarif td> tr> |
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.
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)
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()
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.
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.
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()
Sicherlich unterscheiden sich die Ergebnisse stark zwischen Männern und Frauen.
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()
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 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()
In der Grafik ist keine signifikante Korrelation erkennbar.
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()
Auch hier ist keine signifikante Korrelation zu erkennen.
Ich werde diesmal auch die Ticketnummer überspringen. Ich möchte dies im Abschnitt "Daten beobachten" ansprechen, auf den ich noch einmal eingehen werde.
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()
Wenn der Fahrpreis zurückgelassen wird, erhöht sich das Überleben "1". Der Koeffizient ist niedrig, es kann jedoch eine Korrelation bestehen.
Die Zimmernummer wird diesmal ebenfalls übersprungen. Ich möchte dies im Abschnitt "Daten beobachten" ansprechen, auf den ich noch einmal eingehen werde.
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()
Es scheint eine Korrelation zu geben, es scheint keine ...
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.
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.
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
25.12.2019 Erstausgabe veröffentlicht 29.12.2019 Nächster Link hinzugefügt
Recommended Posts