Prédiction de survie au Titanic | Votre premier projet de science des données

 Prédiction de survie au Titanic | Votre premier projet de science des données

Introduction

Dans cet article, nous allons parcourir le populaire jeu de données Titanic et essayer de prédire si une personne a survécu au naufrage. Vous pouvez obtenir ce jeu de données sur Kaggle, en cliquant sur les liens suivants ici. Cet article se concentrera sur la façon de penser à ces projets, plutôt que sur leur mise en œuvre. Beaucoup de débutants ne savent pas comment commencer, quand terminer et tout le reste. J’espère que cet article vous servira de manuel du débutant. Je vous suggère de pratiquer le projet dans Kaggle même.

L’objectif : Prédire si un passager a survécu ou non. 0 pour ne pas avoir survécu, 1 pour avoir survécu.

Description des données

Dans cet article, nous allons faire une analyse de base des données, puis un peu d’ingénierie des caractéristiques, et enfin utiliser certains des modèles populaires pour la prédiction. Commençons.

Analyse des données

Étape 1 : Importation des bibliothèques de base

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

Étape 2 : Lecture des données

training = pd.read_csv('/kaggle/input/titanic/train.csv')
test = pd.read_csv('/kaggle/input/titanic/test.csv')
training['train_test'] = 1
test['train_test'] = 0
test['Survived'] = np.NaN
all_data = pd.concat([training,test])
all_data.columns

Étape 3 : Exploration des données

Dans cette section, nous allons essayer de tirer des enseignements des données, et de nous familiariser avec elles, afin de pouvoir créer des modèles plus efficaces.

training.info()
training.describe()
# seperate the data into numeric and categorical
df_num = training[['Age','SibSp','Parch','Fare']]
df_cat = training[['Survived','Pclass','Sex','Ticket','Cabin','Embarked']]

Maintenant, faisons des graphiques des données numériques :

for i in df_num.columns:
    plt.hist(df_num[i])
    plt.title(i)
    plt.show()

Donc, comme vous pouvez le voir, la plupart des distributions sont dispersées, sauf Age, qui est assez normalisé. Nous pourrions envisager de les normaliser plus tard. Ensuite, nous traçons une carte thermique de corrélation entre les colonnes numériques :

sns.heatmap(df_num.corr())

Nous pouvons voir ici que Parch et SibSp ont une corrélation plus élevée, ce qui est généralement logique puisque les parents sont plus susceptibles de voyager avec leurs multiples enfants et que les conjoints ont tendance à voyager ensemble. Ensuite, comparons les taux de survie entre les variables numériques. Cela pourrait révéler des informations intéressantes :

pd.pivot_table(training, index = 'Survived', values = ['Age','SibSp','Parch','Fare'])

La déduction que nous pouvons tirer de ce tableau est la suivante :

  1. L’âge moyen des survivants est de 28 ans, donc les jeunes ont tendance à survivre davantage.
  2. Les personnes qui ont payé un tarif plus élevé ont plus de chances de survivre, plus du double. Cela pourrait être les personnes voyageant en première classe. Donc les riches ont survécu, ce qui est un peu triste dans ce scénario.
  3. Dans la 3ème colonne, si vous avez des parents, vous avez plus de chances de survivre. Donc les parents ont pu sauver les enfants avant eux-mêmes, ce qui explique les taux de survie.
  4. Et si vous êtes un enfant, et que vous avez des frères et sœurs, vous avez moins de chance de survivre.

Maintenant, nous faisons la même chose avec nos variables catégorielles :

for i in df_cat.columns:
    sns.barplot(df_cat[i].value_counts().index,df_cat[i].value_counts()).set_title(i)
    plt.show()

Les graphiques des tickets et des cabines sont très désordonnés, nous devrions peut-être les modifier ! A part ça, le reste des graphiques nous renseigne :

  1. Survivants : La plupart des gens sont morts dans le naufrage, seulement environ 300 personnes ont survécu.
  2. Pclasse : La majorité des personnes voyageant, avaient des tickets pour la 3ème classe.
  3. Sexe : Il y avait plus d’hommes que de femmes à bord du vaisseau, à peu près le double.
  4. Embarqué : La plupart des passagers ont embarqué sur le navire à Southampton.

Maintenant, nous allons faire quelque chose de similaire au tableau croisé dynamique ci-dessus, mais avec nos variables catégorielles, et les comparer à notre variable dépendante, qui est de savoir si les gens ont survécu :

print(pd.pivot_table(training, index = 'Survived', columns="Pclass",
                     values="Ticket" ,aggfunc="count"))
print()
print(pd.pivot_table(training, index = 'Survived', columns="Sex", 
                     values="Ticket" ,aggfunc="count"))
print()
print(pd.pivot_table(training, index = 'Survived', columns="Embarked", 
                     values="Ticket" ,aggfunc="count"))
  1. Pclass : Ici, nous pouvons voir que beaucoup plus de personnes ont survécu de la première classe que de la deuxième ou de la troisième classe, même si le nombre total de passagers de la première classe était bien inférieur à celui de la troisième classe. Ainsi, notre hypothèse précédente selon laquelle les riches ont survécu est confirmée ici, ce qui pourrait être pertinent pour la construction de modèles.
  2. Le sexe : La plupart des femmes ont survécu, et la majorité des hommes sont morts dans le naufrage. On dirait que le dicton « Les femmes et les enfants d’abord » s’est appliqué dans ce scénario.
  3. Embarqué : Cela ne semble pas très pertinent, peut-être que si quelqu’un était de « Cherbourg » avait plus de chances de survivre.

