How many files(0-15)

競馬の予想システムで一儲を企むおっさんのヨコシマな横顔

機械学習 其の004 ~前処理とデータ表示~

データを処理する際に、入手したデータをそのまま使えないことがあるのは、機械学習 其の003のとおり。今回は前回のデータを、結果として必要な部分だけを抽出、加工し表示してみます。
まずは、前回のデータは数値以外の箇所がnanとして読み込まれていたので、genfromtxtのdtypeとconvertersを使って読み込むように修正しました。
改修したソースと実行結果は以下のとおりです。

# -*- coding: utf-8 -*-
import scipy as sp
import numpy as np

# genfromtxtにdtypeの指定とconvertersを追加
racedata = sp.genfromtxt("racedata3.tsv", delimiter="\t", skiprows=1, 
    dtype=[ ('着','i2'),                     # 0:着
            ('枠','i2'),                     # 1:枠 
            ('馬番','i2'),                   # 2:馬番 
            ('馬名','U50'),                  # 3:馬名  
            ('性齢','U10'),                  # 4:性齢  
            ('負担','i3'),                   # 5:負担  
            ('馬体重','U10'),                # 6:馬体重 
            ('増減','i3'),                   # 7:増減 
            ('騎手','U50'),                  # 8:騎手 
            ('調教師','U50'),                # 9:調教師 
            ('タイム', 'U10'),                 # 10:タイム  
            ('着差','U10'),                  # 11:着差 
            ('上がり3F','U10'),               # 12:上がり3F 
            ('コーナー通過順','U10'),          # 13:コーナー通過順
            ('人気','i2')],                  # 14:人気
    converters={ 
        3 : lambda s: s.decode('utf8'),    # 馬名
        4 : lambda s: s.decode('utf8'),    # 性齢
        8 : lambda s: s.decode('utf8'),    # 騎手
        9 : lambda s: s.decode('utf8'),    # 調教師
        10: lambda s: s.decode('utf8'),    # タイム
        11: lambda s: s.decode('utf8'),    # 着差
        12: lambda s: s.decode('utf8'),    # 上がり3F 
        13: lambda s: s.decode('utf8')     # コーナー通過順
    })

print racedata
print "\n\n"
for rec in racedata:
    print str(rec[0]) + "," + str(rec[1]) + "," + str(rec[2]) + "," + \
           rec[3] + "," + rec[4] + "," + str(rec[5]) + "," + \
           str(rec[6]) + "," + str(rec[7]) + "," + rec[8] + "," + \
           rec[9] + "," + rec[10] + "," + rec[11] + "," + rec[12] + "," + \
           rec[13] + "," + str(rec[14])
