# Guide Complet des Outliers (Valeurs Aberrantes) 🔍 **Identifier, comprendre et gérer les outliers** pour garantir la qualité de vos analyses statistiques. --- ## Table des Matières 1. [Qu'est-ce qu'un Outlier ?](#quest-ce-quun-outlier) 2. [Types d'Outliers](#types-doutliers) 3. [Méthodes de Détection](#méthodes-de-détection) 4. [Indicateurs Visuels](#indicateurs-visuels) 5. [Processus de Gestion](#processus-de-gestion) 6. [Impact sur les Analyses](#impact-sur-les-analyses) 7. [Bonnes Pratiques](#bonnes-pratiques) 8. [Exemples Concrets](#exemples-concrets) --- ## Qu'est-ce qu'un Outlier ? ### Définition Un **outlier** (valeur aberrante) est une observation qui s'écarte **significativement** du reste des données. ### Caractéristiques ``` Données normales : ┌─┐ ┌─┤ ├─┐ ← Distribution normale │ │ │ │ └─┤ ├─┘ └─┘ Avec outliers : ┌─┐ ┌─┤ ├─┐ │ │ │ │ ● ← Outlier élevé └─┤ ├─┘ ● └─┘ ● ← Outlier faible ``` ### Pourquoi les Outliers Sont-Ils Importants ? ⚠️ **Ils peuvent fausser vos résultats** : ```python # Moyenne SANS outlier [10, 12, 11, 13, 12] → Moyenne = 11.6 # Moyenne AVEC outlier [10, 12, 11, 13, 12, 100] → Moyenne = 26.3 # Impact : La moyenne est plus que doublée ! # Solution : Utiliser la médiane (robuste aux outliers) ``` --- ## Types d'Outliers L'application détecte **2 types** d'outliers : ### 1. Outliers Univariés 🔴 **Définition** : Valeur extrême dans **une seule variable**. **Détection** : Méthode **IQR** (Interquartile Range) **Exemple** : ```python # Surface des appartements (m²) [45, 50, 55, 60, 65, 70, 75, 500] # 500 est outlier # Calcul : Q1 = 52.5 Q3 = 71.25 IQR = Q3 - Q1 = 18.75 # Limite supérieure Upper = Q3 + 1.5×IQR = 71.25 + 1.5×18.75 = 99.375 # 500 > 99.375 → OUTLIER 🔴 ``` **Indicateur visuel** : **Cercle rouge** sur la valeur dans la table --- ### 2. Outliers Multivariés 🟣 **Définition** : Combinaison **inhabituelle** de plusieurs variables. **Détection** : Algorithme **Isolation Forest** **Exemple** : ```python # Client : Âge=18, Revenu=100000€, Historique=0 # Individuellement : # - Âge 18 : Normal # - Revenu 100000€ : Normal # - Historique 0 : Normal # Mais COMBINÉ : # → Jeune avec très haut revenu et aucun historique # → SUSPECT ! (fraude potentielle, erreur de saisie, etc.) # → OUTLIER MULTIVARIÉ 🟣 ``` **Indicateur visuel** : **Cercle violet** sur la ligne dans la table --- ## Méthodes de Détection ### Méthode 1 : IQR (Interquartile Range) #### Principe L'IQR mesure la **dispersion centrale** des données (50% central). ``` ┌────┬──────┬──────┬──────┬────┐ Min Q1 Médiane Q3 Max └─────┬─────┘ IQR ``` #### Formules ```python Q1 = 25ème percentile Q3 = 75ème percentile IQR = Q3 - Q1 Limite inférieure = Q1 - 1.5 × IQR Limite supérieure = Q3 + 1.5 × IQR # Outlier si : valeur < Limite inférieure OU valeur > Limite supérieure ``` #### Exemple Pas à Pas ```python # Données : Prix immobiliers Prix = [150k, 180k, 200k, 220k, 250k, 280k, 300k, 1500k] # Étape 1 : Trier [150, 180, 200, 220, 250, 280, 300, 1500] # Étape 2 : Calculer Q1 et Q3 Q1 = 190 (moyenne de 180 et 200) Q3 = 290 (moyenne de 280 et 300) # Étape 3 : Calculer IQR IQR = 290 - 190 = 100 # Étape 4 : Calculer les limites Limite_inf = 190 - 1.5×100 = 40 Limite_sup = 290 + 1.5×100 = 440 # Étape 5 : Identifier les outliers 150k > 40 ✅ Normal 180k > 40 ✅ Normal ... 300k < 440 ✅ Normal 1500k > 440 ❌ OUTLIER 🔴 ``` #### Avantages et Limites ✅ **Avantages** : - Simple à comprendre - Robuste aux outliers (utilise des rangs) - Fonctionne avec des données non normales ❌ **Limites** : - Ne détecte que les extrêmes univariés - Peut manquer des outliers multivariés - Seuil 1.5 arbitraire (peut être ajusté) --- ### Méthode 2 : Isolation Forest #### Principe L'algorithme **isole** les observations en créant des partitions aléatoires. Les outliers sont **plus faciles à isoler** (moins de partitions nécessaires). ``` Forêt aléatoire d'arbres de décision : - Chaque arbre partitionne les données - Les outliers ont des chemins plus courts - Score d'anomalie basé sur la longueur moyenne des chemins ``` #### Algorithme ```python from sklearn.ensemble import IsolationForest # 1. Entraîner le modèle model = IsolationForest( contamination='auto', # Détection automatique du seuil random_state=42 ) # 2. Prédire predictions = model.fit_predict(data_multivariée) # Résultats : # 1 → Normal # -1 → Outlier 🟣 ``` #### Exemple Visuel ``` Espace 2D (Âge, Revenu) : Revenu │ │ • │ • • │ • • │ • ● • ← ● = Outlier multivarié │ • • • (combinaison rare) │• • └──────────────→ Âge ``` #### Avantages et Limites ✅ **Avantages** : - Détecte les outliers **multivariés** - Ne nécessite pas de distribution normale - Fonctionne avec des données de haute dimension ❌ **Limites** : - Plus complexe à interpréter - Résultats non déterministes (aléatoire) - Peut varier selon le paramètre `contamination` --- ### Comparaison des Méthodes | Critère | IQR | Isolation Forest | |---------|-----|------------------| | **Type** | Univarié | Multivarié | | **Détection** | Valeurs extrêmes | Combinaisons rares | | **Complexité** | Simple | Complexe | | **Interprétabilité** | Élevée | Faible | | **Robustesse** | Moyenne | Élevée | | **Utilisation** | Première analyse | Analyse approfondie | --- ## Indicateurs Visuels ### Dans l'Application #### 🔴 Cercle Rouge (Outlier Univarié) **Affichage** : Sur la **cellule** spécifique **Exemple** : ``` ┌─────────────┬─────────────┬─────────────┐ │ Surface │ Prix │ Chambres │ ├─────────────┼─────────────┼─────────────┤ │ 60 │ 250000 │ 3 │ │ 75 │ 300000 │ 4 │ │ 500 🔴 │ 350000 │ 5 │ ← Outlier sur Surface │ 55 │ 280000 │ 3 │ └─────────────┴─────────────┴─────────────┘ ``` **Information au survol** : ``` Column 'Surface' value 500 is outside IQR bounds [32.5, 115.5] ``` --- #### 🟣 Cercle Violet (Outlier Multivarié) **Affichage** : Sur toute la **ligne** **Exemple** : ``` ┌─────────────┬─────────────┬─────────────┐ │ Âge │ Revenu │ Historique │ ├─────────────┼─────────────┼─────────────┤ │ 35 │ 3000 │ 12 │ │ 42 │ 4500 │ 8 │ │ 18 🟣 │ 100000 │ 0 🟣 │ ← Outlier multivarié │ 28 │ 2500 │ 5 │ └─────────────┴─────────────┴─────────────┘ ``` **Information au survol** : ``` Multivariate anomaly detected by Isolation Forest ``` --- #### 🔴🟣 Les Deux (Outlier Univarié + Multivarié) **Exemple** : ``` ┌─────────────┬─────────────┬─────────────┐ │ Surface │ Prix │ Chambres │ ├─────────────┼─────────────┼─────────────┤ │ 500 🔴🟣 │ 5000000 🔴 │ 10 🟣 │ └─────────────┴─────────────┴─────────────┘ ``` **Interprétation** : - 🔴 Surface et Prix sont des valeurs extrêmes - 🟣 La combinaison Surface+Prix+Chambres est anormale --- ## Processus de Gestion ### Workflow Recommandé ``` 1. Détection automatique ├─ IQR (univarié) └─ Isolation Forest (multivarié) 2. Investigation manuelle ├─ Survoler les indicateurs colorés ├─ Lire les raisons détaillées └─ Vérifier la source de données 3. Décision ├─ Conserver (valeurs légitimes) ├─ Corriger (erreurs de saisie) └─ Exclure (vraies anomalies) 4. Ré-analyse ├─ Réexécuter la détection ├─ Vérifier l'impact sur les résultats └─ Documenter les décisions ``` --- ### Étape 1 : Identification **Dans l'application** : 1. Importez vos données 2. Les outliers sont automatiquement détectés 3. Repérez les cercles 🔴 et 🟣 **Règle de priorité** : ``` 🔴 Univarié → Vérifier en premier (simple) 🟣 Multivarié → Vérifier ensuite (complexe) ``` --- ### Étape 2 : Investigation #### Questions à se poser **1. Est-ce une erreur de saisie ?** ```python # Exemple : Âge = 250 # → Probablement une erreur (tapez 25 au lieu de 250) # → Vérifier la source de données # → Corriger si possible ``` **2. Est-ce une valeur légitime ?** ```python # Exemple : Revenu = 1000000€ pour un CEO # → Valeur extrême mais réelle # → CONSERVER (pas d'erreur) # → Vérifier l'impact sur l'analyse ``` **3. Est-ce un événement rare ?** ```python # Exemple : Pic de ventes le Black Friday # → Valeur extrême mais explicable # → CONSERVER ou créer une variable "Black Friday" # → Modéliser séparément si nécessaire ``` **4. Est-ce une mesure défaillante ?** ```python # Exemple : Température = -50°C en été # → Erreur de capteur # → EXCLURE ou CORRIGER ``` --- ### Étape 3 : Action #### Option 1 : Corriger **Quand** : Erreur de saisie identifiée **Exemple** : ```python # Avant (erreur) Prix = 15000000 # 15 millions pour un 60 m² ?? # Après (correction) Prix = 150000 # 150k€ → réaliste # Action : Modifier la valeur dans le fichier source ``` --- #### Option 2 : Conserver **Quand** : Valeur légitime mais extrême **Stratégies** : **A. Transformation** ```python # Appliquer une transformation log prix_log = log(Prix) # Avantages : # - Réduit l'impact des extrêmes # - Normalise la distribution ``` **B. Modèle robuste** ```python # Utiliser des méthodes robustes aux outliers # - Spearman au lieu de Pearson # - Médiane au lieu de moyenne # - Isolation Forest pour la détection ``` **C. Analyse séparée** ```python # Créer deux modèles # - Modèle 1 : Données normales # - Modèle 2 : Outliers (cas particuliers) ``` --- #### Option 3 : Exclure **Quand** : - Erreur non corrigeable - Valeur influente et non représentative - Mesure défaillante **Dans l'application** : 1. Cliquez sur l'outlier (🔴 ou 🟣) 2. La ligne est marquée pour exclusion 3. Les prochaines analyses ignoreront cette ligne 4. Les exclusions sont mémorisées **⚠️ Précautions** : - Documentez la raison de l'exclusion - Vérifiez l'impact sur la taille de l'échantillon - Assurez-vous que l'exclusion est justifiée --- ### Étape 4 : Vérification #### Avant vs Après ```python # AVANT (avec outliers) Moyenne = 26.3 Écart-type = 38.5 Corrélation = 0.45 # APRÈS (sans outliers) Moyenne = 11.6 Écart-type = 1.1 Corrélation = 0.92 # Impact : L'analyse est plus représentative ``` #### Checklist de validation - [ ] Les exclusions sont **justifiées** et documentées - [ ] L'échantillon reste **suffisamment grand** (n > 30) - [ ] Les résultats sont **plus cohérents** - [ ] Pas de **sur-correction** (exclure trop de données) - [ ] Les décisions sont **reproductibles** --- ## Impact sur les Analyses ### 1. Moyenne vs Médiane ```python # Données avec outlier [10, 12, 11, 13, 12, 100] Moyenne = 26.3 📊 Biaisée par l'outlier Médiane = 12 📊 Robuste # Règle : Utiliser la médiane en présence d'outliers ``` --- ### 2. Corrélation Pearson vs Spearman ```python # Avec outlier (Pearson) r_pearson = 0.60 📊 Faible (outlier distord la relation) # Avec outlier (Spearman) r_spearman = 0.90 📊 Fort (robuste aux outliers) # Sans outlier (Pearson) r_pearson = 0.92 📊 Fort (relation réelle) # Règle : Utiliser Spearman si outliers présents ``` --- ### 3. Régression #### Impact sur les Coefficients ```python # RÉGRESSION SANS OUTLIER Prix = 50000 + 2500×Surface R² = 0.90 # RÉGRESSION AVEC OUTLIER Prix = 80000 + 1000×Surface R² = 0.60 # Impact : # - Intercept : 50000 → 80000 (biaisé) # - Surface : 2500 → 1000 (sous-estimé) # - R² : 0.90 → 0.60 (moins précis) ``` #### Influence (Leverage) Certains outliers ont un **impact disproportionné** : ```python # Outlier avec fort leverage Point : (Surface=1000, Prix=1000000) # Si exclu : # Coefficient Surface : 2500 → 2800 (+12%) # L'outlier "tire" la droite vers lui ``` --- ### 4. Tests Statistiques ```python # Test t (comparaison de moyennes) # SANS outlier Groupe A : [10, 12, 11, 13, 12] Groupe B : [15, 17, 16, 18, 17] p-value = 0.0001 ✅ Différence significative # AVEC outlier dans Groupe A Groupe A : [10, 12, 11, 13, 12, 100] # outlier ajouté Groupe B : [15, 17, 16, 18, 17] p-value = 0.15 ❌ Différence non significative # Impact : L'outlier masque la différence réelle ``` --- ## Bonnes Pratiques ### 1. Toujours Visualiser ```python # Box plot pour détecter visuellement import matplotlib.pyplot as plt plt.boxplot(data['Prix']) plt.show() # Box plot avec outliers marqués # ┌─┐ # │ │ ● ← Outlier # ├─┤ # │ │ # └─┘ ``` --- ### 2. Ne Pas Exclure Automatiquement ```python ❌ MAUVAIS if is_outlier(valeur): exclure(valeur) # Automatique ✅ BON if is_outlier(valeur): investiguer(valeur) # Manuel si erreur: corriger_ou_exclure() sinon: conserver() ``` --- ### 3. Documenter les Décisions ```python # Journal des exclusions exclusions = { 'ligne_42': { 'raison': 'Erreur de saisie (âge=250)', 'action': 'Corrigé en 25', 'date': '2025-01-11' }, 'ligne_87': { 'raison': 'Capteur défaillant (température=-50)', 'action': 'Exclu', 'date': '2025-01-11' } } ``` --- ### 4. Comparer Avec/Sans ```python # Analyse 1 : Tous les données model1 = regression(data_complete) r2_1 = 0.75 # Analyse 2 : Sans outliers model2 = regression(data_sans_outliers) r2_2 = 0.92 # Conclusion : Les outliers impactent significativement # → Exclusion justifiée si R² améliore et taille échantillon OK ``` --- ### 5. Utiliser des Méthodes Robustes ```python # Méthodes robustes aux outliers Moyenne → Médiane Écart-type → Écart interquartile (IQR) Pearson → Spearman OLS → Régression robuste (Huber, RANSAC) ``` --- ## Exemples Concrets ### Exemple 1 : Immobilier **Données** : Prix, Surface, Chambres ``` ┌───────┬─────────┬──────────┬──────────┐ │ ID │ Surface │ Prix │ Chambres │ ├───────┼─────────┼──────────┼──────────┤ │ 1 │ 60 │ 250000 │ 3 │ │ 2 │ 75 │ 300000 │ 4 │ │ 3 │ 500 🔴 │ 350000 │ 5 │ ← Outlier univarié │ 4 │ 55 │ 280000 │ 3 │ │ 5 │ 80 │ 320000 │ 4 │ │ 6 │ 70 │ 15000000 🔴│ 3 │ ← Outlier univarié │ 7 │ 65 │ 290000 │ 3 │ └───────┴─────────┴──────────┴──────────┘ ``` **Analyse** : - **Ligne 3** : Surface = 500 m² → Outlier (trop grand pour l'échantillon) - **Ligne 6** : Prix = 15M€ → Outlier (prix extrême) **Action** : ``` Investigation : - Ligne 3 : Vérifié → Château luxueux (légitime) - Ligne 6 : Vérifié → Erreur de saisie (15M au lieu de 150k) Décision : - Ligne 3 : CONSERVER (valeur réelle) - Ligne 6 : CORRIGER (150k€) ``` --- ### Exemple 2 : E-commerce **Données** : Âge, Revenu, Montant_Achat ``` ┌───────┬──────┬─────────┬──────────────┐ │ ID │ Âge │ Revenu │ Montant_Achat │ ├───────┼──────┼─────────┼──────────────┤ │ 1 │ 35 │ 3000 │ 150 │ │ 2 │ 42 │ 4500 │ 200 │ │ 3 │ 28 │ 2500 │ 100 │ │ 4 │ 18 🟣│ 100000 🟣│ 0 🟣 │ ← Outlier multivarié │ 5 │ 55 │ 5000 │ 250 │ └───────┴──────┴─────────┴──────────────┘ ``` **Analyse** : - **Ligne 4** : - Âge = 18 (normal) - Revenu = 100k€ (normal) - Montant = 0 (normal) - **MAIS** : Jeune avec très haut revenu et aucun achat → SUSPECT **Investigation** : ``` Cas 1 : Erreur de saisie (revenu=10000€) Cas 2 : Compte frauduleux Cas 3 : Héritage récent (légitime) Cas 4 : Erreur de catégorisation (professionnel vs personnel) ``` **Action** : ``` Si erreur → Corriger Si fraude → Exclure et signaler Si légitime → Créer une variable "Profil_Riche_Jeune" ``` --- ### Exemple 3 : Santé **Données** : IMC, Tension, Cholestérol ``` ┌───────┬──────┬─────────┬────────────┐ │ ID │ IMC │ Tension │ Cholestérol│ ├───────┼──────┼─────────┼────────────┤ │ 1 │ 22 │ 120 │ 180 │ │ 2 │ 25 │ 130 │ 200 │ │ 3 │ 60 🔴│ 180 🔴 │ 350 🔴 │ ← Outlier univarié │ 4 │ 23 │ 125 │ 190 │ │ 5 │ 28 │ 140 │ 220 │ └───────┴──────┴─────────┴────────────┘ ``` **Analyse** : - **Ligne 3** : IMC=60 (obésité morbide), Tension=180 (hypertension sévère), Cholestérol=350 (très élevé) **Investigation** : ``` Cas 1 : Patient réel (pathologie sévère) Cas 2 : Erreur de mesure (unités ?) Cas 3 : Données agrégées par erreur ``` **Action** : ``` Si patient réel : → CONSERVER et analyser séparément (cas sévères) Si erreur : → CORRIGER ou EXCLURE ``` --- ## 🎯 Checklist de Gestion des Outliers ### Détection - [ ] Identifier les outliers univariés (🔴 cercles rouges) - [ ] Identifier les outliers multivariés (🟣 cercles violets) - [ ] Compter le nombre d'outliers - [ ] Vérifier la proportion (< 5% des données) ### Investigation - [ ] Vérifier la source de données - [ ] Rechercher des erreurs de saisie - [ ] Consulter un expert du domaine - [ ] Explorer les causes possibles ### Action - [ ] Corriger les erreurs identifiées - [ ] Conserver les valeurs légitimes - [ ] Exclure les vraies anomalies - [ ] Documenter toutes les décisions ### Validation - [ ] Comparer les résultats avec/sans - [ ] Vérifier la taille de l'échantillon final - [ ] S'assurer que la distribution est cohérente - [ ] Valider avec des graphiques --- ## 📊 Fonctionnalités de l'Application ### Détection Automatique L'application détecte automatiquement les outliers à l'importation : ```python # Méthode 1 : IQR (univarié) uni_outliers = detect_univariate_outliers( data, columns=numeric_columns ) # Méthode 2 : Isolation Forest (multivarié) multi_outliers = detect_multivariate_outliers( data, columns=numeric_columns ) # Fusion structurée result = merge_outliers_structured(uni_outliers, multi_outliers) ``` --- ### Interface Utilisateur #### Indicateurs Visuels - 🔴 **Cercle rouge** : Outlier univarié (sur la cellule) - 🟣 **Cercle violet** : Outlier multivarié (sur la ligne) - 🔴🟣 **Les deux** : Les deux types d'outliers #### Information au Survol ```javascript // Exemple de tooltip { "index": 42, "reasons": [ "Column 'Surface' value 500 is outside IQR bounds [32.5, 115.5]", "Multivariate anomaly detected by Isolation Forest" ] } ``` --- ### Exclusion et Mémorisation ```python # Marquer une ligne pour exclusion excluded_indices = [42, 87, 156] # Ré-analyser sans ces lignes new_analysis = analyze_with_exclusions( data, excluded_indices=excluded_indices ) # Les exclusions sont mémorisées dans la session ``` --- ## 🚀 Conclusion Les outliers sont à la fois un **défi** et une **opportunité** : ⚠️ **Défi** : - Peuvent fausser vos analyses - Nécessitent une investigation minutieuse - Exiger des décisions subjectives ✅ **Opportunité** : - Peuvent révéler des phénomènes intéressants - Signalent des erreurs dans les données - Permettent d'améliorer la qualité des analyses **Points clés** : 1. **Toujours investiguer** avant d'exclure 2. **Documenter** vos décisions 3. **Comparer** avec/sans outliers 4. **Utiliser** des méthodes robustes 5. **Visualiser** pour comprendre --- **Version** : 1.0 **Projet** : Application d'Analyse de Données 🔗 **Voir aussi** : [Guide Corrélation](CORRELATION_GUIDE.md) | [Guide Régression](REGRESSION_GUIDE.md)