Rでロト6を当てたい(2)
前回の続き。
ゲイル理論なるものがある。

ロト6の神様 最強のゲイル理論 (ギャンブル財テクブックス)
- 作者: スマートラックジャパン
- 出版社/メーカー: メタモル出版
- 発売日: 2006/10/01
- メディア: 単行本
- 購入: 7人 クリック: 90回
- この商品を含むブログ (2件) を見る
ロト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グループに分類する。
- hot1 : 前回も当選した数字
- hot5 : 5回以内に当選した数字
- hot10 : 10回以内に当選した数字
- 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つ選択する
最後に上記の方針を元に数字をピックアップするが長くなったので別の記事にする。