[PYTHON] Prédisons les survivants du Hello World de Kaggle, Titanic par régression logistique-Modélisation-

0. Introduction

--Background: Je me suis finalement inscrit avec Kaggle, donc je l'ai essayé pour le moment. (lent)

1. Préparation de l'analyse des données

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

image.png

#Dimension des données
train_csv.shape

#Résultat de sortie
(891, 12)

Il semble contenir des données pour 891 passagers.


#Nombre de valeurs manquantes dans chaque ligne
train_csv.isnull().sum()

#Résultat de sortie
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

Il manque de nombreuses valeurs pour Age et Cabin.

2. Analysez les données et sélectionnez des variables explicatives

Les détails des données sont décrits sur la page du concours, je les omettrai donc. Ces données prédit qui peut survivre grâce aux attributs des passagers du Titanic. Il existe plusieurs attributs du passager, mais nous déciderons quel attribut utiliser et comment l'utiliser lors de l'analyse des données.

2.0. Vérifiez la variable objectif

Si le passager a survécu ou non est enregistré dans Survived à 0/1. 0 signifie la mort, 1 signifie la survie. Combien de personnes ont survécu?

#Probabilité de survie
train_csv['Survived'].mean()

#Résultat de sortie
 0.3838383838383838

Il semble qu'un peu moins de 40% des personnes aient survécu.

train_csv['Survived'].value_counts()

#Résultat de sortie
0    549
1    342
Name: Survived, dtype: int64

Cela ressemble à ceci en termes de nombre de personnes.

Examinons maintenant la relation entre chaque attribut et Survived.

2.1. Pclass (classe de billet)

Contient des valeurs entières de 1 à 3. Il semble que plus le nombre est petit, meilleure est la classe. En regardant le film, je pense que les passagers de la classe supérieure étaient préférentiellement sur le canot de sauvetage. Croisons-nous avec Survived et voyons l'impact * 1.

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

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

Le taux de mortalité des passagers de la 3ème classe est largement plus élevé que dans les autres classes. Au contraire, les passagers de 1ère classe ont un taux de survie élevé. Après tout, meilleure est la classe, plus le taux de survie est élevé, donc cette fois je vais l'utiliser tel quel pour le modèle.

2.2. Name Cela peut avoir quelque chose à voir avec cela, mais je ne l'utiliserai pas cette fois car il est difficile d'expliquer la cause et l'effet. (Il peut y avoir quelque chose si seul le titre est extrait.)

2.3. Sexe

homme et femme sont inclus tels quels dans la chaîne de caractères. En cas d'urgence, la survie des femmes a tendance à être une priorité, il semble donc que plus de femmes sont en vie que d'hommes dans ce cas également. Crosstab avec Survived.

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

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

Les femmes ont de nombreux survivants, mais les hommes ont peu de survivants. Je vais donc fabriquer un mannequin féminin et le mettre dans le modèle.

2.4. Âge

L'âge est entré numériquement, mais certaines valeurs manquent. Au stade de l'analyse, les valeurs manquantes sont exclues et comparées. De manière générale, les jeunes ont plus de chances de survivre. Par conséquent, comparons l'âge moyen des passagers morts et survivants. * 2

#Âge moyen des décès
train_csv[(train_csv['Age'].isnull() == False) & (train_csv['Survived'] == 0)].Age.mean()

#Résultat de sortie
30.62617924528302

#Âge moyen des survivants
train_csv[(train_csv['Age'].isnull() == False) & (train_csv['Survived'] == 1)].Age.mean()

#Résultat de sortie
28.343689655172415

Les survivants sont plus jeunes. Cependant, tel quel, il manque des valeurs et il ne peut pas être inclus dans le modèle. La méthode la plus rapide et la plus populaire consiste à compléter les données avec des valeurs représentatives (moyenne ou médiane). Cette fois, les valeurs manquantes seront complétées par la valeur moyenne globale et incluses dans le modèle.

2.5. SibSp et Parch

SibSp contient le nombre de frères et de conjoints, et Parch contient le nombre de parents et d'enfants. Il semble que les gens avec de nombreuses familles sont plus susceptibles de le trouver, alors j'ai l'impression d'être en vie. Dessinons un histogramme SibSp / Parch pour chacun des survivants et des morts.

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

Dans les deux cas, 0 personne a beaucoup de morts, mais même 1 personne a plusieurs survivants ou le même. Une réalité douloureuse pour une personne. Puisque les distributions de SibSp et Parch sont similaires, nous utiliserons Parch comme représentant cette fois. (Parce que mettre des variables similaires entraîne une colinéarité multiple) Parch est transformé en une variable factice par 0 personne et 1 personne ou plus et mis dans le modèle.

2.6. Ticket Il y a peut-être quelque chose à voir avec cela, mais je ne comprends pas vraiment la signification des chiffres et des lettres, donc je ne peux pas expliquer si cela me concerne. Donc je ne l'utiliserai pas cette fois.

2.7. Tarif

Le montant est une valeur entière. Plus la personne est élevée, plus elle a de chances de survivre.

