パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

セル関数〜SUMIF, COUNTIF
(準備中)


EXCELのセル関数(セルに記述する関数)の中でも、SUMIFとCOUNTIFはなかなか
使い出がある。

架空のデータではつまらないので、競馬の予想のためのデータを使って
SUNIFとCOUNTIFの便利な使い方を説明する。

1 使うデータの説明
使うデータは2021年のJRAの3歳重賞ローズSのデータである。秋華賞のトライアルレースとしても有名な
重賞だ。

出走馬の前走の成績とローズSの成績をEXCELにまとめてみた。
前走の成績とローズSの成績になんらかの関係(相関関係)があれば、前走の成績を
競馬の予想に使えるわけである。

表は、ローズSの着順/馬名/ローズSでのタイム差/前走のレース/前走との間隔/前走におけるタイム差/父
の項目をピックアップして並べてみた。




競馬をあまり知らない人のために簡単に注釈しておく。
タイム差は1着とのタイム差である。従って1着は0.0としてある。

前走は 前走で走ったレースをG1を1, G2を2、G3を3、オープンを4、3勝クラスを5、2勝クラスを6、1勝クラスを7
新馬・未勝利を8として格付けした。
当然数字が小さいほうが格上のレースということになるので、一般的には前走で上のクラスに出走した馬ほど
上位にくるのではないかという予測が成り立つ。

間隔というのは、前走とローズSとの間隔を月数で表した。
間隔が長いということは前走の後牧場で休養をし、休養明けのレースを走ったといこと。
短いということはローテーションを組んで出走していることになる。一般的には休養明けはまだ調子が戻っておらず
本調子でないことも多い(中には休養明けに好走するタイプの馬もいるが)。従って、間隔が1ないし2の馬の
ほうが上位に来るのではという予想も成り立ちうる。(使いづめで疲労した馬もでてくるので、本当はもっと細かい
データ分析が必要)

前走タイム差は前走における1着とのタイム差。1着は0.0にしてある。当然、前走で好走した馬のほうが上位に
来るのではという予測が成り立ちうる。

父というのは、その馬の父を記した。ディープインパクトとキングカメハメハ産駒が多いのでこの2頭だけを
ピックアップした。父だけでなく父父(すなわち祖父)もデータとして拾った。
ある距離、あるコースを得意とする血統がいるからである。ローズSはディープインパクト産駒の好走する率が
多いと言われている。


でもって、今回は、@前走タイム差が0.3秒以内と0.3秒以上、A前走が重賞(前走が1〜3)と条件戦(6,7)
B父(父父含む)がディープインパクトとキングカメハメハ、という3パターンで分析してみた。



2 COUNTIFの使い方
COUNTIFは指定された範囲内で、ある条件を満たしたデータの個数(セルの数)をカウントする。

COUNTIFの基本構文
=COUNTIF(範囲, 検索条件)

範囲 検索の対象としたいセルの範囲
検索条件 この条件に合致したセルの個数をカウントする。

COUNTIFの使い方の具体例

@前走のタイム差が0.3秒以内の馬の頭数(0.3以下のデータのセルの個数)をカウントする。

