logo oujood
🔍

Projet Pandas : dataset réel

Ce projet utilise le dataset Titanic, l'un des jeux de données les plus utilisés en data science. Il est imparfait, dense en valeurs manquantes et riche en enseignements — exactement ce que vous rencontrerez dans la vraie vie.

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

  📋 Copier le code

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é

  📋 Copier le code

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

  📋 Copier le code

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

  📋 Copier le code

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