#le défunt
train_csv[train_csv['Survived']==0].Fare.mean()

#Résultat de sortie
22.117886885245877

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

#Résultat de sortie
48.39540760233917

Il y avait une grande différence. Regardons également la distribution.

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

C'est un peu difficile à voir, mais il semble qu'il y ait plus de survivants lorsque le tarif est élevé. Alors je l'ai juste mis dans le modèle.

2.8. Cabin Puisqu'il y a trop de valeurs manquantes, j'ai décidé de ne pas l'utiliser cette fois.

2.9. Embarqué (lieu d'embarquement)

Il est représenté par trois bases sur lesquelles vous êtes arrivé. Les différences dans les conditions de santé et économiques propres à la résidence, la race et le temps d'embarquement selon le lieu d'embarquement peuvent affecter les taux de survie. Il manque des valeurs, mais elles sont insignifiantes et seront ignorées.

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

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

Le nombre de décès de passagers en provenance de S (Southampton) est important. Faisons un mannequin S et mettons-le dans le modèle.

Pourquoi les passagers de Southampton sont-ils morts? Si quelqu'un sait, faites-le moi savoir.

3. Modélisation avec régression logistique

Modélisons en fonction du résultat de l'analyse.

3.1. Traitement des données

La modélisation elle-même est facile, mais vous devez travailler avec les variables. Comme ça.

train = pd.DataFrame()
train = train.drop(['Name', 'SibSp', 'Ticket', 'Cabin'] , axis=1) #Supprimer les colonnes inutilisées

#Faire un mannequin féminin
train['Female'] = train['Sex'].map(lambda x: 0 if x == 'male' else 1 ).astype(int)

#Complétez la valeur manquante de l'âge par la valeur moyenne
train['Age'].fillna(train['Age'].mean(), inplace=True)

#Parch fait 0 et plus de mannequins
# Parch=0 quand 0, Prach>=Quand 1 1
train['Parch_d'] = train['Parch'].map(lambda x: 0 if x == 0 else 1).astype(int)

#Embarqué rend S et autres mannequins
train['Embarked_S'] = train['Embarked'].map(lambda x: 0 if x == 'S' else 1).astype(int)

3.2. Modélisation

Puis modèle.

#Génération de modèle
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. Modélisation des résultats

Tout d'abord, vérifiez quel type de modèle est devenu le modèle.

#coefficient
result.coef_
#Résultat de sortie
rray([[-1.02255162e+00, -2.89166539e-02, -7.14935760e-02,
         1.19056911e-03,  2.49662371e+00, -4.29002495e-01]]

#Section
result.intercept_
#Résultat de sortie
array([1.98119965])

La femme (mannequin femme) semble avoir le plus d'influence.

Voyons ensuite si le modèle créé est un bon modèle * 3. Premièrement, obtenons le coefficient de décision.

model.score(X, y)

#Résultat de sortie
0.792368125701459

Ça n'a pas l'air mal. Le facteur de décision est également appelé R 2 </ sup>, mais il montre dans quelle mesure la valeur prédite du modèle créé précédemment correspond aux données réelles. (Les valeurs ci-dessus sont les valeurs des données d'entraînement) Il est représenté par 0 à 1, et plus il est proche de 1, meilleure est la prédiction.

Maintenant, prédisons et confirmons avec les données de test. Continuez vers la section de prédiction. → https://qiita.com/anWest/items/cad88fe7b6f26fe86480

4. Remarques

Recommended Posts

Prédisons les survivants du Hello World de Kaggle, Titanic par régression logistique-Modélisation-
Prédisons les survivants de Hello World, Titanic de Kaggle par régression logistique-Prédiction / Évaluation-
bonjour le monde avec ctypes
Bonjour le monde avec Docker
Dessinez bonjour le monde avec mod_wsgi
Bonjour le monde avec Flask + Hamlish
Jusqu'à bonjour le monde avec zappa
Certains modèles de Kaggle's Titanic (kaggle ④)
Bonjour tout le monde! Avec la communication CAN virtuelle
Prédire le Titanic de Kaggle avec Keras (Kaggle ⑦)
[Note] Sortie Hello world avec python
Hello World! Par QPython avec Braincrash
Hello World et détection de visage avec opencv-python 4.2
Vérifiez les données brutes avec Kaggle's Titanic (Kaggle ⑥)
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
J'ai essayé d'apprendre avec le Titanic de Kaggle (kaggle②)
Hello World! Par QPython avec Brainfu * k
Bonjour le monde
Hello World et détection de visage avec OpenCV 4.3 + Python
Hello World avec gRPC / go dans l'environnement Docker
Bonjour tout le monde avec toutes les fonctionnalités du langage Go
Dites bonjour au monde avec Python avec IntelliJ
Hello World avec nginx + uwsgi + python sur EC2
Essayez Theano avec les données MNIST de Kaggle ~ Retour logistique ~
Premier python ① Construction de l'environnement avec pythonbrew & Hello World !!
Créer un serveur "Hello World" (HTTP) dans Tornado