=COUNTIF(F3:F20, "<=0.3")
範囲には「前走タイム差」のデータの入っているF3:F20を指定する。
検索条件には、0.3以内という条件を指定する。数値の大小の判定式を検索条件にする場合、
ダブルコーテーション(")で式をくくる。




前走タイム差0.3以上(0.3より大きい)のほうは
=COUNTIF(F3:F20, ">0.3")
とすればよい。


A 前走が重賞の馬の頭数をカウントする
=COUNTIF(D3:D20, "<=3")
範囲は前走のデータが入っているD3:D20を指定する。
検索条件は前走が重賞なので3以下を指定する。


前走が条件戦だった馬の頭数は
=COUNTIF(D3:D20, ">4")
とすればよい。

B父(父父含む)がディープインパクトの馬の頭数をカウントする
=COUNTIF(G3:G20, "*ディープインパクト")
範囲は父のデータが入っている、G3:G20を指定する。
検索条件には"*ディープインパクト"を指定する。

検索条件として、ある文字を指定する場合は、その文字を"でくくって指定すればよい。
もし、父がディープインクトの場合だけ(父父ディープインパクトは除外する)を検索条件にする
場合は、"ディープインパクト" とすればよい。

アスタリスク(*)を付けると、ディープインパクトの前に何か文字のあるデータも含めて検索することになる。

※よく、検索条件の文字として○や×を使うことがある。
例えば出席者を○、欠席者を×とした出欠表のEXCELがあった場合、
=COUNT(範囲, "○")
で出席者の数をカウントすることができる。


父(父父含む)キングカメハメハの馬の頭数をカウントする場合は、
=COUNTIF(G3:G20, "*キングカメハメハ")
とすればよい。


3 SUMIFの使い方

SUMIFの基本構文
=SUMIF(範囲, 検索条件, 合計範囲)

[範囲]の中で、[検索条件]に合致したデータがある場合、[合計範囲]にあるデータ(数値)を合計する。
範囲と合計範囲のデータが同じ場合は、合計範囲は省略することができる。

具体例を見た方がわかりやすいので、具体例をあげる。

@前走のタイム差が0.3秒以内の馬のローズSでのタイム差の合計(累計)
=SUMIF(F3:F20, "<=0.3", C3:C20)
範囲は前走のタイム差のデータがある、F3:F20とする。
検索条件はタイム差が0.3以内なので、"<=0.3" とする。検索条件の書き方はCOUNTIFと同じなので、
COUNTIFを参照のこと。
合計範囲は今回のローズSでのタイム差なので、C3:C20を指定する。

これで、前走のタイム差0.3秒以内だった馬の今回のローズSでのタイム差の合計が得られる。


前走タイム差0.3秒以上(より大きい)馬の今回のローズSでのタイム差の合計は
=SUMIF(F3:F20, ">0.3", C3:C20)
とすればよい。

A 前走が重賞だった馬のローズSでのタイム差の合計
=SUMIF(D3:D20, "<=3", C3:C20)
範囲は前走のデータが入っているD3:D20を指定する。
検索条件は前走が重賞なので3以下を指定する。
合計範囲は今回のローズSでのタイム差なので、C3:C20を指定する。

これで、前走が重賞だった馬の今回のローズSでのタイム差の合計が得られる。




前走が条件戦だった馬のローズSでのタイム差の合計は
=SUMIF(D3:D20, ">4", C3:C20)
とすればよい。

B父(父父含む)がディープインパクトの馬のローズSでのタイム差の合計
=SUMIF(G3:G20,"*ディープインパクト",C3:C20)
範囲は父のデータが入っているG3:G20を指定する。
検索条件は"*ディープインパクト"を指定する。
検索条件の指定の仕方はCOUNTIFと同じなので、COUNTIFを参照のこと。
合計範囲は今回のローズSでのタイム差なので、C3:C20を指定する。

同様に、父(父父含む)がキングカメハメハの馬のローズSでのタイム差の合計は
=SUMIF(G3:G20,"*キングカメハメハ",C3:C20)
とすればよい。


4 補足
(1)タイム差平均を求める
今回の競馬データの分析では、それぞれの条件別にタイム差が生じるのか(馬券を購入
するのに有利な条件が見つかるのか)が目的なので、最終的に各条件でのタイム差の平均を
求める。

ここでは、シンプルにタイム差累計÷頭数で計算している。
以下は、前走タイム差0.3秒以内だった馬のローズSでのタイム差の平均値を出している例だが
シンプルに =C25/D25 を計算しているだけ。

以下、他の条件のタイム差平均も同様。



(2) タイム差平均に関する検定
タイム差平均の結果を見てみると、前走のタイム差はあまりローズSでのタイム差と相関関係が
ないようである。
他方、前走が重賞か条件戦かでは、ローズSのタイム差平均に多少の差がでており、前走重賞の馬
のほうがやはり好走する可能性が高いようにもみえる。

ただ、この差に有意差があるのかどうかt検定してみると、有意差なしの結果になる。
(有意水準5%で、前走重賞の馬と前走条件戦の馬のローズSにおけるタイム差の母平均
に差はないという帰無仮説は棄却できないという結果になっている)


t検定もEXCELで簡単にできる。
このt検定は、EXCLEでt検定(準備中)のところで解説します。


(3) マクロ(VBA)で計算する
今回はCOUNTIF,SUMIFというセル関数を使ってデータの分析をしてみたが、VBAでやってもよい。
EXCELをコピペ、編集する時にセル関数の入っているセルを壊してしまうということはよくあることなので、
セル関数よりVBA(マクロ)大好き派の人もいることと思う。

以下のSub dif_time()は
EXCELの35行目に、前走タイム差0.3秒以内だった馬の
タイム差累計、頭数、タイム差平均 を計算して表示している。
この程度であれば、セル関数とVBAとどちらが便利とも言えない。

Sub dif_time()
Total = 0: Count = 0
For i = 3 To 20
If Cells(i, 6) <= 0.3 Then Total = Total + Cells(i, 3).Value: Count = Count + 1
Next
Cells(35, 3) = Total
Cells(35, 4) = Count
Cells(35, 5) = Total / Count
End Sub




TopPage/Visual Basic&Excel活用研究目次