データの選択とサブセット化

このデモでは、特定の行を選択し、テーブルメニューの「サブセット」コマンドを使ってデータテーブルのサブセットを抽出する方法を見ていきます。コースジャーナルのセクションで、「スキーロッジ気温データ」をクリックします。これは幅は広いですが、かなり短いデータテーブルです。ここでのシナリオは、スキーリゾートに気象観測所があり、毎時間気温を記録してファイルに保存するというものです。ファイルには、観測データの日付と毎時気温の測定値が含まれます。これは午前のデータなので、気温も午前のデータです。気温がマイナス摂氏度を下回った場合、その気温では雪が降るには寒すぎる可能性があるため、人工雪機を起動するとします。そこで、過去のデータ記録を調べて、人工雪機を使用したであろう日を探します。人工雪機を増設するか、既存の人工雪機を交換するかの判断材料にしたい場合もあるでしょう。ここでいくつか注意点があります。 1つ目は、この気温は摂氏ではなく華氏で記録されていることです。2つ目は、データのごく一部だけを使用していることです。これらは日順に並んでいますが、これは大規模なデータセットを扱う際のベストプラクティスの一つです。スクリプトを開発する際には、代表的な観測サンプルを取得して、より小さなサブセットに対してスクリプトを開発・テストするようにしてください。繰り返しますが、データに潜む可能性のある問題をすべて反映していることを期待しています。そして、それをデータセット全体に対してテストすることができます。この例では、1週間分のデータのみを取得したので、これが代表的であることを願っています。もう1つは、華氏で記録された気温はありますが、カットオフは摂氏マイナス度です。摂氏マイナス度を華氏に変換することは確かに可能ですが、代わりにベクトル化演算を使用するという概念を改めて示し、すべての華氏気温を行列として抽出し、摂氏気温に変換します。ジャーナルには「Isolate Snow-Making Days Script」というスクリプトがあらかじめ用意されています。これを一つずつ実行していきます。このデモでは、ログウィンドウを行き来するのではなく、埋め込みログオプションを使用します。スクリプトエディタウィンドウ内で右クリックし、「埋め込みログを表示」を選択します。そして、エディタ部分でスクリプト全体が見えるように、ウィンドウのサイズを調整します。「line」を選択して実行します。すると、現在のデータテーブル(スキーロッジ気温データテーブル)への参照が取得され、dtに格納されます。次に、「get as Matrix」というメッセージを送信し、それを変数tempFに格納します。「line」を実行します。大きな行列の場合、ログに行列を表示するのではなく、行列の次元と、それが割り当てられたことを示す情報のみを取得することがよくあります。7行7列であることに注目してください。データテーブルに戻ると、このデータテーブルには列があります。では、なぜ列だけを抽出したのでしょうか?日付列を見れば、まず名義列であることがわかります。これは、数値ではなく文字データとして扱われている可能性を示唆しています。さらに、列情報を確認することもできますが、列の幅を少し広げて、値が左揃えになっていることを確認することでも確認できます。これはJMPが文字データを処理する方法です。データテーブルに「get as matrices」コマンドを送信すると、この文字列列は無視され、数値列のみが抽出されました。次に、この行は変数tempF(そこに格納されている行列)の各要素を取得し、摂氏に変換してtempCに格納します。ログにも同じメッセージが表示されますが、tempfまたはtempcにマウスポインターを合わせると値を確認できます。次に、tempCの行数をカウントします。これはベストプラクティスとして、ループの外で行または列をカウントすることを推奨しています。行列 tempC の行数を数えて、変数 nr に格納します。line を実行すると、もちろん 7 行あります。もう一つやりたいことは、2 つの行列を作成することです。1 つは特定の日の最低気温を表す minTemp で、もう 1 つは人工降雪機が作動しているべきかどうかを表す Machine です。どちらも、いくつかの行、1 つの列、そして欠損値から開始します。line では、assign 関数をカスケード接続しています。J 関数を使って、いくつかの行を持つ行列を作成します。ここには、tempC の行数、先ほど述べた単一の列、そして欠損値が入っています。 Machine、minTemp、その他の変数が同じ値で始まる場合は、行に示されているように、カスケード方式で割り当てることができます。これを実行すると、ログに、Machine または minTemp の上にマウス カーソルを移動すると、欠損値の列が表示されます。次にループを実行します。カウンターで、r が nr に格納されている数値以下かどうかをテストします。for ループの本体は、この場合、tempC の最初の行とすべての列を取得する obs という変数です。その行の最小値を見つけて、それを minTemp の r 番目、つまり最初の位置に置きます。次に、その位置に minTemp に置いた値と minus を比較します。この比較が true の場合、値が minus より小さい場合は結果のブール値 1 を取得し、それを Machine の最初の位置に格納します。一方、false の場合、つまり値が minus 以上の場合は、Machine に格納します。次に更新し、再度テストを実行します。すると、obs はデータテーブルの次の行で上書きされます。minTemp と Machine の両方にデータが入力されるまで、同じ手順を繰り返します。行を実行して minTemp にマウスを移動します。これはホバーヘルプに表示され、スクリプト入力ウィンドウの下部にも表示されます。Machine にマウスを移動すると、これらのメッセージが表示されます。最後の数ステップでは、これらのメッセージをカスケードすることもできましたが、デモ用に分離しておきます。dt に新しい列メッセージを送信します。これは minTemp という名前で、値は先ほど for ループから取得した値になります。行を実行してみると、背景に新しい列が作成されたことがわかります。例えば、新しい列にフォーマット引数を追加して、小数点以下の桁数を固定することもできます。これにより、列オブジェクト参照も返されます。この列を再度操作する場合は、これを変数に格納しておくことができます。次のコードは、新しい列に dt へのメッセージを設定することです。これは Make Snow と呼ばれます。値は、マシンの列ベクトルから取得されます。このベクトルには、とがあります。ここで私のスクリプトは、データ値に がある場合はラベルが no になり、データ値に がある場合はラベルが yes になる値ラベルを使用するように要求します。そしてもちろん、ブール型のものを使用して、値ラベルを使用するオプションをオンにします。つまり、行を実行します。もう一度、列オブジェクトのインスタンスを作成します。テーブルに戻ってスクロールします。列に現在表示されているのは no と yes です。列パネルで下にスクロールすると、Make Snow が連続していることがわかります。つまり、実際のデータ値は数値データです。値ラベルを使う際にもう一つ注意すべき点があります。列パネルのアスタリスクはプロパティがあることを示します。これをクリックすると、このアスタリスクが表示されます。値ラベルを使用しているときにデータテーブル内のセルにマウスポインターを合わせると、実際のデータ値が表示されます。今すぐグラフを作成したり、何らかの分析を行う場合でも、ラベルが有効になっている限り、これらのラベルが使用されます。スクリプトに戻って、これらのメッセージをデータテーブルにカスケードすることもできますが、デモのために、次の手順で実行します。データテーブルにselect whereコマンドを送信し、「Make Snow」列の値が次の行と等しい行を検索します。次の行を実行します。すると、背景に4行が選択されているのがわかります。最後に、データテーブルにsubsectコマンドを送信します。出力テーブル名と列を指定します。4行選択されているので、必要な行を指定する必要はありません。これらの行が自動的にサブセットテーブルに取り込まれます。線を引いてみます。これでサブセットテーブルができました。ここでも、最低気温データの書式設定を選択できます。ソーススクリプトはサブセットを反映しています。実際に確認してみましょう。ソースを右クリックして編集を選択します。テーブルメニューのコマンドを使って新しいスクリプトを作成すると、対話型であれスクリプトであれ、ソーススクリプトが取得されます。つまり、使用されたテーブルコマンドがサブセットだったことが分かります。サブセットの注意点は、これらの行が抽出された理由がわからないため、それらの行がハードコードされることです。JMPが書き出すスクリプトには、この選択の根拠がありません。また、JMPは選択された行の引数に を設定することで、選択された行だけを抽出するデフォルトの傾向を上書きします。このスクリプトを別のスクリプトに取り込んで適用したい場合は、ここで示した2行を削除し、サブセットメッセージを送信する前に、スクリプトに必要な論理的な選択を行う必要があります。そこで、このスクリプトをキャンセルします。これは、テーブルのメニューからコマンドを使用する一例ですが、ここでもデータをマトリックスとして操作します。