国民的長寿番組であるサザエさん

先週あることが話題になりました。


解説動画はこちら



さて話題になったのは
サザエさんのじゃんけんに関することなのですが

何が起きたかは分からないですよね。
まずはサザエさんのじゃんけんを見てみることにしましょう。

ありがたいことに
サザエさんのじゃんけんの結果を
まとめていただいているサイトがありました。

サザエさんじゃんけん研究所
公式ウェブサイト


こちらのデータを参考にさせて頂くこととします。

こちらをファイル化して進めますが
やりたい方は
ご自身で用意してください。

さてファイルを読み込みます。
data = []
with open('sazae.csv') as _f:
    for row in _f:
        rows = row.replace('\n','').split('\t')
        data.append(rows)
print(len(data))
print(data[0],data[-1])
1439
['第1回', '1991年11月10日', 'チョキ'] ['第1439回', '2020年6月7日', 'パー']

こんな感じのデータです。

初回は1991年
最新回は2020年6月7日の結果です。

さて1439回分のデータあるので
集計をしてみましょう。

手の内訳は
result = {}
for d in data:
    if d[2] in result:
        result[d[2]]+=1
    else:
        result[d[2]]=1
print(result)
print(['{0} : {1}'.format(k,v/len(data)) for k,v in result.items()])
{'チョキ': 500, 'グー': 463, 'パー': 476}
['チョキ : 0.34746351633078526', 'グー : 0.32175121612230717', 'パー : 0.33078526754690757']

パー、グー、チョキの回数は
割と均等ですね。

少しだけチョキが多いようです。

お次は複数回での手が
どうなるかを見てみます。

次のような関数で
複数回の手を集計できます。
# 複数回の手の結果を計算する関数
def check_result(num,data):
    result = {}
    for i in range(len(data)-(num-1)):
        key = ''.join([data[i+j][2] for j in range(num)])
        if key in result:
            result[key]+=1
        else:
            result[key]=1
    return result
2回での手の内訳
result2 = check_result(2,data)
for k,v in sorted(result2.items()):
    print(k,v)
グーグー 97
グーチョキ 196
グーパー 170
チョキグー 199
チョキチョキ 94
チョキパー 207
パーグー 167
パーチョキ 209
パーパー 99

連続になると少し回数が減りますねーー

3回での手の内訳
result3 = check_result(3,data)
for k,v in sorted(result3.items()):
    print(k,v)
グーグーグー 7
グーグーチョキ 50
グーグーパー 40
グーチョキグー 46
グーチョキチョキ 45
グーチョキパー 105
グーパーグー 31
グーパーチョキ 92
グーパーパー 47
チョキグーグー 40
チョキグーチョキ 59
チョキグーパー 100
チョキチョキグー 42
チョキチョキチョキ 4
チョキチョキパー 48
チョキパーグー 101
チョキパーチョキ 60
チョキパーパー 46
パーグーグー 50
パーグーチョキ 87
パーグーパー 30
パーチョキグー 110
パーチョキチョキ 45
パーチョキパー 54
パーパーグー 35
パーパーチョキ 57
パーパーパー 6

さて、複数回の組み合わせとしては
こんな感じの結果になりました。

それでは連続でN回同じ手を出すは
どれくらいあるでしょうか?

次のような関数で調査しました。
# 連続手の結果を計算する関数
def continuous_result(num,data):
    result = {}
    targets = ['グー'*num , 'パー'*num , 'チョキ'*num]
    for i in range(len(data)-(num-1)):
        key = ''.join([data[i+j][2] for j in range(num)])
        if key in targets:
            if key in result:
                result[key]+=1
            else:
                result[key]=1
    return result

全じゃんけんの回数で割って確率をみてみます。

2連続
cresult2 = continuous_result(2,data)
for k,v in sorted(cresult2.items()):
    print('{0:10}'.format(k),'\t',v,'\t','{0:.5%}'.format(v/len(data)))
グーグー       	 97 	 6.74079%
チョキチョキ     	 94 	 6.53231%
パーパー       	 99 	 6.87978%

