工程信箱
第 4 集:蟒蛇和熊貓,我的天哪!

我們系統工程師偶爾會遇到一些有趣的問題,這些問題往往超出了JMP的典型應用範圍。這些應用通常都很巧妙,也常常讓我們意識到,數據的使用並不限於解決業務或技術問題。有時,這些問題則完全出乎意料,極具挑戰性。這些「難題」(我喜歡這樣稱呼它們)形式多元:編碼問題、有趣的分析、資料視覺化方法…相信你已經明白我的意思了。
我好久沒回覆讀者來信了,但這個問題確實值得一提。我用來回答這個問題的工具似乎並沒有得到應有的討論。所以,我想藉此機會幫助一位紐約的同事,並向大家展示一些你可能不知道的JMP的實用功能。
問題
麥克[JMP]
我經常需要進行分組,例如需要取得按某個標籤分組的所有元素的最大值,而 Python Pandas 的等效程式碼可能是這樣的:
df.groupby(['Something', 'Something Else']).max()
另一種方法可能是使用熊貓.n最大的結合 groupby,我想從 groupby 中找出前 5 個結果。
在擺弄了幾分鐘列公式後,我放棄了,只好匯出數據,稍後再匯入 JMP 中。 Tabulate 函數也能做到這一點,但並非總是能達到我想要的效果。因此,如果能有一份「如何像使用 Pandas 一樣使用 JMP」的文檔,對我來說將非常有幫助,而且考慮到 Pandas 的普及程度,這份文檔對 JMP 本身也可能很有幫助…
謝謝,
缺口
我的回覆
嗨,尼克!有一個技巧可以讓你的公式更靈活,它能很好地模擬 Pandas 的功能。這個技巧需要你告訴 JMP 你想按哪些欄位分組。具體操作方法是:右鍵點選列名,然後選擇「新公式列」>「分組依據」。

完成上述操作後,您透過右鍵單擊列名稱並使用「新公式列」>…建立的任何公式列都會按您設定的分組列進行分組。


