威廉·鮑姆(沃傑鮑姆),新罕布什爾大學統計學研究生
我的項目是使用 JMP 腳本語言從多個網站提取數據來預測職業足球比賽的勝利。 該腳本自動執行了收集、聚合和重新組織數據以進行分析的繁瑣過程。 該腳本的幾個部分包含不同的功能,例如消除下標的單元格處理以及多個數據集的串聯和連接。 使用關聯數組來比較不同行中列公式的輸出。 最後,對多個預測模型的結果進行比較。 該項目的目的主要是說明如何使用 JSL 以可重複的方式自動化數據收集、組織和預測的過程。
介紹
大約兩年前,我了解到 JMP 可以使用 JMP 腳本語言 [JSL] 從網絡上抓取數據。 作為一名統計學研究生,我經常尋找練習數據來磨練我的分析技能並提高我的編碼能力。碰巧我是一名狂熱的美式足球迷,並且可以從許多不同的來源在線輕鬆獲得體育統計數據。作為一項練習,我嘗試使用從網絡上抓取的數據來預測每個職業足球隊一個賽季的總勝場數。
數據抓取和清理技術可應用於網絡上以 html 表格形式提供的任何數據。我發現令人驚奇的是,JSL 可以用於在單個腳本或複合腳本組中自動進行數據清理和執行建模。此外,JMP 還可以幫助那些編程經驗有限的用戶,讓用戶能夠通過其圖形用戶界面 [GUI] 進行分析,然後將流程保存為可重複使用的腳本。 當用戶使用更新的或新的數據重複分析時,這可以節省大量時間。
設置
第一步是創建文件夾來存儲數據聚合過程中創建的文件。我發現為每個數據源創建一個文件夾可以很好地組織生成的許多文件。

