William Baum ( albero di wj ), studente laureato in statistica, Università del New Hampshire
Il mio progetto utilizza il linguaggio di scripting JMP per estrarre dati da più siti Web per prevedere le vittorie nel football professionistico. Lo script automatizza un processo altrimenti laborioso di raccolta, aggregazione e riorganizzazione dei dati per l'analisi. Diverse sezioni dello script includono diverse funzioni, come l'elaborazione delle celle per eliminare gli indici e la concatenazione e l'unione di più set di dati. Viene utilizzato un array associativo per confrontare l'output delle formule di colonna in righe separate. Infine, vengono confrontati i risultati di più modelli predittivi. Lo scopo di questo progetto è principalmente quello di illustrare gli utilizzi di JSL per automatizzare i processi di raccolta, organizzazione e previsione dei dati, in modo ripetibile.
Introduzione
Circa due anni fa, ho scoperto che JMP poteva estrarre dati dal web con JMP Scripting Language [JSL]. Come studente di statistica laureato, cerco spesso dati di pratica su cui affinare le mie capacità analitiche e migliorare la mia codifica. Capita che io sia un appassionato di football americano e le statistiche sportive sono facilmente reperibili online da molte fonti diverse. Come esercizio, ho provato a prevedere il totale delle vittorie in una stagione per ogni squadra di football professionistico, con dati estratti dal web.
Le tecniche di scraping e pulizia dei dati possono essere applicate a qualsiasi dato disponibile sotto forma di tabelle HTML sul Web. Trovo sorprendente che JSL possa essere utilizzato per automatizzare la pulizia dei dati ed eseguire la modellazione all'interno di un singolo script o di un gruppo composito di script. Inoltre, JMP aiuta coloro che hanno un'esperienza di programmazione limitata, consentendo agli utenti di condurre un'analisi tramite la sua interfaccia utente grafica [GUI] e, in seguito, di salvare il processo come uno script che può essere riutilizzato. Ciò consente agli utenti di risparmiare molto tempo quando ripetono le analisi con dati aggiornati o nuovi.
Impostare
Il primo passo è stato creare cartelle in cui archiviare i file che sarebbero stati creati durante il processo di aggregazione dei dati. Ho scoperto che creare una cartella per ogni fonte di dati funzionava bene per organizzare i numerosi file prodotti.

