{"id":589097,"date":"2025-08-04T08:45:06","date_gmt":"2025-08-04T07:45:06","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=589097"},"modified":"2025-09-11T14:53:24","modified_gmt":"2025-09-11T13:53:24","slug":"nettoyage-des-donnees-en-science-des-donnees","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/fr\/pycharm\/2025\/08\/nettoyage-des-donnees-en-science-des-donnees\/","title":{"rendered":"Nettoyage des donn\u00e9es en science des donn\u00e9es"},"content":{"rendered":"<p>Dans cette s\u00e9rie d&#8217;articles consacr\u00e9s \u00e0 la science des donn\u00e9es, nous avons parl\u00e9 de la <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/how-to-get-data\/\">source des donn\u00e9es<\/a> et vu comment <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/\" target=\"_blank\" rel=\"noreferrer noopener\">explorer ces donn\u00e9es avec pandas<\/a>, mais s&#8217;il s&#8217;agit d&#8217;un excellent exercice, il ne refl\u00e8te pas tout \u00e0 fait ce qu&#8217;il convient d&#8217;appeler les <em>donn\u00e9es r\u00e9elles<\/em>. Les donn\u00e9es utilis\u00e9es au cours des formations sont g\u00e9n\u00e9ralement nettoy\u00e9es et pr\u00e9par\u00e9es pour se concentrer sur l&#8217;apprentissage sans avoir \u00e0 se pencher sur le processus de nettoyage, mais les donn\u00e9es de production contiennent souvent des probl\u00e8mes et sont parfois mal organis\u00e9es. Ces donn\u00e9es doivent \u00eatre nettoy\u00e9es pour produire des informations exploitables, et c&#8217;est le sujet de cet article de blog.<\/p>\n<p>Les probl\u00e8mes de donn\u00e9es peuvent \u00eatre li\u00e9s au comportement des donn\u00e9es en tant que telles, \u00e0 la mani\u00e8re dont elles ont \u00e9t\u00e9 collect\u00e9es, ou m\u00eame \u00e0 la fa\u00e7on dont elles ont \u00e9t\u00e9 saisies. Des erreurs ou des oublis peuvent se produire \u00e0 tous les stades du parcours.<\/p>\n<p>Nous allons voir ici le nettoyage des donn\u00e9es et non pas leur transformation. Le nettoyage des donn\u00e9es permet de s&#8217;assurer que les conclusions que vous en tirez peuvent \u00eatre g\u00e9n\u00e9ralis\u00e9es \u00e0 la population que vous d\u00e9finissez. Par contraste, la transformation des donn\u00e9es implique notamment la conversion des formats, la normalisation et l&#8217;agr\u00e9gation.<\/p>\n<h2 class=\"wp-block-heading\">Pourquoi le nettoyage des donn\u00e9es est-il important ?<\/h2>\n<p>Il faut commencer par comprendre ce que repr\u00e9sentent les ensembles de donn\u00e9es. La plupart des ensembles de donn\u00e9es constituent un \u00e9chantillon repr\u00e9sentatif d&#8217;une population plus large et, en travaillant avec cet \u00e9chantillon, vous \u00eates en mesure d&#8217;extrapoler (ou de <em>g\u00e9n\u00e9raliser<\/em>) vos conclusions au reste de la population. Par exemple, nous avons utilis\u00e9 un <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es<\/a> dans les deux articles pr\u00e9c\u00e9dents. Cet ensemble de donn\u00e9es porte essentiellement sur les ventes de maisons, mais il ne couvre qu&#8217;une petite zone g\u00e9ographique, une courte p\u00e9riode de temps et potentiellement pas toutes les maisons dans cette zone et cette p\u00e9riode. Il s&#8217;agit d&#8217;un \u00e9chantillon d&#8217;une population plus large.<\/p>\n<p>Vos donn\u00e9es doivent constituer un \u00e9chantillon repr\u00e9sentatif de l&#8217;ensemble de la population. Par exemple, toutes les ventes de maisons dans cette zone pendant une p\u00e9riode donn\u00e9e. Pour s&#8217;assurer que les donn\u00e9es constituent bien un \u00e9chantillon repr\u00e9sentatif de la population dans son ensemble, nous devons d&#8217;abord d\u00e9finir les limites de cette population.<\/p>\n<p>Comme vous le savez, il est souvent difficile de travailler avec l&#8217;ensemble de la population, \u00e0 l&#8217;exception peut-\u00eatre des donn\u00e9es de recensement, et vous devez donc poser des limites. Ces limites peuvent \u00eatre g\u00e9ographiques, d\u00e9mographiques, temporelles, bas\u00e9es sur des actions (notamment transactionnelles) ou propres \u00e0 un domaine. La population peut \u00eatre d\u00e9finie de nombreuses fa\u00e7ons, mais pour g\u00e9n\u00e9raliser vos donn\u00e9es de fa\u00e7on fiable, vous devez la d\u00e9finir avant de proc\u00e9der au nettoyage des donn\u00e9es.<\/p>\n<p>En r\u00e9sum\u00e9, si vous pr\u00e9voyez d&#8217;utiliser vos donn\u00e9es \u00e0 des fins d&#8217;analyse, quelle qu&#8217;elle soit, ou de <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2022\/06\/start-studying-machine-learning-with-pycharm\/\">machine learning<\/a>, vous devez prendre le temps de nettoyer les donn\u00e9es, afin d&#8217;obtenir des informations fiables et de les extrapoler au <em>monde r\u00e9el<\/em>. Le nettoyage des donn\u00e9es permet de r\u00e9aliser des analyses plus pr\u00e9cises et, concernant le machine learning, des gains de performances.<\/p>\n<p>Si vous ne nettoyez pas les donn\u00e9es, vous risquez de ne pas pouvoir g\u00e9n\u00e9raliser de fa\u00e7on fiable vos conclusions au reste de la population, de produire des statistiques biais\u00e9es et des visualisations incorrectes. Si vous utilisez vos donn\u00e9es pour entra\u00eener des mod\u00e8les de machine learning, cela risque \u00e9galement d&#8217;entra\u00eener des erreurs et des pr\u00e9dictions incorrectes.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/jb.gg\/m8p92h\" target=\"_blank\" rel=\"noopener\"><br \/>Essayez PyCharm Professional gratuitement<br \/><\/a><\/p>\n<h2 class=\"wp-block-heading\">Exemples de nettoyage des donn\u00e9es<\/h2>\n<p>Nous allons voir quelles sont les cinq t\u00e2ches \u00e0 ex\u00e9cuter pour nettoyer vos donn\u00e9es. Cette liste n&#8217;est pas exhaustive, mais elle constitue un excellent point de d\u00e9part pour aborder des donn\u00e9es r\u00e9elles.<\/p>\n<h3 class=\"wp-block-heading\">D\u00e9duplication des donn\u00e9es<\/h3>\n<p>Les doublons sont un probl\u00e8me parce qu&#8217;ils peuvent biaiser vos donn\u00e9es. Imaginez que vous tracez un histogramme repr\u00e9sentant la fr\u00e9quence des prix de vente. Les doublons de valeurs faussent l&#8217;histogramme repr\u00e9sentant la distribution des prix.<\/p>\n<p>Pour \u00eatre plus pr\u00e9cis, lorsque nous parlons de duplication dans les ensembles de donn\u00e9es, nous parlons de doublons de lignes de donn\u00e9es, chacune d&#8217;entre elles correspondant \u00e0 une observation unique. Les colonnes comportent aussi des doublons, ce qui est pr\u00e9visible. Nous parlons uniquement des doublons d&#8217;observations.<\/p>\n<p>Heureusement pour nous, une <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.duplicated.html\" target=\"_blank\" rel=\"noopener\">m\u00e9thode pandas<\/a> permet de d\u00e9tecter la pr\u00e9sence de doublons dans nos donn\u00e9es. Nous pouvons utiliser la fonction de chat de <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/ai\/\" target=\"_blank\" rel=\"noopener\">JetBrains AI<\/a> pour cr\u00e9er un rappel avec un prompt tel que :<\/p>\n<p><em>Code to identify duplicate rows<\/em><\/p>\n<p>Voici le code r\u00e9sultant :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">duplicate_rows = df[df.duplicated()]\nduplicate_rows<\/pre>\n<p>Ce code suppose que votre DataFrame s&#8217;appelle <code>df<\/code> et il est donc important de le remplacer par le nom de votre DataFrame s&#8217;il est diff\u00e9rent.<\/p>\n<p>Il n&#8217;y a pas de doublons de donn\u00e9es dans l&#8217;<a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es Ames Housing<\/a> que nous utilisons, mais si vous recherchez un exemple qui en comporte, utilisez l&#8217;ensemble de donn\u00e9es <a href=\"https:\/\/www.kaggle.com\/datasets\/cites\/cites-wildlife-trade-database\" target=\"_blank\" rel=\"noopener\">CITES Wildlife Trade Database<\/a> et voyez si vous pouvez trouver les doublons au moyen de la m\u00e9thode pandas ci-dessus.<\/p>\n<p>Une fois les doublons identifi\u00e9s, vous devez les \u00e9liminer pour ne pas fausser vos r\u00e9sultats. Vous pouvez \u00e9galement obtenir le code requis pour cela avec JetBrains AI en utilisant un prompt tel que :<\/p>\n<p><em>Code to drop duplicates from my dataframe\u00a0<\/em><\/p>\n<p>Le code r\u00e9sultant \u00e9limine les doublons, r\u00e9initialise l&#8217;index de votre DataFrame, puis l&#8217;affiche sous la forme d&#8217;un nouveau DataFrame appel\u00e9 df_cleaned :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned = df.drop_duplicates()\ndf_cleaned.reset_index(drop=True, inplace=True)\ndf_cleaned<\/pre>\n<p>Il existe d&#8217;autres fonctions pandas que vous pouvez utiliser pour une <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.drop_duplicates.html\" target=\"_blank\" rel=\"noopener\">gestion de doublons plus avanc\u00e9e<\/a>, mais la fonction indiqu\u00e9e ci-dessus est suffisante pour amorcer la d\u00e9duplication de votre ensemble de donn\u00e9es.<\/p>\n<h3 class=\"wp-block-heading\">Gestion des valeurs non plausibles<\/h3>\n<p>Les valeurs non plausibles apparaissent g\u00e9n\u00e9ralement lorsque les donn\u00e9es sont saisies de fa\u00e7on incorrecte ou lorsque quelque chose ne se d\u00e9roule pas correctement pendant le processus de collecte de donn\u00e9es. Pour notre <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es Ames Housing<\/a>, une valeur non plausible peut prendre la forme d&#8217;une valeur n\u00e9gative pour SalePrice ou d&#8217;une valeur num\u00e9rique pour Roof Style.<\/p>\n<p>L&#8217;identification de valeurs non plausibles dans votre ensemble de donn\u00e9es repose sur une approche plus large qui inclut l&#8217;examen des <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#summary-statistics\">statistiques de r\u00e9sum\u00e9<\/a>, afin de v\u00e9rifier les r\u00e8gles de validation des donn\u00e9es qui ont \u00e9t\u00e9 d\u00e9finies par le collecteur pour chaque colonne, et en notant les points de donn\u00e9es qui tombent en dehors de cette validation, ainsi qu&#8217;en utilisant des visualisations pour identifier des sch\u00e9mas et tout ce qui peut constituer une anomalie.<\/p>\n<p>Il est recommand\u00e9 de g\u00e9rer les valeurs non plausibles, car elles peuvent ajouter du bruit et cr\u00e9er des probl\u00e8mes au niveau de vos analyses. Toutefois, l&#8217;approche \u00e0 utiliser est sujette \u00e0 diff\u00e9rentes interpr\u00e9tations. Si vous n&#8217;avez pas beaucoup de valeurs non plausibles par rapport \u00e0 la taille de votre ensemble de donn\u00e9es, il est recommand\u00e9 de supprimer les enregistrements correspondants. Par exemple, si vous avez identifi\u00e9 une valeur non plausible \u00e0 la ligne 214 de votre ensemble de donn\u00e9es, vous pouvez utiliser la <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.drop.html\" target=\"_blank\" rel=\"noopener\">fonction drop de pandas<\/a> pour supprimer cette ligne de votre ensemble de donn\u00e9es.<\/p>\n<p>Ici aussi, JetBrains AI peut g\u00e9n\u00e9rer le code n\u00e9cessaire avec un prompt tel que :<\/p>\n<p><em>Code that drops index 214 from <\/em><em>#df_cleaned<\/em><\/p>\n<p>Il est \u00e0 noter que dans les <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/jupyter-notebook-support.html\" target=\"_blank\" rel=\"noopener\">notebooks Jupyter de PyCharm<\/a> je peux ajouter le pr\u00e9fixe # devant les mots pour indiquer \u00e0 l&#8217;AI Assistant de JetBrains que je fournis du contexte suppl\u00e9mentaire et, dans ce cas, que mon DataFrame s&#8217;appelle <code>df_cleaned<\/code>.<\/p>\n<p>Le code de sortie supprime cette observation de votre DataFrame, r\u00e9initialise l&#8217;index et l&#8217;affiche :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned = df_cleaned.drop(index=214)\ndf_cleaned.reset_index(drop=True, inplace=True)\ndf_cleaned<\/pre>\n<p>Une autre strat\u00e9gie courante de traitement des valeurs non plausibles consiste \u00e0 les imputer, ce qui veut dire que vous les remplacez par une valeur plausible sur la base d&#8217;une strat\u00e9gie d\u00e9finie. L&#8217;une des strat\u00e9gies les plus communes consiste \u00e0 utiliser la valeur m\u00e9diane au lieu de la valeur non plausible. Dans la mesure o\u00f9 la valeur m\u00e9diane n&#8217;est pas affect\u00e9e par les valeurs aberrantes, elle est souvent retenue par les data scientists \u00e0 cet effet, tout comme la moyenne ou la valeur de mode de vos donn\u00e9es peut \u00eatre plus pertinente dans certaines situations.<\/p>\n<p>D&#8217;autre part, si vous connaissez le domaine relatif \u00e0 l&#8217;ensemble de donn\u00e9es et la fa\u00e7on dont les donn\u00e9es ont \u00e9t\u00e9 r\u00e9unies, vous pouvez remplacer la valeur non plausible par une valeur qui est plus significative. Si vous participez \u00e0 ce processus de collecte de donn\u00e9es ou le connaissez, cette option peut \u00eatre faite pour vous.<\/p>\n<p>Le choix du traitement des valeurs non plausibles d\u00e9pend de leur pr\u00e9dominance dans votre ensemble de donn\u00e9es, de la fa\u00e7on dont les donn\u00e9es sont collect\u00e9es et de comment vous envisagez de d\u00e9finir votre population, ainsi que d&#8217;autres facteurs, tels que votre connaissance du domaine \u00e9tudi\u00e9.<\/p>\n<h3 class=\"wp-block-heading\">Formatage des donn\u00e9es<\/h3>\n<p>Vous pouvez identifier les probl\u00e8mes de formatage avec vos <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#summary-statistics\">statistiques r\u00e9sum\u00e9es<\/a> ou des <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#graphs\">visualisations<\/a> anticip\u00e9es pour avoir une id\u00e9e de la qualit\u00e9 de vos donn\u00e9es. Le formatage incoh\u00e9rent peut se manifester sous forme de valeurs num\u00e9riques qui ne sont pas toutes d\u00e9finies sur la m\u00eame d\u00e9cimale ou des variations typographiques, telles que \u00ab premier \u00bb et \u00ab 1er \u00bb. Le formatage incorrect des donn\u00e9es peut \u00e9galement avoir des implications sur l&#8217;empreinte m\u00e9moire de vos donn\u00e9es.<\/p>\n<p>Lorsque vous identifiez des probl\u00e8mes de formatage dans votre ensemble de donn\u00e9es, vous devez standardiser les valeurs. Selon le probl\u00e8me en cause, cela implique la d\u00e9finition de vos propres r\u00e9f\u00e9rences et l&#8217;application du changement. Encore une fois, la biblioth\u00e8que pandas dispose de fonctions utiles, telles que <a href=\"https:\/\/pandas.pydata.org\/pandas-docs\/stable\/reference\/api\/pandas.DataFrame.round.html\" target=\"_blank\" rel=\"noopener\">round<\/a>. Par exemple, pour arrondir la colonne SalePrice \u00e0 2 chiffres apr\u00e8s la virgule, il est possible de demander le code suivant \u00e0 JetBrains AI :<\/p>\n<p><em>Code to round <\/em><em>#SalePrice<\/em><em> to two decimal places\u00a0<\/em><\/p>\n<p>Le code r\u00e9sultant arrondit la valeur et imprime les 10 premi\u00e8res lignes pour vous permettre de les v\u00e9rifier :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned['SalePrice'] = df_cleaned['SalePrice].round(2)\ndf_cleaned.head()<\/pre>\n<p>Pour prendre un autre exemple, vous pouvez \u00eatre confront\u00e9 \u00e0 des variantes orthographiques, avec une colonne HouseStyle qui contiendrait \u00e0 la fois \u00ab 1Story \u00bb et \u00ab OneStory \u00bb, alors que vous savez que les deux sont identiques. Vous pouvez utiliser le prompt suivant pour obtenir le code faisant cela :<\/p>\n<p><em>Code to change all instances of <\/em><em>#OneStory<\/em><em> to <\/em><em>#1Story<\/em><em> in <\/em><em>#HouseStyle<\/em><em>\u00a0<\/em><\/p>\n<p>Le code r\u00e9sultant fait ce qui lui est demand\u00e9 et remplace toutes les instances de OneStory par 1Story :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">df_cleaned[HouseStyle'] = df_cleaned['HouseStyle'].replace('OneStory', '1Story')<\/pre>\n<h3 class=\"wp-block-heading\">Traitement des valeurs aberrantes<\/h3>\n<p>Les valeurs aberrantes sont tr\u00e8s courantes dans les ensembles de donn\u00e9es, mais leur traitement, s&#8217;il y en a un, d\u00e9pend essentiellement du contexte. L&#8217;une des solutions les plus simples pour identifier les valeurs anormales consiste \u00e0 utiliser un diagramme en bo\u00eete qui utilise les biblioth\u00e8ques <a href=\"https:\/\/seaborn.pydata.org\/generated\/seaborn.boxplot.html\" target=\"_blank\" rel=\"noopener\">seaborn<\/a> et <a href=\"https:\/\/matplotlib.org\/stable\/api\/_as_gen\/matplotlib.pyplot.figure.html\" target=\"_blank\" rel=\"noopener\">matplotlib<\/a>. J&#8217;ai parl\u00e9 plus en d\u00e9tail des diagrammes en bo\u00eete dans mon article pr\u00e9c\u00e9dent sur l&#8217;<a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/\">exploration des donn\u00e9es avec les pandas<\/a> si vous avez besoin d&#8217;un rappel rapide.<\/p>\n<p>Nous allons examiner SalePrice dans notre <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es immobili\u00e8res Ames<\/a> pour ce diagramme en bo\u00eete. \u00c0 nouveau, je vais utiliser JetBrains AI pour g\u00e9n\u00e9rer du code avec un prompt tel que :<\/p>\n<p><em>Code to create a box plot of <\/em><em>#SalePrice<\/em><em>\u00a0<\/em><\/p>\n<p>Voici le code r\u00e9sultant que nous devons ex\u00e9cuter :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import seaborn as sns\nimport matplotlib.pyplot as plt\n\n# Create a box plot for SalePrice\nplt.figure(figsize=(10, 6))\nsns.boxplot(x=df_cleaned['SalePrice'])\nplt.title('Box Plot of SalePrice')\nplt.xlabel('SalePrice')\nplt.show()<\/pre>\n<p>Le diagramme en bo\u00eete nous dit que nous avons une inclinaison positive, car la ligne m\u00e9diane de la bo\u00eete bleue est \u00e0 gauche du centre. Une inclinaison positive nous dit que la distribution du prix des maisons tend \u00e0 refl\u00e9ter majoritairement les prix les plus faibles, ce qui n&#8217;est pas surprenant. Le diagramme en bo\u00eete nous donne un indicateur visuel du nombre \u00e9lev\u00e9 de valeurs aberrantes dans la partie droite. Il s&#8217;agit dans cet exemple du petit nombre de propri\u00e9t\u00e9s qui sont tr\u00e8s au-dessus du prix m\u00e9dian.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-536439\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image.png\" alt=\"\" width=\"1600\" height=\"1054\" \/><\/figure>\n<p>Vous pouvez accepter ces valeurs aberrantes, dans la mesure o\u00f9 il est tout \u00e0 fait logique qu&#8217;un petit nombre de propri\u00e9t\u00e9s soit plus cher que la majorit\u00e9. Cependant, tout d\u00e9pend de la population \u00e0 g\u00e9n\u00e9raliser et des conclusions \u00e0 tirer de vos donn\u00e9es. Une d\u00e9finition claire du p\u00e9rim\u00e8tre de la population permet de d\u00e9terminer sur la base de donn\u00e9es fiables si les valeurs aberrantes de vos donn\u00e9es vont poser probl\u00e8me.<\/p>\n<p>Par exemple, si votre population comporte des gens qui ne peuvent pas acheter des villas de luxe, il peut \u00eatre judicieux de supprimer ces valeurs aberrantes. Par contre, si elle inclut des gens qui en ont les moyens, il est pr\u00e9f\u00e9rable de les conserver.<\/p>\n<p>Nous avons vu dans cet article que les diagrammes en bo\u00eete permettent d&#8217;identifier les valeurs aberrantes, mais d&#8217;autres options, telles que les nuages de points et les histogrammes, permettent aussi de visualiser rapidement ce type de valeur et de prendre une d\u00e9cision en cons\u00e9quence.<\/p>\n<p>Le traitement des valeurs aberrantes tombe g\u00e9n\u00e9ralement dans deux cat\u00e9gories, \u00e0 savoir leur suppression ou l&#8217;utilisation de statistiques moins sensibles \u00e0 ce type de valeur. Dans le premier cas, nous devons savoir exactement dans quelles lignes elles se trouvent.<\/p>\n<p>Jusqu&#8217;\u00e0 pr\u00e9sent, nous avons uniquement parl\u00e9 de l&#8217;identification visuelle. Il existe diff\u00e9rentes fa\u00e7ons de d\u00e9terminer quelles observations sont des valeurs aberrantes. L&#8217;approche la plus commune est une m\u00e9thode appel\u00e9e <em>score Z modifi\u00e9<\/em>. Avant de voir comment et pourquoi il est modifi\u00e9, le score Z est d\u00e9fini ainsi :<\/p>\n<p><em>Score Z =<\/em> (<em>valeur du point de donn\u00e9es<\/em> \u2013 <em>moyenne<\/em>) \/ <em>\u00e9cart type<\/em><\/p>\n<p>Nous modifions ensuite le score Z parce que la moyenne et l&#8217;\u00e9cart type sont influenc\u00e9s par les valeurs aberrantes en raison de leur mode de calcul. Le score Z modifi\u00e9 est d\u00e9fini sous la forme :<\/p>\n<p><em>Score Z modifi\u00e9 =<\/em> (<em>valeur du point de donn\u00e9es<\/em> \u2013 <em>m\u00e9diane<\/em>) \/ <em>\u00e9cart absolu<\/em> <em>m\u00e9dian<\/em><\/p>\n<p>Comme nous l&#8217;avons vu dans la section <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/10\/data-exploration-with-pandas\/#summary-statistics\">statistiques r\u00e9sum\u00e9es<\/a>, la m\u00e9diane n&#8217;est pas impact\u00e9e par les valeurs aberrantes. L&#8217;<em>\u00e9cart absolu m\u00e9dian<\/em> correspond \u00e0 la valeur <em>m\u00e9diane<\/em> des \u00e9carts absolus de l&#8217;ensemble de donn\u00e9es par rapport \u00e0 la <em>m\u00e9diane<\/em>. Par exemple, si votre ensemble de donn\u00e9es contient les valeurs suivantes :<\/p>\n<p>1, 2, 2, 2,<strong> 3<\/strong>, 3, 3, 5,9<\/p>\n<p>La <em>m\u00e9diane<\/em> est \u00e9gale \u00e0 3, car il s&#8217;agit de la valeur au milieu de l&#8217;ensemble de donn\u00e9es. Les \u00e9carts par rapport \u00e0 la m\u00e9diane de 3 sont les suivants dans l&#8217;ordre pr\u00e9sent\u00e9 ci-dessus :<\/p>\n<p>2, 1, 1, 1, 0, 0, 0, 2, 5<\/p>\n<p>En triant ces valeurs par ordre croissant, nous obtenons :<\/p>\n<p>0, 0, 0, 1, <strong>1<\/strong>, 1, 2, 2, 5<\/p>\n<p>Cela signifie que l&#8217;<em>\u00e9cart absolu m\u00e9dian<\/em> serait 1 dans cet exemple.<\/p>\n<p>Comment calculer le score Z modifi\u00e9 pour notre ensemble de donn\u00e9es pour SalePrice\u00a0? Soumettons ce prompt \u00e0 JetBrains AI :<\/p>\n<p><em>Given:<\/em><\/p>\n<p><em>Modified Z-score = (data point value \u2013 median) \/ median absolute deviation<\/em><\/p>\n<p><em>Calculate the Modified Z-score for <\/em><em>#SalePrice<\/em><em>\u00a0<\/em><\/p>\n<p>Cela produit le code suivant :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\nfrom scipy.stats import median_abs_deviation\n\n\n# Assuming 'data' is your DataFrame and it contains the 'SalePrice' column\n\n\n# Calculate the median for the SalePrice column\nmedian_sale_price = data['SalePrice'].median()\n\n\n# Calculate the Median Absolute Deviation (MAD) for the SalePrice column\nmad_sale_price = median_abs_deviation(data['SalePrice'], scale='normal')\n\n\n# Calculate the Modified Z-scores for the SalePrice column\ndata['Modified_Z_Score'] = (data['SalePrice'] - median_sale_price) \/ mad_sale_price\n\n\n# Display the first few rows with the Modified Z-scores\nprint(data[['SalePrice', 'Modified_Z_Score']].head())<\/pre>\n<p>Lorsque nous installons les paquets n\u00e9cessaires et ex\u00e9cutons ce code, nous pouvons voir que nous avons progress\u00e9, mais maintenant nous devons \u00e9tablir ce qu&#8217;est une valeur aberrante pour SalePrice en fonction du score Z modifi\u00e9. \u00c0 premi\u00e8re vue, une valeur aberrante est ici tout nombre &gt;=3 ou &lt;=-3. Il faut toutefois noter que, comme pour la plupart des d\u00e9cisions statistiques, elle peut et doit \u00eatre adapt\u00e9e \u00e0 votre jeu de donn\u00e9es. &lt;=-3 however, it\u2019s worth noting that like most statistical decisions, it can and should be tailored to your dataset.<\/p>\n<p>Nous allons soumettre un autre prompt \u00e0 JetBrains AI pour obtenir un r\u00e9sultat plus pertinent :<\/p>\n<p><em>Just list those that have a <\/em><em>#Modified_Z_Score<\/em><em> of 3 or above or -3 or below\u00a0<\/em><\/p>\n<p>Je vais prendre cet extrait de code et utiliser les lignes ci-dessus qui m&#8217;int\u00e9ressent :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Filter the rows where the Modified Z-score is 3 or above, or -3 or below\noutliers = data[(data['Modified_Z_Score'] &gt;= 3) | (data['Modified_Z_Score'] &lt;= -3)]\n\n\n# Print all the filtered rows, showing their index and SalePrice\noutliers = (outliers[['SalePrice', 'Modified_Z_Score']])\noutliers<\/pre>\n<p>J&#8217;ai modifi\u00e9 ce code pour enregistrer les valeurs dans un nouveau DataFrame appel\u00e9 \u00ab outliers \u00bb et je les ai imprim\u00e9es pour les lire.<\/p>\n<p>L&#8217;\u00e9tape suivante consiste \u00e0 retirer ces valeurs aberrantes du DataFrame. Encore une fois, il est possible d&#8217;utiliser JetBrains AI pour g\u00e9n\u00e9rer du code avec un prompt tel que :<\/p>\n<p><em>Create a new dataframe without the outliers\u00a0<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data_without_outliers = data.drop(index=outliers.index)\n\n\n# Display the new DataFrame without outliers\nprint(data_without_outliers)<\/pre>\n<p>Le nouveau DataFrame, data_without_outliers, exclut ces valeurs lorsque la variable SalePrice est consid\u00e9r\u00e9e comme une valeur aberrante.<\/p>\n<p>Il est alors possible de mettre \u00e0 jour le code du diagramme en bo\u00eete pour examiner le nouveau DataFrame. Il affiche toujours l&#8217;inclinaison positive, comme cela est pr\u00e9visible, mais les valeurs consid\u00e9r\u00e9es comme aberrantes ont \u00e9t\u00e9 supprim\u00e9es :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import seaborn as sns\nimport matplotlib.pyplot as plt\n\n\n# Create a box plot for SalePrice\nplt.figure(figsize=(10, 6))\nsns.boxplot(x=data_without_outliers['SalePrice'])\nplt.title('Box Plot of SalePrice')\nplt.xlabel('SalePrice')\nplt.show()<\/pre>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-536450\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-1.png\" alt=\"\" width=\"1572\" height=\"1076\" \/><\/figure>\n<p>Avant de conclure pour cette partie, voyons quel pourcentage d&#8217;observations a \u00e9t\u00e9 retir\u00e9 de notre DataFrame parce qu&#8217;elles sont consid\u00e9r\u00e9es comme des valeurs aberrantes par rapport \u00e0 SalePrice.<\/p>\n<p>Nous pouvons utiliser un prompt tel que :<\/p>\n<p><em>Calculate the percentage of observations removed between #data and #data_without_outliers<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Calculate the number of observations in the original and filtered DataFrames\noriginal_count = len(data)\nfiltered_count = len(data_without_outliers)\n\n# Calculate the number of removed observations\nremoved_count = original_count - filtered_count\n\n# Calculate the percentage of observations removed\npercentage_removed = (removed_count \/ original_count) * 100\n\n# Display the percentage\nprint(f\"Percentage of observations removed: {percentage_removed:.2f}%\")<\/pre>\n<p>PyCharm indique que 5,67 % des observations ont \u00e9t\u00e9 supprim\u00e9es.<\/p>\n<p>Comme indiqu\u00e9 plus haut, si vous conservez vos valeurs aberrantes, envisagez d&#8217;utiliser des valeurs r\u00e9sum\u00e9es qui sont moins susceptibles d&#8217;\u00eatre affect\u00e9es, telles que la <em>m\u00e9diane<\/em> et l&#8217;<em>\u00e9cart interquartile<\/em>. Vous pouvez envisager d&#8217;utiliser ces mesures pour formuler vos conclusions lorsque vous travaillez sur des ensembles de donn\u00e9es que vous savez contenir des valeurs extr\u00eames pertinentes pour la population que vous avez d\u00e9finie et vos conclusions.<\/p>\n<h3 class=\"wp-block-heading\">Valeurs manquantes<\/h3>\n<p>Le moyen le plus rapide d&#8217;identifier les valeurs manquantes de votre ensemble de donn\u00e9es consiste \u00e0 utiliser vos statistiques r\u00e9sum\u00e9es. Pour rappel, dans votre DataFrame, cliquez sur <em>Show Column Statistics<\/em> dans la partie droite et s\u00e9lectionnez <em>Compact<\/em>. Les valeurs manquantes dans les colonnes s&#8217;affichent en rouge, comme vous pouvez le voir ici, pour Lot Frontage, dans notre <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es Ames Housing<\/a> :<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXdeSNdJvl9sk5Z8QXEJCr5rhDMI5GTGmaRdqvkIufNS8QZNQi-1QwDF1LQgTS_e9vm0B-pSKa5o2aZnNZEmPiAzvoaOjvRxmOICDRzuM_0iWumPGH_UWyR07Q8xTrzIUnYvL7-j-1.png\" width=\"624\" height=\"123\" \/><\/p>\n<p>Trois types de donn\u00e9es manquantes sont \u00e0 prendre en compte pour nos donn\u00e9es :<\/p>\n<ul>\n<li>Manquant de fa\u00e7on totalement al\u00e9atoire (MCAR)<\/li>\n<li>Manquant de fa\u00e7on al\u00e9atoire (MAR)<\/li>\n<li>Manquant de fa\u00e7on non al\u00e9atoire (MNAR)<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">Manquant de fa\u00e7on totalement al\u00e9atoire (MCAR)<\/h3>\n<p>Les donn\u00e9es manquantes de fa\u00e7on totalement al\u00e9atoire indiquent que l&#8217;absence de donn\u00e9es est due uniquement au hasard et que cela n&#8217;a aucun lien avec les autres variables de l&#8217;ensemble de donn\u00e9es. Cela peut se produire lorsque quelqu&#8217;un omet de r\u00e9pondre \u00e0 l&#8217;une des questions d&#8217;un formulaire, par exemple.<\/p>\n<p>Les donn\u00e9es manquantes de fa\u00e7on totalement al\u00e9atoire sont rares, mais sont aussi les plus faciles \u00e0 g\u00e9rer. Si vous avez un nombre relativement faible d&#8217;observations manquantes de fa\u00e7on totalement al\u00e9atoire, l&#8217;approche la plus courante consiste \u00e0 supprimer ces observations, car cela ne devrait pas avoir d&#8217;impact sur l&#8217;int\u00e9grit\u00e9 de votre ensemble de donn\u00e9es et, par cons\u00e9quent, les conclusions que vous pouvez en tirer.<\/p>\n<h3 class=\"wp-block-heading\">Manquant de fa\u00e7on al\u00e9atoire (MAR)<\/h3>\n<p>Les donn\u00e9es manquantes de fa\u00e7on al\u00e9atoire ne semblent pas suivre d&#8217;ordre pr\u00e9cis, mais les autres variables mesur\u00e9es permettent d&#8217;identifier un fil conducteur. Par exemple, quelqu&#8217;un n&#8217;a pas r\u00e9pondu \u00e0 une question du formulaire en raison du mode de collecte des donn\u00e9es.<\/p>\n<p>Si l&#8217;on garde comme exemple l&#8217;<a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es Ames Housing<\/a>, la variable Lot Frontage peut manquer plus fr\u00e9quemment pour les propri\u00e9t\u00e9s vendues par certaines agences immobili\u00e8res. Dans ce cas, les donn\u00e9es manquantes peuvent \u00eatre dues \u00e0 des pratiques diff\u00e9rentes de saisie des donn\u00e9es par certaines agences. Dans ce cas, l&#8217;absence de donn\u00e9es pour Lot Frontage s&#8217;explique par la fa\u00e7on dont l&#8217;agence qui a vendu la propri\u00e9t\u00e9 a collect\u00e9 les donn\u00e9es, ce qui est une caract\u00e9ristique observ\u00e9e et ne concerne pas Lot Frontage en tant que tel.<\/p>\n<p>Lorsque des donn\u00e9es manquent de fa\u00e7on al\u00e9atoire, il faut essayer de comprendre pourquoi ces donn\u00e9es sont manquantes, ce qui implique souvent de revenir sur la fa\u00e7on dont les donn\u00e9es ont \u00e9t\u00e9 collect\u00e9es. Une fois que vous avez identifi\u00e9 la raison de l&#8217;absence de donn\u00e9es, vous pouvez choisir quoi faire. L&#8217;une des approches les plus courantes dans ce cas consiste \u00e0 imputer les valeurs. Nous avons d\u00e9j\u00e0 vu cela pour les valeurs non plausibles, mais c&#8217;est \u00e9galement une strat\u00e9gie valide pour les donn\u00e9es manquantes. Vous avez le choix entre diff\u00e9rentes options selon la population d\u00e9finie et les conclusions auxquelles vous souhaitez parvenir, avec notamment l&#8217;utilisation de variables corr\u00e9l\u00e9es, telles que la taille de la propri\u00e9t\u00e9, son ann\u00e9e de construction et son prix de vente, comme dans cet exemple. Si vous comprenez les raisons pour lesquelles des donn\u00e9es manquent, vous pouvez g\u00e9n\u00e9ralement utiliser des informations contextuelles pour entrer les valeurs, ce qui permet de s&#8217;assurer que les relations entre les donn\u00e9es de votre ensemble sont pr\u00e9serv\u00e9es.<\/p>\n<h3 class=\"wp-block-heading\">Manquant de fa\u00e7on non al\u00e9atoire (MNAR)<\/h3>\n<p>Enfin, les donn\u00e9es manquantes de fa\u00e7on non al\u00e9atoire signifient que la probabilit\u00e9 de donn\u00e9es manquantes est li\u00e9e \u00e0 des donn\u00e9es qui n&#8217;ont pas \u00e9t\u00e9 observ\u00e9es. Cela signifie que les donn\u00e9es manquantes d\u00e9pendent des donn\u00e9es non observ\u00e9es.<\/p>\n<p>Nous allons revenir une derni\u00e8re fois \u00e0 notre <a href=\"https:\/\/www.kaggle.com\/datasets\/prevek18\/ames-housing-dataset\" target=\"_blank\" rel=\"noopener\">ensemble de donn\u00e9es Ames Housing<\/a> et aux donn\u00e9es manquantes dans Lot Frontage. L&#8217;un des sc\u00e9narios possibles pour les donn\u00e9es manquant de fa\u00e7on non al\u00e9atoire est que les vendeurs choisissent de ne pas d\u00e9clarer \u00ab Lot Frontage \u00bb s&#8217;ils le trouvent <em>petit<\/em> et pensent que la mention de la taille r\u00e9duirait le prix de vente. Si la probabilit\u00e9 de donn\u00e9es \u00ab Lot Frontage \u00bb manquantes d\u00e9pend de la taille du terrain (qui n&#8217;est pas observ\u00e9e), il est peu probable que cette taille soit sous-estim\u00e9e, ce qui signifie que les donn\u00e9es manquantes sont li\u00e9es directement \u00e0 la valeur manquante.<\/p>\n<h3 class=\"wp-block-heading\">Visualisation des donn\u00e9es manquantes<\/h3>\n<p>Lorsque des donn\u00e9es manquent, vous devez \u00e9tablir si cela suit un sch\u00e9ma particulier. Si vous observez un sch\u00e9ma particulier, cela signifie qu&#8217;il existe un probl\u00e8me que vous devez r\u00e9soudre avant de g\u00e9n\u00e9raliser vos donn\u00e9es.<\/p>\n<p>L&#8217;une des fa\u00e7ons les plus simples de visualiser cela est de cr\u00e9er une carte thermique. Avant de passer \u00e0 la partie code, nous allons exclure les variables sans donn\u00e9es manquantes. Pour cela nous pouvons cr\u00e9er un prompt pour JetBrains AI :<\/p>\n<p><em>Code to create a new dataframe that contains only columns with missingness\u00a0<\/em><\/p>\n<p>Voici notre code :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Identify columns with any missing values\ncolumns_with_missing = data.columns[data.isnull().any()]\n\n# Create a new DataFrame with only columns that have missing values\ndata_with_missingness = data[columns_with_missing]\n\n# Display the new DataFrame\nprint(data_with_missingness)<\/pre>\n<p>Avant d&#8217;ex\u00e9cuter ce code, modifiez la derni\u00e8re ligne pour profiter de la mise en forme \u00e9l\u00e9gante du DataFrame par PyCharm :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data_with_missingness<\/pre>\n<p>Il est maintenant temps de cr\u00e9er une carte thermique. Ici \u00e9galement, nous allons utiliser un prompt destin\u00e9 \u00e0 JetBrains AI :<\/p>\n<p><em>Create a heatmap of <\/em><em>#data_with_missingness<\/em><em> that is transposed<\/em><\/p>\n<p>Voici le code r\u00e9sultant :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import seaborn as sns\nimport matplotlib.pyplot as plt\n\n\n# Transpose the data_with_missingness DataFrame\ntransposed_data = data_with_missingness.T\n\n\n# Create a heatmap to visualize missingness\nplt.figure(figsize=(12, 8))\nsns.heatmap(transposed_data.isnull(), cbar=False, yticklabels=True)\nplt.title('Missing Data Heatmap (Transposed)')\nplt.xlabel('Instances')\nplt.ylabel('Features')\nplt.tight_layout()\nplt.show()<\/pre>\n<p>Notez que j&#8217;ai retir\u00e9 cmap=\u2019viridis\u2019 des arguments de la carte thermique, car je ne le trouve pas tr\u00e8s visible.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-537110\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/image-24.png\" alt=\"\" width=\"1600\" height=\"1065\" \/><\/figure>\n<p>Cette carte thermique laisse supposer que les donn\u00e9es manquantes suivent un sch\u00e9ma, car les m\u00eames variables manquent dans plusieurs lignes. Dans un groupe, les variables Bsmt Qual, Bsmt Cond, Bsmt Exposure, BsmtFin Type 1 et Bsmt Fin Type 2 sont toutes absentes des m\u00eames observations. Dans un autre groupe, les variables Garage Type, Garage Yr Bit, Garage Finish, Garage Qual et Garage Cond sont aussi toutes manquantes des m\u00eames observations.<\/p>\n<p>Ces variables se rapportent toutes aux sous-sols et garages, mais il existe d&#8217;autres variables li\u00e9es aux garages ou aux sous-sols qui ne sont pas manquantes. L&#8217;une des explications possibles est que des questions diff\u00e9rentes ont \u00e9t\u00e9 pos\u00e9es sur les garages et les sous-sols dans diff\u00e9rentes agences immobili\u00e8res lorsque les donn\u00e9es ont \u00e9t\u00e9 collect\u00e9es, et que toutes n&#8217;ont pas \u00e9t\u00e9 enregistr\u00e9es de fa\u00e7on aussi d\u00e9taill\u00e9e que dans l&#8217;ensemble de donn\u00e9es. Ces sc\u00e9narios sont courants pour les donn\u00e9es que vous ne collectez pas vous-m\u00eame, et vous pouvez explorer la fa\u00e7on dont les donn\u00e9es ont \u00e9t\u00e9 collect\u00e9es pour en savoir plus sur les donn\u00e9es manquantes de votre ensemble de donn\u00e9es.<\/p>\n<h2 class=\"wp-block-heading\">Bonnes pratiques de nettoyage des donn\u00e9es<\/h2>\n<p>Comme je l&#8217;ai indiqu\u00e9, la d\u00e9finition de votre population est en haut de la liste de bonnes pratiques de nettoyage des donn\u00e9es. D\u00e9finissez ce que vous voulez accomplir et comment g\u00e9n\u00e9raliser vos donn\u00e9es avant de les nettoyer.<\/p>\n<p>Vous devez vous assurer que toutes vos m\u00e9thodes sont reproductibles, car cela est d\u00e9terminant pour nettoyer les donn\u00e9es. Les situations qui ne sont pas reproductibles peuvent avoir un impact significatif en aval. Par cons\u00e9quent, je vous recommande de veiller \u00e0 l&#8217;ordonnancement s\u00e9quentiel de vos notebooks Jupyter et d&#8217;utiliser les fonctionnalit\u00e9s Markdown pour documenter syst\u00e9matiquement vos d\u00e9cisions, notamment concernant le nettoyage.<\/p>\n<p>Lors du nettoyage des donn\u00e9es, vous devez travailler de fa\u00e7on incr\u00e9mentale, afin de modifier le DataFrame au lieu du fichier CSV ou de la base de donn\u00e9es d&#8217;origine, et vous assurer que vous proc\u00e9dez avec un code reproductible et bien document\u00e9.<\/p>\n<h2 class=\"wp-block-heading\">En r\u00e9sum\u00e9<\/h2>\n<p>Le nettoyage des donn\u00e9es est un vaste sujet, qui pr\u00e9sente de nombreuses difficult\u00e9s. Plus l&#8217;ensemble de donn\u00e9es est important, plus son processus de nettoyage est difficile. Vous devez garder votre population \u00e0 l&#8217;esprit pour g\u00e9n\u00e9raliser vos conclusions de fa\u00e7on plus large tout en recherchant un \u00e9quilibre entre le retrait et l&#8217;entr\u00e9e des valeurs manquantes, et d\u00e9terminer pour quelles raisons ces donn\u00e9es sont manquantes.<\/p>\n<p>Vous devenez en quelque sorte la voix des donn\u00e9es. Vous savez quel est le parcours des donn\u00e9es et comment vous avez assur\u00e9 leur int\u00e9grit\u00e9 \u00e0 tous les niveaux. Vous \u00eates la meilleure personne pour documenter ce parcours et le faire conna\u00eetre aux autres personnes.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/jb.gg\/m8p92h\" target=\"_blank\" rel=\"noopener\"><br \/>Essayez PyCharm Professional gratuitement<br \/><\/a><\/p>\n<p><em>Auteur de l\u2019article original en anglais :<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/193dd3accbb2e467f1b46a7f38ea929d?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"Helen Scott\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Helen Scott<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":589100,"comment_status":"closed","ping_status":"closed","template":"","categories":[952],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/589097"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=589097"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/589097\/revisions"}],"predecessor-version":[{"id":599246,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/pycharm\/589097\/revisions\/599246"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/589100"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=589097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=589097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=589097"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=589097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}