William Baum ( wjbaum ), étudiant diplômé en statistiques, Université du New Hampshire
Mon projet utilise le langage de script JMP pour extraire des données de plusieurs sites web afin de prédire les victoires de footballeurs professionnels. Le script automatise un processus laborieux de collecte, d'agrégation et de réorganisation des données à des fins d'analyse. Plusieurs sections du script incluent différentes fonctions, telles que le traitement des cellules pour éliminer les indices, ainsi que la concaténation et la jointure de plusieurs ensembles de données. Un tableau associatif est utilisé pour comparer les résultats des formules de colonnes dans des lignes distinctes. Enfin, les résultats de plusieurs modèles prédictifs sont comparés. L'objectif principal de ce projet est d'illustrer les utilisations du JSL pour automatiser les processus de collecte, d'organisation et de prédiction des données, de manière reproductible.
Introduction
Il y a environ deux ans, j'ai découvert que JMP pouvait extraire des données du web grâce au langage de script JMP [JSL]. Étudiant en statistiques de troisième cycle, je recherche souvent des données d'entraînement pour perfectionner mes compétences analytiques et améliorer mon codage. Il se trouve que je suis un fervent supporter de football américain et que les statistiques sportives sont facilement accessibles en ligne, via de nombreuses sources. À titre d'exercice, j'ai tenté de prédire le nombre total de victoires de chaque équipe de football professionnel au cours d'une saison, à partir de données extraites du web.
Les techniques de scraping et de nettoyage de données peuvent être appliquées à toutes les données disponibles sous forme de tableaux HTML sur le web. Je trouve remarquable que JSL puisse automatiser le nettoyage des données et la modélisation au sein d'un seul script ou d'un groupe de scripts. De plus, JMP facilite la tâche des personnes peu expérimentées en programmation en leur permettant d'effectuer une analyse via son interface graphique [GUI], puis d'enregistrer le processus sous forme de script réutilisable. Cela permet aux utilisateurs de gagner un temps précieux lors de la répétition d'analyses avec des données mises à jour ou nouvelles.
Installation
La première étape a consisté à créer des dossiers pour stocker les fichiers créés lors du processus d'agrégation des données. J'ai constaté que la création d'un dossier pour chaque source de données permettait d'organiser efficacement les nombreux fichiers produits.

Ensuite, j'ai demandé à l'utilisateur du script d'attribuer un chemin local pour le stockage des fichiers, afin de créer un code plus propre : dir = Pick Directory(“Sélectionnez le répertoire pour le stockage des fichiers”, show files(0));
Ce chemin local peut également être codé en dur.
Une fois le chemin sélectionné, les données ont été extraites de plusieurs sites web et enregistrées dans des fichiers individuels (un pour chaque tableau HTML). Ces fichiers ont été référencés ultérieurement, lors de l'étape d'agrégation des données.
Extraction de données
Avec JMP, il suffit de copier-coller les noms d'URL dans le code JSL depuis la barre d'adresse du navigateur. Il est également possible d'insérer un lien vers le site web directement dans un script, ce qui facilite l'ouverture du site web lors de la modification du code JSL : Web("http://url_name.com");
Importation de données
JMP propose une gamme d'outils utiles pour faciliter l'importation de données. Premièrement, vous pouvez essayer d'enregistrer directement un tableau HTML au format JMP. Cette méthode est optimale lorsque les données nécessitent peu de réorganisation. La deuxième méthode consiste à enregistrer le tableau HTML au format CSV, puis à l'importer dans JMP avec des paramètres utilisateur disponibles via JSL. Après avoir examiné le tableau importé, j'ai remarqué plusieurs colonnes vides. Grâce à la commande « delete columns », j'ai pu supprimer les colonnes vides de mon tableau à l'aide d'un court script.