3連続
グーグーグー     	 7 	 0.48645%
チョキチョキチョキ  	 4 	 0.27797%
パーパーパー     	 6 	 0.41696%

4連続
グーグーグーグー   	 2 	 0.13899%
パーパーパーパー   	 2 	 0.13899%

5連続
パーパーパーパーパー 	 1 	 0.06949%

さて、連続で同じ手を出すのは
極端に少ないようです。

今までは4連続が最高だったようですが
この度、5連続でパーを初めて出したので
ニュースになったようです。

確率で言うと0.06%
ニュースになるのも頷けるかもしれません。

5回じゃんけんした際の手の組み合わせは
3通りの手があるので
3**5 = 243通りの組み合わせがあります。

その確率だとだいたい0.4%なので
それに比べると少ないですね。

じゃんけんの結果をみると
やや連続での組み合わせの回数が
少ないように感じます。

グーグーグー    	      7 	 0.48645%
グーグーチョキ   	     50 	 3.47464%
グーグーパー    	     40 	 2.77971%
グーチョキグー   	     46 	 3.19666%
グーチョキチョキ  	     45 	 3.12717%
グーチョキパー   	    105 	 7.29673%
グーパーグー    	     31 	 2.15427%
グーパーチョキ   	     92 	 6.39333%
グーパーパー    	     47 	 3.26616%
チョキグーグー   	     40 	 2.77971%
チョキグーチョキ  	     59 	 4.10007%
チョキグーパー   	    100 	 6.94927%
チョキチョキグー  	     42 	 2.91869%
チョキチョキチョキ 	      4 	 0.27797%
チョキチョキパー  	     48 	 3.33565%
チョキパーグー   	    101 	 7.01876%
チョキパーチョキ  	     60 	 4.16956%
チョキパーパー   	     46 	 3.19666%
パーグーグー    	     50 	 3.47464%
パーグーチョキ   	     87 	 6.04587%
パーグーパー    	     30 	 2.08478%
パーチョキグー   	    110 	 7.64420%
パーチョキチョキ  	     45 	 3.12717%
パーチョキパー   	     54 	 3.75261%
パーパーグー    	     35 	 2.43224%
パーパーチョキ   	     57 	 3.96108%
パーパーパー    	      6 	 0.41696%

例えば3回じゃんけんした際の組み合わせは
3**3で27通りなので
1パターンあたりは3.7%ほど

連続で同じ手を出すのは大分
少ないようですね。

と言うことは
仮説:前回と同じ手、連続手を
極端に嫌っているのではないか?

と言うことで

検証:前回と違う手をランダムにさしたら
勝率はどうなるのか?

100回対戦して平均を求めて見たいと
思います。

import numpy as np
hand = ['グー' , 'パー' , 'チョキ']
all_result = []
for j in range(100):
    result = {'勝ち':0,'負け':0,'あいこ':0}
    for i in range(len(data)):
        sazae = data[i][2]
        if i==0:
            you = np.random.choice(hand)
        else:
            you = np.random.choice(list(set(hand)-set([last])))
        if you==sazae:
            result['あいこ']+=1
            a='あいこ'
        else:
            if any([you=='グー' and sazae=='チョキ',you=='パー' and sazae=='グー',you=='チョキ' and sazae=='パー']):
                result['勝ち']+=1
                a='勝ち'
            else:
                result['負け']+=1
                a = '負け'
        last = sazae
    print(result)
    all_result.append(result)
win = sum([r['勝ち'] for r in all_result])//100
lose = sum([r['負け'] for r in all_result])//100
aiko = sum([r['あいこ'] for r in all_result])//100
print(win,lose,aiko)
436 430 571

思ったより勝ててないですねwww

まあ前回のと違うのをランダムで出したら
勝ちかあいこかに振られるので
あいこが多くなっちゃってます。

前回
前々回
前々々回

みたいに、過去の傾向を学習してあげないと
勝率は上がらないでしょうねーーー

なんか前々々世みたいにだな!!

と言うことで、サザエさんの
じゃんけんでした。

勝ちたい方はデータを見て
過去の傾向やパターンを見つけたら
勝率が上がるかもしれません。

今回はこれまでです
それでは。