[ (1, 3, 3, u'\u30b9\u30a6\u30a7\u30d7\u30c8\u30b8\u30e7\u30fc\u30a4', u'\u30bb4', 55, u'477kg', -1, u'\u7027\u5ddd\u5bff\u5e0c\u4e5f', u'\u9df9\u898b\u6d69', u'1:12.7', u'-', u'38.1', u'1-1', 7)
 (2, 7, 7, u'\u30de\u30a4\u30cd\u30eb\u30d5\u30a1\u30e9\u30aa\u30f3', u'\u72614', 55, u'529kg', -1, u'\u6962\u5d0e\u529f\u7950', u'\u8d64\u5dba\u672c\u6d69', u'1:12.9', u'\uff11 1/4', u'37.9', u'6-5', 1)
 (3, 1, 1, u'\u30a6\u30a3\u30fc\u30af\u30a8\u30f3\u30c9', u'\u725d4', 53, u'502kg', -1, u'\u5897\u7530\u5145\u5b8f', u'\u671d\u5009\u5b9f', u'1:13.5', u'\uff13', u'38.5', u'5-4', 4)
 (4, 6, 6, u'\u30b7\u30e5\u30fc\u30eb\u30c0\u30f3\u30b9', u'\u72614', 54, u'489kg', -4, u'\u2606\u702c\u5ddd\u5c06\u8f1d', u'\u6e21\u9089\u548c\u96c4', u'1:13.6', u'1/2', u'38.8', u'3-3', 3)
 (5, 4, 4, u'\u30c8\u30df\u30b1\u30f3\u30c7\u30d5\u30d0\u30fc\u30eb', u'\u72614', 57, u'503kg', -1, u'\u7e41\u7530\u5065\u4e00', u'\u5bae\u672c\u5eb7', u'1:14.0', u'\uff12', u'38.6', u'7-7', 6)
 (6, 2, 2, u'\u30ed\u30fc\u30ec\u30f3\u30c0\u30f3\u30b5\u30fc', u'\u725d6', 53, u'445kg', -1, u'\u5c71\u5d0e\u826f', u'\u671d\u5009\u5b9f', u'1:14.4', u'\uff12', u'39.0', u'7-7', 5)
 (7, 8, 8, u'\u30ac\u30eb\u30d9\u30b9', u'\u72617', 55, u'463kg', -1, u'\u9ad8\u91ce\u8aa0\u6bc5', u'\u4e45\u4fdd\u8207\u9020', u'1:14.7', u'\uff11 1/2', u'37.9', u'9-9', 9)
 (8, 5, 5, u'\u30cb\u30b7\u30ce\u30bb\u30fc\u30ea\u30f3\u30b0', u'\u725d4', 55, u'486kg', -3, u'\u77e2\u91ce\u8cb4\u4e4b', u'\u4f50\u5b97\u5fdc\u548c', u'1:14.9', u'\uff11 1/2', u'40.2', u'2-2', 2)
 (9, 8, 9, u'\u30ac\u30ea\u30b7\u30e4\u30d2\u30eb', u'\u725d6', 53, u'437kg', -3, u'\u753a\u7530\u76f4\u5e0c', u'\u4f50\u3005\u6728\u6d0b\u4e00', u'1:16.4', u'\uff17', u'41.5', u'4-6', 8)]



1,3,3,スウェプトジョーイ,セ4,55,477kg,-1,瀧川寿希也,鷹見浩,1:12.7,-,38.1,1-1,7
2,7,7,マイネルファラオン,牡4,55,529kg,-1,楢崎功祐,赤嶺本浩,1:12.9,1 1/4,37.9,6-5,1
3,1,1,ウィークエンド,牝4,53,502kg,-1,増田充宏,朝倉実,1:13.5,3,38.5,5-4,4
4,6,6,シュールダンス,牡4,54,489kg,-4,☆瀬川将輝,渡邉和雄,1:13.6,1/2,38.8,3-3,3
5,4,4,トミケンデフバール,牡4,57,503kg,-1,繁田健一,宮本康,1:14.0,2,38.6,7-7,6
6,2,2,ローレンダンサー,牝6,53,445kg,-1,山崎良,朝倉実,1:14.4,2,39.0,7-7,5
7,8,8,ガルベス,牡7,55,463kg,-1,高野誠毅,久保與造,1:14.7,1 1/2,37.9,9-9,9
8,5,5,ニシノセーリング,牝4,55,486kg,-3,矢野貴之,佐宗応和,1:14.9,1 1/2,40.2,2-2,2
9,8,9,ガリシヤヒル,牝6,53,437kg,-3,町田直希,佐々木洋一,1:16.4,7,41.5,4-6,8


これから着順とタイムを抽出して表示してみます。抽出部分のソースと実行結果は以下のとおり。
racedata[:,0]で着順のみを抽出し、racedata[:,10]でタイムを抽出しています。注意点としては、genfromtxtの戻りがタプルの配列になってしまっているので、これをnp.arrayに変換しています。

# 読込部分は省略
# genformtxtの戻りがタプルの配列となっているのでnp.arrayに変換
racedata = np.array(racedata.tolist(), dtype = object)

x = racedata[:,0]
y = racedata[:,10]

print x
print y


実行結果

[1 2 3 4 5 6 7 8 9]
[u'1:12.7' u'1:12.9' u'1:13.5' u'1:13.6' u'1:14.0' u'1:14.4' u'1:14.7'
 u'1:14.9' u'1:16.4']


