William Baum ( wjbaum ), Diplom-Student der Statistik, University of New Hampshire
Mein Projekt verwendet die JMP-Skriptsprache, um Daten von mehreren Websites abzurufen und so Siege im Profifußball vorherzusagen. Das Skript automatisiert einen ansonsten mühsamen Prozess des Sammelns, Aggregierens und Reorganisierens von Daten für die Analyse. Mehrere Abschnitte des Skripts umfassen unterschiedliche Funktionen, wie z. B. die Zellverarbeitung zur Eliminierung von Indizes sowie die Verkettung und Verbindung mehrerer Datensätze. Ein assoziatives Array wird verwendet, um die Ausgabe von Spaltenformeln in separaten Zeilen zu vergleichen. Abschließend werden die Ergebnisse mehrerer Vorhersagemodelle verglichen. Der Zweck dieses Projekts besteht hauptsächlich darin, die Verwendung von JSL zur wiederholbaren Automatisierung der Prozesse der Datenerfassung, -organisation und -vorhersage zu veranschaulichen.
Einführung
Vor etwa zwei Jahren erfuhr ich, dass JMP mit der JMP Scripting Language [JSL] Daten aus dem Web extrahieren kann. Als Student der Statistik bin ich oft auf der Suche nach Übungsdaten, mit denen ich meine analytischen Fähigkeiten verfeinern und meine Codierung verbessern kann.Zufälligerweise bin ich ein begeisterter American-Football-Fan und Sportstatistiken sind online aus vielen verschiedenen Quellen verfügbar.Als Übung habe ich versucht, die Gesamtsiege in einer Saison für jede professionelle Fußballmannschaft vorherzusagen, indem ich Daten aus dem Internet entnommen habe.
Daten-Scraping- und Bereinigungstechniken können auf alle Daten angewendet werden, die in Form von HTML-Tabellen im Web verfügbar sind.Ich finde es erstaunlich, dass JSL verwendet werden kann, um die Datenbereinigung zu automatisieren und die Modellierung innerhalb eines einzelnen Skripts oder einer zusammengesetzten Gruppe von Skripten durchzuführen.Darüber hinaus hilft JMP Personen mit begrenzter Programmiererfahrung, indem es Benutzern ermöglicht, eine Analyse über die grafische Benutzeroberfläche [GUI] durchzuführen und den Prozess anschließend als Skript zu speichern, das wiederverwendet werden kann. Dies spart Benutzern viel Zeit bei der Wiederholung von Analysen mit aktualisierten oder neuen Daten.
Aufstellen
Der erste Schritt bestand darin, Ordner zu erstellen, in denen die Dateien gespeichert werden, die während des Datenaggregationsprozesses erstellt werden.Ich fand, dass das Erstellen eines Ordners für jede Datenquelle gut funktionierte, um die vielen erzeugten Dateien zu organisieren.

Als nächstes habe ich den Skriptbenutzer gebeten, einen lokalen Pfad für die Dateispeicherung zuzuweisen, um einen saubereren Code zu erzielen: dir = Pick Directory(“Verzeichnis für die Dateispeicherung auswählen”, show files(0));
Dieser lokale Pfad kann auch fest codiert sein.
Sobald ein Pfad ausgewählt wurde, wurden die Daten von mehreren Websites extrahiert und in einzelnen Dateien gespeichert (eine für jede HTML-Tabelle).Auf diese Dateien wurde später während der Datenaggregationsphase verwiesen.
Scraping von Daten
Bei JMP muss man einfach URL-Namen kopieren und aus der Adressleiste eines Browsers in den JSL-Code einfügen.Man kann auch direkt in einem Skript einen Link zur Website einfügen, was beim Öffnen der Website beim Bearbeiten des JSL-Codes hilft: Web(" http://url_name.com ");
Daten importieren
JMP verfügt über eine Reihe nützlicher Tools zur Unterstützung des Datenimports.Zunächst kann man versuchen, eine HTML-Tabelle direkt als JMP-Datei zu speichern.Diese Methode funktioniert am besten, wenn die Daten nur wenig Reorganisation erfordern.Die zweite Methode besteht darin, die HTML-Tabelle zunächst als Datei mit durch Kommas getrennten Werten [CSV] zu speichern, die dann mit benutzerdefinierten Einstellungen, die über JSL verfügbar sind, in JMP importiert werden kann.Nachdem ich mir die importierte Tabelle angesehen hatte, fielen mir mehrere leere Spalten auf.Über den Befehl „Spalten löschen“ konnte ich mit einem kurzen Skript die leeren Spalten aus meiner Tabelle löschen.

