2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-20

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

やったこと

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

・説明用のコード

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

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

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')

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

前回の出力は以下のとおり
keiba_scatter_color_plot3.jpg
ということで、それぞれのグラフは各列の相関を見るために(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')

この出力も当然上記と同じものが出ます。
pandas_iris_line_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で色分けされたものを表示することができませんでした。
seaborn_pairplot_default.png
しかし、対角線の図は上記の"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

まとめ

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

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?