エンジニアリング分野のメールバッグ
エピソード4:ニシキヘビとパンダ、なんてこった!

システムエンジニアである私たちは、時折、 JMPの一般的な使用範囲からやや外れた興味深い問題に遭遇します。こうしたアプリケーションは概して巧妙で、データ活用がビジネスや技術的な問題の解決だけに限定されないことを改めて認識させてくれます。また、時には、予想外の難題に直面することもあります。私が「カーブボール」と呼ぶこうした問題は、コーディングの問題、興味深い分析、データの視覚化方法など、さまざまな形で現れます。
しばらく読者からの質問コーナーには投稿していませんでしたが、今回の質問はぜひとも取り上げる必要があると感じました。質問への回答に使用したツールは、あまり知られていないように思います。そこで、ニューヨーク在住の同僚の質問にお答えするとともに、JMPでできる興味深い機能をご紹介したいと思います。
質問
マイク[JMP]、
多くの場合、グループ化を行う必要があり、たとえば、特定のラベルでグループ化されたすべてのデータの最大値を取得する必要があります。Python Pandas で同等のコードは次のようになります。
df.groupby(['Something', 'Something Else']).max()
別の例としては、groupby を使用したpandas.n最大のようなものがあり、groupby から上位 5 つの項目を取得したい場合などが考えられます。
数分間列の数式をいじってみた後、諦めてデータをエクスポートし、後でJMPに再インポートします。Tabulateは似たような機能を持っていますが、必ずしも私の望むようにはいきません。ですから、「JMPをPandasのように使う方法」というドキュメントがあれば、私にとって非常に役立つでしょうし、Pandasがこれほど普及している今、JMPにとっても役立つかもしれません。
ありがとう、
ニック
私の回答
こんにちは、ニック! [Pandas] の機能の多くを模倣し、数式の柔軟性を高めるためのテクニックがあります。それは、JMP にグループ化する列を指定することです。これを行うには、列名を右クリックして、[新しい数式列] > [グループ化] を選択します。

この操作を行うと、列名を右クリックして「新しい数式列」>…を選択して作成する数式列は、設定したグループ化列によってグループ化されます。


その後は、データフィルタまたはローカルデータフィルタを使用してフィルタリングまたはサブセット化するだけです。これで解決するかどうか教えてください!
最高、
M
パンダ:かわいいイタチ科動物か、データ分析ツールか
さて、初心者の方のために説明すると、Pandasは愛らしい、色彩感覚に難のあるイタチ科の動物ではありません。Pandas(Pythonスクリプトでは通常「pd」と略されます)は、「…データ操作と分析のためのPythonプログラミング言語です。特に、数値テーブルと時系列を操作するためのデータ構造と操作を提供します[ 出典]」。基本的に、JMPのデータ整理と操作部分(データテーブル、行と列のメニューなど)がPythonプログラミング環境で果たす役割を担っています。そのため、Pythonデータ分析ワークフローにとって非常に重要です。さて、JMP内でPythonを実行したい場合は、この記事はあなたには適していません。 こちらのホワイトペーパーをご覧ください。コマンドラインでのデータ変換から解放されたいのであれば、読み進めてください。
データフレームとデータテーブル
まだ読んでくれてる?素晴らしい。さて、この記事の残りの部分では、PandasとJMPにおけるそれに相当する機能の共通点について解説していきます。これは決して網羅的なリストではありませんが、2つの環境について考える際に、正しい方向性を示すことを目的としています。
まず最初に説明したいのは「データフレーム」です。Pandasでは、ここにすべてのデータが格納されます。JMPのデータテーブルと同様に、データフレームは基本的に名前(列名)などが付いたデータ列の集合です。列や行に対して操作(変換、集計など)を行いますが、常にデータフレーム全体、またはその一部に対して操作を行うことになります。
JMPでは、主要なデータコンテナはデータテーブルです。列と行は、Pandas DataFrameと同じように操作できます。どちらの場合も、データテーブル内の欠損値を処理できます。JMPでは、欠損値はセルに「.」が入ったもの(数値データの場合)または空白のセル(文字データの場合)として指定されます。データの変換、集計などを行うことができます(これらの詳細については後述します)。どちらの場合も、ソフトウェアにデータについてより多くの情報を伝えるほど、作業の手間が省けます。これが次のポイントにつながります。
列のプロパティとデータ型
列のプロパティとデータ型 (Pandas の dtypes) に関しては、JMP が圧倒的に優れています。Pandas はデータ型の理解の大部分を NumPy という別の Python パッケージから継承しており、これは素晴らしいことです。NumPy は非常に堅牢なコードですが、この点に関しては非常に制限があります。約 8 種類のデータを処理しますが (下の表を参照 [ ソース])、さまざまなフォーマットのサポートはやや限定的です (たとえば、通貨はサポートなしではかなり混乱します)。
JMP の列プロパティは、 JMP の使い方に関する書籍の約 43 ページを占めています。その内容は非常に広範で、インポートされたデータ型を正しく認識します。JMP を初めて使うユーザーにとって特に興味深いのは、列プロパティが Pandas で使用されるデータ型をはるかに超える範囲をカバーしている点です。ソフトウェア全体でアクションをトリガーするさまざまなメタデータを処理できます。公平を期すために言えば、Pandas DataFrame に属性を付加することはできますが、DataFrame は単なるコンテナであるため、属性のサポートをコードで実装するか、使用しているパッケージにサポートが実装されていることを期待するしかありません。JMP では、これらすべてが既に実装されています。
表作成、列の数式、グループ化
実のところ、私が答えようとしていた質問の文脈では、前の2つの項目はそれほど重要ではありません。私たちの目的においては、データテーブル/データフレームは単にデータを格納するための箱にすぎません。列のプロパティ/型は分析上の考慮事項に役立ちますが、これもまた、ここで取り組んでいる質問にとって重要ではありません。私たちが関心を持っている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 ユーザーは、これらのデータ変換操作の主要ツールとして Summary または Tabulate を使用します。列を作成するために Formula Editor を使用することもあります。しかし、データ テーブル (およびプラットフォームの列リスト) には、Pandas で実行したいことのほぼすべて、そしてそれ以上のことを実行できる秘密兵器があります。その秘密兵器とは、列名を右クリックして [新しい数式列] を選択できる機能です。これは、列リストがある場所ならどこでも機能します。そこから、列の結合、行の累積合計など、さまざまな変換を実行するための多くのオプションが利用できます。 それ自体は便利ではあるものの、特に魔法のような機能ではありません。本当に興味深いのは、JMPで列の「グループ化」フラグをオンにしたときです。これにより、作成した数式列は自動的にグループ化変数のレベルを認識するようになります。少し考えてみてください。ソフトウェア内のどこにでも、グループ化列に基づいて層別化できる数式列を作成できるのです。
最近受けた別の質問から、これが何を意味するのかを例を挙げて見てみましょう。
例:1つの料金で2つの質問!
最初の質問が届いたのとほぼ同時期に、別の顧客から、多数のサンプルに対して数値積分(曲線下面積、AUC)を計算する方法についての質問を受けました。さらに、その顧客は以前、 環境および分子突然変異誘発誌に掲載した論文のために公開したサンプルデータセットを提供してくれるとのことでした。
彼らがやりたかったことは、グループ化フラグと関数列を使えば簡単に実現できることが分かりました。手順は以下のとおりです( JMP Publicサイトのデータを使って手順を追うことができます)。
まず、 データをグラフ化してみましょう。この議論においては研究の詳細自体は重要ではありませんが、 興味深い内容です。簡単に言うと、濃度(濃度(μM))が異なる多数の化学物質と、それに対する一連の遺伝子反応に関するデータです。今回の演習では、それぞれの遺伝子反応に対するAUCを計算することに関心があります。グラフビルダーで列切り替え機能を使ってグラフを作成してみましょう。
AUCを計算する最初のステップは、グループ化の設定です。化学列を右クリックし、「新しい数式列」を選択してから「グループ化」を選択します。バイオマーカー列についても同様の手順を繰り返します。ここで、順序が重要になる場合があることに注意してください。まず化学でグループ化し、次に化学内のバイオマーカーでグループ化します。その後は、データテーブルの「新しい数式列」を使用して計算式を作成するだけです。

