DIYしよう! EXCELでDIY

Excelで競馬分析をしよう    
   Home > DIYしよう!> ExcelでDIY
お知らせ ソフトウェア 競馬研究 DIYしよう 出馬表 開催情報 BLOG リンク モバイル
 
 

■ワークシートを分析してみよう

   面倒な変数の概念も終わり、今回はさらに一歩踏み込んだワークシート分析を行ってみます。ワークシートを使った競馬データの分析方法は、中級編でも扱っていましたが、マクロを使った場合に比べてどの様なメリットがあるか、改めて整理してみましょう。

【ワークシートのみの分析】
  • 新しいデータを追加するごとに、同じ分析手順を繰り返さなければならない
  • 特定の条件のデータだけを抜き出し、それを元に分析すると言った作業が煩雑になる
  • あまり複雑な作業には向かない
  • 計算式のチェックなどが複雑になり、間違いやすい

【マクロを使った分析】
  • 新しいデータの追加をしても、分析処理を直す必要がない
  • ワークシートでは困難な、複合的なデータ分析が可能
  • アプリケーションのようなインターフェースを作る事が出来る
  • データの出力先をワークシートのみならず、CSVやAccess、HTMLと多岐渡り指定できる

競馬データ分析や自分だけの予想ソフトを組むには、マクロを利用するほうが効率的です。これは再三にわたり触れてきたので、もはや説明は不要でしょう。 では、「新潟競馬場タイム分析」で作成した分析用ワークシートを例にあげながら、説明していきたいと思います。

■新潟競馬場タイム分析で使用したワークシートの解説

 新潟競馬場タイム分析では、2001年第1回新潟、第2回新潟の連対馬の成績データを分析しています。Targetを使えば指定開催のタイム分析が簡単に行えるので、分析シート上でやった事は、コースごとの連対脚質の連対占有率を求める事です。これもTargetを使って、地道にコースごとのデータを出力すれば出来る事ですが、面倒なので開催の全データをExcelで分析する事にしました。

新潟競馬場タイム分析でExcelにさせたこと
  • 指定開催の全成績データを利用
  • 各馬の通過順位から脚質を算出
  • コースごとの脚質連対占有率を算出
  • 結果をワークシートに出力

 作成した分析シートは、2つのプロシジャーから構成されています。1つは通過順位から脚質を判別するもの、もう1つはコース別に並び替えた成績データから、脚質毎の集計をするプロシジャーです。尚、脚質判別には今週の馬場速報などで利用している、自作のクラスモジュールを利用しています。クラスモジュールは説明すると長くなるので、ここでは省略しますがプロパティに数値を入れると、結果がえられるものだと解釈してください。

List1.脚質分析処理

  Public Sub CheckKyaku()
  Dim y As Long, cKya As New clsKyaku
  Dim Pos1 As Long,Pos2 as Long,Tou as Long

    Do While (Sheet1.Cells(y + 2, 1) <> "")
       '■■■ 必要なデータをシートから抜き出す
        Pos1 = Sheet1.Cells(y + 2, 21)          '3角順位をSheet1から抜き出す
        Pos2 = Sheet1.Cells(y + 2, 22)          '4角順位をSheet1から抜き出す
        Tou = Sheet1.Cells(y+2,14)              '出走頭数をSheet1から抜き出す

        If Pos1 = 0 Then
      Pos1 = Pos2                          '直線1000m対策
        End If

        '■■■ 脚質算出クラス操作
        cKya.FirstPos = Pos1                    '通過順位をプロパティに代入
        cKya.LastPos = Pos2
        cKya.Entry = Sheet1.Cells(y + 2, 14)    '出走頭数を代入
        Call cKya.GetKyaku                      '脚質判定(cKya内処理)
        
        'ワークシートの23列目と24列目に、cKya.Kyakuプロパティの値を表示
        Sheet1.Cells(y + 2, 23) = Choose(cKya.Kyaku + 1, "不明", "逃げ", "先行", "差し", "追込")
        Sheet1.Cells(y + 2, 24) = cKya.Kyaku
        y = y + 1
    Loop

  End Sub

