読者です 読者をやめる 読者になる 読者になる

INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

Rでロト6を当てたい(2)

R

前回の続き。

ゲイル理論なるものがある。

ロト6の神様 最強のゲイル理論 (ギャンブル財テクブックス)

ロト6の神様 最強のゲイル理論 (ギャンブル財テクブックス)

ロト6の数字は均等に出るものだと思っていたけど、出る数字には偏りがあるらしい。
直近10回以内に出たホットナンバー、11回以上出ていないコールドナンバーに分類し、ホットナンバーとコールドナンバーの比率で数字を予想するとのこと。

実際に試してみる。


外れ回数の計算

まずは各数字の外れ回数の計算を行なう。dplyrのlag()を使うと簡単。

> nums <- nums %>% 
+   arrange(num, time) %>% 
+   group_by(num) %>%
+   # 前回の当選回、外れ回数を追加
+   mutate(last_time = lag(time), 
+          lag = time - lag(time) - 1)
> head(nums)
Source: local data frame [6 x 4]
Groups: num

  time num last_time lag
1    2   1        NA  NA
2    3   1         2   0
3   10   1         3   6
4   36   1        10  25
5   43   1        36   6
6   52   1        43   8
> tail(nums)
Source: local data frame [6 x 4]
Groups: num

  time num last_time lag
1  949  43       948   0
2  964  43       949  14
3  966  43       964   1
4  974  43       966   7
5  976  43       974   1
6  977  43       976   0
> 


last_time列が前回の当選回、lag列がその間の外れ回数を表しており、1の場合は2,3回と連続して出たあと、次の10回目に当選するまで6回外れていることになる。


ホットナンバー、コールドナンバーの分類

次に各数字を以下の4グループに分類する。

  1. hot1 : 前回も当選した数字
  2. hot5 : 5回以内に当選した数字
  3. hot10 : 10回以内に当選した数字
  4. cold : 11回以上当選していない数字
> # x < yであれば1、それ以外であれば0を返す関数
> is.less <- function(x, y) {
+   if (is.na(x)) 
+     return(0)
+   else if (x < y)
+     return(1)
+   else
+     return(0)
+ }
> 
> # hot1, hot5, hot10, coldに分類
> nums <- nums %>%
+   rowwise() %>%
+   mutate(hot1  = is.less(lag, 1),
+          hot5  = is.less(lag, 5)  - is.less(lag, 1),
+          hot10 = is.less(lag, 10) - is.less(lag, 5),
+          cold  = 1 - is.less(lag,10))
> head(nums)
Source: local data frame [6 x 8]

  time num last_time lag hot1 hot5 hot10 cold
1    2   1        NA  NA    0    0     0    1
2    3   1         2   0    1    0     0    0
3   10   1         3   6    0    0     1    0
4   36   1        10  25    0    0     0    1
5   43   1        36   6    0    0     1    0
6   52   1        43   8    0    0     1    0
> tail(nums)
Source: local data frame [6 x 8]

  time num last_time lag hot1 hot5 hot10 cold
1  949  43       948   0    1    0     0    0
2  964  43       949  14    0    0     0    1
3  966  43       964   1    0    1     0    0
4  974  43       966   7    0    0     1    0
5  976  43       974   1    0    1     0    0
6  977  43       976   0    1    0     0    0
> 


ホットナンバー、コールドナンバーの集計

最後に各回にホットナンバー、コールドナンバーがそれぞれ何個ずつ含まれるか集計する。

> hot.n <- nums %>% 
+   arrange(time) %>% 
+   group_by(time) %>% 
+   summarise_each_(funs(sum), vars = c("hot1", "hot5", "hot10", "cold")) %>% 
+   arrange(-time)
> hot.n
Source: local data frame [978 x 5]

   time hot1 hot5 hot10 cold
1   978    1    3     2    0
2   977    2    2     2    0
3   976    1    3     0    2
4   975    2    0     2    2
5   974    1    3     2    0
6   973    0    3     2    1
7   972    1    2     1    2
8   971    2    2     2    0
9   970    1    1     3    1
10  969    1    3     0    2
..  ...  ...  ...   ...  ...
> 


確かに6個中、4〜6個が10回以内に当選した数字となっており、ホットナンバー戦略は有効そうな気がする。というより前回当選した数字が次も当選する確率高そう!

> hot.n %>%
+   count(hot1) %>%
+   mutate(cr = round(n/sum(n) * 100, 1))
Source: local data frame [5 x 3]

  hot1   n   cr
1    0 343 35.1
2    1 451 46.1
3    2 163 16.7
4    3  18  1.8
5    4   3  0.3
> 


前回当選した数字の中から1個以上が次も当選するというのは約65%となり、想像していた以上に頻繁に発生していた。

ホットナンバー, コールドナンバーの個数の組み合わせの頻度を集計してみると

> # hot1, hot5, hot10, coldの集計
> hot.n %>%
+   count(hot1, hot5, hot10, cold) %>% 
+   ungroup() %>%
+   mutate(cr = round(n/sum(n) * 100, 1)) %>%
+   arrange(-n)
Source: local data frame [71 x 6]

   hot1 hot5 hot10 cold  n  cr
1     1    3     1    1 67 6.9
2     1    2     2    1 66 6.7
3     1    2     1    2 57 5.8
4     0    2     2    2 42 4.3
5     0    3     2    1 42 4.3
6     2    2     1    1 37 3.8
7     1    3     2    0 36 3.7
8     1    1     2    2 33 3.4
9     1    3     0    2 33 3.4
10    0    3     1    2 31 3.2
..  ...  ...   ...  ... .. ...
> 
> 

となり、hot1とcoldを1つずつピックアップするパターンが一番多い。(とはいえ全体の13%程度だけど)


上記の結果から以下を数字選びの方針に追加する

  • hot1から1つ選択する
  • coldから1つ選択する
  • hot5から3つ選択する
  • hot10から1つ選択する

最後に上記の方針を元に数字をピックアップするが長くなったので別の記事にする。