之後,只需使用資料過濾器或本機資料過濾器進行篩選或子集劃分即可。希望這能幫到你!
最好的,
M
熊貓:可愛的鼬科動物還是數據分析工具
好了,對於不熟悉 Pandas 的朋友,Pandas 可不是什麼毛茸茸的、顏色不太鮮豔的鼬科動物。 Pandas(在 Python 腳本中通常縮寫為「pd」)是一種「用於資料操作和分析的Python 程式語言。它特別提供了用於操作數值表和時間序列的資料結構和操作[ 來源]。」它基本上在 Python 程式設計環境中承擔了 JMP 中資料組織和操作部分(資料表、行和列選單等)的功能。因此,它對 Python 資料分析工作流程至關重要。如果您想在 JMP 中運行 Python,那麼這篇文章並不適合您。請閱讀這篇白皮書。如果您想擺脫在命令列中進行資料轉換的束縛,請繼續閱讀。
數據框和數據表
還在?太棒了。好的,本文接下來將介紹 Pandas 的一些常用功能以及 JMP 中的對應功能。這並非一份詳盡的清單;其目的在於幫助你在理解這兩個環境時找到正確的方向。
首先我想介紹的是「DataFrame」。在 Pandas 中,所有資料都儲存在 DataFrame 中。它類似於 JMP 中的資料表,本質上是一個包含列名等資料集合。你可以對列和行進行操作(例如轉換資料、匯總資料等),但你始終要操作的是整個 DataFrame 或其某個部分。
在 JMP 中,主要的資料容器是資料表。您可以像在 Pandas DataFrame 中一樣操作列和行。兩者都支援處理資料表中的缺失值。在 JMP 中,缺失值要么用帶有“.”的單元格表示(數值資料),要么用空白單元格表示(字元資料)。您可以轉換資料、匯總資料等等(稍後會詳細介紹)。在這兩種情況下,您提供給軟體的資料資訊越多,需要做的準備就越少,這也引出了我的下一個觀點。
列屬性和資料類型
在列屬性和資料類型(Pandas 中的 dtypes)方面,JMP 完勝。 Pandas 的大部分資料類型理解都繼承自另一個名為 NumPy 的 Python 包,這很棒。 NumPy 的程式碼相當健壯,但在這方面卻非常有限。它只能處理大約八種資料類型(見下表[ 來源]),而且對不同格式的支援也比較有限(例如,如果沒有輔助工具,它處理貨幣時會非常混亂)。
JMP 的列屬性在《使用 JMP 》一書中佔了約 43 頁的篇幅。它們功能強大得多,並且在導入資料時能夠很好地識別資料類型。對於 JMP 新手來說,尤其值得關注的是,列屬性支援的資料類型遠遠超過 Pandas。它能夠處理大量元數據,從而觸發軟體中的各種操作。當然,你也可以為 Pandas DataFrame 添加屬性,但由於 DataFrame 只是一個容器,你必須自己寫程式碼來支援這些屬性,或者寄望於你使用的套件中已經包含了相應的支援。而 JMP 已經為你完成了所有這些工作。
製表、列公式和分組依據
事實上,前兩項內容在我試圖回答的問題中並不那麼重要。就我們的目的而言,資料表/DataFrame 只是一個用來存放資料的容器。列屬性/類型雖然有助於分析,但對於我們目前的問題來說並不重要。我們感興趣的 Pandas 功能是 GroupBy。它用於對資料進行切片和切塊,以便進行其他分析。一個簡單的例子是使用 JMP Big Class 數據表,按年齡組獲取男孩和女孩的平均身高和體重,代碼如下:
# Import Pandas
import pandas as pd
# Bring in the data
data = pd.read_csv("/Users/mike.anderson@jmp.com/Desktop/Big Class.csv")
# Put the data into a DataFrame
df = pd.DataFrame(data)
# Run the group by, get the means, and show the results
summ_df= df.groupby(['sex','age']).mean()
print(summ_df)
輸出結果大致如下:
height weight
sex age
F 12 58.600000 100.200000
13 59.000000 95.333333
14 62.600000 96.600000
15 63.000000 102.000000
16 62.500000 113.500000
17 62.000000 116.000000
M 12 57.333333 97.000000
13 61.250000 94.250000
14 65.285714 103.857143
15 65.200000 110.800000
16 68.000000 128.000000
17 69.000000 153.000000
通常,JMP 使用者會使用「匯總」或「製表」作為進行資料轉換操作的主要工具。他們甚至可能使用公式編輯器來建立列。但是,資料表(以及平台列清單)中隱藏著一個秘密武器,它幾乎可以實現 Pandas 中的所有操作,甚至更多。這個秘密武器就是右鍵單擊列名並選擇“新公式列”。只要存在列列表,此方法就適用!之後,您可以使用許多不同的選項來執行各種轉換,例如合併列、計算行的累積總和等等。 這本身雖然方便,但並沒有特別神奇之處。真正有趣的地方在於,當你在 JMP 中為某一列啟用「分組依據」功能時。這樣,你建立的任何公式列都會自動識別分組變數中的層級。仔細想想——你可以在軟體中的任何位置建立公式列,並根據分組列進行分層。
讓我們來看一個我最近收到的另一個問題的例子,以此來理解這句話的意思:
舉例:買一送一! !
幾乎在收到第一個問題的同時,另一位客戶也向我諮詢瞭如何對大量樣本進行數值積分(曲線下面積或AUC)。此外,他們也願意提供先前發表在《環境與分子誘變》期刊上的一篇論文的樣本資料集。
原來,他們想要實現的功能其實很容易用分組標誌和函數列來實現。以下是具體步驟(你可以使用JMP 公共網站上的資料進行操作 
首先, 我們來繪製數據圖表。雖然這項研究本身很有意思,但其細節與本次討論無關。簡而言之,它收集了大量不同濃度(濃度 (μM))的化學物質以及一系列基因反應。在我們的練習中,他們感興趣的是計算每個基因反應的曲線下面積 (AUC)。以下是在圖表產生器中使用列切換器繪製的圖表:
計算 AUC 的第一步是設定分組。我們將右鍵單擊“化學成分”列,選擇“新公式列”,然後選擇“分組依據”。對“生物標誌物”列重複此操作。請注意,分組順序很重要。我們先按「化學成分」分組,然後在「化學成分」下按「生物標記」分組。之後,只需在資料表中使用「新公式列」建立計算公式即可。

為了清晰起見,接下來我將每個步驟拆分成單獨的列。如果您真的有興趣,這裡我使用的是梯形法則黎曼和的數學計算方法。
好了,回到計算部分。首先我們需要的是 x 軸上每個點之間的距離(x 軸上每個點的變化量)。我們將選取“濃度(微米)”列,右鍵單擊標題,然後選擇“新公式列”>“行”>“差值”。現在打開 JMP 建立的新列中的公式。它應該顯示類似這樣的內容:

請注意,JMP 正在處理行之間的計算,並且已調整公式,以便在檢測到新的化學物質或新的生物標記類型時重置。
接下來,我們需要計算每個數據點與其前一個數據點之間的平均值。右鍵點選列標題,選擇“新公式”>“列”>“行”>“延遲”。打開公式並稍作修改,使其計算行之間的差值,而不僅僅是給出上一行的值。如下圖所示:

這兩個欄位(我在資料表中將它們重新命名為dx和你 )需要相乘才能得到線段的面積。選取這兩列,右鍵點選其中一列的列名。選擇“新公式列”>“組合”>“乘積”。新產生的列給出了曲線上每個數據點與其下一個數據點之間部分的近似面積。我在資料表中將該列重命名為iAUC (瞬時 AUC)。

最後一步是將每個部分的數值相加。這可以透過右鍵點擊 iAUC 列,然後選擇「新公式列」>「行」>「累積求和」來完成。由於我們在練習開始時選擇了「分組依據」列,因此資料集中的每個樣本的計數都會重置。

接下來,我們可以使用製表或總計功能建立一個表格,其中包含每個樣本的最大值(曲線下的近似總面積)。以下是一個常見化學物質的例子:

最後想說的話
就是這樣。你可以用 JMP 中現有的結構輕鬆地在 Pandas 中復現類似的行為。只要記住使用分組依據變數即可。無需任何幫助,無論你是否患有色覺障礙。
編按:你讀過嗎?本系列「工程信箱」的其他文章看看Mike如何幫助正在使用…的用戶JMP決定是否註冊除雪服務,並為 STEAM 教育計畫開發獨特的視覺化效果。