素数を判定する(SPSS Modeler データ加工逆引き3-25)

## 素数を判定する

![スクリーンショット 2023-10-27 14.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/303d3a25-d648-f56e-6f15-f39d82713ae1.png)

この記事は2023年秋のSPSSユーザーイベントで扱われたModeler詰将棋①を題材にしています

https://www.ibm.com/blogs/solutions/jp-ja/smuc-2023-autumn/

## 1.想定される利用目的

・上方レコードを参照して該当するものが存在するのか、存在すると何レコード上にあるかを求める
    ・マーケティング領域では解約・休眠予測の特徴量作成
    ・製造業の領域では故障予測・異常検知の特徴量作成  

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/prime_number2.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-10-27 14.09.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5649145c-a30b-2e06-38bc-382b0300ed0c.png)

a.入力するデータは以下の通りです。1から1万までのレコードです。
![スクリーンショット 2023-10-27 14.12.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f77d56b9-4f09-5753-2330-90b3da48a5f1.png)

#### 上方レコードを参照する関数による求め方

b.[フィールド作成]ノードを編集します。@&#xFFF0;SCINCEを使って該当レコード@&#xFFF0;THISから順番に上のレコードを参照して余りが0になる（約数）を探し、IDとの差が１だと素数と判定します。
![スクリーンショット 2023-10-27 14.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/12ecdf5d-95eb-685b-c871-354fd502ddf6.png)

サンプルストリームには存在しませんが、以下の設定で説明します。
![スクリーンショット 2023-10-27 14.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/43b558cd-8b62-c27e-f693-6857330e300a.png)

上記のフィールド作成の結果得られるテーブルは以下の通りです。THIS=5の場合、５割る4、5割る3、5割る2、5割る1、まで連続して実行して余りが0になるレコードが何行上にあるかを表示します。5や７は最初のレコードまでそれを見つけることができない＝自分と1でしか割り切れない数になるため素数だと判定されます。6は3行上に約数を見つけるため素数ではないと判定されます。

![スクリーンショット 2023-10-27 14.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/00ef7867-4483-fd92-0370-4c345eb12096.png)

あらためてbを[プレビュー]します。
![スクリーンショット 2023-10-27 14.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7431197d-62c2-c978-0c6f-11b6a10fc0af.png)

c.[レコード集計]ノードを[プレビュー]します。1万までの間に素数が１２２９レコード含まれることがわかります。
![スクリーンショット 2023-10-27 14.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c4ff89ae-0f62-d1af-e6ae-4689467a7c4b.png)

#### SQLプッシュバックが有効になる求め方

d.[条件抽出]ノードを編集します。後続で1万から順番に割り算をするのですが全てを分母にする必要がなく、計算分子の平方根以下までで判定できます。そこで今回は1万の平方根である100を上限にしています。
![スクリーンショット 2023-10-27 14.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/38d221c9-a269-002f-e094-2a0819b1b23e.png)

e.[フィルター]ノードを編集します。フィールド名を変更します。
![スクリーンショット 2023-10-27 14.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e4635512-7541-fcfa-9b97-2f3069b0dd79.png)

f.[レコード結合]ノードを編集します。[キー]によるレコード結合ですが[キー]をブランクにして総当たりで結合します。

![スクリーンショット 2023-10-27 16.19.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d306ccaa-cc0e-4fda-35a9-c47582478f90.png)


[プレビュー]します。1から1万を分子に２から100までを分母にした総当たり計算の準備ができました。
![スクリーンショット 2023-10-27 14.21.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ec6c3fd9-cda6-e4bc-886d-286cbd8f4893.png)


g.[フィールド作成]ノードを編集します。分子と分母が不一致で割り切れない場合にフラグを立てます。

![スクリーンショット 2023-10-27 14.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c9cf969-49e8-365e-acbf-51801ebabfd1.png)

h.[レコード集計]ノードを編集します。1万までの全てに2から100までを割り算し一度も割り切れなかったら素数になる勘定です。
![スクリーンショット 2023-10-27 14.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/191584b0-09d2-f655-c778-3d7c505f79bc.png)

[プレビュー]します。
![スクリーンショット 2023-10-27 14.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/391c38a9-8f46-cb43-402d-be4c32e133bd.png)

#### 注意点

素数を効率よく判定する方法は以下の記事で紹介されています。

https://qiita.com/srtk86/items/874639e361917e5016d4

## 4.　参考情報

#### @&#xFFF0;SCINCEを使ったTips

https://qiita.com/416nishimaki/items/6f2e9e401c82ea1a7519

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008