ウィリアム・ボーム(ウィバウム)、ニューハンプシャー大学大学院統計学生
私のプロジェクトは、JMP スクリプト言語を使用して複数の Web サイトからデータを取得し、プロ フットボールの勝利を予測するプロジェクトです。 このスクリプトは、分析のためにデータを収集、集約、再編成するという面倒なプロセスを自動化します。 スクリプトのいくつかのセクションには、下付き文字を削除するセル処理や、複数のデータ セットの連結や結合など、さまざまな機能が含まれています。 連想配列は、個別の行の列式の出力を比較するために使用されます。 最後に、複数の予測モデルの結果が比較されます。 このプロジェクトの主な目的は、データの収集、編成、予測のプロセスを反復可能な方法で自動化するための JSL の使用法を説明することです。
序章
約 2 年前、JMP が JMP Scripting Language [JSL] を使用して Web からデータをスクレイピングできることを知りました。 私は統計学の大学院生として、分析スキルを磨き、コーディングを改善するための練習データをよく探しています。偶然ですが、私は熱心なアメリカン フットボール ファンであり、スポーツの統計はさまざまな情報源からオンラインで簡単に入手できます。演習として、Web から収集したデータを使用して、各プロ フットボール チームのシーズンの合計勝利数を予測しようとしました。
データのスクレイピングとクリーニングの手法は、Web 上の HTML テーブルの形式で利用可能なあらゆるデータに適用できます。JSL を使用してデータのクリーンアップを自動化し、単一のスクリプトまたはスクリプトの複合グループ内でモデリングを実行できることは素晴らしいと思います。さらに、JMP は、ユーザーがグラフィカル ユーザー インターフェイス (GUI) を通じて分析を実行し、その後再利用可能なスクリプトとしてプロセスを保存できるようにすることで、プログラミング経験が限られているユーザーを支援します。 これにより、更新されたデータまたは新しいデータを使用して分析を繰り返す際に、ユーザーは大幅に時間を節約できます。
設定
最初のステップは、データ集約のプロセス中に作成されるファイルを保存するフォルダーを作成することでした。データ ソースごとにフォルダーを作成すると、生成された多数のファイルを整理するのに効果的であることがわかりました。

次に、よりクリーンなコードを作成するために、スクリプト ユーザーにファイル ストレージのローカル パスを割り当てるように依頼しました。 dir = Pick Directory(“ファイル ストレージのディレクトリを選択”, show files(0));
このローカル パスはハードコーディングすることもできます。
パスが選択されると、データが複数の Web サイトから収集され、個別のファイル (HTML テーブルごとに 1 つ) に保存されます。これらのファイルは、後のデータ集約段階で参照されました。
データのスクレイピング
JMP を使用すると、ブラウザのアドレス バーから URL 名をコピーして JSL コードに貼り付けるだけで済みます。Web サイトへのリンクをスクリプトに直接配置することもできます。これは、JSL コードの編集中に Web サイトを開くのに役立ちます: Web(" http://url_name.com ");
データのインポート
JMP には、データのインポートを支援するさまざまな便利なツールが用意されています。まず、HTML テーブルを JMP ファイルとして直接保存してみます。この方法は、データの再編成がほとんど必要ない場合に最も効果的です。2 番目の方法は、まず HTML テーブルをカンマ区切り値 [CSV] ファイルとして保存し、その後、JSL を通じて利用可能なユーザー定義の設定を使用して JMP にインポートできます。インポートされたテーブルを確認すると、いくつかの空の列があることに気付きました。「列の削除」コマンドを使用すると、短いスクリプトでテーブルから空の列を削除できました。

