国民的長寿番組であるサザエさん
先週あることが話題になりました。
解説動画はこちら
さて話題になったのは
サザエさんのじゃんけんに関することなのですが
何が起きたかは分からないですよね。
まずはサザエさんのじゃんけんを見てみることにしましょう。
ありがたいことに
サザエさんのじゃんけんの結果を
まとめていただいているサイトがありました。
サザエさんじゃんけん研究所
公式ウェブサイト
こちらのデータを参考にさせて頂くこととします。
こちらをファイル化して進めますが
やりたい方は
ご自身で用意してください。
さてファイルを読み込みます。
こんな感じのデータです。
初回は1991年
最新回は2020年6月7日の結果です。
さて1439回分のデータあるので
集計をしてみましょう。
手の内訳は
パー、グー、チョキの回数は
割と均等ですね。
少しだけチョキが多いようです。
お次は複数回での手が
どうなるかを見てみます。
次のような関数で
複数回の手を集計できます。
連続になると少し回数が減りますねーー
3回での手の内訳
さて、複数回の組み合わせとしては
こんな感じの結果になりました。
それでは連続でN回同じ手を出すは
どれくらいあるでしょうか?
次のような関数で調査しました。
全じゃんけんの回数で割って確率をみてみます。
2連続
3連続
4連続
5連続
さて、連続で同じ手を出すのは
極端に少ないようです。
今までは4連続が最高だったようですが
この度、5連続でパーを初めて出したので
ニュースになったようです。
確率で言うと0.06%
ニュースになるのも頷けるかもしれません。
5回じゃんけんした際の手の組み合わせは
3通りの手があるので
3**5 = 243通りの組み合わせがあります。
その確率だとだいたい0.4%なので
それに比べると少ないですね。
じゃんけんの結果をみると
やや連続での組み合わせの回数が
少ないように感じます。
例えば3回じゃんけんした際の組み合わせは
3**3で27通りなので
1パターンあたりは3.7%ほど
連続で同じ手を出すのは大分
少ないようですね。
と言うことは
仮説:前回と同じ手、連続手を
極端に嫌っているのではないか?
と言うことで
検証:前回と違う手をランダムにさしたら
勝率はどうなるのか?
100回対戦して平均を求めて見たいと
思います。
思ったより勝ててないですねwww
まあ前回のと違うのをランダムで出したら
勝ちかあいこかに振られるので
あいこが多くなっちゃってます。
前回
前々回
前々々回
みたいに、過去の傾向を学習してあげないと
勝率は上がらないでしょうねーーー
なんか前々々世みたいにだな!!
と言うことで、サザエさんの
じゃんけんでした。
勝ちたい方はデータを見て
過去の傾向やパターンを見つけたら
勝率が上がるかもしれません。
今回はこれまでです
それでは。
先週あることが話題になりました。
解説動画はこちら
さて話題になったのは
サザエさんのじゃんけんに関することなのですが
何が起きたかは分からないですよね。
まずはサザエさんのじゃんけんを見てみることにしましょう。
ありがたいことに
サザエさんのじゃんけんの結果を
まとめていただいているサイトがありました。
サザエさんじゃんけん研究所
公式ウェブサイト
こちらのデータを参考にさせて頂くこととします。
こちらをファイル化して進めますが
やりたい方は
ご自身で用意してください。
さてファイルを読み込みます。
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
まあ前回のと違うのをランダムで出したら
勝ちかあいこかに振られるので
あいこが多くなっちゃってます。
前回
前々回
前々々回
みたいに、過去の傾向を学習してあげないと
勝率は上がらないでしょうねーーー
なんか前々々世みたいにだな!!
と言うことで、サザエさんの
じゃんけんでした。
勝ちたい方はデータを見て
過去の傾向やパターンを見つけたら
勝率が上がるかもしれません。
今回はこれまでです
それでは。

コメント
コメント一覧 (8)
# 複数回の手の結果を計算する関数
for i in range(len(data)-(num-1)):
key = ''.join([data[i+j][2] for j in range(num)])
ここってどういう風に考えればいいのでしょうか?
特に[data[i+j][2]この部分がわからないです。
また最後の100回対戦して平均
sazae = data[i][2]もわからないです。
教えていただけると幸いです
dataにじゃんけんのデータを格納していて
一回分取り出しています。(data[i+j]のところ)
データは[回数 , 日付 , 手]になっているので[2]で手を取り出しています。
keyには手の組み合わせが入ります。
data[i+j][2]の部分は一回分の手の結果です。(パーとか)
これをnum回分joinで連結させてます。(パーチョキグーみたいな)
sazae = data[i][2] のところはsazaeの手ですね。
理解できました。
ありがとうございます。
最後に質問なんですが、乙Pyさんの動画毎回見ているんですが、
わからない場合があったとき質問したいのですが、
こちらのHPで質問してよいでしょうか。
youtubeのコメントやTwitterなどにしようか非常に迷ったのですが....
動画の欄にご意見ご感想はコメント欄にって書いてあるんですが....
どこが乙Pyさんにとっていいのか迷いました。
後これからも動画楽しみにしています。よろしくお願いします。
どちらに書いていただいても、大体見ていますので、
どこでも大丈夫です。
ありがとうございます。
for i in range(len(data)-(num-1)):
(len(data)-(num-1))の部分はなにを行っているんでしょうか?
特に(num-1)の部分が分かりません。
教えてください。よろしくお願いします。
dataの中から次の手をインデックスで参照するので
今がi回目で、最終回はその次のものは参照できないので
num-1回分だけ引いてるんですよー
ありがとうございます。
コメントする