上記のように、距離の短いものから順にどんどん結合していくと、クラスタ数は1つずつ減り、クラスタあたりのメンバ数(クラスタサイズ)は大きくなります。その様子を計算して図示してみましょう。plt.show()draw_threshold_dependency(result1)指定した閾値でクラスタを得る次のような関数で、指定した閾値でクラスタを得ることができます。クラスタを得る関数を使う。クラスターID(それが何番目のクラスターに所属するか)が格納されます。6つのクラスターに分かれました。ところがこの関数には弱点があります。変数を変えてクラスタリングすると、その「距離」の定義が変わるので、そのたびに閾値がどのくらいかいちいち確認しながら調整しなければいけないのです。指定したクラスタ数でクラスタを得るそこで、以下のように、閾値ではなく「いくつのクラスタに分割したいか」で決めることにしてみましょう。指定したクラスタ数でクラスタを得る関数を作る。output_cluster_ids次のようにして「10個のクラスタに分けたい」というふうに指定できます。9]得られたクラスタのメンバ数の分布は次のようになります。シルエット係数が高いほど、よく分割できている(クラスタ間距離に比べ、クラスタ内距離が十分に短い)ことを示します。df)0.6192139990573414ただし、上記のコードで得られたシルエット係数は、距離の定義を「ユークリッド距離」とした場合のシルエット係数になります。次のようにして、クラスタ数を変えた時にシルエット係数がどう変わるかを可視化できます。上記の計算手法は時間がかかります。同じ計算(距離の計算)を何度も行なっているからです。格納して、それを必要に応じて読み込む形にしましょう。coefficient")plt.grid()plt.show()これで、結果は変わらず、高速化ができたことと思います。クラスタに分割して中身を見る上記の計算より、クラスタ数が10個の時にシルエット数が極大になることが分かりました。そこで、クラスタ数を10個として、どのようなクラスターが得られたか確認してみましょう。10)次のようにして、10個のクラスターのメンバーとそのアルコール消費量が確認できます。どのように分かれたか、得られたグラフをよくみて考察してみましょう。「行ごとの正規化」を「列ごとの正規化」「正規化しない」などに変更した場合どのように結果が変わるか確認し、「正規化」の効果を考察しましょう。変えた時にどのように結果が変わるか確認しましょう。upLoginユーザーは見つかりませんでした。