OpenOffice/競馬の研究6

  1. データベースの準備
  2. 入力フォームの作成
  3. 入力フォームの作成2
  4. データの入力
  5. データを見る
  6. データを見る2

ここで少し実用的(?)なところへ踏み込んでみようかと思います。

競馬新聞には、◎○△▲など各紙の勝手な予想が載ってますよね。人気の高いものや実績のあるものに付いてるようなので馬のことをよく知らない人には良い目安になります。

そこでこのマークの信頼性を調査してみることにします。もし何か法則(笑)でもあれば利用しない手はありません。

目次

テーブルの設計

新聞予想を調査するに当たっていくつかテーブルを作ります。

  • 新聞予想データ(レースIDで紐付け)
  • 新聞予想マークマスタ(◎△などのマークのマスタです)
  • 新聞予想新聞マスタ(新聞の種類のマスタ、将来的に)

テーブルを作る

新聞予想データ

新聞予想にはたいていの場合、複数の欄が用意されていますね。人による分類だったり、参考にしたデータの分類だったり。それぞれどのくらいの信頼性があるか別で調べたいところです。

そこで新聞予想データには、どのレースに対しての情報か、どの新聞の予想か、どんなマークか、という情報の他に、どの分類か、という整数値を保存するカラムも用意しておくことにします。

新聞予想マークマスタ

マークについては標準的なものについては作成後すぐに登録しておくことにして、後は適宜追加していくような運用になります。

1文字とは限らないかも、、ということからVARCHARにしておきました。

新聞予想新聞マスタ

新聞各誌のデータを扱うかも、ということで用意しておきます。

リレーションの登録

例のごとくリレーションにも追加で登録しておききます。

新聞予想の入力フォーム作成

これは結構面倒な作業です。結果データ入力フォームと同じで1レースに対して複数のレコードが紐付けられる形になるので、そのまま応用できます。

作り方は省略します。

新聞予想の入力

サンプルとして某ネット競馬新聞の予想を入れときます。著作権とかあるので特定につながる詳細は触れません。書いてあるとおりに入力できたかも分かりません。

12レース分入力してみましたが、結構な量です。マウスで入力することを想定してましたが、大量のデータ入力の場合はキーボードが一番ですね…。

検証(単勝式)

簡単なところから単勝式に絞って話を進めたいと思います。

まずは一着となる馬にどんなマークが付いていたか、付いていなかったか。というところから調べてみます。

レースID一致という条件で「結果データ.一着 = 新聞予想データ.馬番」を抽出すれば、新聞がどんな予想だったか分かります。

クエリの準備

新聞予想を評価するためのクエリを用意します。レースIDで、基本データと結果データと新聞予想データを繋いだものです。

この後、クエリをSQL文で直接変更します。この際に「SQL文を直接実行」モードにしておいてください。(OpenOfficeによる解釈でのエラーチェックを省く機能です)

SELECT "レースデータビュー"."開催日", 
    "レースデータビュー"."地名", 
    "レースデータビュー"."出走", 
    "レースデータビュー"."状態", 
    "レースデータビュー"."天候", 
    "新聞予想データ"."マーク分類", 
    "新聞予想マークマスタ"."マーク記号", 
    "新聞予想データ"."馬番", 
    "新聞予想新聞マスタ"."新聞名", 
    CASE WHEN "新聞予想データ"."馬番"= "結果データ"."一着" THEN 1 ELSE NULL END * "結果データ"."単勝式"AS "配当", 
    "結果データ"."単勝式", 
    "結果データ"."一着", 
    CASE WHEN "新聞予想データ"."馬番"= "結果データ"."一着" THEN '1' ELSE '0' END AS "的中",
    CASE WHEN "新聞予想データ"."馬番"<> "結果データ"."一着" THEN '1' ELSE '0' END AS "外れ"
FROM "レースデータビュー", "結果データ", "新聞予想データ", "新聞予想マークマスタ", "新聞予想新聞マスタ" 
WHERE ( "レースデータビュー"."レースID" = "結果データ"."レースID" 
  AND "新聞予想データ"."レースID" = "レースデータビュー"."レースID"
  AND "新聞予想データ"."マークID" = "新聞予想マークマスタ"."マークID"
  AND "新聞予想データ"."新聞ID" = "新聞予想新聞マスタ"."新聞ID" )
ORDER BY "レースデータビュー"."開催日" ASC, "レースデータビュー"."地名" ASC, "レースデータビュー"."出走" ASC, "新聞予想データ"."馬番" ASC

最後のカラムのCASE句がポイントです。"的中"カラムは、予想と結果の一着が一致(単勝式的中)の場合に'1'、外れなら'0'。"外れ"カラムは"的中"カラムの逆になるようにしました。

