素数を判定する
この記事は2023年秋のSPSSユーザーイベントで扱われたModeler詰将棋①を題材にしています
1.想定される利用目的
・上方レコードを参照して該当するものが存在するのか、存在すると何レコード上にあるかを求める
・マーケティング領域では解約・休眠予測の特徴量作成
・製造業の領域では故障予測・異常検知の特徴量作成
2.サンプルストリームのダウンロード
3.サンプルストリームの説明
a.入力するデータは以下の通りです。1から1万までのレコードです。
上方レコードを参照する関数による求め方
b.[フィールド作成]ノードを編集します。@SCINCEを使って該当レコード@THISから順番に上のレコードを参照して余りが0になる(約数)を探し、IDとの差が1だと素数と判定します。
サンプルストリームには存在しませんが、以下の設定で説明します。
上記のフィールド作成の結果得られるテーブルは以下の通りです。THIS=5の場合、5割る4、5割る3、5割る2、5割る1、まで連続して実行して余りが0になるレコードが何行上にあるかを表示します。5や7は最初のレコードまでそれを見つけることができない=自分と1でしか割り切れない数になるため素数だと判定されます。6は3行上に約数を見つけるため素数ではないと判定されます。
c.[レコード集計]ノードを[プレビュー]します。1万までの間に素数が1229レコード含まれることがわかります。
SQLプッシュバックが有効になる求め方
d.[条件抽出]ノードを編集します。後続で1万から順番に割り算をするのですが全てを分母にする必要がなく、計算分子の平方根以下までで判定できます。そこで今回は1万の平方根である100を上限にしています。
e.[フィルター]ノードを編集します。フィールド名を変更します。
f.[レコード結合]ノードを編集します。[キー]によるレコード結合ですが[キー]をブランクにして総当たりで結合します。
[プレビュー]します。1から1万を分子に2から100までを分母にした総当たり計算の準備ができました。
g.[フィールド作成]ノードを編集します。分子と分母が不一致で割り切れない場合にフラグを立てます。
h.[レコード集計]ノードを編集します。1万までの全てに2から100までを割り算し一度も割り切れなかったら素数になる勘定です。
注意点
素数を効率よく判定する方法は以下の記事で紹介されています。
4. 参考情報
@SCINCEを使ったTips
SPSS Modeler ノードリファレンス目次
SPSS Modeler 逆引きストリーム集(データ加工)