Successivamente, ho chiesto all'utente dello script di assegnare un percorso locale per l'archiviazione dei file, per rendere il codice più pulito: dir = Pick Directory(“Seleziona directory per l'archiviazione dei file”, show files(0));
Questo percorso locale può anche essere codificato in modo rigido.
Una volta selezionato un percorso, i dati venivano estratti da più siti web e salvati in file individuali (uno per ogni tabella HTML). Questi file venivano referenziati in seguito, durante la fase di aggregazione dei dati.
Estrazione dei dati
Con JMP, si devono semplicemente copiare e incollare i nomi URL nel codice JSL dalla barra degli indirizzi del browser. Si può anche inserire un collegamento al sito web direttamente in uno script, il che aiuta ad aprire il sito web durante la modifica del codice JSL: Web("http://nome_url.com");
Importazione dei dati
JMP ha una serie di strumenti utili per facilitare l'importazione dei dati. Innanzitutto, si può provare a salvare una tabella HTML come file JMP, direttamente. Questo metodo funziona meglio quando i dati richiedono una piccola riorganizzazione. Il secondo metodo consiste nel salvare prima la tabella HTML come file con valori separati da virgole [CSV], che può poi essere importato in JMP con impostazioni definite dall'utente disponibili tramite JSL. Dopo aver esaminato la tabella importata, ho notato diverse colonne vuote. Utilizzando il comando "delete columns", sono riuscito a eliminare le colonne vuote dalla mia tabella con un breve script.

JMP estrae automaticamente le informazioni dal web e salva i file. Non è necessariamente necessario salvare questi file, ma i dati estratti dal web possono a volte essere un po' disordinati. Salvare i dati in un file semplifica il debug, perché è possibile guardare le tabelle importate e modificare il codice, se necessario.
Metodo 1
I dati vengono importati e salvati inizialmente come file CSV:
ObjectName = Open(“http//:url_name1.com”, Tabella HTML(#))<< Imposta Nome(“TableName1”) << Salva(dir||“FileName1.csv”);
Metodo 2
I dati vengono importati direttamente in JMP e salvati:
NomeOggetto = Apri(“http://url_name2.com”, Tabella HTML(#)<< Imposta Nome(“NomeTabella2”) << Salva(dir||“NomeFile2.jmp”);

Elaborazione delle cellule
Quando si ordinano i dati dei caratteri in uno script, anche piccole variazioni nelle stringhe importate possono rovinare il codice. In questo caso, i playoff erano vicini e per indicare che il New England aveva conquistato un titolo di divisione, è stata inserita una "z" nel loro nome. Fortunatamente, JMP offre una varietà di comandi per manipolare le stringhe all'interno delle celle.

Nello script seguente, JMP esegue un loop su ogni riga della colonna del nome "Team" ed elimina le lettere specificate, se compaiono all'inizio della stringa. Il comando "For Each Row" semplifica il looping, che applica un processo a ogni riga. La frase condizionale "if, then" indica a JMP cosa fare quando si applicano le condizioni specifiche. Il comando "Contains" restituisce la posizione di un elemento specificato all'interno della stringa. Il comando "Substr" (sottostringa) restituisce parte della stringa: partendo da una posizione specificata, restituisce il numero specificato di caratteri.

Combinazione di tabelle
Combinare le tabelle in JMP è facile tramite il menu "Tabelle". Il menu Tabelle offre più opzioni. In generale, uso "Join" per combinare tabelle che hanno colonne diverse, ma le stesse etichette di riga. Uso "Concatenate" quando combino tabelle con etichette di riga diverse, ma le stesse colonne. In questo caso, ho concatenato le informazioni da più tabelle. Era stata creata una tabella per ogni divisione di team. Quindi, ho ordinato le righe del file risultante in base al nome del team, in ordine alfabetico, per garantire che righe simili fossero abbinate durante il processo di unione, in seguito.

Crea una nuova tabella
Trovo utile creare una nuova tabella, prima di unire le tabelle. JMP consente agli utenti di creare una nuova tabella in un paio di modi. Innanzitutto, può essere fatto tramite la GUI. Può anche essere fatto tramite uno script. In questo caso, ho usato il comando "New Table" per creare una nuova tabella con il numero appropriato di righe: una per ogni squadra di calcio. Ho poi aggiunto la colonna dei nomi delle squadre con il comando "New Column", impostando i valori con un elenco.

Unire le tabelle
Trovo che unire le tabelle sia un compito fastidioso senza JMP. Fortunatamente, JMP ha una bella GUI per unire le tabelle nel menu "Tabelle". Sebbene le convenzioni di denominazione siano sempre importanti, JMP rinomina automaticamente le colonne provenienti da tabelle diverse che condividono lo stesso nome. In questo caso, ho unito le tabelle tramite la GUI, quindi ho semplicemente copiato e incollato lo script della tabella risultante nel mio script personalizzato più grande. Altrimenti, avrei dovuto digitare molto (rinominare le colonne), prima di unire le tabelle. Ho ripetuto il processo di unione molte volte.

Rinomina e riformatta le colonne
Una volta completate le unioni, avevo un sacco di nomi di colonne dal suono strano. Per eliminare la confusione, ho rinominato quelle colonne. Per farlo, ho prima creato un elenco di nomi preferiti. Poi, ho rinominato le colonne usando la combinazione di un loop e della funzione "Set Name".

A volte JMP importa i dati come stringa, ma l'utente ha bisogno di un formato di colonna diverso, come time. Questo è facile da modificare nella GUI di JMP, ma può essere fatto anche in uno script JSL. In questo caso, ho fatto sapere a JMP che la colonna conteneva informazioni di tempo continue, invece di caratteri.
Riorganizzare le colonne
Una volta aggregati i dati e create nuove colonne, si potrebbe voler cambiare l'ordine delle colonne nella tabella dati. Ciò è facilmente realizzabile in JSL con il comando "Sposta colonne selezionate".

Visualizzazione della tabella dati
Ecco una vista parziale della tabella dati completata.

Sviluppare array associativi
Una volta terminata l'aggregazione dei dati, era il momento di fare delle analisi. La prima cosa che volevo confrontare era la forza relativa di diverse squadre, in base alla forza del loro programma, fino a quel punto della stagione. Il mio obiettivo era prevedere quanto sarebbe stata forte la prestazione futura di una squadra, non solo in base alla loro prestazione passata, ma anche in relazione alla prestazione passata dei loro futuri avversari. Per farlo, ho dovuto confrontare le informazioni contenute nelle celle situate in diverse righe e colonne della mia tabella. Creare un array associativo (alias dizionario o mappa hash) è stato molto utile per questo compito.
In JMP, si possono usare elenchi, matrici o colonne in un array associativo. In questo caso, ho usato due colonne, con un valore predefinito (null). La colonna chiave "TEAM" conteneva i nomi abbreviati delle città per ogni squadra. La colonna valore, chiamata "Strength", era una colonna formula che calcolava un indice, combinando vittorie e punti netti. Ho usato ogni settimana (una colonna) del programma di gioco di 17 settimane come chiavi per fare riferimento ai valori dell'array associativo per quella settimana.
Programma di 17 settimane: Chiavi

Nello script, ho definito l'array associativo, quindi ho creato una colonna formula per farvi riferimento. Di nuovo, la formula fa riferimento al valore corretto tramite un indice dell'array associativo, utilizzando l'avversario settimanale come chiave. Se il valore nella colonna chiave non è nell'array associativo, la funzione restituisce un valore nullo (funziona bene con le settimane di pausa nella pianificazione).

Ho quindi creato una nuova colonna per ogni settimana per confrontare la forza del team. Queste due formule avrebbero potuto essere unite, ma ho preferito tenerle separate in modo da poter visualizzare le diverse metriche nella tabella dei dati.

Poi ho contato il numero di vittorie previste per la stagione. Un modo semplice per contare i risultati delle colonne era creare una nuova colonna formula che contenesse la somma di una serie di condizioni "If-Then" per ciascuna delle 17 colonne. In questo caso, se la differenza in Strength era positiva, la previsione era considerata una vittoria e conteggiata.

Creare modelli di previsione
JMP ha una varietà di tecniche di modellazione per la previsione. Molte tecniche sono accessibili tramite il menu "Analizza", tra cui le piattaforme "Adatta modello" e "Neural". Quando si crea uno script personalizzato, consiglio di sviluppare prima modelli ottimali nelle piattaforme di JMP. Quindi si può salvare lo script del modello nella tabella dati (tramite la GUI) e copiare e incollare il codice nello script personalizzato. Si può anche usare JSL per salvare gli script del modello in una tabella dati. Ciò offre agli utenti la flessibilità di impostare il modello per l'esecuzione automatica o di rendere il modello disponibile nell'elenco degli script della tabella dati della tabella creata dallo script personalizzato.
Ecco un esempio.

Tecniche di modellazione avanzate in JMP Pro
In JMP Pro sono disponibili diverse tecniche di modellazione avanzate, non disponibili nella versione standard di JMP. Due esempi sono la versione potenziata della rete neurale e la tecnica di regressione generalizzata elastic-net. Un'altra bella qualità di JMP è la sua capacità di eseguire la convalida holdback con una proporzione specificata dall'utente, selezionando automaticamente un campione casuale da un set di dati. Ciò semplifica sia la convalida che il confronto dei modelli.
Rete neurale potenziata

Rete elastica

Talvolta la media delle previsioni di più modelli può superare le prestazioni dei singoli modelli.
Qui ho creato una colonna formula in JSL che calcola la media di due formule di previsione.

JMP Pro ha una piattaforma di confronto modelli, in cui gli utenti possono confrontare l'efficacia relativa di più modelli, uno accanto all'altro. La piattaforma di confronto modelli offre inoltre agli utenti il potere di fare la media di più modelli insieme, con solo pochi clic.
Confronti di modelli

In questo caso, la media dei modelli Neural Net ed Elastic Net (con validazione holdback [HB]) ha avuto prestazioni leggermente migliori rispetto a uno qualsiasi dei due modelli individuali, da solo. Un'altra bella caratteristica della piattaforma di confronto dei modelli sono i grafici "effettivo per previsto" e "residuo per riga".
Grafici di confronto dei modelli

Conclusione
Con JMP Scripting Language [JSL], JMP può estrarre dati da più fonti web, elaborare i dati, eseguire più previsioni, confrontarle e visualizzarle, il tutto all'interno di un singolo script. L'uso efficace di JSL può far risparmiare molto tempo, soprattutto quando si deve ripetere un'analisi regolarmente.