接下來,我要求腳本用戶為文件存儲分配本地路徑,以使代碼更清晰: dir = Pick Directory(“選擇文件存儲目錄”, show files(0));
該本地路徑也可以進行硬編碼。
選擇路徑後,就會從多個網站抓取數據並保存到單獨的文件中(每個 HTML 表一個文件)。稍後在數據聚合階段引用這些文件。
抓取數據
使用 JMP,只需將 URL 名稱從瀏覽器地址欄複製並粘貼到 JSL 代碼中即可。還可以直接在腳本中放置指向網站的鏈接,這有助於在編輯 JSL 代碼時打開網站:Web(" http://url_name.com ”);
導入數據
JMP 擁有各種有用的工具來幫助數據導入。首先,可以嘗試直接將 html 表另存為 JMP 文件。當數據幾乎不需要重組時,此方法效果最佳。第二種方法是首先將 html 表另存為逗號分隔值 [CSV] 文件,然後可以使用通過 JSL 提供的用戶定義設置將其導入到 JMP。查看導入的表格後,我注意到有幾個空列。使用“刪除列”命令,我可以通過一個簡短的腳本從表中刪除空列。

JMP 自動從網絡中提取信息並保存文件。人們不一定需要保存這些文件,但從網絡上抓取的數據有時可能會有點混亂。將數據保存到文件中可以更輕鬆地進行調試,因為可以查看導入的表並根據需要調整代碼。
方法一
數據導入並保存為 CSV 文件,最初:
ObjectName = 打開(“http://:url_name1.com”, HTML Table(#))<< 設置名稱(“TableName1”) << 保存(dir||“FileName1.csv”);
方法2
數據直接導入 JMP 並保存:
對象名稱 = 打開(“ http://url_name2.com” , HTML 表格(#)<< 設置名稱(“TableName2”) << 保存(dir||“FileName2.jmp”);

細胞處理
當對腳本中的字符數據進行排序時,即使導入的字符串中的微小變化也可能會弄亂您的代碼。在這種情況下,季后賽臨近,為了表明新英格蘭隊已經贏得了分區冠軍,他們的名字中插入了一個“z”。 值得慶幸的是,JMP 提供了多種命令來操作單元格內的字符串。

在以下腳本中,JMP 循環遍歷“團隊”名稱列的每一行,並刪除指定的字母(如果它們出現在字符串的開頭)。“For Each Row”命令可以輕鬆循環,將進程應用於每一行。條件“if,then”短語告訴 JMP 在特定條件適用時要執行的操作。 “包含”命令返回字符串中指定項目的位置。“Substr”(子字符串)命令返回字符串的一部分:從指定位置開始,返回指定數量的字符。

組合表格
通過“表格”菜單可以輕鬆組合 JMP 中的表格。表格菜單提供了多個選項。一般來說,我使用“聯接”來組合具有不同列但行標籤相同的表。 當我組合具有不同行標籤但相同列的表時,我使用“連接”。在本例中,我連接了多個表中的信息。為每個部門的團隊創建了一張表。接下來,我按團隊名稱按字母順序對結果文件的行進行排序,以確保稍後在加入過程中匹配類似的行。

創建一個新表
我發現在連接表之前創建一個新表很有用。JMP 允許用戶通過多種方式創建新表。首先,它可以通過 GUI 來完成。也可以通過腳本來完成。在本例中,我使用“新建表”命令創建一個具有適當行數的新表:每個足球隊一個。然後,我使用“新列”命令添加團隊名稱列,並使用列表設置值。

連接表
我發現如果沒有 JMP,連接表是一項煩人的任務。值得慶幸的是,JMP 有一個很好的 GUI,用於在“表格”菜單中連接表格。 儘管命名約定始終很重要,但 JMP 會自動重命名來自共享相同名稱的不同表的列。在本例中,我通過 GUI 連接表,然後簡單地將結果表的表腳本複制並粘貼到更大的自定義腳本中。否則,在加入表格之前,我需要進行大量輸入(重命名列)。 我多次重複加入過程。

重命名和重新格式化列
一旦連接完成,我就有了很多聽起來奇怪的列名。為了消除混亂,我重新命名了這些列。 為此,我首先創建了一個首選名稱列表。然後,我使用循環和“設置名稱”函數的組合重命名了列。

有時,JMP 將數據作為字符串導入,但用戶需要不同的列格式,例如時間。 這在 JMP GUI 中很容易更改,但也可以在 JSL 腳本中完成。在本例中,我讓 JMP 知道該列包含連續時間信息,而不是字符信息。
重新組織列
聚合數據並創建新列後,人們可能想要更改數據表中列的順序。在 JSL 中使用“移動選定列”命令可以輕鬆完成此操作。

數據表視圖
這是已完成的數據表的部分視圖。

開發關聯數組
完成數據匯總後,就該進行一些分析了。我想要比較的第一件事是不同球隊的相對實力,基於他們在賽季中那個時刻的賽程強度。 我的目標是預測一支球隊未來的表現有多強,不僅基於他們自己過去的表現,而且還相對於未來對手過去的表現。為此,我必須比較表中不同行和列的單元格中包含的信息。創建關聯數組(又名字典或哈希映射)對於此任務非常有用。
在 JMP 中,可以在關聯數組中使用列表、矩陣或列。在本例中,我使用了兩列,並帶有默認值(空)。 鍵列“TEAM”包含每個球隊的城市名稱縮寫。價值列稱為“強度”,是一個計算指數的公式列,結合了勝利和淨得分。我使用 17 週比賽時間表的每週(一列)作為鍵來引用該週的關聯數組值。
17 週時間表:關鍵

在腳本中,我定義了關聯數組,然後創建了一個公式列來引用它。同樣,該公式使用每週對手作為鍵,通過關聯數組的下標引用正確的值。如果鍵列中的值不在關聯數組中,則該函數返回空值(適用於時間表中的再見周)。

然後我每週創建一個新專欄來比較團隊實力。這兩個公式可以合併,但我更喜歡將它們分開,這樣我就可以可視化數據表中的不同指標。

接下來,我統計了本賽季的預測獲勝次數。對列結果進行計數的一種簡單方法是創建一個新的公式列,其中包含 17 列中每一列的一系列“If-Then”條件的總和。在這種情況下,如果強度差異為正,則預測被視為勝利並有效。

創建預測模型
JMP 具有多種用於預測的建模技術。許多技術都可以通過“分析”菜單訪問,包括“擬合模型”和“神經”平台。創建自定義腳本時,我建議首先在 JMP 平台中開發最佳模型。 然後,可以將模型腳本保存到數據表(通過 GUI),並將代碼複製並粘貼到自定義腳本中。還可以使用 JSL 將模型腳本保存到數據表中。這使用戶可以靈活地將模型設置為自動運行,或者使模型在自定義腳本創建的表的數據表腳本列表中可用。
這是一個例子。

JMP Pro 中的高級建模技術
JMP Pro 中提供了多種高級建模技術,而 JMP 標準版本中不提供這些技術。兩個例子是神經網絡的增強版本和彈性網絡廣義回歸技術。JMP 的另一個優點是它能夠按照用戶指定的比例執行保留驗證,自動從數據集中選擇隨機樣本。這簡化了驗證和模型比較。
增強神經網絡

彈性網

有時,多個模型預測的平均值可能優於單個模型的性能。
在這裡,我在 JSL 中創建了一個公式列,用於計算兩個預測公式的平均值。

JMP Pro有一個模型比較平台,用戶可以在其中並排比較多個模型的相對有效性。模型比較平台還使用戶只需點擊幾下即可對多個模型進行平均。
模型比較

在這種情況下,神經網絡和彈性網絡模型(帶有抑制驗證 [HB])的平均值比這兩個單獨模型中的任何一個模型的表現稍好。模型比較平台的另一個不錯的功能是“實際預測”和“殘差按行”圖。
模型比較圖

結論
借助 JMP 腳本語言 [JSL],JMP 可以從多個 Web 源抓取數據、處理數據、執行多個預測、比較並顯示它們 - 所有這些都在單個腳本中完成。有效使用 JSL 可以節省大量時間,特別是當必須定期重複分析時。