MATLABで競艇の解析を始めよう（配当を解析しよう）

# MATLABでボートレース解析をする６番目の記事です。
　[昨日の毒島選手](https://www.boatrace.jp/owpc/pc/race/raceresult?rno=12&jcd=24&hd=20190901)はさすがのSG制覇でしたね！という時期に書いております。というか、いつの間にかもう９月か。。。歓迎会で飲みながら書いております。


## ここまでの振り返り。
　[１番目の記事](https://qiita.com/teruqii/items/11c21882613db088e339)でダウンロードができて、[２番目の記事](https://qiita.com/teruqii/items/9aede1165e7428d3f89c)で出走表を読み込んで、[３番目の記事](https://qiita.com/teruqii/items/14bdffe71ef9ff061e55)で結果を読み込んで、[４番目の記事](https://qiita.com/teruqii/items/986d4fba96544960f367)で配当データを取ったり、[５番目の記事](https://qiita.com/teruqii/items/3e1d0b15619382da7260)で学習をさせたりしました。

　気が向いた順に書いてるからか、なんかバラバラだな。。まあいいや。。

# 配当のデータを触ってないので、触ってみよう。
　１番目の記事のやり方で2013年1月から2019年8月までのデータをごっそりダウンロードさせてみました。４番目の記事のやり方で配当データを取ってみると、358609個のデータがあったので、これを試しに解析してみよう。

## まずは出現確率の分布なんかを見てみればいいよね。
　３連単って全部で120パターンありますけど、どんな出現確率で出てくるのかしら。
T_div っていうテーブルにまとまっていればこうですね。

```matlab
figure(1)
histogram(T_div.trifecta,'DisplayOrder','Descend','Normalization','Prob')
title('3連単の割合')
```

![boat_trif.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/55eb25b2-79b1-b967-90a2-31c4bf95f3f2.png)

左から順に、[123] が約6%, [124], [132] が約4.5%, [134], [142], [125] が約3.5% ですね。逆に [645],[635],[652],[654],[653] あたりは 0.1% くらいかな。

ボートは内枠が有利なので、偏っちゃいますね。

## 配当金の分布も見たいかも。
　200円区切りくらいで10000円まででいいかな。

```matlab
histogram(T_div.trifecta_d,200:200:10000)
```

![trif_div.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/d586ebeb-d45e-dcf9-ac4d-3101e6b16c2a.png)

600円～800円が一番多く出てきてますね。
平均値も求めよう。

```matlab
>> nanmean(T_div.trifecta_d)

ans =

       7461.57
```

7461円ですね。

## 他の買い方も見てみよう。
３連複は20通りでこう。

```matlab
figure(2)
histogram(T_div.trio,'DisplayOrder','Descend','Normalization','Prob')
title('3連複の割合')
```

![boat_trio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/ddeabe04-2651-ba3e-6e5b-ec3c2b337a24.png)

２連単30パターン。

```matlab
figure(3)
histogram(T_div.exacta,'DisplayOrder','Descend','Normalization','Prob')
title('2連単の割合')
```

![boat_exac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/884f520b-a1d2-d585-607d-1ec25ecb179a.png)

２連複20パターン。
1-2 が全体の24%ですね。

```matlab
figure(4)
histogram(T_div.quinella,'DisplayOrder','Descend','Normalization','Prob')
title('2連複の割合')
```

![boat_quin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/0e94b757-e557-8160-86b1-ab03c420507d.png)

ワイド15パターン。
ワイドと複勝の場合、同じようにヒストグラムをプロットすると母数が増えちゃう（histogram コマンドは、行列の全要素で平均を取っちゃう）ので、histcounts でデータを求めて行数で割るといいですね。

```matlab
figure(5)
[x,ed] = histcounts(T_div.wide);
histogram('Categories',categorical(ed),'BinCounts',x./height(T_div),'DisplayOrder','Descend')
title('ワイドの割合')
```

![boat_wide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/962b9220-28e5-e1d1-6ffc-6342d48ea6f0.png)


複勝6パターン
1 を買っときゃ 65% 当たる。

```matlab
[x,ed] = histcounts(T_div.show);
histogram('Categories',categorical(ed),'BinCounts',x./height(T_div),'DisplayOrder','Descend')
title('複勝の割合')
print -dpng boat_show.png
```

![boat_show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/8c84296d-31b4-72fa-e9b3-76d60981cf79.png)


単勝6パターン
50% くらい 1 。

```matlab
figure(7)
histogram(T_div.win,categorical(1:6),'DisplayOrder','Descend','Normalization','Prob')
title('単勝の割合')
```

![boat_win.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/0d177bf5-5c9f-177f-dd19-be3a48bf827b.png)

というのが 6年半のデータから見えますね。

# 1-2-3 ばっかり買ってみよう！
　15% くらい当たるんなら、1-2-3 の３連単ばっかり買ってればいいね！
と思いついたら、行動に移す前にプログラムを作ってみよう。

　MATLABのテーブルだと、簡単に書けますよね。

```matlab
a = '123';
allR = height(T_div) - nnz(ismissing(T_div.trifecta));  % (全レース) - (不成立)
tr = sum(T_div.trifecta_d(T_div.trifecta == a))/allR
```

コマンドウィンドウにこんな答えが出ました！

```matlab
tr =

   82.8425
```

毎レース100円 123 を6年間買うと、82.84円の配当が期待できます。損ですね！
allR が 358456 だったので 3584万円賭けたら、2969万円 (allR*tr) だけ返ってきました。


## じゃあ 124 にしようかな。
　さっきのプログラムを編集して、全部試せばいいよね！

```matlab
a = '123456';
a = a(perms(1:6));           % 全通りの着順 (720通り)
a = unique(a(:,1:3),'row');  % 1,2,3位だけ取って重複を捨てる
a = categorical(cellstr(a)); % カテゴリカルに変換

tr = zeros(size(a));
allR = height(T_div) - nnz(ismissing(T_div.trifecta));  % (全レース) - (不成立)
for x = 1:length(a)
    tr(x) = sum(T_div.trifecta_d(T_div.trifecta == a(x)))/allR;
end
bar(a,tr)
```

![trif_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/78575c33-26d5-81d8-dc95-ac792aa90c71.png)

縦軸が100円あたりの配当なので、どれもダメということが分かりました！
[123], [132] あたりは80円くらいで、あとはそれより下ですね。

## じゃあ３連複でいいか。
　３連複だと nchoosek 関数をよく使います。こんな感じ。

```matlab
a = categorical(cellstr(nchoosek('123456',3)));
tr = zeros(size(a));
allR = height(T_div) - nnz(ismissing(T_div.trio));  % (全レース) - (不成立)
for x = 1:length(a)
    tr(x) = sum(T_div.trio_d(T_div.trio == a(x)))/allR;
end
bar(a,tr)
```

![trio_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/bd5e3b83-53b4-30b1-ab3b-2f0859b8430d.png)

これでもダメですよね！他のは省略しますけど、継続的に買うと何でもダメなんですよね。

## 参考：6年間のデータで蛭子買いをしてみよう。
　蛭子買いは、蛭子さんが編み出した [1256][235][245] のボックス買い36点をして大穴を狙うという買い方です。

```matlab
ebisu = categorical(cellstr([perms('125');perms('126');perms('156');perms('256');perms('235');perms('245')]));
allR = (height(T_div) - nnz(ismissing(T_div.trifecta)))*length(ebisu);  % ((全レース) - (不成立)) * 点数
ebisu_d = sum(T_div.trifecta_d(ismember(T_div.trifecta,ebisu)))/allR
```

結果は、

```matlab
ebisu_d =

         62.41
```

まあそうよね。


## ギャンブル豆知識
　頻繁に当たったり外れたり儲かったり儲からなかったりするギャンブルは、ずっと同じパターンを買い続けるとどんどん期待値に収束していきます（＝コツコツと負けます）。こういうのを大数の法則とかいいますよね。


# またもや、ダメであることを発見しました！
　というわけで戦略的に、固いレースを見つけるとか荒れるレースを見つけるとかしないとダメなんです、ということを再確認しました！(前向き)

ただ、図を貼りまくったら長くなったので、続きはまた今度にしますね。続きが見たい人は「いいね」してね (いいねがほしい病気)