思い立ったが吉日。
ロト6というのは1~43の数字を6つ選んで一致させる宝くじです。
これって傾向や偏りがあったりするのかなと気になったのでやってみます。
組み合わせ的には43C6=6096454通りから1通りだけが1等になります。
2等では1つ数字がボーナス数字と置き換わっていたらあたりです。
なので1回の抽選で7回ボールを引くわけです。
公式で過去の当選番号を公開しているのでとりあえずとってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var casper = require('casper').create(); var fs = require('fs'); var $ = require('node_modules/jquery'); var FILE_NAME = "out.json"; var TARGET ="http://www.takarakujinet.co.jp/ajax/loto6/pastResultPage.do?searchway=date&year=2018&month=3&day=24&kaigou=&howmany=100"; var outs =[]; casper.start(TARGET); casper.then(function(){ $( this.getHTML("table.kekka") ).find("td.lotnum").each(function(){ var _json = {}; _json.date = $(this).prev().html().replace(/\<br\>/g,"-"); _json.nums = $(this).html().replace(/\<br\>/g," ").replace(/\(|\)/g,"").split(/ | /g); outs.push(_json); }); }); casper.then(function(){ fs.write(FILE_NAME, JSON.stringify(outs)); this.echo("success."); }); casper.run(); |
nodejsでもいいんですがクローラーが手元にあったので流用しました。
URLを叩いてほしい部分をJSON形式にまとめておきます。
データが手に入ったので分析してみたいけど、どうするか。
ベクトルにしてみたいけど7次元にするとおかしい気がする。
[10,18…],[5,10,11…],[1,4,10…],…みたいなときに10のつながりが無視される。とりあえず43次元にして抽選された数字を1、それ以外を0とすることにします。
1 2 3 4 5 6 7 8 |
var $ = require('jquery'); var json = require( "./out.json" ); var arr = []; for(var i=0;i<43;i++)arr[i]=0; for(var i=0;i<json.length;i++)for(var j=0;j<7;j++){ arr[ json[i].nums[j]-1 ]+=1; } console.log(arr); |
今度はnodejsでjsonを読み込み、43次元配列でカウントしてみました。
1 2 |
[17,19,17,12,14,17,15,23,12,18,15,12,11,18,18,15,15,15,16,23,13, 17,14,17,20,14,12,23,12,14,14,17,19,17,12,22,19,15,22,20,16,17,12] |
直近100回だと意外と偏りがありますね。36は13の倍出てます。
第1回からの1262回分だとこう。
1 2 |
[186,203,196,203,195,230,184,215,179,219,196,215,203,205,203,203,193,207,210,215,214, 209,216,191,211,204,230,224,188,213,209,196,200,201,206,210,218,217,215,201,190,205,206] |
ほぼ平らですが、これが偏ってるかどうかってどうやって判断しよう。
大学の講義を思い出しつつ標準偏差を確かめてみる。
1 2 3 4 5 6 7 8 9 10 |
var ave=0,s=0,s2=0,c1=0,c2=0; for(var i=0;i<arr.length;i++){ ave += arr[i]/arr.length; } for(var i=0;i<arr.length;i++){ s2 += Math.pow(arr[i]-ave,2)/arr.length; } s = Math.sqrt(s2); for(var i=0;i<arr.length;i++)if(arr[i]<ave+ s&&arr[i]>ave- s){ c1++; } for(var i=0;i<arr.length;i++)if(arr[i]<ave+2*s&&arr[i]>ave-2*s){ c2++; } console.log(ave); console.log(s); console.log(c1*100/arr.length); console.log(c2*100/arr.length); |
1σ内が70%で、2σ内が93%となった。正規分布ですね。
いくつかセットを変えても似たような感じなので偏りはなさそうです。
行列にして何か解析も考えたけど特に思いつかないので、とりあえずこれだけ。