実行結果を見るとわかりますが、タイムは「分:秒」の形式なのでこれを秒に変換します。

# タイムを数値変換
for idx, time in enumerate(y):
    y[idx] = float(time.split(":")[0])*60+float(time.split(":")[1])
    
print x
print y


実行結果

[1 2 3 4 5 6 7 8 9]
[72.7 72.9 73.5 73.6 74.0 74.4 74.7 74.9 76.4]


実行結果をみると秒に正しく変換出来ていることがわかります。これで、やっとデータをグラフに表示するための前準備が終わったのでmatplotlibでグラフを作成してみます。
ここで、titleやx,y軸のラベルに日本語を使用したいので、FontPropertiesでフォントを読み込んで、plt.title、plt.xlabel、plt.ylabelにfontpropertiesを指定しています。

plt.barだと着順毎のタイム差があまりわからないので、plt.scatterでの実行結果もつけています。

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

fp = FontProperties(fname=r'C:\WINDOWS\Fonts\msgothic.ttc', size=14)

中略

plt.bar(x, y)
plt.title(u"着順別タイム", fontproperties=fp)
plt.xlabel(u"着順", fontproperties=fp)
plt.ylabel(u"タイム", fontproperties=fp)
plt.xticks([i for i in x], [i for i in x])
plt.autoscale(tight=True)
plt.grid()
plt.show()


plt.barの実行結果
f:id:taka23kz:20150912183308p:plain


plt.scatterの実行結果
f:id:taka23kz:20150912183324p:plain


今回作成したソースの全体は以下のとおりです。

# -*- coding: utf-8 -*-
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# genfromtxtにdtypeの指定とconvertersを追加
racedata = sp.genfromtxt("racedata3.tsv", delimiter="\t", skiprows=1, 
    dtype=[ ('着','i2'),                     # 0:着
            ('枠','i2'),                     # 1:枠 
            ('馬番','i2'),                   # 2:馬番 
            ('馬名','U50'),                  # 3:馬名  
            ('性齢','U10'),                  # 4:性齢  
            ('負担','i3'),                   # 5:負担  
            ('馬体重','U10'),                # 6:馬体重 
            ('増減','i3'),                   # 7:増減 
            ('騎手','U50'),                  # 8:騎手 
            ('調教師','U50'),                # 9:調教師 
            ('タイム', 'U10'),                 # 10:タイム  
            ('着差','U10'),                  # 11:着差 
            ('上がり3F','U10'),               # 12:上がり3F 
            ('コーナー通過順','U10'),          # 13:コーナー通過順
            ('人気','i2')],                  # 14:人気
    converters={ 
        3 : lambda s: s.decode('utf8'),    # 馬名
        4 : lambda s: s.decode('utf8'),    # 性齢
        8 : lambda s: s.decode('utf8'),    # 騎手
        9 : lambda s: s.decode('utf8'),    # 調教師
        10: lambda s: s.decode('utf8'),    # タイム
        11: lambda s: s.decode('utf8'),    # 着差
        12: lambda s: s.decode('utf8'),    # 上がり3F 
        13: lambda s: s.decode('utf8')     # コーナー通過順
    })

# genformtxtの戻りがタプルの配列となっているのでnp.arrayに変換
racedata = np.array(racedata.tolist(), dtype = object)
fp = FontProperties(fname=r'C:\WINDOWS\Fonts\msgothic.ttc', size=14)

x = racedata[:,0]     # 着順の配列を作成
y = racedata[:,10]    # タイムの配列を作成

# タイムを数値変換
for idx, time in enumerate(y):
    y[idx] = float(time.split(":")[0])*60+float(time.split(":")[1])
    

plt.scatter(x, y)
plt.title(u"着順別タイム", fontproperties=fp)
plt.xlabel(u"着順", fontproperties=fp)
plt.ylabel(u"タイム", fontproperties=fp)
plt.xticks([i for i in x], [i for i in x])
plt.autoscale(tight=True)
plt.grid()
plt.show()