最近競馬にハマっており、データを見ながら予想や結果を語りたいなと思うようになりました。
なので、結果を可視化してみて色々見てみたいと思います。
当方開発経験がなく、今までほぼpythonを触ったこともない人間ですので暖かい目で見て頂ければと思います。
注意
今回タイトルにある通り、中山2500m、東京2000mの枠別好走率をグラフで可視化しようと思いましたが、レース開催数が十分でなかったり、レース毎に出走頭数が異なる状態をひとまとめにグラフ化しているので、正確な値ではない結果となっています。練習やメモ書きのようなものだと思ってもらえればと思います。
グラフ作成
中山、東京共にやることは同じです。
分母の確認
total_races = df['馬番'].value_counts()
print(total_races)
レース数が少なく、結果の信ぴょう性がない
レース毎に出走頭数が違うので参考にならないことが分かる。
#中山のレースを読み込み
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
df =pd.read_csv('./レース結果_芝/レース結果_芝_中山.csv',encoding='cp932')
#距離2500mを抽出
df=df[df['距離']==2500]
#好走(3着以内)と枠順の関係
#棒グラフの作成
#横軸馬番、縦軸三着以内回数のグラフを作成
plt.rcParams['font.family'] = 'MS Gothic'
# 各馬の三着以内に入った回数を計算
top3_counts = df[df['着順'] <= 3]['馬番'].value_counts()
#各馬番の分母を計算
total_races = df['馬番'].value_counts()
#3着以内率を計算
top3_win_rate = (top3_counts / total_races)
top3_win_rate_sorted = top3_win_rate.sort_index()
# 馬番を横軸、三着以内回数を縦軸にした棒グラフを作成
plt.figure(figsize=(12, 6))
top3_win_rate.plot(kind='bar')
plt.xlabel('馬番')
plt.ylabel('三着以内率')
plt.title('馬番ごとの三着以内率')
plt.show()
#全体結果と比較
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
t_df =pd.read_csv('./レース結果加工後.csv',encoding='cp932')
plt.rcParams['font.family'] = 'MS Gothic'
# 各馬の三着以内に入った回数を計算
t_top3_counts = t_df[t_df['着順'] <= 3]['馬番'].value_counts()
#各馬番の分母を計算
t_total_races = t_df['馬番'].value_counts()
#3着以内率を計算
t_top3_win_rate = (t_top3_counts / t_total_races)
t_top3_win_rate_sorted = t_top3_win_rate.sort_index()
# 馬番を横軸、三着以内回数を縦軸にした棒グラフを作成
plt.figure(figsize=(12, 6))
t_top3_win_rate.plot(kind='bar')
plt.xlabel('馬番')
plt.ylabel('三着以内率')
plt.title('馬番ごとの三着以内率')
plt.show()
全てのレース結果からみても外枠に行くほど好走率は少ないことが分かる。
並べて表示
#グラフを描画
plt.figure(figsize=(10, 6))
#3着以内率の棒グラフを描画
top3_win_rate.plot(kind='bar', color='skyblue',align="edge", width=-0.3, label='中山2500m3着以内率')
# t_top3_win_rateの棒グラフを描画し、重ねて表示
t_top3_win_rate.plot(kind='bar', color='orange',align="edge", width=0.3, label='全体3着以内率')
# 軸ラベル、タイトルを設定
plt.xlabel('馬番')
plt.ylabel('着順率')
plt.title('3着以内率と全体3着以内率の比較')
# 凡例を表示
plt.legend()
# グラフを表示
plt.show()
中山2500は16枠までしかない。
一応見比べると15,16枠の勝率が極端に少ないことが分かるが、分母が少ないだけではないのかという疑いは否定できない。(実際大外枠はだいぶ不利で有名)
東京2000m
やることは同じ
total_races = df['馬番'].value_counts()
print(total_races)
二桁枠順になると分母が少なくなる
#東京芝2000mのレース枠毎の成績確認
#東京のレースを読み込み
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
df_t =pd.read_csv('./レース結果_芝/レース結果_芝_東京.csv',encoding='cp932')
#距離2000mを抽出
df_t=df_t[df_t['距離']==2000]
#好走(3着以内)と枠順の関係
#棒グラフの作成
#横軸馬番、縦軸三着以内回数のグラフを作成
plt.rcParams['font.family'] = 'MS Gothic'
# 各馬の三着以内に入った回数を計算
top3_counts_t = df_t[df_t['着順'] <= 3]['馬番'].value_counts()
#各馬番の分母を計算
total_races_t = df_t['馬番'].value_counts()
#3着以内率を計算
top3_win_rate_t = (top3_counts_t / total_races_t)
top3_win_rate_sorted_t = top3_win_rate_t.sort_index()
# 馬番を横軸、三着以内回数を縦軸にした棒グラフを作成
plt.figure(figsize=(12, 6))
top3_win_rate_t.plot(kind='bar')
plt.xlabel('馬番')
plt.ylabel('三着以内率')
plt.title('馬番ごとの三着以内率')
plt.show()
全体と並べて表示
#グラフを描画
plt.figure(figsize=(10, 6))
#3着以内率の棒グラフを描画
top3_win_rate_t.plot(kind='bar', color='skyblue',align="edge", width=-0.3, label='東京2000m3着以内率')
# t_top3_win_rateの棒グラフを描画し、重ねて表示
t_top3_win_rate.plot(kind='bar', color='orange',align="edge", width=0.3, label='全体3着以内率')
# 軸ラベル、タイトルを設定
plt.xlabel('馬番')
plt.ylabel('着順率')
plt.title('3着以内率と全体3着以内率の比較')
# 凡例を表示
plt.legend()
# グラフを表示
plt.show()
16枠が上振れているのか、15枠が下振れているのか、わからないが多少外枠不利がみられるのが分かる
あとがき
正直大学生が単位欲しさにレポートを書いているのと何ら変わらないなぁと思いつつ。。
次は前提条件がそろっている競馬場毎の走破タイムを見比べてみたいと思います。