JMP extrait automatiquement les informations du Web et enregistre les fichiers. Il n'est pas forcément nécessaire d'enregistrer ces fichiers, mais les données extraites du Web peuvent parfois être un peu confuses. L'enregistrement des données dans un fichier facilite le débogage, car il permet de consulter les tables importées et d'ajuster le code si nécessaire.
Méthode 1
Les données sont importées et enregistrées sous forme de fichier CSV, initialement :
ObjectName = Open(“http//:url_name1.com”, HTML Table(#))<< Set Name(“TableName1”) << Save(dir||“FileName1.csv”);
Méthode 2
Les données sont importées directement dans JMP et enregistrées :
Nom de l'objet = Ouvrir(“http://url_name2.com”, Tableau HTML(#)<< Définir le nom(“NomTable2”) << Enregistrer(dir||“NomFichier2.jmp”);

Traitement cellulaire
Lors du tri de données de caractères dans un script, même de légères variations dans les chaînes importées peuvent perturber votre code. Dans ce cas précis, les séries éliminatoires approchaient et, pour indiquer que la Nouvelle-Angleterre avait remporté le titre de division, un « z » avait été inséré dans son nom. Heureusement, JMP propose diverses commandes pour manipuler les chaînes dans les cellules.

Dans le script suivant, JMP parcourt chaque ligne de la colonne « Équipe » et supprime les lettres spécifiées si elles apparaissent au début de la chaîne. La commande « Pour chaque ligne » facilite la boucle en appliquant un processus à chaque ligne. La phrase conditionnelle « si, alors » indique à JMP la marche à suivre lorsque les conditions spécifiques s'appliquent. La commande « Contient » renvoie la position d'un élément spécifié dans la chaîne. La commande « Substr » (sous-chaîne) renvoie une partie de la chaîne : à partir d'une position spécifiée, elle renvoie le nombre de caractères spécifié.

Combinaison de tables
Combiner des tables dans JMP est facile grâce au menu « Tables ». Ce menu propose plusieurs options. En général, j'utilise « Joindre » pour combiner des tables contenant des colonnes différentes, mais des libellés de ligne identiques. J'utilise « Concaténer » pour combiner des tables contenant des libellés de ligne différents, mais des colonnes identiques. Dans ce cas, j'ai concaténé des informations provenant de plusieurs tables. Une table avait été créée pour chaque division d'équipe. J'ai ensuite trié les lignes du fichier résultant par nom d'équipe, par ordre alphabétique, afin de garantir la correspondance des lignes identiques lors du processus de jointure ultérieur.

Créer une nouvelle table
Je trouve utile de créer une nouvelle table avant de joindre des tables. JMP permet de créer une table de deux manières. Premièrement, via l'interface graphique. Deuxièmement, via un script. Dans ce cas, j'ai utilisé la commande « Nouvelle table » pour créer une table avec le nombre de lignes approprié : une pour chaque équipe de football. J'ai ensuite ajouté la colonne des noms d'équipes avec la commande « Nouvelle colonne », en définissant les valeurs à l'aide d'une liste.

Rejoindre des tables
Je trouve la jointure de tables fastidieuse sans JMP. Heureusement, JMP dispose d'une interface graphique conviviale pour joindre des tables dans le menu « Tables ». Bien que les conventions de nommage soient toujours importantes, JMP renomme automatiquement les colonnes provenant de différentes tables portant le même nom. Dans ce cas, j'ai joint les tables via l'interface graphique, puis j'ai simplement copié-collé le script de la table résultante dans mon script personnalisé plus volumineux. Sinon, j'aurais dû saisir beaucoup de données (renommer les colonnes) avant de joindre les tables. J'ai répété le processus de jointure plusieurs fois.

Renommer et reformater les colonnes
Une fois les jointures réalisées, j'avais beaucoup de noms de colonnes étranges. Afin d'éviter toute confusion, je les ai renommés. Pour ce faire, j'ai d'abord créé une liste de noms préférés. Ensuite, j'ai renommé les colonnes en combinant une boucle et la fonction « Définir un nom ».

Parfois, JMP importe des données sous forme de chaîne, mais l'utilisateur a besoin d'un format de colonne différent, comme l'heure. Ce format est facile à modifier dans l'interface graphique JMP, mais il est également possible de le faire via un script JSL. Dans ce cas, j'ai indiqué à JMP que la colonne contenait des informations temporelles continues, et non des caractères.
Réorganiser les colonnes
Une fois les données agrégées et les nouvelles colonnes créées, il peut être nécessaire de modifier l'ordre des colonnes dans le tableau de données. Cette opération est facile à réaliser en JSL grâce à la commande « Déplacer les colonnes sélectionnées ».

Vue du tableau de données
Voici une vue partielle du tableau de données complété.

Développer un tableau associatif
Une fois les données agrégées, il était temps de procéder à l'analyse. Je souhaitais d'abord comparer la force relative des différentes équipes, en fonction de leur calendrier, jusqu'à ce stade de la saison. Mon objectif était de prédire la performance future d'une équipe, non seulement en fonction de ses performances passées, mais aussi par rapport à celles de ses futurs adversaires. Pour ce faire, j'ai dû comparer les informations contenues dans des cellules situées dans différentes lignes et colonnes de mon tableau. La création d'un tableau associatif (ou dictionnaire ou table de hachage) s'est avérée très utile pour cette tâche.
Dans JMP, on peut utiliser des listes, des matrices ou des colonnes dans un tableau associatif. Dans ce cas, j'ai utilisé deux colonnes, avec une valeur par défaut (null). La colonne clé « ÉQUIPE » contenait les noms abrégés des villes de chaque équipe. La colonne de valeur, appelée « Force », était une colonne de formule calculant un indice combinant les victoires et les points nets. J'ai utilisé chaque semaine (une colonne) du calendrier des matchs de 17 semaines comme clé pour référencer les valeurs du tableau associatif pour cette semaine.
Programme de 17 semaines : Clés

Dans le script, j'ai défini le tableau associatif, puis créé une colonne de formule pour y faire référence. Là encore, la formule référence la valeur correcte via un indice du tableau associatif, en utilisant l'adversaire hebdomadaire comme clé. Si la valeur de la colonne clé n'est pas dans le tableau associatif, la fonction renvoie une valeur nulle (fonctionne bien avec les semaines de congé du planning).

J'ai ensuite créé une nouvelle colonne pour chaque semaine afin de comparer la force des équipes. Ces deux formules auraient pu être combinées, mais j'ai préféré les conserver séparées afin de pouvoir visualiser les différentes mesures dans le tableau de données.

Ensuite, j'ai compté le nombre de victoires prédites pour la saison. Une façon simple de comptabiliser les résultats des colonnes consistait à créer une nouvelle colonne de formules contenant la somme d'une série de conditions « Si-Alors » pour chacune des 17 colonnes. Dans ce cas, si la différence de force était positive, la prédiction était considérée comme une victoire et comptabilisée.

Créer des modèles de prédiction
JMP propose diverses techniques de modélisation pour la prédiction. De nombreuses techniques sont accessibles via le menu « Analyser », notamment les plateformes « Ajuster le modèle » et « Neural ». Lors de la création d'un script personnalisé, je recommande de développer d'abord des modèles optimaux sur les plateformes JMP. Il est ensuite possible d'enregistrer le script du modèle dans la table de données (via l'interface graphique), puis de copier-coller le code dans le script personnalisé. Il est également possible d'utiliser JSL pour enregistrer les scripts du modèle dans une table de données. Cela offre aux utilisateurs la possibilité de configurer l'exécution automatique du modèle ou de l'afficher dans la liste des scripts de la table créée par le script personnalisé.
Voici un exemple.

