スクリプトを書き始めたときに最初に知っておきたかったこと: スクリプトにはさまざまな種類がある再び突破口へ!
数週間前、私は父と話していました。 彼とデートはしていないが、彼は使っているJMPバージョン1.0以降。 私が初めてマウスの使い方を学んでいたとき、Mac II-se の隣に 3.5 インチのディスクが置かれていたのを覚えています。 同じマシンは、アリゾナ州ツーソンで開催された 2019 Discovery Summit カンファレンスでも展示されました。 これがその写真です:

とにかく、父と私は話し合いました私の最初の Five Things ブログ シリーズ。 彼は、JMP でスクリプトを開始する方法について誰かがシリーズを書いてほしいと述べました。 その時、私はすでに他の記事をいくつか書いていたので、将来のプロジェクトのために隠しておきました。 しかし、人生には別の計画がありました。 1 週間後、私は顧客プレゼンテーションの手伝いを頼まれたのですが、驚いたことに、彼らが私に取り上げてほしいトピックの 1 つがスクリプトの概要でした。 どうやら宇宙はジョークが大好きのようだ。
とにかく、また行きます! 私の最初の 5 つのことシリーズの形式に従って、脚本を書き始めるときに誰もが知っておくべきだと思う 5 つのことをここに示します。 まずは概念的な考えから。
ニーズを見つけ、ニーズを満たす
スクリプトを開始する前に、その必要性を検討する必要があります。 スクリプトを作成したい場合は、何らかの理由がある可能性があります。 もしかしたら、仕事の効率を上げるためにそうしているのかもしれません。 もしかしたら、グループの分析方法を標準化したいと考えているかもしれません。 あるいは、あなたは実際、ニヤリと笑いたくてこの本を手に取ることを決めた稀な人々の一人かもしれません。 これらはいずれも悪い理由ではありませんが、最後の理由により状況が少し難しくなる可能性があります (理由は後ほど説明します)。 重要なのは、最初のスクリプトについて頭の中に理由と具体的な目的を持っている必要があるということです。
スクリプトがあり、さらにスクリプトもあります
いずれにせよ、私の考えでは、既存のデータに作用するスクリプトとデータを作成するスクリプトの 2 つの異なるタイプのスクリプトがあると考えています。 既存のデータを操作するスクリプトは、JMP 内のデータ テーブルおよび既存のプラットフォームと対話して、新しいユーザー定義の出力を作成します。 これらは、複数のレポートをウィンドウで囲むなどの単純な場合もあれば、アプリケーション ビルダーでカスタム作成したレポートのような複雑な場合もあります。 主な共通点は、このようなスクリプトは既存のコンテンツの変更。
2 番目のグループは、データを作成するスクリプトです。 データを作成するスクリプトには、シミュレーション ツール、カスタム グラフィックス、JMP ファイル内のメタデータを管理するツールなどがあります。このグループはもう少し曖昧ですが、共通のテーマは、スクリプトが既存のデータや分析の強化を超えた方法で JMP を拡張することです。 ほとんどの場合、これらのスクリプトは次のようになります。新しいコンテンツを作成するゼロから。
一般に、JMP スクリプト言語 (JSL) の学習を考えるときは、既存のコンテンツを変更するスクリプトから始めます。 ここから議論を始めていきます。 それでは、一歩下がって、なぜ JSL の学習に興味があるのかを考えてみましょう。
一言言ってください、ヴァシリー。 一文だけお願いします。
少し時間を取って、あなたのことについて考えてください必要。 JSL でどのような問題点に対処したいと考えていますか? ニヤニヤしたりクスクス笑ったりするためのスクリプト作成が (少なくとも最初は) 難しい理由がわかりましたか? トップに到達するための理由がある場合、学習曲線を戦い抜く可能性が高くなります。 絶対にJSLを手に入れることができないと言っているのではなく、余分なモチベーションがなければ戦いはより難しいというだけです。
次のステップ、そしてこのエピソードで取り上げる最後のステップは、そのニーズにどう対処するかです。 簡単な答えは、2 つのことを行うということです。 まず、JSL を学習するきっかけとなった (おそらく曖昧な) アイデアを 1 つの文、つまり問題文に書き留めます。 そして、私が言いたいのはただの一文だけです。 アイデアを具体化して、それを基にして構築できるようにしてください。 また、スコープのクリープを抑制するのにも役立ちます。 ここではいくつかの例を示します。
- 週次レポートのグラフ生成をすべて 1 つのスクリプトで自動化したいと考えています。
- 顧客が提供したデータテーブルの書式設定作業を自動化したいと考えています。
- 工場のコンピュータ システムから提供されるデータ ファイルから一連の管理図を生成したいと考えています。
具体的なことについて話しているわけではないことに注意してください。私は単に、私が JSL を検討するに至った問題点を述べているだけです。 そして、書くのをやめました。
パンチリストを作成する
問題文はわかりましたか? 良い! ここで、スクリプトの一連の具体的な成果物を作成します。 これは、JSL を学習するために SAS が提供するリソースを見つけるのに役立つパンチリストになります。 グラフィカル ユーザー インターフェイス (GUI) やユーザー インターフェイス (UI) を具体的にリストしないでください。 スクリプトが実行する必要があるアクションをリストします。 上記の問題ステートメントの例を次に示します。
問題点 1:週次レポートのグラフ生成をすべて 1 つのスクリプトで自動化したいと考えています。
パンチリスト:
- 過去 3 週間のデータを含むデータ セットを実稼働データベースから取得します。
- 製品の時間と温度のグラフを作成します。
- 多項式モデルを使用して、時間と温度の解析を実行します。
- グラフとレポートを PowerPoint ファイルにエクスポートします。
問題点 2:顧客が提供したデータテーブルの書式設定作業を自動化したいと考えています。
パンチリスト:
- 内部標準に基づいて列の名前を変更します (仕様のテーブルを使用)。
- 必要な列に単位を割り当てます (仕様のテーブルを使用)。
- 緯度と経度を地理座標に変換します。
- 変化欠陥のあるユニットからのコラム継続的なに序数。
問題点 3:工場のコンピュータ システムから提供されるデータ ファイルから一連の管理図を生成したいと考えています。
パンチリスト:
- ネットワーク上の場所からデータをインポートします。
- 仕様制限を割り当てます。
- 管理図を作成します。
ここで注意していただきたいのは、私は自分自身をあまりにも詰め込んでいるわけではないということです。 私はスクリプトで実行する必要があることのパンチリストを作成しているところです。 あなたはこれまでに JSL で働いたことがないことを想定しているので、これらの問題にどのように対処すればよいのかわからないことも想定しています。 それらを書き留めることで、ヘルプやリソースで何を探す必要があるかがわかります。 これについては、このシリーズの次回の記事で取り上げます。
今週の締めくくりの考え
このシリーズは数週間にわたる予定なので、ただ読むだけのシリーズではなく、より実践的なシリーズにすることにしました。 したがって、私が最後に述べたこれらの点を宿題として受け取ってください。 説明責任やフィードバックが必要な場合は、以下のコメントに記入してください。 私がお手伝いできることがあれば、また、今後何らかの問題が発生する可能性がある場合はお知らせします。
ボーナスポイントを得るには、JMP でスクリプトウィンドウを開きます (ファイル > 新規 > スクリプト) 問題のステートメントと箇条書きをスクリプト ウィンドウに 1 行に 1 つずつ入力し、行の先頭に二重スラッシュ (「//」) を付けます。 JSL スクリプト エディターでこれらの行のテキストの色が緑色に変わる場合があります。 あなたが今行ったことについては、次のエピソードで説明します。
ああ、ヴァシリーとは何者なのか、そしてなぜ彼があなたに特異な一文を与えなければならないのか疑問に思っているなら、見てください。ここ。

スクリプトには、既存のデータに作用するスクリプトとデータを作成するスクリプトの 2 種類があります。
Re: スクリプトを書き始めたときに知っておきたかったことの 1 つ目: スクリプトにはさまざまな種類がある素晴らしい考えですね! 追加のヘルプについては、シリーズのパート 2 をご覧ください。スクリプトを書き始めたときに知っておきたかったことの 2 つ目: ヘルプの利用
一番、
M
Re: スクリプトを書き始めたときに知っておきたかったことの 1 つ目: スクリプトにはさまざまな種類がある良い考えです。JMPを学ぶには、新版JMP スクリプトへのジャンプマーフリーとルーカスの「」が役に立ちました。
Re: スクリプト作成を始めた時に知っておきたかった最初のこと:スクリプトには様々な種類がある私の主なプログラミング言語はSASです。データステップ、マクロ言語、proc sql、proc imlなど、厳密には1つの言語ではありませんが、JMPを使った短期コースを見てすぐに興味を持ちました。なぜでしょうか?長年の経験から、本当に重要なことは2つしかないと考えるようになりました。
1. 最初は「あなたのソフトウェアは正しい答えを出してくれますか?」と言いましたが、「あなたのソフトウェアは、異議を唱えられたり批判されたりしたときに、あなたが弁護できる答えを出してくれますか?」に変更しました。
2. 1.の答えをどれくらい早く得られますか?
最初はJMPのポイント&クリック機能しか使っていませんでしたが、JMPをより効率的に使うためにはJSLを学ぶ必要があることに気づきました。
例えば、連続的な結果を予測するためにk-nnを使用する方法を学生に教えています。連続的な結果と検証変数に対して、12個の予測変数(連続変数と名義変数の混合)があります。予測変数を削除していくと、 R² 、RASE、AAEがどのように変化するかを示したいのです。そのためには、まず12個の予測変数で実行し、次に11個で実行し、…最後に2個の予測変数で実行する必要があります。このブログシリーズの3番目の投稿から、新しいウィンドウについて学びました。
New Window("My Window",
// Launch platform: K Nearest Neighbors 12 Variables
Data Table( "Boston Housing Plus Validation Column" ) <<
K Nearest Neighbors(
Validation( :Validation ),
Y( :MEDV ),
X(:CRIM, :ZN, :INDUS, :CHAS, :NOX, :RM, :AGE, :DIS, :RAD, :TAX, :PTRATIO, :LSTAT),
K( 20 )
);
additional analyses with 10 predictors down to last run with 2. So, a total of 11 analyses.
);
「新規ウィンドウ」を選択すると、11種類の予測変数リストでk-nnを実行した場合の11個のウィンドウではなく、1つのウィンドウに結果が出力されます。その後、結果テーブルを右クリックして「結合データテーブルを作成」を選択すると、11個の分析結果すべてが1つのテーブルにまとめられます。
11種類の異なる分析(12個の予測変数から2個に減らす)を含むコードをループに変換する必要があるのは明らかだと思います。それが、私がJSLを学ぶ上での次のステップです。
JMPとJSLの初心者向け。
投稿ありがとうございます。私はWindowsマシンでJMP Student 19を使用しています。
ジョン
Re: スクリプト作成を始めた時に知っておきたかった最初のこと:スクリプトには様々な種類がある@jkeighley さん、お褒めの言葉ありがとうございます!シリーズがお役に立てて嬉しいです。少し専門的な話になりますが、こちらの例をご覧ください。新しいレポートの構成方法について、何かヒントが得られるかもしれません(スクリプトのインデックスには、細かい部分について役立つ情報が掲載されているはずです)。
Names Default To Here( 1 );
Clear Log();
// data table goes here
dt = Open( "$Sample_Data/penguins.jmp" );
// report names go here (this is what the tabs will be named)
reportNames = {"report 1", "report 2", "report 3", "report 4", "report 5"};
// jsl for each tab's contents go here. One tab per Expr() call. They
// should be in the same order as the report names.
reportScripts = {Expr(
dt << Scatterplot 3D(
Y( :Culmen Length, :Culmen Depth, :Flipper Length ),
Coloring( :Species ),
Normal Contour Ellipsoids( 1, :Species ),
Nonpar Density Contour( 1, :Species ),
Legend( 1 ),
Frame3D(
Set Graph Size( 655, 672 ),
Legend( 1 ),
Set Grab Handles( 0 ),
Set Rotation( -72.1900689453449, -1.75327107936844, 34.4563606108469 )
),
SendToReport( Dispatch( {}, "Density Contour Controls", OutlineBox, {Close( 1 )} ) )
)
), Expr(
dt << Hierarchical Cluster(
Y( :Culmen Length, :Culmen Depth, :Flipper Length, :Body Mass, :Delta 15 N, :Delta 13 C ),
Label( :Species ),
Method( "Centroid" ),
Standardize By( "Columns" ),
Color Clusters( 1 ),
Show Dendrogram( 0 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ),
Constellation Plot( 1 ),
Cluster Summary( 1 )
)
), Expr(
dt << Graph Builder(
Size( 662, 560 ),
Show Control Panel( 0 ),
Variables( X( :Species ), Y( :Culmen Length ) ),
Elements( Points( X, Y, Legend( 3 ) ) )
)
), Expr(
dt << Graph Builder(
Size( 662, 552 ),
Show Control Panel( 0 ),
Variables( X( :Body Mass ), Y( :Flipper Length ), Overlay( :Species ) ),
Elements( Points( X, Y, Legend( 13 ) ), Contour( X, Y, Legend( 16 ), Contour Type 2D( "HDR" ) ) ),
SendToReport(
Dispatch( {}, "Graph Builder", FrameBox,
{DispatchSeg( Contour Seg( "Contour (Adelie penguin (Pygoscelis adeliae))" ), {Line Color( {230, 159, 0} )} ),
DispatchSeg( Contour Seg( "Contour (Chinstrap penguin (Pygoscelis antarctica))" ), {Line Color( {86, 180, 233} )} ),
DispatchSeg( Contour Seg( "Contour (Gentoo penguin (Pygoscelis papua))" ), {Line Color( {0, 158, 115} )} )}
)
)
)
), Expr(
dt << Fit Group(
Bivariate( Y( :Flipper Length ), X( :Culmen Length ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Flipper Length ), X( :Culmen Depth ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Body Mass ), X( :Culmen Length ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Body Mass ), X( :Culmen Depth ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
<<{Arrange in Rows( 2 )}
)
)};
// I'm creatng an Associative array to manage the looping for me
reports = Associative Array( reportNames, reportScripts );
// build the window wrapper
nw = New Window( "Example Report", tb = Tab Box() );
// loop through the AA and append each tab page box to the tab box in the report
For Each( {{k, v}, i}, reports, tb << Append( Tab Page Box( Title( k ), Eval( v ) ) ) );
// set the view back to the first report.
tb << Set Selected( 1 );