[PYTHON] Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic, durch logistische Regression vorhersagen.

0. Einleitung

--Background: Ich habe mich endlich bei Kaggle registriert, also habe ich es vorerst versucht. (langsam)

1. Vorbereitung für die Datenanalyse

train_csv = pd.read_csv('../input/titanic/train.csv', sep=',')
train_csv.head()

image.png

--Überprüfen Sie die Übersicht der Daten

#Datendimension
train_csv.shape

#Ausgabeergebnis
(891, 12)

Es scheint Daten für 891 Passagiere zu enthalten.


#Anzahl der fehlenden Werte in jeder Zeile
train_csv.isnull().sum()

#Ausgabeergebnis
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

Es gibt viele fehlende Werte für Alter und Kabine.

2. Analysieren Sie die Daten und wählen Sie erklärende Variablen aus

Die Details der Daten sind auf der Wettbewerbsseite beschrieben, daher werde ich sie weglassen. Diese Daten sagen voraus, wer von den Eigenschaften der Titanic-Passagiere überleben kann. Es gibt verschiedene Attribute des Passagiers, aber wir werden entscheiden, welches Attribut verwendet werden soll und wie es bei der Analyse der Daten verwendet werden soll.

2.0 Überprüfen Sie die Zielvariable

Ob der Passagier überlebt hat oder nicht, wird in Survived bei 0/1 gespeichert. 0 bedeutet Tod, 1 bedeutet Überleben. Wie viele Menschen haben überlebt?

#Überlebenswahrscheinlichkeit
train_csv['Survived'].mean()

#Ausgabeergebnis
 0.3838383838383838

Es scheint, dass etwas weniger als 40% der Menschen überlebt haben.

train_csv['Survived'].value_counts()

#Ausgabeergebnis
0    549
1    342
Name: Survived, dtype: int64

In Bezug auf die Anzahl der Personen sieht es so aus.

Betrachten wir nun die Beziehung zwischen jedem Attribut und Survived.

2.1 Klasse (Ticketklasse)