JMP ruft die Informationen automatisch aus dem Internet ab und speichert die Dateien.Man muss diese Dateien nicht unbedingt speichern, aber aus dem Internet entnommene Daten können manchmal etwas chaotisch sein.Das Speichern von Daten in einer Datei erleichtert das Debuggen, da man sich die importierten Tabellen ansehen und den Code nach Bedarf anpassen kann.
Methode 1
Die Daten werden zunächst als CSV-Datei importiert und gespeichert:
ObjectName = Open(“http//:url_name1.com”, HTML Table(#))<< Set Name(“TableName1”) << Save(dir||“FileName1.csv“);
Methode 2
Daten werden direkt in JMP importiert und gespeichert:
ObjectName = Open(“ http://url_name2.com“ , HTML Table(#)<< Set Name(“TableName2”) << Save(dir||“FileName2.jmp“);

Zellverarbeitung
Beim Sortieren von Zeichendaten in einem Skript können selbst geringfügige Abweichungen in importierten Zeichenfolgen Ihren Code beeinträchtigen.In diesem Fall standen die Playoffs kurz bevor und um anzuzeigen, dass New England sich einen Divisionstitel gesichert hatte, wurde ein „z“ in ihren Namen eingefügt. Glücklicherweise bietet JMP eine Vielzahl von Befehlen zum Bearbeiten von Zeichenfolgen in Zellen.

Im folgenden Skript durchläuft JMP jede Zeile der Namensspalte „Team“ und löscht angegebene Buchstaben, wenn sie am Anfang der Zeichenfolge erscheinen.Der Befehl „Für jede Zeile“ ermöglicht eine einfache Schleife, die einen Prozess auf jede Zeile anwendet.Der bedingte „Wenn, dann“-Satz sagt JMP, was zu tun ist, wenn die spezifischen Bedingungen zutreffen. Der Befehl „Contains“ gibt die Position eines angegebenen Elements innerhalb der Zeichenfolge zurück.Der Befehl „Substr“ (Teilzeichenfolge) gibt einen Teil der Zeichenfolge zurück: Beginnend an einer angegebenen Position gibt er die angegebene Anzahl von Zeichen zurück.

Tabellen kombinieren
Das Kombinieren von Tabellen in JMP ist über das Menü „Tabellen“ einfach.Das Tabellenmenü bietet mehrere Optionen.Im Allgemeinen verwende ich „Join“, um Tabellen zu kombinieren, die unterschiedliche Spalten, aber die gleichen Zeilenbeschriftungen haben. Ich verwende „Verketten“, wenn ich Tabellen mit unterschiedlichen Zeilenbeschriftungen, aber denselben Spalten kombiniere.In diesem Fall habe ich Informationen aus mehreren Tabellen verkettet.Für jede Mannschaftsabteilung wurde eine Tabelle erstellt.Als nächstes habe ich die Zeilen der resultierenden Datei alphabetisch nach Teamnamen sortiert, um sicherzustellen, dass gleiche Zeilen später während des Zusammenführungsprozesses übereinstimmen.

Erstellen Sie eine neue Tabelle
Ich finde es nützlich, vor dem Zusammenführen von Tabellen eine neue Tabelle zu erstellen.Mit JMP können Benutzer auf verschiedene Arten eine neue Tabelle erstellen.Erstens kann dies über die GUI erfolgen.Dies kann auch über ein Skript erfolgen.In diesem Fall habe ich den Befehl „Neue Tabelle“ verwendet, um eine neue Tabelle mit der entsprechenden Anzahl an Zeilen zu erstellen: eine für jede Fußballmannschaft.Anschließend habe ich die Spalte mit den Teamnamen mit dem Befehl „Neue Spalte“ hinzugefügt und die Werte mithilfe einer Liste festgelegt.

Tische zusammenfügen
Ich finde, dass das Zusammenfügen von Tabellen ohne JMP eine lästige Aufgabe ist.Glücklicherweise verfügt JMP über eine schöne Benutzeroberfläche zum Verbinden von Tabellen im Menü „Tabellen“. Obwohl Namenskonventionen immer wichtig sind, benennt JMP automatisch Spalten um, die aus verschiedenen Tabellen mit demselben Namen stammen.In diesem Fall habe ich die Tabellen über die GUI verbunden und dann einfach das Tabellenskript der resultierenden Tabelle kopiert und in mein größeres, benutzerdefiniertes Skript eingefügt.Andernfalls hätte ich vor dem Zusammenfügen der Tabellen viel tippen (Spalten umbenennen) müssen. Ich habe den Beitrittsprozess viele Male wiederholt.

Spalten umbenennen und neu formatieren
Nachdem die Verknüpfungen abgeschlossen waren, hatte ich viele seltsam klingende Spaltennamen.Um Verwirrung zu vermeiden, habe ich diese Spalten umbenannt. Dazu habe ich zunächst eine Liste mit Wunschnamen erstellt.Dann habe ich die Spalten mithilfe einer Kombination aus einer Schleife und der Funktion „Name festlegen“ umbenannt.

Manchmal importiert JMP Daten als Zeichenfolge, der Benutzer benötigt jedoch ein anderes Spaltenformat, z. B. Zeit. Dies lässt sich leicht in der JMP-GUI ändern, kann aber auch in einem JSL-Skript durchgeführt werden.In diesem Fall habe ich JMP darüber informiert, dass die Spalte fortlaufende Zeitinformationen anstelle von Zeichen enthielt.
Spalten neu organisieren
Sobald die Daten aggregiert und neue Spalten erstellt wurden, möchten Sie möglicherweise die Reihenfolge der Spalten in der Datentabelle ändern.Dies lässt sich in JSL ganz einfach mit dem Befehl „Ausgewählte Spalten verschieben“ bewerkstelligen.

Datentabellenansicht
Hier ist eine Teilansicht der fertigen Datentabelle.

Entwickeln Sie ein assoziatives Array
Nachdem ich mit der Aggregation der Daten fertig war, war es an der Zeit, eine Analyse durchzuführen.Das erste, was ich vergleichen wollte, war die relative Stärke verschiedener Teams, basierend auf ihrer Stärke im Spielplan, bis zu diesem Zeitpunkt in der Saison. Mein Ziel war es, vorherzusagen, wie stark die zukünftige Leistung einer Mannschaft sein würde, und zwar nicht nur auf der Grundlage ihrer eigenen bisherigen Leistung, sondern auch im Verhältnis zur bisherigen Leistung ihrer zukünftigen Gegner.Dazu musste ich Informationen vergleichen, die in Zellen in verschiedenen Zeilen und Spalten meiner Tabelle enthalten waren.Für diese Aufgabe war das Erstellen eines assoziativen Arrays (auch Wörterbuch oder Hash-Map genannt) sehr nützlich.
In JMP kann man Listen, Matrizen oder Spalten in einem assoziativen Array verwenden.In diesem Fall habe ich zwei Spalten mit einem Standardwert (null) verwendet. Die Schlüsselspalte „TEAM“ enthielt die abgekürzten Städtenamen für jedes Team.Die Wertespalte mit dem Namen „Stärke“ war eine Formelspalte, die einen Index berechnete, der Siege und Nettopunkte kombinierte.Ich habe jede Woche (eine Spalte) des 17-wöchigen Spielplans als Schlüssel verwendet, um auf die assoziativen Array-Werte für diese Woche zu verweisen.
17-wöchiger Zeitplan: Schlüssel

Im Skript habe ich das assoziative Array definiert und dann eine Formelspalte erstellt, um darauf zu verweisen.Auch hier verweist die Formel über einen Index des assoziativen Arrays auf den korrekten Wert, wobei der wöchentliche Gegner als Schlüssel verwendet wird.Wenn der Wert in der Schlüsselspalte nicht im assoziativen Array enthalten ist, gibt die Funktion einen Nullwert zurück (funktioniert gut mit Bye-Wochen im Zeitplan).

Anschließend habe ich für jede Woche eine neue Spalte erstellt, um die Teamstärke zu vergleichen.Diese beiden Formeln hätten verbunden werden können, aber ich habe es vorgezogen, sie getrennt zu halten, damit ich die verschiedenen Metriken in der Datentabelle visualisieren konnte.

Als nächstes zählte ich die Anzahl der prognostizierten Siege für die Saison.Eine einfache Möglichkeit, die Spaltenergebnisse zu zählen, bestand darin, eine neue Formelspalte zu erstellen, die die Summe einer Reihe von „Wenn-Dann“-Bedingungen für jede der 17 Spalten enthielt.Wenn in diesem Fall der Unterschied in der Stärke positiv war, wurde die Vorhersage als Sieg gewertet und gewertet.

Erstellen Sie Vorhersagemodelle
JMP verfügt über eine Vielzahl von Modellierungstechniken für die Vorhersage.Der Zugriff auf viele Techniken erfolgt über das Menü „Analysieren“, darunter die Plattformen „Fit Model“ und „Neural“.Beim Erstellen eines benutzerdefinierten Skripts empfehle ich, zunächst optimale Modelle auf den Plattformen von JMP zu entwickeln. Dann kann man das Modellskript in der Datentabelle speichern (über die GUI) und den Code kopieren und in das benutzerdefinierte Skript einfügen.Man kann JSL auch verwenden, um Modellskripte in einer Datentabelle zu speichern.Dies gibt Benutzern die Flexibilität, das Modell so einzustellen, dass es automatisch ausgeführt wird, oder das Modell in der Liste der Datentabellenskripts der vom benutzerdefinierten Skript erstellten Tabelle verfügbar zu machen.
Hier ist ein Beispiel.

Erweiterte Modellierungstechniken in JMP Pro
In JMP Pro stehen mehrere erweiterte Modellierungstechniken zur Verfügung, die in der Standardversion von JMP nicht verfügbar sind.Zwei Beispiele sind die verstärkte Version des neuronalen Netzes und die Technik der generalisierten Regression des elastischen Netzes.Eine weitere nette Eigenschaft von JMP ist die Fähigkeit, eine Holdback-Validierung mit einem vom Benutzer angegebenen Anteil durchzuführen und dabei automatisch eine Zufallsstichprobe aus einem Datensatz auszuwählen.Dies erleichtert sowohl die Validierung als auch den Modellvergleich.
Verstärktes neuronales Netz

Elastisches Netz

Manchmal kann der Durchschnitt mehrerer Modellvorhersagen die Leistung einzelner Modelle übertreffen.
Hier habe ich in JSL eine Formelspalte erstellt, die den Durchschnitt zweier Vorhersageformeln bildet.

JMP Pro verfügt über eine Modellvergleichsplattform, mit der Benutzer die relative Wirksamkeit mehrerer Modelle nebeneinander vergleichen können.Die Modellvergleichsplattform gibt Benutzern außerdem die Möglichkeit, mit nur wenigen Klicks den Durchschnitt mehrerer Modelle zusammenzustellen.
Modellvergleiche

In diesem Fall schnitt der Durchschnitt der Neural Net- und Elastic Net-Modelle (mit Holdback-Validierung [HB]) etwas besser ab als jedes der beiden Einzelmodelle allein.Ein weiteres nettes Feature der Modellvergleichsplattform sind die Diagramme „Ist nach Vorhersage“ und „Residuen nach Zeile“.
Modellvergleichsdiagramme

Abschluss
Mit der JMP Scripting Language [JSL] kann JMP Daten aus mehreren Webquellen extrahieren, die Daten verarbeiten, mehrere Vorhersagen durchführen, sie vergleichen und anzeigen – alles in einem einzigen Skript.Der effektive Einsatz von JSL kann viel Zeit sparen, insbesondere wenn eine Analyse regelmäßig wiederholt werden muss.