今年早些時候,我的經理給我發了一篇來自 Data Colada 的非常有趣的文章,這是一篇由三位行為科學家撰寫的部落格文章,研究已發表的研究。 Data Colada 的作者與一組匿名研究人員合作,在 2012 年論文中使用的汽車里程資料集中發現了一些奇怪的異常現象。我負責測試JMP中的探索模式平台,可用於識別資料中異常或意外的模式。在這篇文章中,我使用探索模式以及 JMP 中的其他有用工具來搜尋汽車里程資料中的意外或異常模式。
背景
汽車里程資料集的前幾行和前幾列如下所示。這些數據是從一項研究中收集的,該研究要求特定汽車保險機構的 13,488 名客戶報告他們當前的里程表讀數。客戶報告的讀數會作為 update_car1 到 update_car4 欄位包含在資料中,因為每個客戶最多報告四輛車的資訊。這些數據還包含首次簽發保單時每輛車的里程表讀數。這些列被命名為baseline_car1 到baseline_car4。由於所有政策並非同時發布,因此本研究中觀察到的從基線到更新所花費的時間各不相同。

在 Data Colada 貼文中,研究人員提出了在此資料集中發現的四個異常現象。讓我們使用 JMP 深入研究這些發現。
異常#1:行駛里程的分佈是均勻的
Data Colada 的作者發現,行駛里程的分佈與 0 到 50,000 英里範圍內的均勻分佈一致。
由於資料包括每輛車里程表讀數的基線和更新列,因此我們建立公式列來透過從更新值中減去基線值來儲存行駛里程。然後,在 JMP 中,我們使用分佈平台查看基線和更新值的分佈,以及每輛車的總行駛里程。考慮每個客戶的第一輛車的分配報告。

基線里程的分佈形狀與更新里程的分佈相似,更新時里程表的中位數讀數高出約 26,000 英里。這項發現本身並不令人驚訝。我發現基線和更新讀數最有趣的是,兩名參與者擁有的車輛已經行駛了近 100 萬英里!他們必須擁有非常好的機械技術。
報告中最令人震驚的部分是上面的第三個分佈,顯示了前兩個分佈之間的差異。基線時間和更新時間之間的行駛里程分佈似乎均勻分佈在 0 到 50,000 英里之間。沒有超過 50,000 英里的值,並且直方圖的每個箱子包含大約相同數量的參與者。在這種情況下,目視檢查提供了數據均勻分佈的有力證據。但是,對於不那麼明顯的數據,您可以使用「分佈」平台中的「擬合 Beta」選項執行適合度檢定。
下面的螢幕截圖顯示了每輛參與者汽車的行駛里程分佈(更新 - 基線)。我們發現第二、第三和第四輛車的每個分佈也平均分佈在 0 到 50,000 之間。根據這種分佈模式,我們可以得出結論,更新的里程值可以透過將均勻分佈的隨機值加到基線里程值來產生。

異常#2:基線里程使用四捨五入,而更新里程則不四捨五入
Data Colada 的作者發現,基線里程有許多值四捨五入到最接近的千位,而更新的里程不包含這種四捨五入。
Data Colada 的研究人員透過查看里程的最後三位數字來研究四捨五入的情況。我們可以使用 JSL 來採取類似的方法,但讓我們使用 Explore Patterns!如果您以前從未使用過“探索模式”,則可以透過選擇“分析”>“篩選”來找到它。

在我們啟動探索模式來探索每個基線和更新列後,我們得到以下螢幕截圖中所示的輸出。在「單變量模式」報告中,選擇第一輛汽車的基準和更新值以比較模式。

