【機械学習入門】「K-meansクラスタリング」というのをやってみる♬ファイル読込みで競馬騎手評価;解説編


ちょっと結果について簡単に解説したいと思います。

やったこと

・説明用のコード
・さらなる追求

・説明用のコード

要は相関を出しているということで、ひたすら相関係数を計算して出力する。

ということで、以下のとおり相関係数を各図のタイトルに表示してみました。

fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(9, 9),sharex=True,sharey=True)
ax0 = axes[0,0]
ax0.scatter(df["1st"],df["1st"],c=colors)
cor00=np.corrcoef(df["1st"],df["1st"])[0, 1]
ax0.set_title("{:.3f}".format(cor00))
ax1 = axes[1,0]
ax1.scatter(df["1st"],df["2nd"],c=colors)
cor10=np.corrcoef(df["1st"],df["2nd"])[0, 1]
ax1.set_title("{:.3f}".format(cor10))
ax2 = axes[2,0]
ax2.scatter(df["1st"],df["3rd"],c=colors)
cor20=np.corrcoef(df["1st"],df["3rd"])[0, 1]
ax2.set_title("{:.3f}".format(cor20))
ax3 = axes[0,1]
ax3.scatter(df["2nd"],df["1st"],c=colors)
cor01=np.corrcoef(df["2nd"],df["1st"])[0, 1]
ax3.set_title("{:.3f}".format(cor01))
ax4 = axes[1,1]
ax4.scatter(df["2nd"],df["2nd"],c=colors)
cor11=np.corrcoef(df["2nd"],df["2nd"])[0, 1]
ax4.set_title("{:.3f}".format(cor11))
ax5 = axes[2,1]
ax5.scatter(df["2nd"],df["3rd"],c=colors)
cor21=np.corrcoef(df["2nd"],df["3rd"])[0, 1]
ax5.set_title("{:.3f}".format(cor21))
ax6 = axes[0,2]
ax6.scatter(df["3rd"],df["1st"],c=colors)
cor02=np.corrcoef(df["3rd"],df["1st"])[0, 1]
ax6.set_title("{:.3f}".format(cor02))
ax7 = axes[1,2]
ax7.scatter(df["3rd"],df["2nd"],c=colors)
cor12=np.corrcoef(df["3rd"],df["2nd"])[0, 1]
ax7.set_title("{:.3f}".format(cor12))
ax8 = axes[2,2]
ax8.scatter(df["3rd"],df["3rd"],c=colors)
cor22=np.corrcoef(df["3rd"],df["3rd"])[0, 1]
ax8.set_title("{:.3f}".format(cor22))
fig.savefig('k-means/pandas_axes.png')

そしてこれを出力したのが以下のような図になります。

前回の出力は以下のとおり

ということで、それぞれのグラフは各列の相関を見るために(x、y)をプロットしていたことが分かります。
そして、K-meansで求めたカテゴリ毎に色を付けています。
さらに、上記コードではちょっと辛いので以下のとおり書き換えます。

fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(9, 9),sharex=True,sharey=True)
for x in range(1,4):
    for y in range(1,4):
        ax = axes[x-1,y-1]
        x_data=df[df.columns[x]]
        y_data=df[df.columns[y]]
        #print(x_data)
        ax.scatter(x_data,y_data,c=colors)
        cor=np.corrcoef(x_data,y_data)[0, 1]
        ax.set_title("{:.3f}".format(cor))

fig.savefig('k-means/pandas_axes2.png')

この出力も当然上記と同じものが出ます。

しかし残念ながら、対角線上のグラフはなんだかわかりません。

・さらなる追求

この対角線にある図は、daiagonal="kde"で描画しています。
これを再現するのは、seabornというツールがよさそうです。
ということで、以下のように描いてみます。

import seaborn as sns
pg = sns.pairplot(df)

print(type(pg))
pg.savefig('k-means/seaborn_pairplot_default.png')

上記は残念ながら、保存された画像しか見ることができませんでした。
一応、保存された画像は以下のとおりに見えます。
残念ながら、せっかくのK-meansで色分けされたものを表示することができませんでした。

しかし、対角線の図は上記の"kde"すなわち「•対角線のグラフの種類をカーネル密度分布に変更: 引数diag_kind」の棒グラフのようです。
【参考】
Python, pandas, seabornでペアプロット図(散布図行列)を作成
カーネル密度分布とは?
で実際なんなのかというと、どうやら以下の列データからその数字を使ってどの程度の値かを推定しているようです。ただ、1stの値などは徐々に減少しているように見えるのに、途中かなり落ち込んでいたりするのはよくわかりませんが、。。しかし、もともとの出力を見るとだいたいの分布を表していて、上記の解釈は正しいと思われます。

name 1st 2nd 3rd
Take 24 11 12
Lumail 21 20 21
Kawada 19 24 12
Fukunaga 17 22 16
Iwata 17 17 14
Murphei 17 11 14
Kitamura 16 11 13
Dmulo 16 8 12
Miura 13 12 7
Tosaki 12 15 12
Fujioka 12 9 4
Ikezoe 12 7 5
Sameshima 10 14 3
Matsuyama 10 7 11
Yokoyama 10 5 2
Tanabe 9 16 13
Oono 9 14 8
Maruyama 9 6 6
Nishimura 9 5 7
FujiokaK 9 5 7

まとめ

・グラフは相関を見るグラフだということが分かりました
・相関係数をグラフに張り付けて表示できるようにしました

・対角線に並んだグラフはカーネル密度分布でしたが、これについてはもう少し学習が必要なようです