こうして当り外れを数値としておくことで集計がしやすくなります。

あと配当のカラムですかね。的中した時の配当額だけ値が入るようにして、外れた場合はNULL値になるようにしています。回収率を計算するときに使います。

Calcで呼び出す

クエリが動作することを確認したら、データパイロットの機能で下図のように設定しデータを呼び出します。

合計-的中は的中した件数、総数-マーク記号マークの付いた件数ですので割合を求めれば的中率となります。

配当はSQL文で条件を付けておいたので的中した場合の配当の合計となります。

今回の場合、抽出結果はこのようになりました。

どうでしょうか。こうしてみるとマークの信頼性がひと目で分かります。

考察してみる

まず右隅の的中(27)と総数(320)という数を見れば、27÷320となり、的中率は8.4%ほどしか無いことが分かります。

同様にしてマーク記号の評価は、左列の的中と外れの数から求めることが出来ます。

マーク 的中 総数 的中率
4 45 8.9%
14 187 7.5%
3 44 6.8%
6 44 13.6%

単にマークとして見た場合は、◎>▲>△>○の順で信頼性がありそうです。

縦軸で見てみるとマーク分類毎の的中率が分かります。

分類 的中 外れ 的中率
1 5 80 6.3%
2 10 80 12.5%
3 4 80 5.0%
4 8 80 10.0%

分類2と4が約1割ほどの確率で当たってることが見えてきます。

これで全体の傾向が見えてきました。

もっと細かく見るなら、縦軸と横軸の交わる個々の枠内で的中率を求めます。

1 2 3 4
0.0% 18.2% 9.1% 8.3%
8.5% 6.4% 4.3% 10.9%
9.1% 9.1% 9.1% 0.0%
0.0% 36.4% 0.0% 18.2%

分類2の◎が36.4%と頭抜けてますね!次に分類2の▲と分類4の◎が続いてます。

逆に分類1の▲や分類4の○は、避けたほうがよさそうです。

直接パーセンテージを表示したいところですが、データパイロット機能のでのやり方はまだ分かりません。機能的に可能なのかも不明です。

考察してみる2

的中率だけならこれで良いのですが、やはり回収率が高くなくては。そこでこの配当の合計値を利用します。

例えば分類2の▲の場合、下表のような値です。

合計-配当 1,500
合計-的中 2
総数-マーク記号 11

100円の馬券を11回購入して1,500円のリターンがあったと考えると、

1,500円 − 100円 × 11 = 400円 

400円プラスなったと言えます。1,100円が1,500円になったわけですから回収率は、

1,500円 ÷ 1,100円 = 136.4%

136.4%と求められます。

逆に分類3の▲では、

合計-配当 550
合計-的中 1
総数-マーク記号 11

となり、

550円 − 100円 × 11 = −550円

で元本割れしたことになります。回収率は、50%です。

こんな感じで回収率をまとめると、

1 2 3 4
0.0% 136.4% 50.0% 91.7%
46.2% 24.9% 12.6% 63.7%
48.2% 50.0% 45.5% 0.0%
0.0% 143.6% 0.0% 39.1%

このようになります。

的中率が2番目だった分類4の◎は、回収率では100%を大きく割っていることが判明しました。

分類2の◎と▲に注目すると何だか儲かりそうです。

まとめ

今回はサンプル数が少ないのでデータとしては信用できませんが、例えば100レース入力した結果でこうした集計が出たとしたら何だか勝てそうな気がしてきませんか。

天候・開催場所・馬場状態など絞り込み方を変えて何度でも集計しなおすことが出来ます。自分だけの法則が見つけられるかもしれません。

単勝式以外の対応

1〜3着のどれかを当てる、複勝式なら応用は簡単です。的中判定は、

CASE WHEN "新聞予想データ"."馬番" 
     IN ( "結果データ"."一着","結果データ"."二着","結果データ"."三着") THEN '1' ELSE '0'
END AS "的中",

このようにINで括ってみました。

配当は

CASE "新聞予想データ"."馬番" WHEN "結果データ"."一着" THEN  "結果データ"."複勝式A"
                             WHEN "結果データ"."二着" THEN  "結果データ"."複勝式B"
                             WHEN "結果データ"."三着" THEN  "結果データ"."複勝式C"
ELSE NULL END AS "配当", 

こんな風に変えれば対応できます。

2頭以上の組み合わせを必要とする、その他の投票方式は工夫が必要になりそうです。今回はここまでとしておきます。

気が向いたら続きを書くかもしれません。:-P


2007-08-31 komina