【概要の解説】

 Targetの出力した2001年第1回、2回新潟の全成績をSheet1(全成績)にコピーし、見やすいように不要なデータをカットしました。List1はSheet1の3、4角通過順位を変数Pos1,2に取り込み、脚質算出用の自作クラスcKyaにプロパティとして渡します。
 頭数、通過順位をプロパティとして与えた後、Call cKya.GetKyakuを実行し、実際の脚質を取得します。取得した脚質はSheet1に文字と数字で出力しています。
  • 成績データのあるSheet1の必要なデータを変数に格納
  • 脚質の算出はcKyaクラスで行う
  • Sheet1のデータが途切れるまで、連続で処理する
  • 脚質はSheet1に出力
尚、今後のソースコードは1行単位の解説を行いません。代わりにソースコードの横にコメントなどを載せ、コード中で解説します。

【コメントとは?】

コメントはVBに限らず、あらゆるプログラミング言語にとって重要なものです。なぜなら、ソースコードは複雑で、その量は多いものでは数千行に及ぶものもあります。そこで、ソースコード自身に人間の言葉で注釈を入れる仕組みをコメントと言います。VBの場合コメントは、アポストロフィ(')以降がコメントとして扱われます。VBEでみると、緑色になるので判別がつきやすいと思います。

■条件分岐処理 If〜Then〜End If

 If〜Then〜End If構文は、最もプログラミング処理的な構文です。If構文を使えば、「もし○○と言う条件を満たしたら、〜を実行しなさい」と言う処理が行えるようになります。
書式:If 条件式 Then 〜 End If
機能:条件式が満たされていたら(真)、ThenとEnd Ifの間に書かれた処理を行う。

例)
  If a=1 Then
   …(処理1)
  End If

変数aが1ならば処理1を実行します。条件を満たしていなければ、素通りされます。
尚、条件の比較には以下の演算子が使えます。

表1.Visual Basicが扱える論理演算子
演算子 用法 解説
= a = b aとbが等しいと真。文字列どうしなら同じ文字列で真
> a > b aがbを越えた数の場合、真(bを含まない)
< a < b aがb未満の数の場合、真(bを含まない)
=> a => b aがb以上の数の場合、真(bを含む)
<= a <= b aがb以下の数の場合、真(bを含む)
<> a <> b aとbが等しくないと真
And 条件式1 And 条件式2 条件式1(例:a=b)と条件式2(例:c=d)を同時に満たすと真
Or 条件式1 Or 条件式2 条件式1(例:a=b)と条件式2(例:c=d)のいずれかが満たされれば真
注)他にも演算子は存在しますが、ここでは省略します。VBAのヘルプをご覧ください

■繰り返し処理 Do While 〜 Loop 構文

 List1では、Sheet1のデータが途切れるまで繰り返し処理をしています。繰り返し処理などプログラムコードの流れをコントロールするものを、制御構文と言います。また、制御構文の中でも繰り返し処理を行うものをループ構文、単にループと呼び、プログラムを書く上で重要な処理です。  Do While〜Loopは代表的なループ構文であり、Do WhileとLoopの間に書かれたソースコードを条件が満たされている限り、ループ処理を実行します。条件の設定を誤るといつまでも終了しないループが出来てしまいます。こうなると、強制的にプログラムを終了させるか、リセットするしかありません。この様な永遠に終わらないループの事を「無限ループ」と言います(Windowsのエラーで、「アプリケーションから応答がありません」と表示されるもののほとんどは、なんらかの原因により無限ループに陥っています)。ループの条件設定の際には、十分注意してください。

書式:Do While(条件式) 〜 Loop
機能:条件式が満たされている間、Do WhileとLoopに囲まれた処理を繰り返します。

Do While〜Loopのフローチャート
図1.Do While〜Loopのフローチャート

例)
Do While(a=1)
  …(実際にループさせたい処理)
Loop

変数aが1であるかぎり、ループし続けます

今回はここまで。次回は分析の続き、コース別の連対脚質の集計をおこないます。

 
 

HomeMenuBackNext