Techniques de modélisation avancées dans JMP Pro
JMP Pro propose plusieurs techniques de modélisation avancées, absentes de la version standard. Citons notamment la version boostée du réseau neuronal et la technique de régression généralisée par réseau élastique. JMP offre également la possibilité d'effectuer une validation de retenue avec une proportion définie par l'utilisateur, en sélectionnant automatiquement un échantillon aléatoire dans un jeu de données. Cela facilite la validation et la comparaison des modèles.
Réseau neuronal boosté

Filet élastique

Parfois, la moyenne des prédictions de plusieurs modèles peut surpasser les performances individuelles des modèles.
Ici, j'ai créé une colonne de formules en JSL qui fait la moyenne de deux formules de prédiction.

JMP Pro dispose d'une plateforme de comparaison de modèles permettant aux utilisateurs de comparer l'efficacité relative de plusieurs modèles côte à côte. Cette plateforme permet également de calculer la moyenne de plusieurs modèles en quelques clics.
Comparaisons de modèles

Dans ce cas, la moyenne des modèles de réseau neuronal et de réseau élastique (avec validation de retenue [HB]) a obtenu des résultats légèrement supérieurs à ceux des deux modèles pris séparément. Les graphiques « réel par prédit » et « résiduel par ligne » constituent une autre fonctionnalité intéressante de la plateforme de comparaison de modèles.
Graphiques de comparaison de modèles

Conclusion
Grâce au langage de script JMP [JSL], JMP peut extraire des données de plusieurs sources web, les traiter, effectuer plusieurs prédictions, les comparer et les afficher, le tout dans un seul script. Une utilisation efficace du JSL permet de gagner un temps précieux, notamment lorsqu'une analyse doit être répétée régulièrement.