JMP は Web から情報を自動的に取得し、ファイルを保存します。必ずしもこれらのファイルを保存する必要はありませんが、Web から収集したデータは少し乱雑になる場合があります。データをファイルに保存すると、インポートされたテーブルを参照して必要に応じてコードを調整できるため、デバッグが容易になります。
方法 1
データはインポートされ、CSV ファイルとして保存されます。最初は次のようになります。
ObjectName = Open(“http//:url_name1.com”, HTML Table(#))<< Set Name(“TableName1”) << Save(dir||“FileName1.csv”);
方法 2
データは JMP に直接インポートされ、保存されます。
オブジェクト名 = オープン(“ http://url_name2.com」 , HTML Table(#)<< Set Name(“TableName2”) << Save(dir||“FileName2.jmp”);

細胞処理
スクリプト内で文字データを並べ替える場合、インポートされた文字列にわずかな違いがあるだけでも、コードに問題が生じる可能性があります。この場合、プレーオフが近づいており、ニューイングランドが地区タイトルを獲得したことを示すために、名前に「z」が挿入されました。 ありがたいことに、JMP にはセル内の文字列を操作するためのさまざまなコマンドが用意されています。

次のスクリプトでは、JMP は「Team」名前列の各行をループし、指定された文字が文字列の先頭にある場合はそれを削除します。「For Each Row」コマンドを使用すると、行ごとに処理を適用するループ処理が簡単になります。条件付きの「if, then」句は、特定の条件が適用された場合に JMP に何を行うかを指示します。 「Contains」コマンドは、文字列内の指定された項目の位置を返します。「Substr」(部分文字列)コマンドは、文字列の一部を返します。指定された位置から始まり、指定された数の文字を返します。

テーブルの結合
JMP でのテーブルの結合は、「テーブル」メニューから簡単に行えます。「テーブル」メニューには複数のオプションが用意されています。通常、私は「結合」を使用して、列は異なるが行ラベルが同じテーブルを結合します。 行ラベルは異なるが列は同じテーブルを結合する場合は、「連結」を使用します。この場合、複数のテーブルの情報を連結しました。チームの部門ごとに 1 つのテーブルが作成されていました。次に、後で結合プロセス中に同じ行が一致するように、結果のファイルの行をチーム名でアルファベット順に並べ替えました。

新しいテーブルを作成する
テーブルを結合する前に、新しいテーブルを作成すると便利です。JMP を使用すると、ユーザーはいくつかの方法で新しいテーブルを作成できます。まず、GUI を通じて実行できます。スクリプトを通じて実行することもできます。この場合、「新しいテーブル」コマンドを使用して、サッカー チームごとに 1 つずつ、適切な数の行を含む新しいテーブルを作成しました。次に、「新しい列」コマンドを使用してチーム名の列を追加し、リストで値を設定しました。

テーブルの結合
JMP がないとテーブルを結合するのは面倒な作業だと思います。ありがたいことに、JMP には「テーブル」メニューでテーブルを結合するための優れた GUI が備わっています。 命名規則は常に重要ですが、JMP は、同じ名前を共有する別のテーブルに由来する列の名前を自動的に変更します。この場合、GUI を介してテーブルを結合し、結果として得られたテーブルのテーブル スクリプトをコピーして、より大きなカスタム スクリプトに貼り付けるだけで済みました。そうでなければ、テーブルを結合する前に、多くの入力 (列の名前変更) を行う必要があったでしょう。 結合プロセスを何度も繰り返しました。

列の名前変更と再フォーマット
結合が完了すると、奇妙な響きの列名がたくさんできました。混乱を避けるために、これらの列の名前を変更しました。 そのために、私はまず優先される名前のリストを作成しました。次に、ループと「Set Name」関数を組み合わせて列の名前を変更しました。

場合によっては、JMP はデータを文字列としてインポートしますが、ユーザーは時間などの別の列形式を必要とします。 これは JMP GUI で簡単に変更できますが、JSL スクリプトでも実行できます。この場合、列には文字ではなく連続時間情報が含まれていることを JMP に知らせます。
列を再編成する
データが集計され、新しい列が作成されたら、データ テーブル内の列の順序を変更したくなる場合があります。これは、JSL で「選択した列を移動」コマンドを使用して簡単に実行できます。

データテーブルビュー
完成したデータ テーブルの部分図を次に示します。

連想配列の開発
データの集計が完了したら、分析を行います。私が最初に比較したかったのは、シーズンのその時点までのスケジュールの強さに基づいた、さまざまなチームの相対的な強さでした。 私の目標は、チーム自身の過去のパフォーマンスだけでなく、将来の対戦相手の過去のパフォーマンスと比較して、チームの将来のパフォーマンスがどの程度強力になるかを予測することでした。そのためには、テーブルの異なる行と列にあるセルに含まれる情報を比較する必要がありました。連想配列 (別名ディクショナリ、またはハッシュ マップ) の作成は、このタスクに非常に役立ちます。
JMP では、リスト、行列、または連想配列の列を使用できます。この場合、デフォルト値 (null) を持つ 2 つの列を使用しました。 キー列「TEAM」には、各チームの都市の略称が含まれていました。「強度」と呼ばれる値の列は、勝利とネットポイントを組み合わせたインデックスを計算する数式列でした。17 週間の試合スケジュールの各週 (列) をキーとして使用し、その週の連想配列の値を参照しました。
17 週間のスケジュール: キー

スクリプトでは、連想配列を定義し、それを参照する数式列を作成しました。この場合も、数式は毎週の対戦相手をキーとして使用し、連想配列の添字を通じて正しい値を参照します。キー列の値が連想配列にない場合、関数は null 値を返します (スケジュール内のバイウィークで適切に機能します)。

次に、チームの強さを比較するために毎週新しい列を作成しました。これら 2 つの数式を結合することもできましたが、データ テーブル内のさまざまなメトリクスを視覚化できるように、それらを分離したままにすることを好みました。

次に、今シーズンの予想勝利数を数えてみました。列の結果をカウントする簡単な方法は、17 列ごとに一連の「If-Then」条件の合計を含む新しい数式列を作成することでした。この場合、強さの差が正の場合、予測は勝利とみなされ、カウントされます。

予測モデルの作成
JMP には、予測のためのさまざまなモデリング技術があります。「モデルの適合」や「ニューラル」プラットフォームを含む多くのテクニックには、「分析」メニューからアクセスできます。カスタム スクリプトを作成する場合は、まず JMP のプラットフォームで最適なモデルを開発することをお勧めします。 次に、(GUI を介して) モデル スクリプトをデータ テーブルに保存し、コードをコピーしてカスタム スクリプトに貼り付けることができます。JSL を使用してモデル スクリプトをデータ テーブルに保存することもできます。これにより、ユーザーはモデルを自動的に実行するように設定したり、カスタム スクリプトによって作成されたテーブルのデータ テーブル スクリプトのリストでモデルを使用できるようにしたりする柔軟性が得られます。
ここに一例を示します。

JMP Pro の高度なモデリング技術
JMP Pro ではいくつかの高度なモデリング技術が利用できますが、これらは JMP の標準バージョンでは利用できません。2 つの例は、ニューラル ネットワークのブースト バージョンと、エラスティック ネット一般化回帰手法です。JMP のもう 1 つの優れた特性は、ユーザー指定の割合でホールドバック検証を実行し、データセットからランダムなサンプルを自動的に選択する機能です。これにより、検証とモデルの比較の両方が容易になります。
ブーストされたニューラルネット

弾性ネット

場合によっては、複数のモデル予測の平均が個々のモデルのパフォーマンスを上回る場合があります。
ここでは、2 つの予測式を平均する式列を JSL に作成しました。

JMP Pro にはモデル比較プラットフォームがあり、ユーザーは複数のモデルの相対的な有効性を並べて比較できます。モデル比較プラットフォームにより、ユーザーは数回クリックするだけで複数のモデルを平均化することができます。
モデルの比較

この場合、ニューラル ネット モデルとエラスティック ネット モデルの平均 (ホールドバック検証 [HB] あり) は、2 つの個別のモデルのどちらか単独よりもわずかに優れたパフォーマンスを示しました。モデル比較プラットフォームのもう 1 つの優れた機能は、「実際と予測」および「行ごとの残差」プロットです。
モデル比較プロット

結論
JMP スクリプト言語 [JSL] を使用すると、JMP は複数の Web ソースからデータを収集し、データを処理し、複数の予測を実行し、それらを比較し、表示することができます。これらのすべてを 1 つのスクリプト内で実行できます。JSL を効果的に使用すると、特に分析を定期的に繰り返す必要がある場合に、時間を大幅に節約できます。