Data Filterは、データをサブセットしながら探索するためのさまざまな方法を提供します。JSLのコマンドとオプションを使えば、データの複雑なサブセットを選択し、それをプロット内で非表示にしたり、分析から除外したりできます。
「JMPでのプロファイル」の機能をスクリプトで実行する場合の基本的な構文は次のようになります。
dt << Data Filter(<Columns>, <Mode(...)>, <Add Filter(...)>, <Show Columns(), <Selector>, <Animation>, <Animate>, <Clear>, <Delete All>, <Delete>, <Filter Columns>, <Filter Column>, <Filter Group>, <Add Filter>, <Add>, <Match>, <Mode>, <Display>, <Where>, <Make Subset>, <Display>, <Show Histograms and Bars>)
オプションなしでData Filterメッセージをデータテーブルに送ると、Data Filterの最初のウィンドウが表示され、「フィルタ列の追加」パネルにデータテーブル内の変数がリストされます。
Modeは、Select(Boolean)、Show(Boolean)、Include(Boolean)という3つの引数を取りますが、引数はどれも必須ではありません。これらの引数は、それぞれ対応するオプションをオンまたはオフにします。Selectのデフォルト値はtrue(1)です。Show とIncludeのデフォルト値はfalse(0)です。
Add Filter()は、列とデータテーブルをサブセットするWhere節を指定します。基本的な構文は次のようになります。
Add Filter( Columns( col, ... ), Where( ... ), ... )
データフィルタに列を追加するには、列名をカンマで区切って指定します。これは、リストデータ構造ではありません。
フィルタ列を指定する場合は、1つまたは複数のWhere節を次のように定義します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
df = dt << Data Filter(
Mode( Show( 1 ) ),
Add Filter(
Columns( :年齢, :性別, :"身長(インチ)"n ),
Where( :年齢 == {13, 14, 15} ),
Where( :性別 == "M" ),
Where( :"身長(インチ)"n >= 52 & :"身長(インチ)"n <= 65 )
)
);
このスクリプトは、身長が52インチ以上65インチ以下の13歳、14歳、15歳の男子を選択します。前述のスクリプトにInvert Selectionメッセージを追加すると、このフィルタされたデータで除外されている年齢を選択できます。
df << ( Filter Column( :年齢 ) << Invert Selection );
この例では、フィルタされたデータの13歳、14歳、15歳以外の年齢が選択されます。
Add Filter()を使って、多重応答のプロパティまたは尺度が設定されている列から一致する文字列を選択することもできます。
dt = Open( "$SAMPLE_DATA/Consumer Preferences.jmp" );
df = dt << Data Filter(
Location( {437, 194} ),
Add Filter(
Columns( :歯磨き カンマ区切り ),
Match None( Where( :歯磨き カンマ区切り == {"Before Sleep", "Wake"} ) ),
/* Displayオプションの指定。「歯磨き カンマ区切り」という列名が
値のリストの上に表示される。Sizeはフィルターリストのサイズを指定する。
値はチェックボックスの隣に表示される。*/
Display( :歯磨き カンマ区切り, Size( 121, 70 ), Check Box Display )
)
);
このスクリプトは、「歯磨き カンマ区切り」列内で、指定された値(「Before Sleep」、「Wake」)のいずれにも一致しない行を選択します。使用可能なその他のスクリプトオプションには、Match Any、Match All、Match Exactly、Match Onlyがあります。多重応答プロパティおよび多重応答尺度の詳細については、『JMPの使用法』の多重応答を参照してください。
既存のData Filterオブジェクトにメッセージを送ることもできます。
Clear(), Display( ... ), Animate(), Mode(), ...
Clearは、引数をとらず、データフィルタをクリアします。
スクリプトの実行時にデータフィルタが表示されないようにするには、次のようにShow Windowを0に設定します。
obj = ( dt << Data Filter( Show Window( 0 ) ) );
除外する値を指定するには、!=演算子を使用します。次の例では、フィルリング後の値に16歳と17歳の年齢が含まれなくなります。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
df = dt << Data Filter(
Add Filter( Columns( :年齢, :性別 ) ),
Match( Columns( :年齢, :性別 ),
Where( :性別 = "M" ), Where( :年齢 != {16, 17} )
)
);
データフィルタのアウトラインと赤い三角のメニューを削除するには、No Outline Boxを指定します。
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
df = dt << Data Filter(
Add Filter( Columns( :地域, :人口 ), Where( :地域 == {"C", "N"} ) ),
No Outline Box( 1 )
);
ローカルデータフィルタを使用すると、他のレポートに影響を与えずに、個々のレポートを作成するデータをフィルタリングすることができます。プラットフォームにローカルデータフィルタが追加されると、データフィルタの参照が戻されます。これにより、簡単にフィルタへアクセスできるようになります。
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
biv = dt << Bivariate(
Y( :x ),
X( :y ),
Automatic Recalc( 1 ),
Fit Line( {Line Color( {213, 72, 87} )} )
);
dfObj = biv << Local Data Filter(
// ヒストグラムがフィルタに表示されないようにするにはShow Histograms and Bars( 0 )を指定する。
// ローカルデータフィルタによるグラフの作成のための計算に、ローカルデータフィルタによって
// 選択された行を含めるには、Includeを有効にする。
// 選択を解除した行は、計算から除外される。
Location( {566, 47} ),
Mode( Include( 1 ) )
);
dfObj << Add Filter(
Columns( :地域, :人口 ),
Where( :地域 == {"C", "N"} )
);
「Make Filter Change Handler」はデータフィルタでフィルタリングされた行数の履歴を残します。
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
dist = Distribution(
Automatic Recalc( 1 ),
Continuous Distribution( Column( :人口 ) )
);
filter = dist << Local Data Filter(Add Filter( columns( :地域 ) ));
f = Function( {a}, Print( a ) );
rs = filter << Make Filter Change Handler( f );
データフィルタを使うと、データの複雑なサブセットを選択し、それをプロット内で非表示にしたり、分析から除外したりできます。選択の範囲は、データテーブルのすべての分析に影響します。
別のオプションとしては、特定のプラットフォームまたはディスプレイボックスからデータをフィルタする方法があります。Data Filter Context Box()関数の中にローカルデータフィルタを作成します。これにより、コンテキストはデータテーブルとしてではなく、現在のプラットフォームまたはディスプレイボックスとして定義されます。
次の例は、グラフボックス用のローカルデータフィルタを作成します。出力については、Figure 9.9を参照してください。
New Window( "Marker Seg Example",
Data Filter Context Box(
V List Box(
dt << Data Filter( Local ),
g = Graph Box(
Frame Size( 300, 240 ),
X Scale( Min( xx ) - 5, Max( xx ) + 5 ),
Y Scale( Min( yy ) - 5, Max( yy ) + 5 ),
Marker Seg( xx, yy, Row States( dt, rows ) )
)
)
)
);
ヒント: 上記のスクリプトはさらに大きなスクリプトの一部であり、そのスクリプトでMarker Segに必要な配列が作成されます。このスクリプトを試すには、「Local Data Filter for Custom Graph.jsl」サンプルスクリプトを開いてください。
図9.9 ローカルデータフィルタとグラフ
1つのコンテキストボックスに、1つのローカルフィルタと複数のグラフを含めることもできます。フィルタリングはすべてのグラフに適用されます。次のスクリプトは、1つのコンテキストボックスにバブルプロットを2つ、データフィルタを1つ作成します。出力については、Figure 9.10を参照してください。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
New Window( "Shared Local Filter",
Data Filter Context Box(
H List Box(
dt << Data Filter( Local ),
Platform(
dt,
Bubble Plot( X( :"体重(ポンド)"n ), Y( :"身長(インチ)"n ), Sizes( :年齢 ) )
),
Platform(
dt,
Bubble Plot( X( :"体重(ポンド)"n ), Y( :年齢 ), Sizes( :"身長(インチ)"n ) )
)
)
)
);
ヒント: このスクリプトを実行するには、「Local Data Filter Shared.jsl」サンプルスクリプトを開きます。
図9.10 2つのバブルプロットを使ったローカルフィルタ
階層的なデータフィルタを作成することもできます。1つのスクリプトでデータフィルタとローカルデータフィルタが生成される場合があります。データテーブルの外側のデータフィルタが、ローカルデータフィルタに使用できるデータを決定します。これをわかりやすく示すため、例を紹介します。次のスクリプトは、Figure 9.11に示すように両方のタイプのデータフィルタを作成します。
ヒント: 次のスクリプトはさらに大きなスクリプトの一部であり、そのスクリプトでMarker Segに必要な配列が作成されます。これらの配列を作成するコードについては、「Local Data Filter for Custom Graph.jsl」サンプルスクリプトを参照してください。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
...
New Window( "Marker Seg Example",
Data Filter Context Box(
V List Box(
dt << Data Filter( Local ),
g = Graph Box(
Frame Size( 300, 240 ),
X Scale( Min( xx ) - 5, Max( xx ) + 5 ),
Y Scale( Min( yy ) - 5, Max( yy ) + 5 ),
Marker Seg( xx, yy, Row States( dt, rows ) )
)
)
)
);
はじめにデータフィルタによって身長55インチ以上65インチ以下のデータが選ばれます。その後、ユーザはグラフのためのローカルデータフィルタを使ってデータをフィルタリングできます。
図9.11 データフィルタの階層
前述の例では、Include (含める)のモードを有効にしたデータフィルタを追加しました。このモードでは、グラフの作成のための計算に、ローカルデータフィルタによって選択された行のみを含めます。選択されていない行は、計算から除外されます。
インタラクティブHTMLとして書き出すには、Includeモードを無効にする必要があります。インタラクティブHTMLでは、計算から行を除外しないためです。
dt = Open( "$SAMPLE_DATA/Quality Control/Coating.jmp" );
dt << Graph Builder(
Size( 532, 455 ),
Show Control Panel( 0 ),
Variables( X( :サンプル ), Y( :重量 ) ),
Elements( Points( X, Y, Legend( 3 ) ), Line( X, Y, Legend( 5 ) ) ),
Local Data Filter( Mode( Include( 0 ) ), Add Filter( columns( :重量 ) ) )
);
Current Report() << Save Interactive HTML( "$DESKTOP/example1.html" );
Web( "$DESKTOP/example1.html" );