Durée : 7 heures | Niveau : Intermédiaire
# 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)]
# 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)
# 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")
# 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("-", "")
# Moyenne arithmétique
df["prix"].mean()
# Par groupe
df.groupby("categorie")["prix"].mean()
Interprétation : Sensible aux outliers
# Médiane (50e percentile)
df["prix"].median()
Interprétation : Robuste aux outliers
# É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
# Statistiques descriptives complètes
df.describe()
# Pour toutes les colonnes
df.describe(include="all")
# Pour une colonne spécifique
df["prix"].describe()
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)
"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.
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)]
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]
# 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")
Testez vos connaissances sur l'analyse statistique ! 10 questions.