🎯 Objectifs de la séance

1. Qualité des Données

📖 Les 6 dimensions de la qualité

  1. Exactitude : Les données sont-elles correctes ?
  2. Complétude : Y a-t-il des valeurs manquantes ?
  3. Cohérence : Les données sont-elles uniformes ?
  4. Validité : Les données respectent-elles les règles ?
  5. Unicité : Y a-t-il des doublons ?
  6. Actualité : Les données sont-elles à jour ?

🚨 Problèmes courants

# Identifier les valeurs manquantes
df.isnull().sum()
df.isna().sum()  # Équivalent

# Pourcentage de valeurs manquantes
(df.isnull().sum() / len(df)) * 100

# Identifier les doublons
df.duplicated().sum()

# Afficher les doublons
df[df.duplicated(keep=False)]

2. Nettoyage avec Pandas

🧹 Gérer les valeurs manquantes

# Supprimer les lignes avec NaN
df_clean = df.dropna()

# Supprimer les lignes où toutes les valeurs sont NaN
df_clean = df.dropna(how="all")

# Supprimer les lignes avec NaN dans certaines colonnes
df_clean = df.dropna(subset=["nom", "email"])

# Remplir avec la moyenne
df["age"].fillna(df["age"].mean(), inplace=True)

# Remplir avec la médiane (plus robuste aux outliers)
df["age"].fillna(df["age"].median(), inplace=True)

# Forward fill (répéter la valeur précédente)
df["prix"].fillna(method="ffill", inplace=True)

🔄 Gérer les doublons

# Supprimer les doublons
df_unique = df.drop_duplicates()

# Supprimer les doublons sur certaines colonnes
df_unique = df.drop_duplicates(subset=["email"])

# Garder la première occurrence
df_unique = df.drop_duplicates(keep="first")

# Garder la dernière occurrence
df_unique = df.drop_duplicates(keep="last")

🔤 Nettoyage de texte

# Supprimer les espaces
df["nom"] = df["nom"].str.strip()

# Convertir en minuscules
df["email"] = df["email"].str.lower()

# Remplacer des caractères
df["telephone"] = df["telephone"].str.replace("-", "")

3. Statistiques Descriptives

📊 Mesures de tendance centrale

Moyenne

# Moyenne arithmétique
df["prix"].mean()

# Par groupe
df.groupby("categorie")["prix"].mean()

Interprétation : Sensible aux outliers

Médiane

# Médiane (50e percentile)
df["prix"].median()

Interprétation : Robuste aux outliers

📈 Mesures de dispersion

# Écart-type
df["prix"].std()

# Variance
df["prix"].var()

# Quartiles
Q1 = df["prix"].quantile(0.25)  # 25e percentile
Q2 = df["prix"].quantile(0.50)  # Médiane
Q3 = df["prix"].quantile(0.75)  # 75e percentile

# IQR (Interquartile Range)
IQR = Q3 - Q1

📋 Describe : Résumé statistique

# Statistiques descriptives complètes
df.describe()

# Pour toutes les colonnes
df.describe(include="all")

# Pour une colonne spécifique
df["prix"].describe()

4. Corrélation et Relations

🔗 Corrélation de Pearson

Mesure la force et la direction de la relation linéaire entre deux variables.

# Matrice de corrélation
correlation_matrix = df.corr()
print(correlation_matrix)

# Corrélation entre deux variables
correlation = df["prix"].corr(df["quantite"])

# Visualisation avec Seaborn
import seaborn as sns
sns.heatmap(df.corr(), annot=True, cmap="coolwarm", center=0)

📊 Interprétation de r (coefficient de corrélation)

  • r = 1 : Corrélation positive parfaite
  • r = 0 : Pas de corrélation
  • r = -1 : Corrélation négative parfaite
  • 0.7 < |r| < 1 : Forte corrélation
  • 0.3 < |r| < 0.7 : Corrélation modérée
  • |r| < 0.3 : Faible corrélation

⚠️ Corrélation ≠ Causalité

"La corrélation n'implique pas la causalité"

Exemple : Les ventes de glaces et les noyades sont corrélées, mais la glace ne cause pas les noyades. C'est la température (variable cachée) qui influence les deux.

5. Détection d'Outliers

📊 Méthode de l'IQR

Q1 = df["prix"].quantile(0.25)
Q3 = df["prix"].quantile(0.75)
IQR = Q3 - Q1

# Définir les limites
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# Identifier les outliers
outliers = df[(df["prix"] < lower_bound) | (df["prix"] > upper_bound)]

# Filtrer les outliers
df_clean = df[(df["prix"] >= lower_bound) & (df["prix"] <= upper_bound)]

📈 Méthode du Z-score

from scipy import stats

# Calculer le Z-score
df["z_score"] = stats.zscore(df["prix"])

# Outliers : |z-score| > 3
outliers = df[df["z_score"].abs() > 3]

# Filtrer les outliers
df_clean = df[df["z_score"].abs() <= 3]

📦 Visualisation : Boxplot

# Boxplot simple
df.boxplot(column="prix")

# Boxplot par catégorie
df.boxplot(column="prix", by="categorie")

# Avec Seaborn
import seaborn as sns
sns.boxplot(data=df, x="categorie", y="prix")

🎯 Quiz de validation des connaissances

Testez vos connaissances sur l'analyse statistique ! 10 questions.

🎓 Points clés à retenir