Exercice 97 / 100

Projet — EDA

ConsigneAnalyse exploratoire de données complète

📖 Cours

eda (Exploratory Data Analysis) = analyse exploratoire. L'étape entre les données brutes et le modèle : comprendre ce qu'on a, repérer les patterns, formuler des hypothèses.

Les 5 questions à se poser

1. Combien de lignes / colonnes ? Types ?2. Y a-t-il des NaN ou des doublons ?3. Distribution de chaque variable (forme, outliers) ?4. Corrélations entre variables ?5. Différences entre groupes (cible vs features) ?

Workflow standard

df.shapedf.info()df.describe() stats numériquesdf.describe(include='object') stats catégoriellesdf.isnull().sum()df.duplicated().sum()df.corr().round(2) matrice de corrélation (numériques)df[col].value_counts() fréquences

Visualisations utiles

- histogrammes distribution d'une variable- boxplots outliers, comparaison de groupes- scatter plots corrélations 2 à 2- heatmap matrice de corrélation- bar charts fréquences catégorielles
À chaque question de l'exploration son graphique : l'histogramme pour la forme d'une variable, le boxplot pour ses valeurs extrêmes, le nuage de points pour le lien entre deux variables, les barres pour le poids des catégories
À chaque question de l'exploration son graphique : l'histogramme pour la forme d'une variable, le boxplot pour ses valeurs extrêmes, le nuage de points pour le lien entre deux variables, les barres pour le poids des catégories
import seaborn as sns # bibliothèque sur-couche de matplotlibsns.pairplot(df, hue='cible')sns.heatmap(df.corr(), annot=True)

Exemple : EDA d'un dataset de réussite

import pandas as pdimport numpy as np
np.random.seed(42)n = 200
heures_etude = np.random.uniform(1, 15, n)note_precedente = np.random.uniform(5, 18, n)bruit = np.random.normal(0, 5, n)
df = pd.DataFrame({ 'heures_etude': heures_etude, 'nb_exercices': np.random.randint(5, 50, n), # sans lien avec la réussite 'note_precedente': note_precedente, # la réussite DÉPEND des heures et de la note précédente : c'est ce lien # que l'exploration doit retrouver, sinon on ne regarde que du bruit 'reussite': (heures_etude * 2 + note_precedente * 3 + bruit > 45).astype(int)})
print('=== EDA ===')print(f'Shape: {df.shape}')print(f'Stats:\n{df.describe()}')print(f'Corrélations:\n{df.corr().round(2)}')print(f'Réussite: {df["reussite"].value_counts().to_dict()}')
# Comparer les moyennes par groupe (réussis vs échoués)for col in ['heures_etude', 'nb_exercices', 'note_precedente']: reussis = df[df['reussite']==1][col].mean() echoues = df[df['reussite']==0][col].mean() print(f'{col}: reussis={reussis:.1f}, echoues={echoues:.1f}')

Bonnes pratiques

- écrire un notebook EDA AVANT de modéliser- documenter les hypothèses au fur et à mesure- vérifier les valeurs absurdes (âge négatif, dates futures...)- identifier la cible et son taux de base

ydata-profiling (ex pandas-profiling) génère un rapport eda complet en une ligne : df.profile_report(). Excellent pour démarrer.

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →