chatGPT, votre assistant data

Faites de ChatGPT un assistant data, et pas un décideur

Jean-Paul Maalouf Mis à jour le : 11 avril 2024 méthode 1 Comment

ChatGPT d’OpenAI devient incontournable dans le monde du traitement et de l’analyse de données. Au-delà d’une compréhension du langage naturel, ChatGPT excelle dans diverses tâches telles que l’extraction d’informations, l’interprétation de données complexes, et même la génération de scripts d’analyse en Python. Ces atouts en font un assistant de choix pour les professionnels et les amateurs de data science, offrant un accès démocratisé à l’analyse de données avancée.

En tant que data scientist, ma curiosité m’a poussé à explorer les limites de ChatGPT dans le contexte spécifique de l’analyse de données. Je me suis interrogé sur la faisabilité d’une analyse de données complète et fiable en quelques clics avec ChatGPT, sans nécessiter de solides connaissances en data science. Est-il possible de se reposer entièrement sur cet outil, ou doit-on aborder ses recommandations avec l’œil avisé d’un professionnel de la data?

Pour répondre à ces questions, j’ai conçu une expérience visant à mettre ChatGPT à l’épreuve. J’ai soumis à l’outil un jeu de données dans lequel j’ai glissé quelques pièges : données manquantes, erreurs de saisie, et multicolinéarité, des problématiques bien connues des data scientists pour leur impact sur la qualité de l’analyse. Approchant ChatGPT avec un esprit ouvert, voire naïf, je lui ai demandé d’exécuter une série de tâches analytiques typiques : nettoyage des données, analyse descriptive et modélisation.

L’objectif était double : évaluer la capacité de ChatGPT à identifier et à naviguer à travers ces écueils classiques, et comprendre comment il gérerait ces particularités.

Analyse de données avec ChatGPT : quelques mots sur le fonctionnement

La mise en œuvre de d’une analyse de données par ChatGPT s’appuie sur une combinaison de ses propres capacités de traitement du langage naturel (NLP) et sur l’intégration de moteurs de calcul externes, notamment Python exécuté dans un environnement Jupyter Notebook. Voici les différentes étapes du processus:

Génération de code : Sur la base de la demande de l’utilisateur et de données en input, ChatGPT génère du code Python nécessaire pour accomplir la tâche demandée, qu’il s’agisse d’un traitement de nettoyage, d’une analyse statistique, de la construction d’un modèle de machine learning, ou de la création de graphiques.

Exécution du code : ChatGPT ne réalise pas les calculs lui-même. Le code généré est exécuté dans un environnement Jupyter notebook automatiquement appelé par ChatGPT.

Interprétation des résultats : Une fois le code exécuté et les résultats obtenus, ChatGPT analyse les sorties, les interprète et génère une réponse en langage naturel pour l’utilisateur, intégrant des visualisations et conclusions tirées de l’analyse.

Mettre les capacités data de ChatGPT 4 à l’épreuve : le choix du jeu de données

Capacités de lecture de ChatGPT : Techniquement, ChatGPT est capable de lire une gamme variée de types de fichiers couramment utilisés dans le monde de la data. Parmi ces formats, on retrouve les classiques .csv (pour les données tabulaires), .xlsx (feuilles de calcul Microsoft Excel), .txt (fichiers texte simples), mais également des formats plus spécifiques comme .json (utiles pour les données structurées), des fichiers de code (.py, .js) et des fichiers .pdf pour les documents contenant des données à extraire ou du texte à interpréter.

Le jeu de données choisi : Pour les besoins de cet article, j’ai sélectionné un jeu de données téléchargé depuis Kaggle, que j’ai mis en forme dans un fichier .xlsx. Il se concentre sur la classification supervisée de grains de riz en deux types, Jasmine et Gonen, à partir de 10 variables morphologiques numériques (notamment Area = surface ; MajorAxisLength et MinorAxisLength = longueur des axes majeur et mineur ; Perimeter = périmètre, etc.). Le jeu de données comporte 18,185 observations de grains de riz et les deux types sont représentées de manière équilibrée.

Objectifs d’analyse : J’ai souhaité solliciter ChatGPT pour la description et le nettoyage du jeu de données, ainsi que l’identification des variables morphologiques clés déterminant le type de grains de riz (modélisation).

Ecueils : Afin de rendre la tâche plus difficile pour ChatGPT, j’ai intentionnellement introduit quelques anomalies dans le jeu de données :

  • Des données manquantes générées aléatoirement dans les variables morphologiques (10% des valeurs).
  • Une valeur textuelle (« a51.2 ») insérée dans une variable numérique (MinorAxisLength).
  • Une valeur négative dans une variable censée contenir uniquement des valeurs positives (MajorAxisLength).
  • Une donnée extrêmement élevée, dépassant d’un ordre de grandeur les valeurs habituelles, dans la variable Perimeter.
  • Dans l’identifiant de la classe, toutes les étiquettes (Jasmine et Gonen) commencent avec une majuscule. J’ai introduit 3 étiquettes Jasmine avec un j minuscule (jasmine).

Multicolinéarité : Une fois cette phase de préparation et de nettoyage abordée, un défi supplémentaire se présenterait lors de la modélisation : ChatGPT serait-t-il capable de détecter et de gérer automatiquement la multicolinéarité évidente parmi les prédicteurs ? Ce phénomène, courant dans les jeux de données complexes, peut sérieusement compromettre l’efficacité de certains modèles s’il n’est pas traité correctement.

Version utilisée : ChatGPT 4 (OpenAI, version du 7 mars 2024).

Ainsi armé de curiosité et d’un jeu de données astucieusement modifié, j’ai démarré l’analyse. Le jeu de données facilement glissé dans l’interface, j’ai écrit mon premier message dans le prompt. Dans ce qui suit, JPM désignent mes initiales, suivies de la commande que j’ai passée à ChatGPT. Les réponses de ChatGPT sont affichées en italique.

JPM : « Décris-moi ce jeu de données. De quoi s’agit-il ? » 

J’ai chargé le jeu de données. Notez la mention sous le prompt qui veut dire : ChatGPT peut faire des erreurs. Pensez à vérifier les informations importantes. Cela me poussera à être plus indulgent si jamais son analyse s’avérait catastrophique 😊.

Voici un extrait de sa réponse :

« Le jeu de données semble être lié à des caractéristiques de grains de riz, probablement utilisé pour analyser et classifier différents types de riz. Chaque ligne représente un grain de riz avec plusieurs attributs mesurés ou calculés. Voici une description des colonnes présentes dans le jeu de données :

  • Area : L’aire du grain de riz, probablement en unités de pixels ou une unité de mesure de surface.
  • MajorAxisLength : La longueur de l’axe majeur du grain de riz, c’est-à-dire la plus longue distance à travers le grain.
  • MinorAxisLength : La longueur de l’axe mineur du grain de riz, c’est-à-dire la plus courte distance à travers le grain.
  • […]
  • AspectRation : Le rapport d’aspect, probablement une faute de frappe pour « Aspect Ratio » (rapport d’aspect), qui est le rapport entre le MajorAxisLength et le MinorAxisLength.
  • Class : La catégorie ou le type de riz auquel le grain appartient. Dans l’aperçu, tous les grains appartiennent à la classe « Jasmine », bien que la dernière entrée soit en minuscules, ce qui suggère qu’il pourrait y avoir des variations dans la façon dont les classes sont enregistrées.

Il y a quelques anomalies apparentes dans les données, comme des valeurs manquantes (indiquées par NaN) et une valeur erronée dans la colonne MinorAxisLength pour la deuxième ligne (« a51.2 »), qui semble être une erreur de saisie. Ce jeu de données peut être utilisé pour des analyses statistiques, de classification, ou pour entraîner des modèles de machine learning afin de distinguer entre différents types de riz basés sur leurs caractéristiques physiques. »

Franchement, sa première description était bluffante. ChatGPT a émis une supposition assez juste du contenu du jeu de données en général et de l’objectif associé. Il a ensuite produit une hypothétique brève description de chaque variable avant d’évoquer quelques anomalies détectées. La réponse a été fournie en français, malgré des intitulés de variables en anglais dans le fichier des données.

Par ailleurs, il est très appréciable de pouvoir obtenir le code Python commenté, en cliquant simplement sur le bouton [>_].

Outre la description qui donne un aperçu assez compréhensible du jeu de données, remarquons que ChatGPT a réussi, de manière assez précoce, à détecter 3 pièges que je lui ai tendus : les valeurs manquantes, la valeur textuelle « a51.2 », ainsi que les étiquettes « jasmine » introduites avec un j minuscule.

A ce stade, tout était assez satisfaisant et rassurant.

J’ai voulu donner une deuxième chance à ChatGPT pour tester ses capacités à détecter d’autres anomalies (la valeur négative et la valeur extrême).

JPM : « Existe-t-il d’autres anomalies dans le jeu de données ? »

ChatGPT a réitéré la description des 3 anomalies détectées précédemment, en développant davantage, et en soulignant l’importance de corriger les anomalies avant de procéder à des analyses plus poussées. Voici un extrait de sa réponse à ce propos :

« […]

Ces anomalies peuvent affecter les analyses et les modèles prédictifs qui seraient développés à partir de ce jeu de données. Il serait donc conseillé de procéder à un nettoyage des données, y compris la gestion des valeurs manquantes, la correction des types de données, et la normalisation des noms de classes, avant d’entreprendre toute forme d’analyse. »

Comme recommandé par ChatGPT, j’ai demandé de procéder à la correction.

JPM : « Très bien ChatGPT, corrige-moi ces 3 anomalies.

La valeur textuelle « a51.2 » correspond effectivement à une erreur de saisie. Pour les analyses qui suivent, merci de la remplacer par une valeur manquante. Par ailleurs, les types « jasmine » et « Jasmine » correspondent à la même chose et doivent être fusionnés. »

ChatGPT :

« Les corrections ont été effectuées avec succès :

[…]

Ces corrections permettent de s’assurer que le jeu de données est plus cohérent et prêt pour les analyses ou les modèles prédictifs qui suivront. »

A mes yeux, contrairement à ce que suggère ChatGPT, le jeu de données était loin d’être prêt pour de la modélisation prédictive. Un bon réflexe aurait été de procéder auparavant à une analyse descriptive. Cette analyse permet à l’expert data de détecter des anomalies dans les données et de les traiter. Elle peut dévoiler par ailleurs des tendances intéressantes. J’espérais que ChatGPT adopte lui aussi cette approche.

JPM : « Propose-moi une analyse descriptive préliminaire du jeu de données »

ChatGPT :

« L’analyse descriptive préliminaire du jeu de données révèle les informations suivantes sur les caractéristiques des grains de riz :

Statistiques Descriptives (Variables Numériques) :

  • Area : La surface moyenne des grains de riz est de 7,034.92 unités avec un écart type de 1,466.94. La surface varie de 2,522 à 10,210 unités.
  • MajorAxisLength : La longueur moyenne de l’axe majeur est de 151.64 unités, avec des grains ayant une longueur allant de -106.72 (valeur aberrante négative qui nécessite une vérification) à 183.21 unités.
  • […]
  • Perimeter : Le périmètre moyen est de 352.86 unités, avec un très large écart type de 162.94, ce qui suggère une grande variabilité dans la forme des grains.
  • […]

Répartition par Classe :

  • Jasmine : 9,985 grains de riz sont classés comme Jasmine.
  • Gonen : 8,200 grains de riz sont classés comme Gonen.

[…] »

ChatGPT a procédé à une description univariée classique des données (moyenne et écart-type pour les variables quantitatives, et tri à plat pour la variable qualitative). L’analyse était dépourvue de graphiques, et s’est clôturée par un récapitulatif. Point important à noter : ChatGPT a bien détecté la valeur négative aberrante dans MajorAxisLength et recommandé de la vérifier. Par contre, il n’a pas identifié de valeur extrême dans la variable Perimeter et s’est contenté de signaler une grande variabilité dans la forme des grains.

Bravo donc, ChatGPT a pu débusquer une anomalie supplémentaire, que je lui ai demandé de corriger pour la suite. Dommage qu’il n’ait pas proposé automatiquement de représentation graphique (histogramme, boxplots…). Ces outils peuvent en dire davantage sur les données.

JPM : « Effectivement la valeur négative dans la colonne MajorAxisLength correspond à une erreur de frappe. Merci de corriger en positif pour les analyses qui suivent.

Peux-tu me proposer des visualisations graphiques de ces analyses descriptives ? »   

ChatGPT : « 

[…] »

Etrangement, ChatGPT a généré 3 graphiques univariés (histogrammes) et 3 graphiques bivariés (boxplots représentant 3 variables morphologiques en fonction de la classe de riz), suivis d’une interprétation rapide des graphiques. Il a donc exclu 4 variables des visualisations, dont la variable Perimeter, qui renferme la donnée extrême ajoutée artificiellement, et dont la visualisation était cruciale pour permettre au moins à l’utilisateur humain de se rendre compte de l’anomalie. Je n’ai pas compris ces choix arbitraires de ChatGPT qui pour moi dénotent une faiblesse.

J’ai donc demandé une visualisation des variables restantes.

JPM : « Qu’en est-il des autres variables ? Périmètre ? Rondeur ? etc. »

ChatGPT a affiché plusieurs graphiques, dont celui que j’attendais (distribution de la variable Perimeter). L’histogramme montre un problème évident de donnée(s) extrême(s) sur la droite.

Ceci n’a pas été clairement soulevé par ChatGPT qui s’est contenté d’écrire :

« […] L’histogramme du périmètre montre une distribution des valeurs avec une concentration autour d’une plage spécifique, indiquant la variabilité des tailles extérieures des grains de riz. […] »

Dommage, à ce stade, un humain averti se serait directement posé des questions sur cette variable. Erreur donc de ChatGPT.

J’ai voulu attirer l’attention de ChatGPT sur la forme inhabituelle de cet histogramme.

JPM : « Je ne comprends pas pourquoi l’histogramme de la variable périmètre est écrasé comme ça. Des explications ? »

Après que j’aie insisté sur ce graphique, ChatGPT a proposé une analyse correcte et des solutions au problème :

« L’histogramme du périmètre est écrasé, probablement en raison de la présence d’une ou de plusieurs valeurs extrêmement élevées (outliers) dans les données. Ces valeurs extrêmes étirent l’échelle de l’axe des abscisses (x) de l’histogramme, rendant les autres valeurs, qui sont regroupées dans une plage plus étroite, difficiles à distinguer et donnant l’impression que l’histogramme est « écrasé ».

[…]

Pour contourner ce problème et obtenir une meilleure visualisation de la distribution du périmètre sans l’influence de cet outlier, nous pourrions envisager de limiter l’axe des abscisses de l’histogramme à une plage plus raisonnable ou de filtrer les données pour exclure les valeurs extrêmes. Examinons l’histogramme du périmètre avec une limitation sur l’axe des abscisses pour mieux visualiser la distribution sans l’outlier. ​​

[…]

Cette approche permet de mieux appréhender la variabilité naturelle du périmètre des grains de riz sans être faussée par des valeurs aberrantes. Cela suggère également l’importance de gérer les outliers dans l’analyse des données pour éviter des interprétations erronées ou des visualisations trompeuses. »

Comme il le suggère, j’ai demandé à ChatGPT d’éliminer la valeur extrême. Cette assistance appuyée par mon regard avisé était appréciable. J’ai de plus commandé un rapport de statistiques bivariées.

JPM : « Oui, remplaçons cette valeur extrême par une donnée manquante pour les analyses qui suivent. Propose-moi à présent des analyses descriptives bivariées. »

Comme je l’espérais, ChatGPT a notamment affiché une représentation graphique de la matrice des corrélations entre les variables morphologiques. Cette matrice montre de fortes corrélations (proches de 1) parmi les variables. Or qui dit fortes corrélations parmi les variables explicatives, dit multicolinéarité, un problème qui invalide le calcul de certains algorithmes. Nous verrons si ChatGPT aura bien mémorisé ce problème pour la suite de l’analyse.

ChatGPT a par la suite proposé des statistiques bivariées confrontant chaque variable explicative à la variable à prédire (la classe de riz), avant de m’encourager à passer à une phase de modélisation.

ChatGPT :

« Comparaison des Moyennes entre Classes :

La comparaison des moyennes des variables numériques entre les classes de riz Jasmine et Gonen révèle des différences notables :

  • Gonen tend à avoir des grains plus grands (plus grande Area, ConvexArea, EquivDiameter, et Perimeter) et moins excentriques (Eccentricity plus basse) que Jasmine. Ils ont également une meilleure rondeur (Roundness plus élevée) et une étendue (Extent) légèrement plus élevée.
  • Jasmine présente des grains avec une plus grande excentricité (plus haute Eccentricity), indiquant une forme plus allongée, et un plus haut rapport d’aspect (AspectRation), suggérant une différence plus marquée entre la longueur et la largeur des grains.

Ces différences entre les classes de riz peuvent être exploités pour des tâches de classification, en utilisant ces caractéristiques physiques comme indicateurs discriminants. Les analyses montrent que les variables liées à la taille, la forme, et la proportion du grain offrent des insights pertinents sur les types de riz, soulignant l’importance de ces attributs dans la caractérisation et la distinction entre les variétés de riz. » ​

Comme suggéré par ChatGPT, je suis passé à la phase de modélisation.

JPM : « Continuons avec cette problématique de classification des deux types de riz. Quelles variables déterminent au mieux le type de grain ? »

Dans sa réponse, ChatGPT a évoqué plusieurs outils permettant de répondre à la question, notamment une régression logistique, des techniques d’analyse discriminante ou des Forêts Aléatoires (Random Forest). Il a mis en route un modèle de Random Forest et a affiché les résultats de performance (précision élevée) ainsi que les variables les plus importantes, ce qui a répondu à ma question.

La gestion d’une anomalie majeure dans le jeu de données n’a pas été signalée dans la réponse de ChatGPT sur la construction du modèle Random Forest. Il s’agit de l’abondance de données manquantes parmi les prédicteurs. L’algorithme Random Forest ne fonctionne que sur un jeu de données dépourvu de données manquantes. J’ai alors mené l’enquête et j’ai trouvé. Un aperçu du code montre qu’une imputation par la moyenne a été mise en œuvre avant le calcul :

# Gérer les valeurs manquantes dans les variables explicatives
imputer = SimpleImputer(strategy='mean')

L’interprétation du résultat devait donc être assez nuancée, des données ayant été générées artificiellement. Le calcul de la précision pouvait être biaisé à cause de phénomènes de fuite d’information (data leakage) entre les échantillons d’entraînement et ceux de validation. La précision était peut-être trop optimiste, et le résultat sur les importances des variables pas tout à fait fiable.

Je suis enfin passé au piège final et j’ai sollicité l’exécution d’un modèle de régression logistique pour voir si les résultats convergeraient avec ceux du Random Forest. Dans un monde idéal, ChatGPT devrait prendre en compte la forte multicolinéarité dans sa stratégie d’analyse, même si je ne le lui précise pas. En effet, la régression logistique est très sensible à la multicolinéarité.

JPM : « Peux-tu comparer ces résultats à ceux d’une régression logistique ? »

Déception ! ChatGPT a exécuté une régression logistique en ignorant la multicolinéarité des prédicteurs. Après avoir listé des indices vantant la bonne performance du modèle (précision, indice F1…), ChatGPT a évoqué deux prédicteurs associés à des coefficients importants en valeur absolue, et en unités standardisées.

Ceci correspond à une limite importante de ChatGPT qui peut mener à des conclusions fausses chez les utilisateurs non-avertis.

J’ai alors voulu jouer au professeur qui « pousse » son élève à se rendre compte de son erreur :  

JPM : « Es-tu sûr de la véracité de cette régression logistique ? As-tu bien vérifié les conditions de validité ? » 

Après avoir brièvement expliqué 5 conditions d’application de la régression logistique, dont l’absence de multicolinéarité, ChatGPT a admis qu’il s’était peut-être précipité sur le résultat de la logistique, en court-circuitant les étapes de diagnostic :

« Dans notre analyse précédente, nous n’avons pas explicitement vérifié toutes ces conditions. Par exemple, nous n’avons pas calculé le VIF pour évaluer la multicollinéarité, ni vérifié formellement l’indépendance des observations. La taille de l’échantillon semble être suffisante, mais une analyse plus détaillée serait nécessaire pour confirmer l’absence de multicollinéarité et s’assurer que la relation linéaire entre les logit des probabilités et les prédicteurs est appropriée. »

Je lui ai par la suite demandé de vérifier la multicolinéarité et d’exécuter de nouveau la régression logistique après avoir exclu certains prédicteurs trop corrélés au reste, ce qu’il a fait.

D’une certaine manière, cette étape montre que malgré ses erreurs, ChatGPT est capable de corriger et d’améliorer l’analyse, sous la supervision d’un professionnel de la data, qui en contrepartie économise du temps de travail.

Le mot de la fin : ChatGPT comme assistant, et pas comme décideur

En conclusion, l’expérience de test des capacités d’analyse de données de ChatGPT a révélé un potentiel considérable et des limites importantes qui méritent attention.

D’une part, ChatGPT s’est affiché comme un assistant d’analyse de données remarquablement compétent. Il a été capable de nettoyage de données, d’analyses descriptives univariées et bivariées, et de construction de modèles supervisés. Son aptitude à détecter certaines anomalies et à fournir un code Python clairement commenté prouve sa valeur ajoutée dans le processus d’analyse de données. Ceci représente un gain de temps significatif pour les professionnels de la data.

D’autre part, cette exploration a mis en lumière certaines lacunes de ChatGPT, notamment sa difficulté à identifier et éliminer les données extrêmes sans intervention manuelle, une approche parfois inconsistante dans l’analyse descriptive, et des raccourcis problématiques dans la gestion des données manquantes et la multicolinéarité. Ces éléments soulignent la nécessité d’une vigilance et d’une expertise humaine dans l’utilisation de ChatGPT pour des tâches d’analyse de données.

L’exécution de la même analyse en passant un GPT spécialisé dans la data (ChatGPT data analyst), a fourni des résultats plus probants, mais toujours pas totalement satisfaisants pour les non-professionnels de la data. Par exemple, dans cette analyse, la multicolinéarité n’a pas été prise en compte non plus dans la mise en place du modèle logistique.

J’insiste en somme sur le qualificatif assistant pour décrire les services de ChatGPT en matière d’analyse de données. Le processus ne peut s’avérer efficace et utile que par une supervision avisée et critique provenant d’un expert de la data. La synergie entre les capacités d’automatisation et d’assistance de ChatGPT et la perspicacité d’un analyste de données expérimenté ouvre la voie à des analyses plus rapides et potentiellement plus approfondies.

Partager cet article

Comments 1

  1. Très intéressant Jean-Paul. Merci pour ce retour d’expérience détaillé d’un one-shot prompt suivi d’une séquence conversationnelle. Je pense qu’il est possible en enrichissant le prompt de contexte, persona, voire sources méthodologiques explicites d’obtenir un assistant plus attentif et concentré. Faisons l’expérience la prochaine fois que tu passes au Node 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.