Guillaume 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 du football professionnel. Le script automatise un processus autrement 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 jonction de plusieurs ensembles de données. Un tableau associatif est utilisé pour comparer la sortie des formules de colonne dans des lignes séparées. Enfin, les résultats de plusieurs modèles prédictifs sont comparés. L'objectif de ce projet est principalement d'illustrer les usages de JSL pour automatiser les processus de collecte, d'organisation et de prédiction des données, de manière répétable.
Introduction
Il y a environ deux ans, j'ai appris que JMP pouvait extraire des données du Web avec JMP Scripting Language [JSL]. En tant qu'étudiant diplômé en statistique, je suis souvent à la recherche de données pratiques sur lesquelles affiner mes compétences analytiques et améliorer mon codage.Il se trouve que je suis un passionné de football américain et que les statistiques sportives sont facilement disponibles en ligne à partir de nombreuses sources différentes.À titre d'exercice, j'ai tenté de prédire le nombre total de victoires au cours d'une saison pour chaque équipe de football professionnelle, avec des données récupérées sur le Web.
Les techniques de grattage et de nettoyage des données peuvent être appliquées à toutes les données disponibles sous forme de tableaux html sur le Web.Je trouve étonnant que JSL puisse être utilisé pour automatiser le nettoyage des données et effectuer la modélisation dans un seul script ou un groupe composite de scripts.De plus, JMP aide ceux qui ont une expérience limitée en programmation, en permettant aux utilisateurs d'effectuer une analyse via son interface utilisateur graphique [GUI], puis d'enregistrer le processus sous forme de script pouvant être réutilisé. Cela permet aux utilisateurs de gagner beaucoup de temps lors de la répétition d'analyses avec des données mises à jour ou nouvelles.
Installation
La première étape consistait à créer des dossiers dans lesquels stocker les fichiers qui seraient créés lors du processus d'agrégation des données.J'ai trouvé que la création d'un dossier pour chaque source de données fonctionnait bien pour organiser 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("Select directory for file storage", show files(0));
Ce chemin local peut également être codé en dur.
Une fois qu'un chemin a été sélectionné, les données ont ensuite é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.
Gratter les données
Avec JMP, il suffit de copier et coller les noms d'URL dans le code JSL à partir de la barre d'adresse d'un navigateur.On peut également mettre un lien vers le site Web directement dans un script, ce qui permet d'ouvrir le site Web lors de l'édition du code JSL : Web(" http://nom_url.com ");
Importation de données
JMP dispose d'un assortiment d'outils utiles pour faciliter l'importation de données.Tout d'abord, on peut tenter d'enregistrer directement un tableau html en tant que fichier JMP.Cette méthode fonctionne mieux lorsque les données nécessitent peu de réorganisation.La deuxième méthode consiste à enregistrer d'abord le tableau HTML sous forme de fichier CSV (valeurs séparées par des virgules), qui peut ensuite être importé dans JMP avec des paramètres définis par l'utilisateur disponibles via JSL.Après avoir regardé le tableau importé, j'ai remarqué plusieurs colonnes vides.En utilisant la commande "supprimer les colonnes", j'ai pu supprimer les colonnes vides de ma table avec un court script.

