ナンバーズ4の当選確率を2倍以上にする方法

なんとなくデータ分析的なことをやって見たいと思い、

手始めにナンバーズ4の過去の膨大な抽選結果から、抽選される数字にはどのような傾向があるのか、そもそも乱数に傾向などあるのか、調べてみた。

その副産物として、当選確率を2倍以上に上げるプログラムができたのでシェアします。

と言っても、単純計算で1/10000の確率でしか当たらないものを100倍くらいに確率あげないと買う気になれないけどね。

ということで、乗っけておきます。

# update.py

ファイルは二種類作ります

 - update.py #最新の抽選結果を手に入れるpy
 - main.py #実行py

まぁ分ける必要ないんですけど。自分の場合色々と頭ごっちゃになるので分けてるだけです。できる人はクラス分けとかできるしまぁそんな話は置いといて。

情報取得方法は親切な[shiracamus](http://qiita.com/shiracamus)さんにサポートしていただきました。

```py3
def dl_csv():
    url='http://www.takarakujinet.co.jp/ajax/numbers4/pastResultPage.do'
    params = {
        'searchway': 'date',
        'year': '2016',
        'month': '12',
        'day': '27', 
        'kaigou': '',
        'howmany': '10',  #取得する件数
        }
    print('サイトをスクレイピングしています...')#こんなもの書かなくていいのに
    data = urllib.parse.urlencode(params).encode(encoding='ascii')
    with urllib.request.urlopen(url=url, data=data) as html:
         HTML=html.read().decode('utf-8')
    soup=BeautifulSoup(HTML,'html5lib')
    tr_list=soup.find("table",{"class":"list"}).find_all("tr")
    all_data=[]
    print('情報をまとめています...')
    #ここからゴリ押し
    for i in range(2,len(tr_list)):
        if i%2==0:
            vol=tr_list[i].find_all('td')[0].text
            ymd=tr_list[i].find_all('td')[1].text.replace('/','')
            numbers=tr_list[i].find_all('td')[2].text
            yen_st=tr_list[i+1].find_all('td')[0].text
            yen_box=tr_list[i+1].find_all('td')[1].text
            yen_set_st=tr_list[i+1].find_all('td')[2].text
            yen_set_box=tr_list[i+1].find_all('td')[3].text
            all_data.append((vol,ymd,numbers,yen_st,yen_box,yen_set_st,yen_set_box))
        elif i%2==1:#奇数のtrに用事はない
            pass
    print('csvファイルに書き込んでいます...')   
    with open('all_data.csv','w',encoding='utf-8') as f:#ゴリ押しutf-8はお友達
        writer = csv.writer(f, lineterminator='\n') # 改行コード（\n）を指定しておく
        for data in all_data:
            writer.writerow(data)
    print('書き込みが完了しました。')       
dl_csv()
```

# main.py

ここから本番です。
記事投稿のために見直してたら、いらんライブラリばっかで結局これだけでよかったとう。

ライブラリをヒッチャカメッチャカインポートする癖を直さないとこの先成長はないと感じました。。。

```py3
import random
Import csv


with open('all_data.csv','r',newline='',encoding='utf-8') as file:
    csvin=csv.reader(file)
    all_data=list(csvin)
result_list=[data[2] for data in all_data]
#aan=all_after_num
def after_numbers(n):
    all_after_num=[]
    for x in range(0,10):
        after_num=[0,0,0,0,0,0,0,0,0,0]#0-9のカウント
        for i in range(1,len(all_data)):
            if int(all_data[i][2][n]) == x:
                after_num[int(all_data[i-1][2][n])]+=1
        all_after_num.append(after_num)
    return all_after_num

thousand_aan=after_numbers(0)
hundred_aan=after_numbers(1)
ten_aan=after_numbers(2)
one_aan=after_numbers(3)
all_class_aan=[]
all_class_aan.append(thousand_aan)
all_class_aan.append(hundred_aan)
all_class_aan.append(ten_aan)
all_class_aan.append(one_aan)
#print(thousand_aan)

########calss位の数字ががiだった後にxが出る確率#######
def class_p_num(class_num):#1000=0,100=1,10=2,1=3
    all_p_num=[]
    for i in range(0,10):
        p_num={}
        for x in range(0,10):
            p_num.update({x:all_class_aan[class_num][i][x]/sum(all_class_aan[class_num][i])})
        all_p_num.append(p_num)
    return all_p_num
    #all_p_num=[[{num:p,num:p...}],[{num:p...}]]

#########入力した4桁の数字の次の抽選結果を予想########
def know_next_nums(numbers4):
    thousand=int(str(numbers4)[0]) #ゴリ押しゴリ押し！！！
    hundred=int(str(numbers4)[1]) #ゴリ押しゴリ押し！！！
    ten=int(str(numbers4)[2]) #ゴリ押しゴリ押し！！！
    one=int(str(numbers4)[3]) #ゴリ押しゴリ押し！！！
    ###recというのは、recommendの略です
    rec_thousand=[key for key in sorted(class_p_num(0)[thousand].items(), key=lambda x:x[1])[-3:]]#value値でソートして確率の高い上位3つを選定
    rec_hundred=[key for key in sorted(class_p_num(1)[hundred].items(), key=lambda x:x[1])[-3:]]
    rec_ten=[key for key in sorted(class_p_num(2)[ten].items(), key=lambda x:x[1])[-3:]]
    rec_one=[key for key in sorted(class_p_num(3)[one].items(), key=lambda x:x[1])[-3:]]
    recommends=[rec_thousand,rec_hundred,rec_ten,rec_one]
    next_nums={}#{num:p,num:p,...}
    for thousand in recommends[0]:#ゴリ押しゴリ押し！！！
        for hundred in recommends[1]:#ゴリ押しゴリ押し！！！
            for ten in recommends[2]:#ゴリ押しゴリ押し！！！
                for one in recommends[3]:#ゴリ押しゴリ押し！！！
                    next_nums.update({''.join([str(thousand[0]),str(hundred[0]),str(ten[0]),str(one[0])]):round(100*thousand[1]*hundred[1]*ten[1]*one[1],3)})
    if numbers4 in result_list:
        print('過去に存在した次の番号:',result_list[result_list.index(numbers4)-1])
    for set in sorted(next_nums.items(),key=lambda x:x[1],reverse=True):
        times=result_list.count(set[0])
        print('%s:%s回 %s％の確率'%(set[0],times,set[1]))
        
next_nums=know_next_nums(input('今回の抽選番号:'))
```

最後に1行だけでポンって感覚が気持ちいいですよね。



## 実行結果
今回の抽選番号:1018
過去に存在した次の番号: 4753
3790:0回 0.024％の確率
9790:1回 0.023％の確率
3700:0回 0.023％の確率
3740:0回 0.023％の確率
9700:0回 0.022％の確率
0790:0回 0.022％の確率
.
.
.
と言った感じに確率の高い順から教えてくれる上に過去に抽選された回数と当たる確率まで教えてくれる便利な奴ができたのですが、、、、


# まとめ

__全然当たらねえ。__