今後は、分かりやすさを考慮して、各ステップを個別の列に分けて説明します。ちなみに、計算には台形公式リーマン和を使用しています。
さて、計算に戻りましょう。まず必要なのは、x軸上の各点間の距離(x軸の点ごとの変化)です。Conc(um)列を選択し、タイトルを右クリックして「新しい数式列」>「行」>「差分」を選択します。次に、JMPが作成した新しい列の数式を開きます。以下のような数式が表示されるはずです。

JMPは行間の計算を処理しており、新しい化学物質または新しいバイオマーカーの種類を検出したときに数式をリセットするように調整していることに注意してください。
次に、各データポイントと前のデータポイントとの間の値の平均値が必要です。列ヘッダーを右クリックし、「新しい数式」→「列」→「行」→「ラグ」を選択します。数式を開き、前の行の値を返すのではなく、行間の差を計算するように少し変更します。その様子を次のスクリーンショットに示します。

これらの 2 つの列 (データ テーブルではdxとあなたと名前を変更しました) を掛け合わせて、セグメントの面積を求めます。2 つの列を選択し、いずれかの列名を右クリックします。[新しい数式列] > [結合] > [積] を選択します。新しい列には、各データ ポイントと次のデータ ポイントの間の曲線部分のおおよその面積が表示されます。データ テーブルでは、この列の名前をiAUC (瞬間 AUC の略) に変更しました。

最後のステップは、各セクションの値を合計することです。これは、iAUC列を右クリックして、[新しい数式]列>[行]>[累積合計]を選択することで行います。演習の最初にグループ化列を選択したため、データセット内の各サンプルの集計はリセットされます。

ここから、TabulateまたはSummaryを使用して、各サンプルの最大値(曲線下の概算総面積)を含む表を作成できます。一般的な化学物質の例を以下に示します。

最後に
以上です。JMPに存在する構造を使えば、Pandasで簡単に動作を再現できます。Group By変数を使うことを忘れなければ、すぐに始められます。イタチ科の動物(色彩に問題のある動物もそうでないものも)は必要ありません。
編集者注:読みましたかエンジニアリング・メールバッグシリーズのその他の記事マイクが、使用していたユーザーをどのようにサポートしたかをご覧ください。JMP除雪サービスに加入するかどうかを決定し、STEAM教育プログラムのための独自の視覚化ツールを開発する。