JMP extrait automatiquement les informations du Web et enregistre les fichiers.Il n'est pas nécessairement nécessaire de sauvegarder ces fichiers, mais les données extraites du Web peuvent parfois être un peu compliquées.L'enregistrement des données dans un fichier facilite le débogage, car on peut consulter les tables importées et 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 :
NomObjet = Ouvrir(“ http://nom_url2.com" , HTML Table(#)<< Set Name(“TableName2”) << Save(dir||“FileName2.jmp”);

Traitement cellulaire
Lors du tri des données de caractères dans un script, même de légères variations dans les chaînes importées peuvent encrasser votre code.Dans ce cas, les séries éliminatoires étaient proches et pour indiquer que la Nouvelle-Angleterre avait décroché un titre de division, un «z» a été inséré dans leur nom. Heureusement, JMP propose une variété de commandes pour manipuler les chaînes dans les cellules.

Dans le script suivant, JMP parcourt chaque ligne de la colonne de nom "Team" 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, qui applique un processus à chaque ligne.L'expression conditionnelle "si, alors" indique à JMP ce qu'il doit faire 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é.

Combiner des tableaux
La combinaison de tables dans JMP est facile via le menu "Tables".Le menu Tableaux propose plusieurs options.En général, j'utilise "Join" pour combiner des tables qui ont des colonnes différentes, mais les mêmes étiquettes de ligne. J'utilise "Concaténer" lorsque je combine des tables avec des étiquettes de lignes différentes, mais les mêmes colonnes.Dans ce cas, j'ai concaténé les informations de plusieurs tables.Un tableau avait été créé pour chaque division d'équipes.Ensuite, j'ai trié les lignes du fichier résultant par nom d'équipe, par ordre alphabétique, pour m'assurer que les lignes similaires correspondent au cours du processus d'adhésion, plus tard.

Créer un nouveau tableau
Je trouve utile de créer une nouvelle table, avant de joindre des tables.JMP permet aux utilisateurs de créer une nouvelle table de plusieurs manières.Tout d'abord, cela peut être fait via l'interface graphique.Cela peut également être accompli par le biais d'un script.Dans ce cas, j'ai utilisé la commande "Nouveau tableau" pour créer un nouveau tableau avec le nombre approprié de lignes : une pour chaque équipe de football.J'ai ensuite ajouté la colonne des noms d'équipe avec la commande "Nouvelle colonne", en définissant les valeurs avec une liste.

Joindre des tables
Je trouve que joindre des tables est une tâche ennuyeuse sans JMP.Heureusement, JMP dispose d'une interface graphique agréable pour joindre des tables dans le menu "Tables". Bien que les conventions de dénomination soient toujours importantes, JMP renomme automatiquement les colonnes provenant de différentes tables qui partagent le même nom.Dans ce cas, j'ai joint les tables via l'interface graphique, puis j'ai simplement copié et collé le script de table de la table résultante dans mon script personnalisé plus grand.Sinon, j'aurais eu beaucoup de saisie à faire (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 à consonance étrange.Afin d'éliminer toute confusion, j'ai renommé ces colonnes. Pour ce faire, j'ai d'abord créé une liste de noms préférés.Ensuite, j'ai renommé les colonnes en utilisant la combinaison d'une boucle et de la fonction "Définir le nom".

Parfois, JMP importe des données sous forme de chaîne, mais l'utilisateur a besoin d'un format de colonne différent, tel que l'heure. Ceci est facile à modifier dans l'interface graphique JMP, mais cela peut également être effectué dans un script JSL.Dans ce cas, j'ai fait savoir à JMP que la colonne contenait des informations de temps continu, au lieu d'un caractère.
Réorganiser les colonnes
Une fois que les données sont agrégées et que de nouvelles colonnes sont créées, on peut vouloir changer l'ordre des colonnes dans la table de données.Cela se fait facilement en JSL avec la commande "Déplacer les colonnes sélectionnées".

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

Développer un tableau associatif
Une fois que j'ai fini d'agréger les données, il était temps de faire une analyse.La première chose que je voulais comparer était la force relative des différentes équipes, en fonction de la force de leur calendrier, jusqu'à ce point de la saison. Mon objectif était de prédire la performance future d'une équipe, non seulement en fonction de ses propres performances passées, mais également par rapport aux performances passées de ses futurs adversaires.Pour ce faire, j'ai dû comparer des informations contenues dans des cellules situées dans différentes lignes et colonnes de mon tableau.La création d'un tableau associatif (alias dictionnaire ou carte de hachage) a été 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é "TEAM" contenait les noms de ville abrégés pour chaque équipe.La colonne de valeur, appelée "Force", était une colonne de formule qui calculait un indice, combinant les gains et les points nets.J'ai utilisé chaque semaine (une colonne) du programme de jeu de 17 semaines comme clé pour référencer les valeurs du tableau associatif pour cette semaine.
Horaire de 17 semaines : Clés

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

J'ai ensuite créé une nouvelle colonne pour chaque semaine afin de comparer la force de l'équipe.Ces deux formules auraient pu être jointes, mais j'ai préféré les garder séparées afin de pouvoir visualiser les différentes métriques dans le tableau de données.

Ensuite, j'ai compté le nombre de victoires prévues pour la saison.Un moyen simple de compter les résultats de la colonne consistait à créer une nouvelle colonne de formule 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 comptée.

Créer des modèles de prédiction
JMP dispose d'une variété de techniques de modélisation pour la prédiction.De nombreuses techniques sont accessibles via le menu "Analyze", y compris les plateformes "Fit Model" et "Neural".Lors de la création d'un script personnalisé, je recommande de développer d'abord des modèles optimaux dans les plates-formes JMP. Ensuite, on peut enregistrer le script de modèle dans la table de données (via l'interface graphique) et copier et coller le code dans le script personnalisé.On peut également utiliser JSL pour enregistrer des scripts de modèle dans une table de données.Cela donne aux utilisateurs la possibilité de configurer le modèle pour qu'il s'exécute automatiquement ou de rendre le modèle disponible dans la liste des scripts de table de données de la table créée par le script personnalisé.
Voici un exemple.

Techniques de modélisation avancées dans JMP Pro
Plusieurs techniques de modélisation avancées sont disponibles dans JMP Pro, qui ne sont pas disponibles dans la version standard de JMP.Deux exemples sont la version boostée du réseau neuronal et la technique de régression généralisée du réseau élastique.Une autre qualité intéressante de JMP est sa capacité à effectuer une validation de retenue avec une proportion spécifiée par l'utilisateur, en sélectionnant automatiquement un échantillon aléatoire à partir d'un ensemble de données.Cela facilite à la fois la validation et la comparaison des modèles.
Réseau de neurones boosté

Filet élastique

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

JMP Pro dispose d'une plate-forme de comparaison de modèles, dans laquelle les utilisateurs peuvent comparer l'efficacité relative de plusieurs modèles, côte à côte.La plate-forme de comparaison de modèles donne également aux utilisateurs le pouvoir de faire la moyenne de plusieurs modèles ensemble, en quelques clics seulement.
Comparaisons de modèles

Dans ce cas, la moyenne des modèles Neural Net et Elastic Net (avec validation de retenue [HB]) a donné des résultats légèrement meilleurs que l'un ou l'autre des deux modèles individuels, seuls.Une autre fonctionnalité intéressante de la plate-forme de comparaison de modèles sont les tracés "réel par prédit" et "résiduel par ligne".
Tracés de comparaison de modèles

Conclusion
Avec JMP Scripting Language [JSL], JMP peut extraire des données de plusieurs sources Web, traiter les données, effectuer plusieurs prédictions, les comparer et les afficher, le tout dans un seul script.L'utilisation efficace de JSL peut faire gagner beaucoup de temps, surtout lorsqu'il faut répéter une analyse régulièrement.