将棋ウォーズで大会のランキング1位になったプレーヤー(以下「件のプレーヤー」と呼ぶ)が大会直後にアカウントを消したということで,ごく一部の界隈が盛り上がっている.
詳しくは以下の記事などを参照してほしい.
偶然にも当該アカウントの棋譜を取得してあったので,その棋譜を少しだけ検討してみる.
import pymongo
from collections import Counter
import re
from scipy.stats import poisson
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
connection = pymongo.Connection('localhost',27017)
db = connection.warskifu
col = db.kifu
MongoDBから件のアカウントが指した対局の棋譜を抜き出す.
user = u'junpe_'
userlist = list(col.find({"$or":[{"user0":user},{"user1":user}]}))
len(userlist)
74
DBには74件登録されていた.件のアカウントの大会での成績は144勝27敗だったので,大会における件のプレーヤーが指した全対局の半分弱しか取得できていない.残りの対局は10秒指し以外のルールで指したか,あるいは大会期間の始めのほう(だいたい10月1〜5日)で指したと考えられる.
for j in userlist:
print 'http://shogiwars.heroz.jp:3002/games/' + j[u'_id']
http://shogiwars.heroz.jp:3002/games/junpe_-Pona3-20141019_082731 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141019_073208 http://shogiwars.heroz.jp:3002/games/HashiPona-junpe_-20141019_072806 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141018_220432 http://shogiwars.heroz.jp:3002/games/Pona4-junpe_-20141018_220018 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141018_213420 http://shogiwars.heroz.jp:3002/games/junpe_-HashiPona-20141016_061753 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141015_105634 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141015_100034 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141014_193040 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141014_185133 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141014_184117 http://shogiwars.heroz.jp:3002/games/MOBILE_ARMOR-junpe_-20141014_182436 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141014_181656 http://shogiwars.heroz.jp:3002/games/junpe_-Boss_bitou-20141014_180957 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141014_180208 http://shogiwars.heroz.jp:3002/games/junpe_-cosmonaut1-20141014_014210 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141014_012324 http://shogiwars.heroz.jp:3002/games/Pona1Jan-junpe_-20141013_193948 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141012_202033 http://shogiwars.heroz.jp:3002/games/junpe_-Pona3-20141012_200810 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141012_194903 http://shogiwars.heroz.jp:3002/games/Pona4-junpe_-20141012_144205 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141012_142812 http://shogiwars.heroz.jp:3002/games/Pona1Jan-junpe_-20141012_140302 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141012_133054 http://shogiwars.heroz.jp:3002/games/junpe_-erfallen-20141009_205219 http://shogiwars.heroz.jp:3002/games/magewappa-junpe_-20141009_204219 http://shogiwars.heroz.jp:3002/games/junpe_-MOBILE_ARMOR-20141009_203347 http://shogiwars.heroz.jp:3002/games/junpe_-Falkenborg-20141009_202555 http://shogiwars.heroz.jp:3002/games/junpe_-Keiji_Maeda-20141009_201915 http://shogiwars.heroz.jp:3002/games/junpe_-MOBILE_ARMOR-20141009_200806 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141009_195843 http://shogiwars.heroz.jp:3002/games/HashiPona-junpe_-20141009_195424 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141009_194719 http://shogiwars.heroz.jp:3002/games/junpe_-GTR600-20141009_193308 http://shogiwars.heroz.jp:3002/games/junpe_-sakurasayaka-20141009_185757 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141009_185006 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141009_181749 http://shogiwars.heroz.jp:3002/games/junpe_-masatooo32-20141009_093023 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141009_091452 http://shogiwars.heroz.jp:3002/games/Pona3-junpe_-20141007_095111 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141007_094137 http://shogiwars.heroz.jp:3002/games/junpe_-2_tsutsukana-20141007_055053 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141007_053951 http://shogiwars.heroz.jp:3002/games/LION_FX-junpe_-20141007_053836 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141007_053330 http://shogiwars.heroz.jp:3002/games/Pona4-junpe_-20141007_052734 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141007_045759 http://shogiwars.heroz.jp:3002/games/shibaura-junpe_-20141007_045153 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141007_044326 http://shogiwars.heroz.jp:3002/games/miya_with_r-junpe_-20141006_205059 http://shogiwars.heroz.jp:3002/games/junpe_-aoba81-20141006_203132 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141006_075815 http://shogiwars.heroz.jp:3002/games/Pona1Jan-junpe_-20141006_075302 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141006_074604 http://shogiwars.heroz.jp:3002/games/junpe_-CharcoalFilter-20141005_223646 http://shogiwars.heroz.jp:3002/games/junpe_-yuta717-20141005_223132 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141005_221409 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141005_220325 http://shogiwars.heroz.jp:3002/games/junpe_-atsutodo-20141005_215600 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141005_194448 http://shogiwars.heroz.jp:3002/games/kazkiti-junpe_-20141005_125305 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141005_122043 http://shogiwars.heroz.jp:3002/games/tats3256-junpe_-20141005_120137 http://shogiwars.heroz.jp:3002/games/Pona3-junpe_-20141005_102337 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141005_092007 http://shogiwars.heroz.jp:3002/games/Macone-junpe_-20141005_091258 http://shogiwars.heroz.jp:3002/games/anzu17-junpe_-20141005_083908 http://shogiwars.heroz.jp:3002/games/junpe_-1_tsutsukana-20141005_082812 http://shogiwars.heroz.jp:3002/games/ttk234-junpe_-20141005_082430 http://shogiwars.heroz.jp:3002/games/junpe_-takekoma-20141005_082029 http://shogiwars.heroz.jp:3002/games/joutatu2013-junpe_-20141005_031327 http://shogiwars.heroz.jp:3002/games/1_tsutsukana-junpe_-20141005_030104
件のプレーヤーと2局以上対局したプレーヤーを列挙してみる.
user_count = []
user_count.extend([_user[u'user0'] for _user in userlist])
user_count.extend([_user[u'user1'] for _user in userlist])
counter = Counter(user_count)
for u, count in counter.most_common():
if count > 1:
print u, count
junpe_ 74 1_tsutsukana 34 Pona3 4 Pona1Jan 3 HashiPona 3 MOBILE_ARMOR 3 Pona4 3
やけにツツカナとの対局が多いような気がする.
次に件のプレーヤーの持ち時間の使い方を見てみる.
u = []
for i in range(len(userlist)):
csa = userlist[i][u'csa']
userdata = userlist[i]
caption = ""
win = len(re.findall(r'[\+|-]',csa))%2
if win==1: ## 先手勝ち
caption = userdata[u'user0']
else:
caption = userdata[u'user1']
caption += '; {0} vs. {1}\n'.format(userdata[u'user0'], userdata[u'user1'])
caption += userdata[u'_id']
user0_time = []
user1_time = []
for j,c in enumerate(csa.split('\n')):
if (j+1)%4==0:
user1_time.append(int(c.replace('T', '')))
elif (j+1)%2==0:
user0_time.append(int(c.replace('T', '')))
_u = []
if userdata[u'user0']==user:
_u = user0_time
elif userdata[u'user1']==user:
_u = user1_time
u.extend(_u)
plt.plot(_u)
plt.ylim(0,10)
plt.title(caption)
plt.figure()
/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.py:423: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_num_figures`). max_open_warning, RuntimeWarning)
<matplotlib.figure.Figure at 0x7f8e49d1c190>
上記のグラフそれぞれは,n手目(横軸)を指すときに使った持ち時間(縦軸)を表している.ここで,対戦相手の時間は無視して件のプレーヤーの時間だけ見ていることに注意する.また,図のタイトルの1行目は左から勝者,先手,後手のプレーヤーのidを表し,2行目は棋譜が載っているページのURLの末尾の文字列を表す.
件のプレーヤーのグラフは一見普通に見える.やけにリズミカルに指している感はあるがソフト指しと判定するには証拠不十分といった気がする.
ちなみに「普通でない持ち時間のグラフ」というのはどういったものを指すのかというと,例えばツツカナ(1_tsutsukana
)はほとんどの指し手を考慮時間3秒で指すので,グラフを描くと以下のように一直線のグラフになる.
csa = userlist[5][u'csa']
print userlist[5][u'user1']
user_time = []
for j,c in enumerate(csa.split('\n')):
if (j+1)%4==0:
user_time.append(int(c.replace('T', '')))
plt.plot(user_time)
plt.figure()
1_tsutsukana
<matplotlib.figure.Figure at 0x7f8e4c14ee90>
<matplotlib.figure.Figure at 0x7f8e4c14ee90>
ついでに件のプレーヤーの持ち時間の使い方をすべてまとめてヒストグラムにしてみる.
plt.hist(u)
(array([ 31., 727., 1837., 1003., 392., 203., 124., 54., 10., 10.]), array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), <a list of 10 Patch objects>)
ほとんどの指し手を4秒未満で指している.
とりあえず件のプレーヤーの持ち時間の使い方を見て,ソフト指しかどうか判定できないかを考えた.結論としては,件のプレーヤーは(個人的な意見としては)ソフト指しではなさそうである.
正直よくわからないのでソフト指しについての識者に意見を請いたい.