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


前回のURL読込を自前のファイル読込で同じことをやってみる。

やったこと

・ファイル読込に変更
・ファイルを変えてみる

・ファイル読込に変更

【参考】
Pandasのread_csv関数でCSVファイルを読み込む方法
pandasでcsv/tsvファイル読み込み(read_csv, read_table)@note.nkmk.me
コードは以下のとおり、変更は最小限です。
肝心な部分は、以下の一行です。
df = pd.read_csv("SchoolScore.csv", sep=',', na_values=".") # データの読み込み

# ウェブ上のリソースを指定する
#url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/SchoolScore.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
#urllib.request.urlretrieve(url, 'SchoolScore.txt')
#('SchoolScore.txt', <httplib.HTTPMessage instance at 0x104143e18>)

df = pd.read_csv("SchoolScore.csv", sep=',', na_values=".") # データの読み込み

ここで
ファイル名:"SchoolScore.csv"
ファイルは以下のとおり(おまけに掲載)、','区切りです。
なので、sep=','
スペースなら、sep=' '
※ちなみに、競馬1では' 'で読み込んでみましたが、競馬2のようにデータ多いとなかなか調整できず、競馬騎手の名前のところがうまく読み込めなかったので、やはり','区切りにしました
na_value="."と置かれています。
ちなみにここでは、以下のファイル(おまけに掲載)を読み込んだ例を示します。
これは前回と同じ結果が得られました。


競馬の騎手の成績(おまけに掲載)を評価

まず、3位以内入賞の結果から成績評価すると以下のとおりとなります。
上記の3科目評価と同じようなグラフが得られます。


そして、おまけに掲載のリンク先データをすべて使うと以下のとおりとなります。


まとめ

・ファイル読込でやってみた
・評価基準を変えて、競馬騎手評価をやってみた

おまけ

学生の成績

Student,Japanese,Math,English
0,80,85,100
1,96,100,100
2,54,83,98
3,80,98,98
4,90,92,91
5,84,78,82
6,79,100,96
7,88,92,92
8,98,73,72
9,75,84,85
10,92,100,96
11,96,92,90
12,99,76,91
13,75,82,88
14,90,94,94
15,54,84,87
16,92,89,62
17,88,94,97
18,42,99,80
19,70,98,70
20,94,78,83
21,52,73,87
22,94,88,72
23,70,73,80
24,95,84,90
25,95,88,84
26,75,97,89
27,49,81,86
28,83,72,80
29,75,73,88
30,79,82,76
31,100,77,89
32,88,63,79
33,100,50,86
34,55,96,84
35,92,74,77
36,97,50,73

騎手の成績1
【参考】
2019年度 リーディングジョッキー (全国) 2019年2月17日現在

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
※全データ

name,1,2,3,4,5,6,Rwin,kijyototal,winratio,winratio2,win3,totalwin,money
Take,24,11,12,5,13,49,7,114,0.211,0.307,0.412,4042,454469000 
Lumail,21,20,21,7,9,36,6,114,0.184,0.360,0.544,978,445864000 
Kawada,19,24,12,9,11,28,3,103,0.184,0.417,0.534,1247,403594000 
Fukunaga,17,22,16,9,6,48,3,118,0.144,0.331,0.466,2170,377694000 
Iwata,17,17,14,10,8,65,7,131,0.130,0.260,0.366,1550,395310000 
Murphei,17,11,14,6,6,30,6,84,0.202,0.333,0.500,25,327974000 
Kitamura,16,11,13,17,6,53,6,116,0.138,0.233,0.345,664,340399000 
Demulo,16,8,12,7,4,24,5,71,0.225,0.338,0.507,944,308588000 
Miura,13,12,7,11,11,68,1,122,0.107,0.205,0.262,696,198769000 
Tosaki,12,15,12,6,13,49,6,107,0.112,0.252,0.364,953,286602000 
Fujioka,12,9,4,7,6,52,4,90,0.133,0.233,0.278,747,225422000 
Ikezoe,12,7,5,7,9,59,5,99,0.121,0.192,0.242,1126,232521000 
Sameshima,10,14,3,5,3,60,3,95,0.105,0.253,0.284,152,135654000 
Matsuyama,10,7,11,10,12,79,3,129,0.078,0.132,0.217,556,195037000 
Yokoyama,10,5,2,2,6,36,2,61,0.164,0.246,0.279,2742,131128000 
Tanabe,9,16,13,13,6,58,3,115,0.078,0.217,0.330,806,226342000 
Oono,9,14,8,15,14,64,1,124,0.073,0.185,0.250,504,185507000 
Maruyama,9,6,6,12,6,65,2,104,0.087,0.144,0.202,454,188557000 
Nishimura,9,5,7,7,4,47,0,79,0.114,0.177,0.266,22,89754000 
FujiokaK,9,5,7,6,11,60,3,98,0.092,0.143,0.214,517,121869000

コード全体

# URL によるリソースへのアクセスを提供するライブラリをインポートする。
import urllib.request
import pandas as pd # データフレームワーク処理のライブラリをインポート
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
from sklearn.cluster import KMeans # K-means クラスタリングをおこなう
#import sklearn #機械学習のライブラリ
from sklearn.decomposition import PCA #主成分分析器


# ウェブ上のリソースを指定する
#url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/SchoolScore.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
#urllib.request.urlretrieve(url, 'SchoolScore.txt')
#('SchoolScore.txt', <httplib.HTTPMessage instance at 0x104143e18>)


df = pd.read_csv("keiba.csv", sep=',', na_values=".") # データの読み込みSchoolScore.csv keiba2.csv
df.head() #データの確認
df.iloc[:, 1:].head() #解析に使うデータは2列目以降
print(df)

plotting.scatter_matrix(df[df.columns[1:]], figsize=(6,6), alpha=0.8, diagonal='kde')   #全体像を眺める
plt.savefig('k-means/keiba_scatter_plot2.jpg')
plt.pause(1)
plt.close()

# この例では 3 つのグループに分割 (メルセンヌツイスターの乱数の種を 10 とする)
kmeans_model = KMeans(n_clusters=3, random_state=10).fit(df.iloc[:, 1:])
# 分類結果のラベルを取得する
labels = kmeans_model.labels_

# 分類結果を確認
print(labels)
#[0 0 0 0 0 0 0 0 1 1 1 1 2 1 2 1 1 1 2 2]

# それぞれに与える色を決める。
color_codes = {0:'#00FF00', 1:'#FF0000', 2:'#0000FF'}
# サンプル毎に色を与える。
colors = [color_codes[x] for x in labels]

# 色分けした Scatter Matrix を描く。
plotting.scatter_matrix(df[df.columns[1:]], figsize=(6,6),c=colors, diagonal='kde', alpha=0.8)   #データのプロット
plt.savefig('k-means/keiba_scatter_color_plot2.jpg')
plt.pause(1)
plt.close()

#主成分分析の実行
pca = PCA()
pca.fit(df.iloc[:, 1:])

PCA(copy=True, n_components=None, whiten=False)

# データを主成分空間に写像 = 次元圧縮
feature = pca.transform(df.iloc[:, 1:])

# 第一主成分と第二主成分でプロットする
plt.figure(figsize=(6, 6))
for x, y, name in zip(feature[:, 0], feature[:, 1], df.iloc[:, 0]):
    plt.text(x, y, name, alpha=0.8, size=10)
plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, color=colors)
plt.title("Principal Component Analysis")
plt.xlabel("The first principal component score")
plt.ylabel("The second principal component score")
plt.savefig('k-means/keiba_PCA12_plot2.jpg')
plt.pause(1)
plt.close()