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

次に、スクリプト ユーザーにファイル ストレージのローカル パスを割り当ててもらい、コードをよりクリーンにしました。 dir = Pick Directory(“Select directory for file storage”, 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 テーブル(#)<< 名前を設定(“TableName2”) << 保存(dir||“FileName2.jmp”);

細胞処理
スクリプトで文字データを並べ替える場合、インポートした文字列が少しでも異なると、コードが台無しになる可能性があります。この場合は、プレーオフが近づき、ニューイングランドがディビジョンタイトルを獲得したことを示すために、チーム名に「z」が挿入されました。ありがたいことに、JMP にはセル内の文字列を操作するためのさまざまなコマンドが用意されています。

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

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

新しいテーブルを作成する
テーブルを結合する前に、新しいテーブルを作成しておくと便利です。JMP では、いくつかの方法で新しいテーブルを作成できます。まず、GUI から作成できます。スクリプトから作成することもできます。この場合は、「新規テーブル」コマンドを使用して、適切な行数 (各フットボール チームにつき 1 行) の新しいテーブルを作成しました。次に、「新規列」コマンドを使用してチーム名の列を追加し、リストで値を設定しました。

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

列の名前変更と書式変更
結合が完了すると、奇妙な名前の列が多数できました。混乱を避けるために、それらの列の名前を変更しました。そのために、まず、希望する名前のリストを作成しました。次に、ループと「名前の設定」機能を組み合わせて、列の名前を変更しました。

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

データテーブルビュー
以下は完成したデータ テーブルの部分的なビューです。

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

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

次に、チームの強さを比較するために、各週ごとに新しい列を作成しました。これらの 2 つの数式を結合することもできましたが、データ テーブルでさまざまな指標を視覚化できるように、別々にしておくことにしました。

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

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

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

弾性ネット

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

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

この場合、Neural Net モデルと Elastic Net モデルの平均 (ホールドバック検証 [HB] を使用) は、2 つの個別のモデルのいずれか単独よりもわずかに優れたパフォーマンスを示しました。モデル比較プラットフォームのもう 1 つの優れた機能は、「予測による実際値」と「行による残差」のプロットです。
モデル比較プロット

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