Étape 4 : Ingénierie des caractéristiques

Nous avons vu que notre billet et cabine n’ont pas vraiment de sens pour nous, et cela pourrait nuire aux performances de notre modèle. Nous devons donc simplifier certaines de ces données grâce à l’ingénierie des caractéristiques.

Si nous regardons les données réelles de la cabine, nous voyons qu’il y a essentiellement une lettre et ensuite un nombre. Les lettres peuvent indiquer de quel type de cabine il s’agit, où elle se trouve sur le navire, à quel étage, à quelle classe elle appartient, etc. Et les chiffres peuvent signifier le numéro de la cabine. Divisons-les d’abord en cabines individuelles et voyons si quelqu’un possède plus d’une cabine.

df_cat.Cabin
training['cabin_multiple'] = training.Cabin.apply(lambda x: 0 if pd.isna(x) 
                                                    else len(x.split(' ')))
training['cabin_multiple'].value_counts()

Il semble que la grande majorité n’avait pas de cabines individuelles, et que seules quelques personnes possédaient plus d’une cabane. Voyons maintenant si les taux de survie en dépendent :

pd.pivot_table(training, index = 'Survived', columns="cabin_multiple",
               values="Ticket" ,aggfunc="count")

Ensuite, regardons la lettre réelle de la cabine dans laquelle ils se trouvaient. On pourrait s’attendre à ce que les cabines avec la même lettre soient à peu près aux mêmes endroits, ou aux mêmes étages, et logiquement si une cabine était près des canots de sauvetage, elle avait une meilleure chance de survie. Regardons cela de plus près :

# n stands for null
# in this case we will treat null values like it's own category
training['cabin_adv'] = training.Cabin.apply(lambda x: str(x)[0])
#comparing survival rates by cabin
print(training.cabin_adv.value_counts())
pd.pivot_table(training,index='Survived',columns="cabin_adv", 
                        values="Name", aggfunc="count")

J’ai fait un peu d’ingénierie future sur le ticket et cela n’a pas donné beaucoup de résultats significatifs, que nous ne connaissions pas déjà, donc je vais sauter cette partie pour garder l’article concis. Nous allons simplement diviser les tickets en deux catégories, numérique et non-numérique, pour une utilisation efficace :

training['numeric_ticket'] = training.Ticket.apply(lambda x: 1 if x.isnumeric() else 0)
training['ticket_letters'] = training.Ticket.apply(lambda x: ''.join(x.split(' ')[:-1])
                                            .replace('.','').replace('/','')
                                            .lower() if len(x.split(' ')[:-1]) >0 else 0)

Une autre chose intéressante que nous pouvons examiner est le titre des passagers individuels. Et si cela a joué un rôle dans l’obtention d’un siège dans les canots de sauvetage.

training.Name.head(50)
training['name_title'] = training.Name.apply(lambda x: x.split(',')[1]
                                                        .split('.')[0].strip())
training['name_title'].value_counts()

Comme vous pouvez le voir, le navire a été abordé par des personnes de nombreuses classes différentes, cela pourrait nous être utile dans notre modèle.

Étape 5 : prétraitement des données pour le modèle

Dans ce segment, nous rendons nos données prêtes pour le modèle. Les objectifs que nous devons remplir sont listés ci-dessous :

  1. Supprimer les valeurs nulles de la colonne Embarqué.
  2. N’incluez que les données pertinentes
  3. Transformez catégoriquement toutes les données, en utilisant ce qu’on appelle un transformateur.
  4. Imputez les données avec les tendances centrales pour l’âge et le tarif.
  5. Normaliser les tarifs pour avoir une distribution plus normale.
  6. utilisation du scaler standard mise à l’échelle des données 0-1

Étape 6 : Déploiement du modèle

Ici, nous allons simplement déployer les différents modèles avec les paramètres par défaut et voir lequel donne le meilleur résultat. Les modèles peuvent être ajustés pour une meilleure performance mais ce n’est pas le but de cet article. Les modèles que nous allons utiliser sont les suivants :

  • Régression logistique
  • K Plus Proche Voisin
  • Classificateur à vecteur de support

Tout d’abord, nous importons les modèles nécessaires

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC

1) Régression logistique

lr = LogisticRegression(max_iter = 2000)
cv = cross_val_score(lr,X_train_scaled,y_train,cv=5)
print(cv)
print(cv.mean())

2) K plus proche voisin

knn = KNeighborsClassifier()
cv = cross_val_score(knn,X_train_scaled,y_train,cv=5)
print(cv)
print(cv.mean())

3) Classificateur à vecteur de support

svc = SVC(probability = True)
cv = cross_val_score(svc,X_train_scaled,y_train,cv=5)
print(cv)
print(cv.mean())

Par conséquent, la précision des modèles est la suivante :

  • Régression logistique : 82,2%.
  • K plus proche voisin : 81,4 %.
  • SVC : 83,3

Comme vous pouvez le voir, nous obtenons une précision décente avec tous nos modèles, mais le meilleur est le SVC. Et voilà, comme ça, vous avez terminé votre premier projet de science des données ! Bien qu’il y ait tellement plus à faire pour obtenir de meilleurs résultats, c’est plus que suffisant pour vous aider à démarrer et à voir comment vous pensez comme un scientifique de données. J’espère que ce guide vous a aidé, j’ai eu beaucoup de plaisir à réaliser ce projet moi-même et j’espère que vous l’apprécierez aussi. Santé !


Source de l’article

A découvrir