機械学習 其の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の実行結果
plt.scatterの実行結果
今回作成したソースの全体は以下のとおりです。
# -*- 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()