Skip to content

Projet Pandas : Analyse de données réelles

Ce projet a pour but de pratiquer Pandas dans un contexte réaliste, en manipulant un jeu de données réel et en appliquant les opérations essentielles utilisées en Data Science :

  • Chargement et inspection de données
  • Nettoyage et préparation
  • Filtrage conditionnel (simple et multiple)
  • Manipulation de colonnes
  • Analyse exploratoire basique

Fichier Python associé

Projet Pandas
py
"""
Analyse exploratoire d'un dataset de réservations hôtelières avec Pandas

Objectifs :
- Manipulation de DataFrames
- Nettoyage des données
- Filtrage conditionnel
- Statistiques descriptives
- Feature engineering simple
"""

import pandas as pd
import numpy as np

# ======================================================
# 1. Chargement des données
# ======================================================

URL = "https://raw.githubusercontent.com/moncoachdata/MasterClass_DS_ML/main/hotel_booking_data.csv"
hotels = pd.read_csv(URL)

print("Dataset chargé avec succès")
print(f"Nombre total de lignes : {len(hotels)}\n")

# ======================================================
# 2. Données manquantes
# ======================================================

missing_values = hotels.isna().sum()
print("Valeurs manquantes par colonne :")
print(missing_values.sort_values(ascending=False), "\n")

most_missing_col = missing_values.idxmax()
print(
    f"La colonne avec le plus de valeurs manquantes est '{most_missing_col}' "
    f"avec {missing_values.max()} valeurs manquantes.\n"
)

# Suppression de la colonne trop incomplète
hotels.drop(columns="company", inplace=True)

# ======================================================
# 3. Analyse descriptive simple
# ======================================================

# 5 pays les plus représentés
print("Top 5 des pays les plus fréquents :")
print(hotels["country"].value_counts().head(), "\n")

# ======================================================
# 4. Tarif journalier moyen (ADR)
# ======================================================

# Personne ayant payé l'ADR le plus élevé
max_adr_row = hotels.loc[hotels["adr"].idxmax()]
print(
    f"ADR maximum payé par : {max_adr_row['name']} "
    f"({max_adr_row['adr']} €)\n"
)

# ADR moyen sur l'ensemble des séjours
mean_adr = round(hotels["adr"].mean(), 2)
print(f"ADR moyen sur l'ensemble des séjours : {mean_adr}\n")

# ======================================================
# 5. Durée et coût des séjours
# ======================================================

# Durée totale du séjour
hotels["total_stay_days"] = (
    hotels["stays_in_week_nights"] + hotels["stays_in_weekend_nights"]
)

mean_stay = round(hotels["total_stay_days"].mean(), 2)
print(f"Durée moyenne d’un séjour : {mean_stay} nuits\n")

# Coût total du séjour
hotels["total_paid"] = hotels["adr"] * hotels["total_stay_days"]
mean_total_paid = round(hotels["total_paid"].mean(), 2)
print(f"Coût total moyen d’un séjour : {mean_total_paid}\n")

# ======================================================
# 6. Filtrage conditionnel
# ======================================================

# Clients avec 5 demandes spéciales
special_requests = hotels.loc[
    hotels["total_of_special_requests"] == 5, ["name", "email"]
]

print("Clients ayant effectué 5 demandes spéciales :")
print(special_requests.head(), "\n")

# Pourcentage de clients réguliers
repeat_guest_percentage = round(
    100 * (hotels["is_repeated_guest"] == 1).sum() / len(hotels), 2
)
print(f"Pourcentage de clients réguliers : {repeat_guest_percentage} %\n")

# ======================================================
# 7. Analyse des noms
# ======================================================

# Extraction du nom de famille
last_names = hotels["name"].apply(lambda x: x.split()[-1])

print("Top 5 des noms de famille les plus fréquents :")
print(last_names.value_counts().head(), "\n")

# ======================================================
# 8. Enfants et bébés
# ======================================================

hotels["total_kids"] = hotels["children"] + hotels["babies"]

print("Personnes ayant réservé pour le plus grand nombre d’enfants/bébés :")
print(
    hotels.sort_values("total_kids", ascending=False)[
        ["name", "adults", "children", "babies", "total_kids"]
    ].head(3),
    "\n"
)

# ======================================================
# 9. Analyse des numéros de téléphone
# ======================================================

print("Top 3 des indicatifs téléphoniques :")
print(
    hotels["phone-number"]
    .astype(str)
    .str[:3]
    .value_counts()
    .head(3),
    "\n"
)

# ======================================================
# 10. Analyse des dates d’arrivée
# ======================================================

# Arrivées entre le 1er et le 15 inclus
arrivals_1_15 = hotels["arrival_date_day_of_month"].between(1, 15).sum()
print(f"Nombre d’arrivées entre le 1er et le 15 du mois : {arrivals_1_15}\n")

# ======================================================
# 11. Jour de la semaine des arrivées
# ======================================================

# Création d'une vraie date
hotels["arrival_date"] = pd.to_datetime(
    hotels["arrival_date_day_of_month"].astype(str)
    + "-"
    + hotels["arrival_date_month"]
    + "-"
    + hotels["arrival_date_year"].astype(str),
    dayfirst=True,
)

print("Nombre d’arrivées par jour de la semaine :")
print(hotels["arrival_date"].dt.day_name().value_counts())