Chapitre 3 Récupération & Préparation des Données PDF
Document Details
Uploaded by Deleted User
Tags
Summary
This document provides an introduction to data preparation in data science. It covers data acquisition, exploration, cleaning, and transformation techniques, along with code examples in Python using libraries like Pandas and OpenCV.
Full Transcript
# Chapitre 3: Récupération & préparation des données ## Plan du chapitre 1. Introduction 2. Acquisition des données 3. Exploration des données 4. Nettoyage des données 5. Transformation des données ## 01 Introduction - Les Data Scientists dépensent 45% à 60% de leur temps collecter, organiser et...
# Chapitre 3: Récupération & préparation des données ## Plan du chapitre 1. Introduction 2. Acquisition des données 3. Exploration des données 4. Nettoyage des données 5. Transformation des données ## 01 Introduction - Les Data Scientists dépensent 45% à 60% de leur temps collecter, organiser et préparer les données, le nettoyage des données prenant en compte plus d'un quart de leur journée. - Cela leur fait perdre un temps précieux sur leurs tâches principales, telles que la sélection, la formation et le déploiement du modèle. - Cette étape joue un rôle fondamental dans la chaîne du processus Data Science et impacte directement les résultats des modèles et des analyses qui en découlent. - Une étape de préparation des données soigneuse garantit que les données utilisées dans les modèles sont fiables, précises et adaptées à la tâche spécifique. ### Introduction: Voici quelques raisons pour lesquelles la préparation des données est importante dans le cycle de la science des données : 1. **Qualité des Modèles**: Des données propres et bien préparées conduisent à des modèles plus précis et fiables. Les erreurs dans les données d'entrée peuvent être amplifiés dans les résultats du modèle. 2. **Prise de Décision**: Les décisions basées sur des données non ou mal préparées peuvent conduire à des conclusions erronées. Une préparation minutieuse des données assure la qualité des informations sur lesquelles les décisions sont prises contribuant ainsi à des analyses plus fiables. 3. **Efficacité du Processus**: Une bonne préparation des données permet aux Data Scientists de consacrer moins de temps à la résolution de problèmes liés à la qualité des données pendant le processus de modélisation, ce qui rend l'ensemble du cycle de développement des modèles plus efficace. 4. **Adaptabilité**: Les jeux de données peuvent évoluer et changer au fil du temps. Une étape de préparation des données bien conçue permet de s'adapter aux nouvelles données et aux changements de contexte. ## 02 Acquisition des données - L'acquisition de données est simple - Cela peut impliquer d'importer directement des données à partir de fichiers CSV, de feuilles de calcul Excel ou de bases de données SQL, par exemple. - La meilleure technique de collecte de données dépend des besoins spécifiques, de la nature du projet et du type de données dans le Dataset. - Ils existent plusieurs types de Datasets selon du domaine d'application et des besoins spécifiques du projet. ### Acquisition de données: Les types de Dataset les plus fréquemment utilisés dans la Data Science : 1. **Dataset Tabulaire**: Les données sont organisées sous forme de tableaux, avec des lignes représentant des observations et des colonnes représentant des variables ou des caractéristiques. - Exemples: fichier CSV/Excel, structure d'arbre (fichier JSON/XML) structure de graphe (fichier RDF). 2. **Dataset Image**: Les données sont composées d'images. - Exemples : Bases de données d'images médicales, ensembles de données d'apprentissage en vision par ordinateur. ### Acquisition de données: Ils existent d'autres types de Dataset dans la Data Science : 1. **Dataset Temporel**: Les données sont collectées à des moments spécifiques. - Exemples: Séries temporelles financières, données météorologiques 2. **Dataset Textuel**: Les données sont constituées de textes ou de documents. - Exemples: articles de presse, commentaires en ligne 3. **Dataset Audio/Vidéo**: Les données sont des enregistrements audio et des séquences vidéo. - Exemples: enregistrements de parole, vidéos de surveillance ### Lecture d'un Dataset Tabulaire ```python # Importer la Bibliothèque Pandas import pandas as pd # Lecture d'un fichier CSV chemin_du_Dataset = 'chemin/vers/le/Dataset.csv' DataFrame data = pd.read_csv(chemin_du_Dataset) # Lecture d'un fichier Excel chemin_du_Dataset = 'chemin/vers/le/Dataset.xls' DataFrame data = pd.read_excel(chemin_du_Dataset) # Lecture d'un fichier Texte chemin_du_Dataset = 'chemin/vers/le/Dataset.txt' DataFrame data = pd.read_table(chemin_du_Dataset) ``` ### Lecture d'un Dataset Image Local Pour lire un Dataset Image en local, on peut utiliser la fonction imread() de la bibliothèque OpenCV ou bien de la bibliothèque Matplotlib. ```python chemin_image = 'chemin/vers/image.jpg' # Bibliothèque OpenCV import cv2 image = cv2.imread(chemin_image) # Bibliothèque Matplotlib import matplotlib.pyplot as mpimg image = mpimg.imread(chemin_image) ``` ### Lecture d'un Dataset Image En Ligne Afin de charger un Dataset d'images en ligne, on peut utiliser la fonction load_data() de divers bibliothèques dédiées à la récupération de Datasets populaires, telles que: - TensorFlow Datasets (TFDS) - sklearn. Datasets - keras. Datasets - ... ## 03 Exploration des données - La phase d'exploration des données est une étape importante dans le processus de travail en Data Science. - Après avoir acquis ou récupéré les données nécessaires, l'exploration vise à comprendre la nature des données, à identifier des tendances, des motifs et des relations, et à préparer les données pour une analyse plus approfondie. - Cela permet de découvrir des informations sur l'uniformité des données ou sur les éventuelles divergences, y compris les valeurs nulles, les erreurs, les incohérences et les anomalies. ### Exploration des données: Soit un Dataset des employés (Employees.csv). Il contient 8 colonnes : 1. prénom, 2. sexe 3. date de début 4. dernière connexion 5. Salaire 6. pourcentage de bonus 7. haute direction 8. équipe. ### Affichage d'une partie du Dataset ```python import pandas as pd data = pd.read_csv('employees.csv') # Affichage des 5 premières lignes du Dataset : data.head() # Affichage des 10 premières lignes du Dataset : data.head(10) # Affichage des 5 dernières lignes du Dataset : data.head(-5) ``` ### La forme des données du Dataset ```python data.shape # (1000, 8) ``` Cela signifie que cet ensemble de données comporte 1 000 lignes et 8 colonnes. ### Statistiques descriptives pour les colonnes numérique ```python data.describe() ``` La fonction describe() applique des calculs statistiques de base sur l'ensemble de données comme les valeurs extrêmes, le nombre d'écarts types de points de données, etc. Toute valeur manquante ou valeur NaN est automatiquement ignorée. La fonction décrire() donne une bonne image de la distribution des données. Pour obtenir la description des colonnes catégorielles du Dataset, ajouter include ='all' dans la fonction describe() ### Informations sur les types de données et les valeurs manquantes ```python data.info() ``` ### Compter le nombre d'éléments distincts (uniques) - dans le Dataset ```python data.nunique() ``` - dans un axe spécifié ```python data['salary'].nunique() ``` ### Nombre de valeurs manquantes dans le Dataset ```python data.isnull().sum() ``` Chaque colonne comporte un nombre différent de valeurs manquantes comme le sexe a 145 valeurs manquantes et le salaire 0. ### Autres fonctions utiles | Méthode | Description | |---|---| | head([n]), tail([n]) | Premiers/derniers n lignes | | describe() | Statistiques (pour les colonnes numériques) | | max(), min() | Valeur max/min des colonnes numériques | | mean(), median() | Valeur Moyenne/médiane des colonnes numériques | | std() | Déviation standard | | sample([n]) | Échantillon aléatoire de la base | ### Séparation des caractéristiques et de la variable cible #### Méthode 1: ```python X = data.iloc[:, :-1] # Caractéristiques y = data.iloc[:, -1] # Variable cible ``` #### Méthode 2: ```python X = data.drop('target', axis=1) y = data['target'] ``` ## 04 Nettoyage des données - Le nettoyage des données joue un rôle fondamental dans le domaine du Data Science - Il s'agit du processus d'identification et de correction des erreurs, lacunes ou incohérences présentes dans le Dataset - Cette étape préliminaire revêt une importance capitale, car des données non traitées peuvent fausser les prédictions et influencer négativement la prise de décision ### Supprimer les doublons et les colonnes inutiles - Supprimer les doublons ```python data_no_duplicates = data.drop_duplicates() ``` - Supprimer des colonnes inutiles ```python colonnes_inutiles = ['colonne_inutile1', 'colonne_inutile2'] data_no_duplicates = data.drop(columns=colonnes_inutiles) ``` ### Gérer les valeurs manquantes Pour gérer les valeurs manquantes, il peut y avoir plusieurs cas, comme supprimer les lignes contenant NaN ou les remplacer par la moyenne, la médiane, le mode ou une autre valeur : - Supprimer toutes les valeurs manquantes : ```python data_no_missing_values = data.dropna() ``` - Supprimer les valeurs manquantes d'une colonne donnée: ```python data_no_missing_values = data.dropna(subset=['nom_colonne']) ``` - Remplacer les valeurs manquantes par la moyenne de la colonne: ```python data['nom_colonne'].fillna(data['nom_colonne'].mean(), inplace=True) ``` - Remplacer les valeurs manquantes par la médiane de la colonne : ```python data['nom_colonne'].fillna(data['nom_colonne'].median(), inplace=True) ``` - Remplacer les valeurs manquantes par le mode de la colonne (la valeur qui apparaît le plus fréquemment dans cette colonne). Ceci ne s'applique que pour les variables catégoriques : ```python data['nom_colonne'].fillna(data['nom_colonne'].mode()[0], inplace=True) ``` - Remplacer les valeurs manquantes par une autre valeur : ```python data['nom_colonne'].fillna('valeur_specifique', inplace=True) ``` ### Gérer les valeurs manquantes: Exemple | Pays | Age | Salaire | Achat | |---|---|---|---| | France | 44 | 72000 | No | | Spain | 27 | 48000 | Yes | | Germany | 30 | 54000 | No | | Spain | 38 | 61000 | No | | Germany | 40 | 63777.777777778 | Yes | | France | 35 | 58000 | Yes | | Spain | 38.777777778 | 52000 | No | | France | 48 | 79000 | Yes | | Germany | 50 | 83000 | No | | France | 37 | 67000 | Yes | ### Gérer les valeurs aberrantes La gestion des valeurs aberrantes (outliers) commence par les identifier et de décider comment les traiter soit en les supprimant ou en les remplaçant par la moyenne, la médiane, le mode ou une autre valeur : - Identifier des valeurs aberrantes: Ils existent différentes méthodes pour détecter les valeurs aberrantes, telles que la méthode des boîtes à moustaches (boxplot), le z-score, l'IQR (écart interquartile), ... - Identifier les valeurs aberrantes dans une colonne spécifique ```python colonne_aberrante = 'nom_colonne' Q1 = data[colonne_aberrante].quantile(0.25) Q3 = data[colonne_aberrante].quantile(0.75) IQR = Q3 - Q1 bornes_inf = Q1 - 1.5 * IQR bornes_sup = Q3 + 1.5 * IQR ``` - Supprimer les valeurs aberrante : ```python data_filtered = data[(data[colonne_aberrante] > bornes_inf) & (data[colonne_aberrante] < bornes_sup)] ``` - Remplacer les valeurs aberrante par la médiane de la colonne : ```python import numpy as np data[colonne_aberrante] = np.where( (data[colonne_aberrante] < bornes_inf) | (data[colonne_aberrante] > bornes_sup), data[colonne_aberrante].median(), data[colonne_aberrante] ) ``` ## 05 Transformation des données - La transformation des données occupe une place importante dans le domaine du Data Science. - Il s'agit d'un processus qui vise à structurer, organiser et préparer les données de manière à les rendre plus accessibles et exploitables. - Cette étape permet de convertir les données d'un format, d'une structure ou d'une valeur à un autre. - La transformation des données facilite ainsi la création de modèles et d'analyses plus robustes contribuant ainsi à des analyses plus efficaces et à des prises de décision éclairées. ### Convertir les colonnes au format datetime ```python data['colonne_date'] = pd.to_datetime(data['colonne_date']) ``` Il est également possible de spécifier le format. ```python data['colonne_date'] = pd.to_datetime(data['colonne_date'], format="%Y-%m-%d %H:%M:%S") ``` ### Convertir les colonnes au format numérique ```python data['age'] = pd.to_numeric(data['age'], errors='coerce') ``` ### Encodage des caractéristiques - La plupart des Datasets réels en Data Science présentent une diversité de types de données (catégorielles, numériques) - Certains modèles d'apprentissage ne traitent pas directement les données catégorielles, nécessitant ainsi une conversion de celles-ci en données numériques pour les intégrer au modèle - Il existe plusieurs options pour l'encodage des caractéristiques comme le Label Encoding et le one Hot Encoding ### Encodage ordinal (Label Encoding) - Les catégories (variables ordinales) sont attribuées à des nombres entiers en respectant un ordre spécifique. - Exemple: Pour le niveau : 1 représente "faible", 2 "moyen" et 3 "élevé". - Avantage: Introduit un ordre pour les catégories, ce qui peut être utile si cela a du sens dans le contexte. - Inconvénient: Peut être problématique si l'ordre n'a pas de signification réelle. ### Encodage ordinal (Label Encoding) ```python # Import de label encoder from sklearn.preprocessing import LabelEncoder # Création d'une instance de LabelEncoder label_encoder = LabelEncoder() # Encodage d'étiquette à la colonne 'niveau' data['niveau'] = label_encoder.fit_transform(data['niveau']) ``` ### Encodage ordinal (Label Encoding) - Dans le contexte du label encoding, l'ordre des valeurs numériques attribuées aux catégories dépend de la façon dont le label encoder les a encodées. Par défaut, le label encoder attribue des valeurs numériques dans l'ordre d'apparition des catégories dans les données. Cela signifie que la première catégorie rencontrée recevra la valeur 0, la deuxième la valeur 1, et ainsi de suite - Cependant, il peut y avoir des cas où on voudrait spécifier explicitement l'ordre des catégories. Pour cela, on peut utiliser la méthode fit du label encoder avec les catégories ordonnées comme argument. ### Encodage ordinal (Label Encoding) ```python # Import de label encoder from sklearn.preprocessing import LabelEncoder # Création d'une instance de LabelEncoder label_encoder = LabelEncoder() # Définir explicitement l'ordre des catégories ordered_categories = np.array(['débutant', 'intermédiaire', 'avance']) # Appliquer le label encoder avec l'ordre spécifié label_encoder.fit(ordered_categories) label_encoder.classes_ = ordered_categories data['niveau'] = label_encoder.transform(data['niveau']) ``` ### Encodage ordinal (Label Encoding): Limites du Label Encoding Label Encoding attribue un numéro unique (à partir de 0) à chaque classe de données. Cela peut conduire à la génération de problèmes prioritaires lors de la formation du modèle d'ensembles de données. - Une étiquette avec une valeur élevée peut être considérée comme ayant une priorité élevée par rapport à une étiquette ayant une valeur inférieure. ### Encodage ordinal (Label Encoding): Limites du Label Encoding: Exemple L'attribut "Pays" ayant des classes de sortie France, Espagne, Allemagne. Sur Label Encoding, cette colonne permet de remplacer le France par 0, Espagne par 1 et Allemagne par 2. - On peut interpréter que Allemagne a une priorité élevée sur le Espagne et France lors de la formation du modèle | Pays | Encode | |---|---| | France | 0 | | Spain | 1 | | Germany | 2 | | Spain | 1 | | Germany | 0 | | France | 2 | | Spain | 0 | | France | 1 | | Germany | 2 | | France | 0 | ### Encodage ordinal (Label Encoding): Limites du Label Encoding En réalité, il n'y a pas de relation de priorité entre ces pays : **Solution: Utiliser plutôt le One-Hot Encoding** | Pays | France | Germany | Spain | |---|---|---|---| | France | 1 | 0 | 0 | | Spain | 0 | 0 | 1 | | Germany | 0 | 1 | 0 | | Spain | 0 | 0 | 1 | | Germany | 0 | 1 | 0 | | France | 1 | 0 | 0 | | Spain | 0 | 0 | 1 | | France | 1 | 0 | 0 | | Germany | 0 | 1 | 0 | | France | 1 | 0 | 0 | ### Encodage à chaud (One-Hot Encoding) - Chaque valeur de la catégorie (variable nominale) est représentée par une colonne binaire (0 ou 1) dans une colonne distincte. - Les variables obtenus sont nommés des variables factices (dummy variables) - Exemple : Pour la colonne couleur avec les valeurs "Rouge", "Vert" et "Bleu", elle va être éclatée en 3 colonnes (une pour chaque valeur) - Avantage: Préservation de l'information catégorielle sans introduire d'ordre artificiel. Adapté lorsque le nombre de catégories est limité. - Inconvénient: Peut entraîner une augmentation significative de la dimensionnalité des données. ### Encodage à chaud (One-Hot Encoding): Méthode 1: Bibliothèque Sci-kit Learn ```python # Import du One Hot Encoder from sklearn.preprocessing import OneHotEncoder # Création d'une instance de OneHot Encoder one_hot_encoder = OneHotEncoder() # Encodage d'étiquette à la colonne couleur' data['couleur']= one_hot_encoder.fit_transform(data['couleur']).toarray() ``` ### Encodage à chaud (One-Hot Encoding): Méthode 2: Bibliothèque Pandas ```python # Encodage d'étiquette à la colonne couleur one_hot_encoder = pd.get_dummies(data, columns=['couleur']) ``` ### Encodage à chaud (One-Hot Encoding): Limites du One-Hot Encoding - Le principal inconvénient du One-Hot Encoding est appelé "piège des variables factices" - Il s'agit d'un scénario dans lequel certains attributs sont fortement corrélés et une variable prédit la valeur des autres. - Cela implique qu'une variable factice peut être prédite à l'aide d'autres variables factices. - Pour N catégories, on peut créer (N-1) variables factices. ### Encodage à chaud (One-Hot Encoding): Limites du One-Hot Encoding: Exemple La catégorie "sexe" ayant 2 valeurs possibles "Homme" (0 ou 1) et Femme (1 ou 0). One-Hot Encoding permet de créer 2 variables factices. - Cela peut entraîner une redondance, car si une personne n'est pas un homme, dans ce cas, cette personne est une femme. - Pas besoin d'utiliser les 2 variables (Une seule suffit). Cela nous protégera du piège des variables factices. ## Mise à l'échelle des caractéristiques - La plupart du temps, les données proviennent avec des ordres de grandeurs différents. - Un algorithme de Machine Learning a tendance à attribuer une importance aux valeurs les plus grandes et à considérer les valeurs plus petites comme les valeurs les plus faibles, quelle que soit l'unité des valeurs. - Cette différence d'échelle peut conduire à de mauvaises performances. ### Mise à l'échelle des caractéristiques: Exemple - L'âge peut varier de 20 à 100 ans, tandis que le salaire peut se chiffrer en milliers ou en dizaines de milliers. - La variable "Salaire" peut dominer et même écraser la variable "Age". - La variable "Age" ne sera pas prise en compte dans le modèle alors qu'elle peut avoir un impact sur la variable "Achat". ### Mise à l'échelle des caractéristiques Si nous prenons 2 échantillons de la base et nous calculons la distance Euclidienne : | Pays | Age | Salaire | Achat | |---|---|---|---| | France | 44 | 72000 | No | | Spain | 27 | 48000 | Yes | | Germany | 30 | 54000 | No | | Spain | 38 | 61000 | No | | Germany | 40 | 63777.7778 | Yes | | France | 35 | 58000 | Yes | | Spain | 38.7778 | 52000 | No | | France | 48 | 79000 | Yes | | Germany | 50 | 83000 | No | | France | 37 | 67000 | Yes | ### Mise à l'échelle des caractéristiques - D'où la nécessité d'utiliser une technique permettant de standardiser les fonctionnalités indépendantes présentes dans les données dans une plage fixe → Mise à l'échelle des caractéristiques. - Cela garantit qu'aucune fonctionnalité ne domine le modèle simplement en raison de son échelle et améliore les performances des algorithmes. - Des techniques existent pour le redimensionnent les caractéristiques afin qu'elles soient à la même échelle telles que la standardisation et la normalisation. - Ceci est essentiel pour plusieurs algorithmes d'apprentissage automatique, car cela évite que des caractéristiques à grande échelle dominent le processus d'apprentissage. ## Standardisation - La Standardisation utilise généralement le StandardScaler qui standardise les caractéristiques en soustrayant la moyenne (µ) et en divisant par l'écart type (σ). - Cela donne à chaque caractéristique une moyenne de 0 et un écart type de 1. - Elle remet à l'échelle les données dans la plage [-1,1]. Cependant, les valeurs aberrantes seront conservées. - Mathématiquement, cela est exprimé par la formule $x_i - \mu / \sigma$. ### Standardisation ```python # Import de la bibliothèque StandardScaler from sklearn.preprocessing import StandardScaler # Créer une instance du Standard Scaler scaler = StandardScaler() # Adapter le scaler aux données et transformer les données. data['nom_colonne'] = scaler.fit_transform(data['nom_colonne']) ``` ## Normalisation La normalisation des caractéristiques peut être appliquée avec différentes techniques: - Min-Max Scaling : ramène les valeurs dans une plage spécifique (entre 0 et 1). - Mean Normalization: centre les données autour de zéro. - Max Absolute Scaling: divise chaque valeur par la valeur absolue maximale. - Robust Scaling: utilise la médiane et l'écart interquartile pour rendre la normalisation moins sensible aux valeurs aberrantes. Le choix de la technique dépend du type de données et des exigences spécifiques du problème, permettant ainsi d'optimiser les performances des algorithmes d'apprentissage automatique. ### Normalisation Min-Max Scaling - La technique de normalisation Min-Max Scaling pour la mise à l'échelle des caractéristiques redimensionne les données dans dans la plage [0,1]. - Cela peut être utile dans certains cas où toutes les valeurs ont besoin de la même échelle positive. Cependant, les valeurs aberrantes des données sont perdues. - La formule de normalisation min-max pour une caractéristique x est donnée par : $x_i - x_{min} / x_{max} - x_{min}$. ### Normalisation Min-Max Scaling ```python # Import de MinMaxScaler from sklearn.preprocessing import MinMaxScaler # Initialisation du MinMaxScaler scaler = MinMaxScaler() # Normaliser les données avec MinMaxScaler data['nom_colonne'] = scaler.fit_transform(data['nom_colonne']) ```