預設情況下,探索模式包括每列中重複次數最多的值、每列中最長的運行以及每列中最長的重複序列的報告。對於參與者擁有的第一輛車,從最長運行或最長重複序列報告中沒有太多收穫。然而,「最重複值」報告顯示了一個有趣的對比。在第一輛擁有的汽車的基準里程中,有許多值似乎四捨五入到最接近的 10,000。這不一定是意想不到的模式;當我被問到我的車的里程數時,我總是繞著圈子回答。
更新里程的最重複值報告有很大不同。在此報告中,重複項要少得多,且出現的重複項不像基線值那樣進行四捨五入。如果透過將均勻分佈的隨機值加到基準值來產生更新列,就會發生這種情況。因此,這項發現與異常#1 一致。
異常 #3 – 資料以兩種字體輸入,每個觀察結果都有一個使用另一種字體的“雙胞胎”
研究人員注意到,在原始資料檔案中,觀察結果是使用兩種不同的字體記錄的。透過一些巧妙的排序,研究人員發現一種字體中的每個基線觀察值對應於另一種字體中非常相似的行。
我讚揚研究人員注意到不同的字體並採取這種方法。但是,假設資料全部採用相同的字體,且沒有出現此危險訊號。我們可以使用 JMP 來識別行和列之間的任何奇怪關係嗎?我們當然可以——畢竟這是 JMP 部落格。
我們可以使用探索模式來調查連續行的列之間是否存在任何線性關係。考慮以下簡單範例。在前四行中,各列具有精確的線性關係,其中 Y=2*X。在接下來的三行中,兩列再次具有精確的線性關係,其中 Y=0.5*X。

我們可以使用探索模式來搜尋基線列之間的線性關係。如果我們還沒有註意到異常#1,那麼在更新的欄位中尋找線性關係也是有意義的。

如果存在許多精確的線性關係,或者可能存在大量線性關係,則可能表示一列中的值是使用另一列的倍數產生的。這裡,只有幾行的基線列具有精確的線性關係。我們可以使用「著色」選項來查看這些單元格並檢查是否有任何不規則之處,但對於具有許多舍入值的這種大小的資料集,找到一些線性關係並不奇怪。
使用探索模式,我們調查了基線值的兩個欄位的行之間是否存在任何可疑的線性關係。然而,結果並不是很有用。現在,我們也尋找兩行之間的列之間的線性關係,同樣是基線值。為此,我們需要在資料轉置上使用探索模式。
對於報告至少三輛車里程的參與者,我使用 JMP 中的轉置選項按基線列轉置資料。我排除了參與者擁有兩輛或更少汽車的行,因為這些行無助於識別線性關係。

在此轉置資料的「探索模式」報告中,存在許多斜率約為 1 的精確線性關係。因此,原始資料表中的許多行在汽車上具有幾乎雙行的基線值。 (提示:您可以右鍵單擊「斜率」列,然後使用「選擇位置」功能突出顯示斜率接近 1 的所有行。斜率介於 0.99 和 1.01 之間的行有 69 對)。

您可以選擇線性關係表上方的“著色”,以對精確線性關係中的所有值進行著色,也可以右鍵單擊 Y 列以對特定值進行著色。下表包含線性關係報告前三行的彩色值。

探索模式已經確定了幾對“駕駛雙胞胎”,其中所有汽車的基線里程值都非常相似,具有精確的線性關係。我們可以透過尋找更多不具有精確線性關係但仍然非常密切相關的對子來跟進這一點。正如 Data Colada 貼文中所示,一旦您按第四輛車的基準值排序,就很容易識別出許多駕駛雙胞胎。
異常 #4 – 一種字體具有許多舍入基線值,而另一種則沒有
研究人員發現,Calibri 字體中的基線值進行了四捨五入,而 Cambria 字體中的值則沒有四捨五入。
現在,假設我們知道某些行是用一種字體編寫的,其他行是用第二種字體編寫的,並且我們的資料中有一個列,其中每行都有該字體。我們可以使用“探索模式”,並將字體名稱作為“按”列。

