SPSS Modelerで最適なクラスター数(のヒント)を探してみる その１


　クラスター分析をしている時に、最適なクラスター数を探すにはどうしたらいいのか？と考えるときありませんか？基本、シルエットスコアやクラスター毎のレコード数や特徴をみて、分析者が判断するものだと思っています。が、とりあえず何個くらいに分ければいいのか、ヒントが欲しいですよね。

　SPSS Modeler にはクラスター分析をするために、K-meansやKohonen、TwoStepといったモデルが用意されていますが、分析者がモデル構築前に、クラスター数を指定する必要があります。
 ※.TwoStepは作成したいクラスター数の最大値、最小値を指定
 ※.Kohonenはオプションで幅と長さを指定可能

　そこで、シルエットスコアやエルボー法という指標を用いて、最適なクラスター数を推定しようと思います。記事の題名がその1となっていますが、その2も作成する予定です。

その1 – SPSS Modeler 自動クラスタリングノードを利用

その2 – SPSS Modeler 拡張ノード(Python for Spark)を利用

https://qiita.com/harrowharrow16/items/1ad1c815a42bd8dd65c2


**※2025-03-11 本記事で使用した、ストリームとデータをGitHubにアップしました。**

https://github.com/harrow16/Qiita/tree/main/Clustering_Part1_0725
 

## シルエットスコアとは

　シルエットスコア（Silhouette Score）は、クラスタリングの効果を評価するために使用される指標の一つです。このスコアは、各データポイントがどの程度適切にクラスタリングされているかを数値で示します。具体的には、クラスタ内の凝集度とクラスタ間の分離度を用いて計算されます。
 
　シルエットスコアは -1 から 1 の範囲で、1 に近いほどクラスタリングの品質が高いことを示します。スコアが 0 に近い場合は、クラスタの境界が曖昧であることを示し、負の値はクラスタリングが不適切である可能性があります。

引用

https://note.com/united_code/n/n8a15ae4063b3


※.引用元のそのままの内容を記載させていただいております。

## エルボー法

　エルボー法は、それぞれのクラスター内の誤差平方和（SSE）を計算し、クラスター数とそれぞれの誤差平方和の和をプロットして適切なクラスター数を判断する手法です。エルボー（肘）のように曲線が折れ曲がる点が適切なクラスター数と考えます。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/eedc575e-3579-4cf8-ec19-aed0df9c7c37.png)


## SPSS Modelerの自動クラスタリングノード

　シルエットスコアを使って最適なクラスター数を推定しようと思いますが、何回もモデルを作成しシルエットスコアを確認するのは大変です。なので、Pythonを使ってクラスター数を変えながらシルエットスコアを計算しようと思ってプログラムまで書いてから、そんなことしなくてもSPSS Modelerには、自動クラスタリングノードでできることが分かりました。(‘Д’)

では実際やってみましょう。

## SPSS Modelerの自動クラスタリングノードを利用したモデルの比較

　使用するデータは、みんな大好きirisのデータです。もう最適なクラスター数も想像がつきますが

データダウンロード先

https://archive.ics.uci.edu/dataset/53/iris

　SPSS Modelerは v18.5を利用します。（本記事の内容はバージョン18.5でなくても問題なく実行できます。）

### 1. 作ったストリーム

　シンプル。。入力データもirisなので特に加工などせずに自動クラスタリングノードへデータを渡しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/4adeb6a7-d2a5-d59f-63d6-47bca3b0f4a8.png)

### 2. 各種設定

#### ①. 入力ノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/97396963-1996-162e-adf0-e02f2eb9812f.png)

　入力ノードはフィールド名を変更しているだけです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/e361ffaa-847d-4831-f8fc-7aefd55893f3.png)



#### ②. データ型ノード

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/e778b242-3efb-fe58-bf05-ff39434adc25.png)

　データ型ノードでインスタンス化及びロールを設定しています。入力変数は、class以外のフィールドです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/131e1343-bce3-21b4-2043-5b5fc1d7e912.png)

#### ③.自動クラスタリングノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/ffc56cbe-e57d-cdfa-2068-57b4b017e163.png)

　自動クラスタリングノードの設定をしていきます。
 
##### a.	エキスパートタブ
　K-meansノードのみを選択して、モデルパラメータを指定します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/56cdbaa6-ad64-26f6-86ea-b3ef0c977635.png)


##### b. モデルパラメータ
　シンプルタブのクラスター数を設定します。今回は2から9までを指定します。
 

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/47f6a62f-2b9b-ae2d-6a94-5feb36e5658f.png)

##### c. モデル作成
　設定が完了すると、作成するモデル数が8となっていることが確認できます。2～9までクラスター数を変えたモデルを8個つくるということですね。
あとは、実行ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/d6418dec-134a-458f-8e08-3b0db599573e.png)

### 3. 結果確認
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/e89ec99c-90fc-4cb3-6038-0e4f54fb60da.png)

　自動クラスタリングナゲットをダブルクリックで開き結果を確認します。全体像の列がシルエットスコアになります。クラスター数別のシルエットスコアが一度に確認できます。また、最小・最大のクラスターのレコード数なども確認でき便利ですね。ちなみに、８個すべての結果ではなく、デフォルトでは上位5個のモデルが表示されるようになっています。
 
 https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=node-auto-cluster-model-options
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839172/bcb946aa-0629-6647-324a-3ef669fbbdbd.png)

　いやー、簡単ですね。
　このように一度に複数の設定を試し指標も確認できるのでぜひ活用していきましょう。え？結局どのクラスター数にすればいいかって？個人的には、最小÷最大の値が一番大きく（最小クラスターと最大クラスターのレコード数の差が小さい）、シルエットスコアも高い”３”を選択するのがいいかなと思います。

 
 ## 次回は、SPSS Modelerの拡張ノードを利用してシルエットスコア・SSEを算出してみます。
 
　自動クラスタリングノードで簡単に複数モデルのシルエットスコアを確認できました。が、せっかくプログラムも書いて準備したので、次回は、拡張ノードを利用したPython for Sparkバージョンも紹介したいと思います。本当はこっちのみ記事にするつもりでした。
 
https://qiita.com/harrowharrow16/items/1ad1c815a42bd8dd65c2


## 参考情報

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

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


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

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

### SPSS funさん記事

https://qiita.com/spssfun2017