众所周知,在足球运动中,球员具备无逆足(即双脚技术水平接近)能够更加灵活地在不同的方向和角度射门或传球,使得防守球员更难预测和防守。这种能力能够增加进攻的多样性,提高进攻的威胁性。球员能够用左右脚完成复杂的技术动作,例如传球、控球、过人和射门。这使得球员在比赛中能更好地应对各种情况,尤其是在紧急时刻或空间受限的情况下。具备无逆足能力的球员能够在场上灵活调整位置,无论是在边路还是中路,都能发挥出色。这种适应性使得教练在排兵布阵时有更多选择,球员也能更好地融入不同的战术体系。球员能够用双脚传球和接球,减少了传球路线的限制,提高了传球的准确性和速度。这有助于球队在高压情况下保持控球权,增加团队的整体配合效果。球员能够用双脚处理球,可以减少单一使用一只脚带来的疲劳和受伤风险。这对于球员的职业生涯有积极影响,有助于延长其运动寿命。
作为亚洲球星孙兴慜,我们从数据分析及统计学的角度来看,孙兴慜真的是无逆足吗?
这里我们采用wyscout数据集,使用英超整个赛季的数据。
导入模块:
import pandas as pdimport jsonimport osimport pathlibimport warningspd.options.mode.chained_assignment = None #忽略不必要的警告warnings.filterwarnings('ignore') #忽略不必要的警告
这里我是将数据下载到本地文件夹里,我保存的路径为:

大家根据自己保存的路径进行修改。
加载数据:
path = os.path.join(str(pathlib.Path().resolve()), 'data', 'Wyscout','datas', 'events_England.json')with open(path) as f: data = json.load(f)train = pd.DataFrame(data)path = os.path.join(str(pathlib.Path().resolve()),"data", 'Wyscout', 'players.json')#open dataset with playerswith open(path) as f: players = json.load(f)player_df = pd.DataFrame(players)print(train)#可以print出来看一下是否能正常加载数据,print(train)则是展示事件数据#print(player_df)则是展示球员信息数据
运行结果:

数据能够正常打开,那么紧接着进行数据的筛选。在这里,我们事件数据里选择'Shot'(注意大小写),球员选择'Son Heung-Min'并且和球员id即'wyID'关联起来。最后再在shots变量里找到son的id,最后可以print一下检查下数据。
输入代码:
#take shots onlyshots = train.loc[train['subEventName'] == 'Shot'] #look for son's idson_id = player_df.loc[player_df["shortName"] == "Son Heung-Min"]["wyId"].iloc[0]#get son's shotson_shots = shots.loc[shots["playerId"] == son_id]print(son_shots)#print一下看看数据内容
运行结果:

son的数据准备好了之后,我们就需要找到son的使用左脚射门和右脚射门的数据。在wyscout数据集里,id为401表示左脚,id为402表示右脚,具体的数据集内容大家可以自己加载好数据后print出来看看,或者在wyscout的GitHub上面查看。
输入代码:
#left leg shotslefty_shots = son_shots.loc[son_shots.apply (lambda x:{'id':401} in x.tags, axis = 1)]#right leg shotsrighty_shots = son_shots.loc[son_shots.apply (lambda x:{'id':402} in x.tags, axis = 1)]#create list with ones for left foot shots and -1 for right foot shots l = [1] * len(lefty_shots) l.extend([-1] * len(righty_shots))print(l)
这里我们为了后续更加便利的处理数据,用1(左脚)和-1(右脚)定义左右脚,并将这些生成列表。
运行结果:

最后,我们用sign test进行检验,再用if判断语句判断如果p值小于0.05,则拒绝零假设,孙存在逆足,否则不拒绝零假设,孙是无逆足。
输入代码:
from statsmodels.stats.descriptivestats import sign_test #导入sign_test模块test = sign_test(l, mu0 = 0)pvalue = test[1]if pvalue < 0.05: print("P-value amounts to", str(pvalue)[:5], "- We reject null hypothesis - Heung-Min Son is not ambidextrous")else: print("P-value amounts to", str(pvalue)[:5], " - We do not reject null hypothesis - Heung-Min Son is ambidextrous")
运行结果:
P-value amounts to 0.142 - We do not reject null hypothesis - Heung-Min Son is ambidextrous
运行结果为p=0.142,>0.05,因此,我们不拒绝零假设,孙是无逆足的。
根据这种方法,同样的我们可以分析其他球员在射门方面是否存在逆足情况,也可以将球员射门位置以及射门习惯位置进行可视化处理,这也正是后续我们将要做的。
通过数据分析,我们可以用数据说话,而不是用人们的感觉和直觉去判断,这通常更科学合理。
推荐阅读:
关注微信公众号并回复‘soccermatics-player’获取GitHub球员的公开数据。
关注微信公众号并回复‘son代码’获取完整代码。

仅供学习交流。