如同在探索模式報告中所見,Calibri 字體行的基準里程值有許多舍入值,而 Cambria 行的基準值沒有捨入。由於我們希望客戶報告的里程數四捨五入,這表示原始報告值是帶有 Calibri 字體的行,並且創建了「駕駛雙胞胎」數據,然後以 Cambria 字體輸入。
結論
每當您獲取新的資料集時,您可能會進行一些探索性分析和資料清理。也許您搜尋異常值、 檢查資料中是否有缺失值或查看每個變數的分佈。我希望這篇文章鼓勵您考慮使用探索模式來檢查資料中的異常模式。並非您使用探索模式找到的所有模式都是錯誤或令人擔憂的證據,但該實用程式為您提供了一個工具來尋找值得進一步調查的模式。
你好@madhu 。 感謝您提出這個問題,我將分享兩個解決方案,使轉置數據表的列標題使用這種格式。
首先,您可以在原始數據表中創建一個新列,該列使用下面屏幕截圖中所示的公式。

創建此列後,您可以在執行轉置時將其用作標籤列。

由於您已經創建了轉置數據表,因此您可以使用的第二個選項是使用 JSL 編輯列標題。 為此,請打開轉置數據表,然後選擇文件 > 新建 > 腳本並將下面的腳本粘貼到腳本編輯器窗口中。 運行此腳本會將列標題更新為所需的格式。
dt = Data Table("Transpose of Car Mileage Data");
colNames = dt << Get Column Names(string);
For(i=2, i <= Length(colNames), i++,
Column(dt, i) << Set Name("id=" || char(colNames[i]))
);
我希望這有幫助。 再次感謝您的評論。
你好@jacob_rhyne
謝謝您的指導。 我現在已經創建了轉置矩陣。
在這個練習中我唯一不能做的就是一次性更改列標題 id=12、id=23、id=36 等。 我需要手動更改每個列名稱嗎? 我想使用一個添加 id= 的公式來一次性替換所有列標題。
你好@madhu 。 您可以在“行”>“行選擇”>“選擇位置”下找到“選擇位置”。

但是,如果您想以交互方式使用 JMP 來選擇這些行,而不是使用 JSL,我建議添加一個新列並創建一個公式來標識這些行。 為此,請嘗試執行以下步驟。
- 從頂部菜單中選擇列 > 新列...
- 在“新建列”菜單中,選擇“列屬性”>“公式”
- 在公式編輯器中,輸入如下公式

輸入公式後,單擊確定以創建列。 在新列中,值為 1 的行對應於擁有三輛或更多汽車的參與者。 您可以通過右鍵單擊值為 1 的行並單擊“選擇匹配單元格”來選擇值為 1 的所有行,如下所示。

對於有關使用 JSL 執行此操作的問題,一個很好的起點是查看增強日誌以查找為您交互執行的操作生成的 JSL。 例如,下面的屏幕截圖顯示了打開附加到此頁面的數據表、創建上述新公式列並使用所選行轉置數據後的日誌。 您可以將日誌中的腳本保存到可以隨時再次運行的新腳本。

我希望這是有幫助的。 再次感謝您的閱讀。
你好@jacob_rhyne
感謝您的及時答复。 我是 JMP 新手(使用 JMP 16 Pro),對 JMP 不太了解。 不幸的是,我沒有找到選擇JMP 菜單上任意位置的功能。
另外,有沒有辦法在數據文件中插入JSL代碼以自動執行代碼?
你好@madhu感謝您的閱讀和提問。 要識別報告至少三輛車里程的參與者,您可以使用 JMP 的“選擇位置”功能來選擇這些行。 然後在轉置數據時,您可以選擇僅使用選定的行。 下面是一個 JSL 腳本,它為擁有三輛或更多汽車的所有參與者選擇行,然後僅使用選定的行轉置數據。
Data Table( "Car Mileage Data" ) << Select Where(
Sum(Is Missing(:baseline_car1),
Is Missing(:baseline_car2),
Is Missing(:baseline_car3),
Is Missing(:baseline_car4)
) <= 1);
Data Table( "Car Mileage Data" ) << Transpose(
columns( :baseline_car1, :baseline_car2, :baseline_car3, :baseline_car4 ),
Transpose selected rows only( 1 ),
Output Table( "Transpose of Car Mileage Data" )
);
要創建汽車里程數數據轉置,您如何識別(或挑選)報告了至少三輛車里程數的參與者? 我可以通過檢查每一行來手動完成,但是,有什麼公式可以使用嗎?