Enthält ganzzahlige Werte von 1-3. Es scheint, dass je kleiner die Zahl, desto besser die Klasse. Wenn ich mir den Film anschaue, denke ich, dass die Passagiere der oberen Klasse bevorzugt auf dem Rettungsboot waren. Lassen Sie uns mit Survived eine Kreuztabelle erstellen und die Auswirkungen [* 1] sehen (https://qiita.com/anWest/items/f3d432e0e02f070ec107#4-%E5%82%99%E8%80%83).

pd.crosstab(train_csv['Pclass'], train_csv['Survived'])

スクリーンショット 2019-12-19 22.14.14.png

Die Sterblichkeitsrate von Passagieren in der 3. Klasse ist überwiegend höher als in anderen Klassen. Im Gegenteil, Passagiere der 1. Klasse haben eine hohe Überlebensrate. Denn je besser die Klasse, desto höher die Überlebensrate. Dieses Mal werde ich sie also so verwenden, wie sie für das Modell ist.

2.2. Name Es mag etwas damit zu tun haben, aber ich werde es dieses Mal nicht verwenden, weil es schwierig ist, Ursache und Wirkung zu erklären. (Es kann etwas geben, wenn nur der Titel extrahiert wird.)

2.3. Geschlecht

männlich und weiblich sind so enthalten, wie sie in der Zeichenkette sind. Im Notfall wird das Überleben von Frauen tendenziell priorisiert, so dass auch in diesem Fall mehr Frauen am Leben sind als Männer. Kreuztabelle mit überlebt.

pd.crosstab(train_csv['Sex'], train_csv['Survived'])

スクリーンショット 2019-12-19 22.30.23.png

Frauen haben viele Überlebende, Männer jedoch nur wenige Überlebende. Also werde ich eine weibliche Puppe machen und sie in das Modell einfügen.

2.4. Alter

Das Alter wird numerisch eingegeben, es fehlen jedoch einige Werte. In der Analysephase werden die fehlenden Werte ausgeschlossen und verglichen. Im Allgemeinen überleben jüngere Menschen eher. Vergleichen wir daher das Durchschnittsalter toter und überlebender Passagiere. * 2

#Durchschnittsalter der Todesfälle
train_csv[(train_csv['Age'].isnull() == False) & (train_csv['Survived'] == 0)].Age.mean()

#Ausgabeergebnis
30.62617924528302

#Durchschnittsalter der Überlebenden
train_csv[(train_csv['Age'].isnull() == False) & (train_csv['Survived'] == 1)].Age.mean()

#Ausgabeergebnis
28.343689655172415

Die Überlebenden sind jünger. Es fehlen jedoch Werte, die nicht in das Modell aufgenommen werden können. Die schnellste und beliebteste Methode besteht darin, die Daten durch repräsentative Werte (Mittelwert oder Median) zu ergänzen. Dieses Mal werden die fehlenden Werte mit dem Gesamtmittelwert ergänzt und in das Modell aufgenommen.

2.5 SibSp und Parch

SibSp enthält die Anzahl der Brüder und Ehepartner, und Parch enthält die Anzahl der Eltern und Kinder. Es scheint, dass Menschen mit vielen Familien es eher finden, also fühle ich mich wie am Leben. Zeichnen wir für jeden Überlebenden und jeden Toten ein SibSp / Parch-Histogramm.

import matplotlib.pyplot as plt

# SibSp
plt.hist([train_csv[train_csv['Survived']==0].SibSp, train_csv[train_csv['Survived']==1].SibSp], label=['Died', 'Survived'])
plt.legend()

image.png

#Parch
plt.hist([train_csv[train_csv['Survived']==0].Parch, train_csv[train_csv['Survived']==1].Parch], label=['Died', 'Survived'])
plt.legend()

image.png

In beiden Fällen haben 0 Menschen viele Todesfälle, aber selbst 1 Person hat viele Überlebende oder das Gleiche. Eine schmerzhafte Realität für eine Person. Da die Distributionen von SibSp und Parch ähnlich sind, werden wir diesmal Parch als Vertreter verwenden. (Weil das Setzen ähnlicher Variablen eine mehrfache Co-Linearität verursacht) Parch wird von 0 Personen und 1 oder mehr Personen zu einer Dummy-Variablen gemacht und in das Modell eingefügt.

2.6. Ticket Es mag etwas damit zu tun haben, aber ich verstehe die Bedeutung der Zahlen und Buchstaben nicht, daher kann ich nicht erklären, ob es mich betrifft. Also werde ich es dieses Mal nicht benutzen.

2.7. Tarif

Der Betrag ist ein ganzzahliger Wert. Je höher die Person, desto wahrscheinlicher ist es zu überleben.

#der Verstorbene
train_csv[train_csv['Survived']==0].Fare.mean()

#Ausgabeergebnis
22.117886885245877

#Überlebende
train_csv[train_csv['Survived']==1].Fare.mean()

#Ausgabeergebnis
48.39540760233917

Es gab einen großen Unterschied. Schauen wir uns auch die Verteilung an.

plt.hist([train_csv[train_csv['Survived']==0].Fare, train_csv[train_csv['Survived']==1].Fare], label=['Died', 'Survived'], bins=20)
plt.legend()

image.png

Es ist ein wenig schwer zu sehen, aber es scheint, dass es mehr Überlebende gibt, wenn der Fahrpreis hoch ist. Also habe ich es einfach in das Modell eingefügt.

2.8. Cabin Da zu viele Werte fehlen, habe ich mich dieses Mal entschieden, sie nicht zu verwenden.

2.9. Eingeschifft (Internat)

Es wird durch drei Basen dargestellt, in denen Sie eingestiegen sind. Unterschiede in den wohnsitzspezifischen gesundheitlichen und wirtschaftlichen Bedingungen, der Rasse und der Boarding-Zeit in Abhängigkeit vom Boarding-Ort können die Überlebensraten beeinflussen. Es fehlen Werte, diese sind jedoch unbedeutend und werden ignoriert.

pd.crosstab(train_csv['Embarked'], train_csv['Survived'])

スクリーンショット 2019-12-19 22.58.29.png

Die Zahl der Todesfälle von Passagieren aus S (Southampton) ist groß. Machen wir einen S-Dummy und fügen ihn in das Modell ein.

Warum sind Southampton Passagiere tot? Wenn jemand weiß, lassen Sie es mich bitte wissen.

3. Modellierung mit logistischer Regression

Lassen Sie uns basierend auf dem Analyseergebnis modellieren.

3.1. Datenverarbeitung

Die Modellierung selbst ist einfach, aber Sie müssen mit den Variablen arbeiten. So was.

train = pd.DataFrame()
train = train.drop(['Name', 'SibSp', 'Ticket', 'Cabin'] , axis=1) #Nicht verwendete Spalten löschen

#Machen Sie eine weibliche Puppe
train['Female'] = train['Sex'].map(lambda x: 0 if x == 'male' else 1 ).astype(int)

#Ergänzen Sie den fehlenden Alterswert mit dem Durchschnittswert
train['Age'].fillna(train['Age'].mean(), inplace=True)

#Parch macht 0 und mehr Dummies
# Parch=0 wenn 0, Prach>=Wenn 1 1
train['Parch_d'] = train['Parch'].map(lambda x: 0 if x == 0 else 1).astype(int)

#Eingeschifft macht S und andere Dummies
train['Embarked_S'] = train['Embarked'].map(lambda x: 0 if x == 'S' else 1).astype(int)

3.2. Modellierung

Dann modellieren.

#Modellgenerierung
from sklearn.linear_model import LogisticRegression
X = train[['Pclass', 'Age', 'Parch_d', 'Fare', 'Female', 'Embarked_S']]
y = train['Survived']

model = LogisticRegression()
result = model.fit(X, y)

3.3. Modellierungsergebnisse

Überprüfen Sie zunächst, zu welcher Art von Modell das Modell geworden ist.

#Koeffizient
result.coef_
#Ausgabeergebnis
rray([[-1.02255162e+00, -2.89166539e-02, -7.14935760e-02,
         1.19056911e-03,  2.49662371e+00, -4.29002495e-01]]

#Sektion
result.intercept_
#Ausgabeergebnis
array([1.98119965])

Frau (weibliche Puppe) scheint den größten Einfluss zu haben.

Als nächstes wollen wir sehen, ob das erstellte Modell gut ist * 3. Lassen Sie uns zuerst den Entscheidungskoeffizienten ermitteln.

model.score(X, y)

#Ausgabeergebnis
0.792368125701459

Es sieht nicht schlecht aus. Der Entscheidungsfaktor wird auch als R 2 </ sup> bezeichnet, zeigt jedoch, wie gut der vorhergesagte Wert des zuvor erstellten Modells zu den tatsächlichen Daten passt. (Die obigen Werte sind die Werte in den Trainingsdaten) Es wird durch 0 zu 1 dargestellt, und je näher es an 1 liegt, desto besser ist die Vorhersage.

Lassen Sie uns nun die Testdaten vorhersagen und bestätigen. Fahren Sie mit dem Abschnitt Vorhersage fort. → https://qiita.com/anWest/items/cad88fe7b6f26fe86480

4. Bemerkungen

Recommended Posts

Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic, durch logistische Regression vorhersagen.
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic durch logistische Regression vorhersagen - Vorhersage / Bewertung
Hallo Welt mit ctypes
Hallo, Welt mit Docker
Zeichne Hallo Welt mit mod_wsgi
Hallo Welt mit Flask + Hamlish
Bis hallo Welt mit Zappa
Wählen Sie Modelle von Kaggles Titanic (kaggle ④)
Hallo Welt! Mit virtueller CAN-Kommunikation
Vorhersage der Titanic von Kaggle mit Keras (kaggle ⑦)
[Hinweis] Hallo Weltausgabe mit Python
Hallo Welt! Von QPython mit Braincrash
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Überprüfen Sie die Rohdaten mit Kaggles Titanic (kaggle ⑥)
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Hallo Welt! Von QPython mit Brainfu * k
Hallo Welt
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Hallo Welt mit gRPC / go in Docker-Umgebung
Hallo Welt mit allen Funktionen der Go-Sprache
Begrüßen Sie die Welt mit Python mit IntelliJ
Hallo Welt mit Nginx + Uwsgi + Python auf EC2
Probieren Sie Theano mit Kaggles MNIST-Daten ~ Logistic Return ~ aus
Erste Python ① Umgebungskonstruktion mit Pythonbrew & Hello World !!
Erstellen Sie in Tornado einen HTTP-Server (Hello World)