CDA数据分析师 出品
【导读】
本期我们用全面的数据证明到底坑了辽宁队!Python技术分析请看第六部分。
获取数据代码:
扫描下方公众号
回复关键字“辽宁”
CBA做为中国职业体育最先重启的联赛,真的是万众瞩目,在第一阶段最后一场比赛广东对江苏的比赛中,钟南山钟老亲临现场,做为中国篮球界的女婿,钟老真的为CBA重启操碎了心。CBA这次复赛重启结果也很不错,堪称模范。
而本期我们要聊的是辽宁队,用数据解读一支争冠队如何变成了鱼腩队?
文章要点:
辽宁队胜负场得分和命中率
不同球员的平均出场时间
辽宁队胜负场失误情况
外援与国内球员平均得分对比
用Python分析辽宁队比赛数据
01
志在卫冕的辽宁队
从争冠队到鱼腩队
辽宁队在赛季刚开始还算顺风顺水,但是复赛重启后,辽宁队战绩可谓是糟糕透顶,连败北京、广州、浙江后,郭士强成为背锅的那个人,黯然下课。真是大侄子坑老叔,一个愿打一个愿挨。
之后,辽宁虐两个不强的队后,遇到强队又比赛落败,真的很难联想到这是一支争冠的球队,这次我们结合数据,聊一聊辽宁变成这样到底谁应该背锅?
赛季刚开始的辽宁队算是顶级强队,我们来看下当初那只辽宁队,先看到分情况:
全部比赛-胜场得分曲线图
全部比赛-负场得分曲线图
从折线图来看,辽宁胜场得分都是100分以上,负场也几乎过100了,证明辽宁队进攻完全没有问题,当时还有师弟这样的CBA詹姆斯, 一个人可以解决很多问题,当时的辽宁真的强。
复赛后的辽宁队的得分下降到什么程度?焦灼的比赛得分刚到100,被虐得体无完肤的比赛得分都是在垃圾时间刷分,整体效率下降太多。
02
命中率不稳定
郭士强为此下课
再看到整体命中率,我们分别统计了胜负场次,拉了折线图出来:
全部比赛-胜场命中率曲线图
全部比赛-负场命中率曲线图
罚球数据方面,复赛后所有球队都有下滑,这个可以理解,毕竟很久没有打比赛了。
三分球辽宁队数据真的惨不忍睹,尤其是复赛后的输球的几场,命中率只有30%多,这和广东新疆等目标球队差距太大了。复赛后和浙江的比赛二分命中率跌破50%,在以前根本不敢相信,这也是郭士强下课的主要原因。二分命中率低只能说明训练不到位,要不就是场上球员太累了。
大家一直在诟病辽宁队的轮换,所以我们也分析了球员出场时间,制作了饼图。
03
奇葩的4+2轮换
只要主力不累死就不能下
这是本赛季所有比赛的球员出场时间图:
不同球员的平均出场时间
把外援去除,郭艾伦、赵继伟、韩德君、李晓旭、刘志轩、贺天举构成了主要轮换,看这还算符合CBA球队常规轮换人次。
复赛后,李晓旭受伤,刘志轩精神游离,贺天举有复苏的迹象,但是远远达不到为球队分忧的状态,因为防守实在太差了。所以只剩下郭艾伦、韩德君、赵继伟了,再加上1个外援,组成了奇葩的4人主力+2人轮换阵容。
然后就有了孙铭徽完爆亚洲第一后卫,那场比赛孙铭徽出场40.3分钟,郭艾伦出场46.8分钟,真是只要不累死就要上。
通过上面的数据来看,轮换是辽宁队复赛后最大的问题,郭士强为此下课也合情合理。但是外教用人比郭士强还狠我们就看不明白了,辽宁队是真的破罐子破摔了么?郭艾伦场均打满全场是什么操作?就算是郭艾伦的球队也不能场场打满吧。
04
没有超强得分能力的保证
失误多不可能赢球
在分析辽宁蜕变的同时,也发现了一些之前球队的隐患,分享给诸位。
这是辽宁队胜负场次分别的失误次数:
全部比赛-胜场失误曲线图
全部比赛-负场失误曲线图
看看这个曲线,要是换我们的杜锋杜指导带队,估计每场都能出好多小视频,疯狂输出,打不了几场全队就剩不下什么人了。在没看到数据之前,觉得见谁削谁的辽宁队场均失误应该会很少,这张图颠覆了我的认知,假如不看队名,我以为是福建这种只进攻不防守的球队应该有的数据表现。
05
少了一个外援
谁来分担得分压力?
再看到外援和国内球员的平均得分:
外援-国内球员平均得分对比
这个比例在CBA倒是很常见,外援占有球队的一半出手权,剩下一半才是国内球员的,也证明了师弟在辽宁队真的很重要。郭艾伦单核带队真的很难,这倒不是说韩德君不是核心,在CBA的FIBA规则下,内线带队真的太过艰难了。
这也侧面就说明了复赛之后辽宁体现的问题,失去了2名外援,就算新外援梅奥和师弟表现的平起平坐,但是国内球员的得分并没有增加,以前得分的还是得分,以前不出场的还是不出场。这算下来就少了将近20分,和CBA复赛后国内球员积极的表现形成了鲜明的对比。
06
用Python带你分析
辽宁队比赛数据
我们使用Python获取并分析了搜狐体育CBA数据中心辽宁队的比赛和技术统计数据,以下为关键部分代码:
回复关键字“辽宁”
获取详细数据代码
首先导入分析所需包,并读入数据集。
# 导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import re
from pyecharts.charts import Bar, Line, Pie, Page
from pyecharts import options as opts
from pyecharts.globals import SymbolType, WarningType
WarningType.ShowWarning = False
import warnings
warnings.filterwarnings('ignore')
汇总数据中包含了从2019-11-01至2020-07-02日的交战汇总数据,共37场,数据格式如下:
# 汇总数据
df_all = pd.read_excel('../data/辽宁交战汇总.xlsx')
df_all.head()
技术数据中包含了每一场比赛选手的详细技术数据,数据预览如下:
# 技术数据
df_skill = pd.read_excel('../data/详细技术数据-修改版.xlsx')
df_skill.head()
此处对首发数据进行清洗。
# 循环
df_skill2 = pd.DataFrame()
for i in df_skill['场序'].drop_duplicates():
# 前五行填1
df_sel = df_skill[df_skill['场序'] == i]
df_sel.iloc[:5, 0] = 1
# 后面填0
df_sel.iloc[5:-1, 0] = 0
# 追加
df_skill2 = df_skill2.append(df_sel, ignore_index=True)
df_skill2['首发'] = df_skill2['首发'].replace('总计', np.nan)
df_skill2.head()
此处我们分析:
主要球员赢球/输球的比赛各项数据(篮板/助攻/失误)
球员出场时间占比
2020年6月前比赛得分曲线图
外援/国内球员平均得分曲线图
郭艾伦/其他球员平均得分曲线图
全部比赛命中率曲线图
全部比赛失误曲线图
全部比赛得分曲线图
代码部分内容较多,以下展示部分分析代码:
# 删除空值
df_time = df_skill2.dropna(axis=0)
df_time.head()
# 计算时间
time_num = round(df_time.groupby('球员')['出场时间'].mean())
time_num = time_num.sort_values(ascending=False)
time_num
球员
梅奥 40.0
郭艾伦 35.0
兰斯-史蒂芬森 35.0
赵继伟 33.0
韩德君 32.0
布兰登-巴斯 32.0
高诗岩 24.0
李晓旭 24.0
刘志轩 22.0
贺天举 17.0
丛明晨 15.0
王化东 11.0
郭旭 9.0
刘雁宇 7.0
鄢手骐 5.0
马壮 2.0
Name: 出场时间, dtype: float64
data_pair = [list(z) for z in zip(time_num.index.tolist(), time_num.values.tolist())]
# 绘制饼图
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
pie1.add('', data_pair, radius=['35%', '60%'])
pie1.set_global_opts(title_opts=opts.TitleOpts(title='不同球员的平均出场时间'),
legend_opts=opts.LegendOpts(is_show=False, orient='vertical', pos_top='15%', pos_left='2%'))
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}min"))
pie1.render()
# 合并数据
df_neiwai = pd.merge(df_skill2, df_all[['场序', '胜负']])
# 删除列
df_neiwai.dropna(inplace=True)
# 添加外援/国内球员标签
def tansform_label(x):
if x == '梅奥' or x == '布兰登-巴斯' or x == '兰斯-史蒂芬森':
return '外援'
else:
return '国内球员'
df_neiwai['标签1'] = df_neiwai.球员.apply(tansform_label)
df_neiwai.head()
# 分组汇总
defen = df_neiwai.groupby(['场序', '标签1'])['得分'].mean().reset_index()
defen['得分'] = round(defen['得分'])
# 产生数据
x_line1 = defen[defen['标签1']=='国内球员']['场序'].astype('str').tolist()
y_line1 = defen[defen['标签1']=='国内球员']['得分'].tolist()
y_line2 = defen[defen['标签1']=='外援']['得分'].tolist()
line9 = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))
line9.add_xaxis(x_line1)
line9.add_yaxis('国内球员', y_line1,
markpoint_opts=opts.MarkPointOpts(data=[
opts.MarkPointItem(type_='max', name='最大值'),
opts.MarkPointItem(type_='min', name='最小值')
]))
line9.add_yaxis('外援', y_line2,
markpoint_opts=opts.MarkPointOpts(data=[
opts.MarkPointItem(type_='max', name='最大值'),
opts.MarkPointItem(type_='min', name='最小值')
]))
line9.set_global_opts(title_opts=opts.TitleOpts(title='外援-国内球员平均得分对比'))
line9.set_series_opts(label_opts=opts.LabelOpts(is_show=True),
linestyle_opts=opts.LineStyleOpts(width=3)
)
line9.render()
# 定义函数
def draw_line(xaxis_data, y_axis, title_label, series_name='', min_num=None, label_color=None, line_color=None, formatter=None):
line = Line(init_opts=opts.InitOpts(width='1350px', height='750px'))
line.add_xaxis(xaxis_data)
line.add_yaxis(series_name, y_axis,
markpoint_opts=opts.MarkPointOpts(data=[
opts.MarkPointItem(type_='max', name='最大值'),
opts.MarkPointItem(type_='min', name='最小值')
]))
line.set_global_opts(title_opts=opts.TitleOpts(title=title_label),
yaxis_opts=opts.AxisOpts(min_=min_num)
)
line.set_series_opts(label_opts=opts.LabelOpts(is_show=True, color=label_color, formatter=formatter),
linestyle_opts=opts.LineStyleOpts(width=3, color=line_color)
)
return line
# 产生数据
x_line1 = df_all[df_all['胜负']=='胜']['场序'].astype('str').tolist()
y_line1 = df_all[df_all['胜负']=='胜']['得分'].tolist()
x_line2 = df_all[df_all['胜负']=='败']['场序'].astype('str').tolist()
y_line2 = df_all[df_all['胜负']=='败']['得分'].tolist()
# 绘图
line1 = draw_line(xaxis_data=x_line1, y_axis=y_line1, title_label='全部比赛-胜场得分曲线图', min_num=80,
label_color=None, line_color=None)
line2 = draw_line(xaxis_data=x_line2, y_axis=y_line2, title_label='全部比赛-胜场负场曲线图', min_num=80,
label_color='blue', line_color='#3B7BA9')
page1 = Page()
page1.add(line1, line2)
page1.render()
结语
辽宁队本赛季能走多远,能不能过季后赛首轮 完全取决于李晓旭回归后的表现,需要弥补没有大外援所损失的得分和篮板,也让韩德君可以稍微休息一下。
但治根本的良药还是要培养新人,辽宁青训出了这么多优秀人才,人才断层应该不会发生,希望俱乐部多多启用新人,辽宁队也到了破而后立的时刻了。
获取完整代码+数据:
扫描下方公众号,回复关键字“辽宁”,获取数据和代码吧。