OUJOOD.COM
Présentation du dataset et objectifs
Le dataset Titanic contient des informations sur 891 passagers du naufrage de 1912 : classe de billet, âge, sexe, tarif payé, port d'embarquement, et s'ils ont survécu ou non. C'est un dataset classique parce qu'il combine des colonnes numériques, des colonnes catégorielles, des valeurs manquantes et des relations intéressantes à explorer.
Nous allons répondre à trois questions :
- Quel est le taux de survie selon la classe de billet ?
- L'âge influence-t-il les chances de survie ?
- Y a-t-il une différence de survie entre hommes et femmes par classe ?
Étape 1 — Chargement et première inspection
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Chargement depuis une URL publique url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" df = pd.read_csv(url) # Inspection initiale print("Dimensions :", df.shape) print("\nPremières lignes :") print(df.head()) print("\nTypes et valeurs manquantes :") df.info() print("\nValeurs manquantes par colonne :") manquantes = df.isnull().sum() print(manquantes[manquantes > 0])
Le dataset contient 891 lignes et 12 colonnes. Trois colonnes ont des valeurs manquantes : Age (environ 20 %), Cabin (environ 77 %) et Embarked (2 lignes). Cabin est si incomplète qu'elle sera difficile à utiliser telle quelle — une décision de traitement s'impose.
Étape 2 — Nettoyage ciblé
import pandas as pd url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" df = pd.read_csv(url) # Age : remplir par la médiane (robuste aux valeurs extrêmes) df["Age"] = df["Age"].fillna(df["Age"].median()) # Embarked : remplir par la valeur la plus fréquente (2 lignes manquantes) df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode()[0]) # Cabin : trop de NaN — créer une colonne binaire "a_cabine" df["a_cabine"] = df["Cabin"].notna().astype(int) # Supprimer les colonnes peu utiles pour notre analyse df = df.drop(columns=["Cabin", "Ticket", "Name", "PassengerId"]) # Renommer pour plus de clarté df = df.rename(columns={ "Survived": "survie", "Pclass": "classe", "Sex": "sexe", "Age": "âge", "SibSp": "fratrie", "Parch": "parents", "Fare": "tarif", "Embarked": "port" }) print(df.isnull().sum()) print(df.head())
Transformer Cabin en variable binaire (a_cabine) plutôt que de supprimer la colonne préserve une information potentiellement utile : avoir une cabine attribuée pourrait être corrélé au statut ou à la classe. C'est une approche courante en data science pour les colonnes très incomplètes.
Étape 3 — Analyse du taux de survie
import pandas as pd url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" df = pd.read_csv(url) df["Age"] = df["Age"].fillna(df["Age"].median()) df["Embarked"] = df["Embarked"].fillna(df["Embarked"].mode()[0]) # Taux de survie par classe survie_classe = df.groupby("Pclass")["Survived"].mean().round(3) * 100 print("Taux de survie par classe (%) :") print(survie_classe) # Taux de survie par sexe et classe survie_croisee = df.groupby(["Pclass", "Sex"])["Survived"].mean().round(3) * 100 print("\nTaux de survie par classe et sexe (%) :") print(survie_croisee.reset_index()) # Statistiques d'âge selon la survie print("\nÂge médian par groupe de survie :") print(df.groupby("Survived")["Age"].median())
Les résultats révèlent des disparités nettes : les passagers de première classe ont un taux de survie bien supérieur à ceux de troisième classe. Les femmes ont survécu à un taux bien plus élevé que les hommes dans toutes les classes — ce qui reflète la politique de priorité aux femmes et enfants lors de l'évacuation.
Étape 4 — Visualisations
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" df = pd.read_csv(url) df["Age"] = df["Age"].fillna(df["Age"].median()) fig, axes = plt.subplots(1, 3, figsize=(16, 5)) # Graphique 1 : taux de survie par classe survie_classe = df.groupby("Pclass")["Survived"].mean() * 100 axes[0].bar(["1ère", "2ème", "3ème"], survie_classe.values, color=["gold", "silver", "peru"]) axes[0].set_title("Survie par classe (%)") axes[0].set_ylabel("Taux de survie (%)") axes[0].set_ylim(0, 100) # Graphique 2 : distribution de l'âge par survie df[df["Survived"] == 1]["Age"].plot( kind="hist", bins=20, alpha=0.6, color="steelblue", label="Survivants", ax=axes[1] ) df[df["Survived"] == 0]["Age"].plot( kind="hist", bins=20, alpha=0.6, color="coral", label="Non-survivants", ax=axes[1] ) axes[1].set_title("Distribution de l\'âge par survie") axes[1].set_xlabel("Âge") axes[1].legend() # Graphique 3 : survie par sexe et classe survie_croisee = df.groupby(["Pclass", "Sex"])["Survived"].mean().reset_index() sns.barplot( data=survie_croisee, x="Pclass", y="Survived", hue="Sex", palette=["coral", "steelblue"], ax=axes[2] ) axes[2].set_title("Survie par classe et sexe") axes[2].set_xlabel("Classe") axes[2].set_ylabel("Taux de survie") axes[2].set_ylim(0, 1) plt.suptitle("Analyse de survie — Titanic", fontsize=14, fontweight="bold") plt.tight_layout() plt.show()
Ce projet illustre un pipeline d'analyse complet sur des données réelles imparfaites. Les mêmes étapes s'appliquent à n'importe quel dataset public : recensements, données météo, résultats sportifs, transactions financières. Ce qui change d'un projet à l'autre, c'est le contexte métier — la logique Pandas reste la même.
Pour aller plus loin sur ce dataset, vous pouvez explorer les corrélations entre le tarif payé et la classe, la relation entre le nombre de membres de la famille à bord et la survie, ou encore l'effet du port d'embarquement.
Par carabde | Mis à jour le 26 avril 2026