老兵不死|数据纪念男篮世界杯

  • 2019 年 10 月 5 日
  • 筆記

微信公众号:萝卜大杂烩

男篮世界杯已经落下帷幕,相信看球的朋友们都已经过足了篮球瘾。有些许遗憾,也有世界霸主的失落,还有老兵不死的坚持,当然还有斗牛军团的登顶。

自杀式输给波兰,溃败式负于尼日利亚,从前一直代表亚洲征战奥运会的中国,可能就要缺席下一届了。当阿联老去,中国即将不再有任何一名球员具备世界篮球运动员的水平,没有一个!期待中国男篮的再次崛起吧!

星光黯淡,小将领衔,教练席上的神奇老者也没能创造神奇,历史最差战绩,我们都不知道该不该赋予这只美国男篮以“梦之队”的称号。也许在不久后的东京,他们会球星云集,卷土重来吧。

什么是老兵,是接近40岁“高龄”的斗士,是场均准两双的无解,是令人啧啧称奇的坚持。钻石的最后,虽然没能如愿,但是谁又会在乎呢,你已经征服了整个世界!潘帕斯草原上的雄鹰,终将振翅高飞。

一如足球领域一样,斗牛军团的篮球同样强大。不能不佩服和感慨,当加索尔和卢比奥内外联合,双剑合璧时,他们就是篮球界的霸主。

下面我们就一起通过真实的数据,来细数本届男篮世界杯上的各项数据吧。

数据从哪里来

我不生产数据,只是数据的搬运工

下面分析的数据,都是抓取自新浪体育

▼ 数据抓取

在新浪体育网站上,有个世界杯专栏,在数据榜这个模块里,可以找个类似下面的链接

https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=FieldGoalsAverage&order=desc&dpc=1

该链接,只要修改 ordertype 字段,就可以获取到诸如球员得分,篮板球,助攻数等一些列数据,具体的过程就不说了,就是发请求,解析 json 的简单操作

import requests  import time      url_list = [      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=PointsAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=ReboundsAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=PlusMinusAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=StealsAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=AssistsAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=BlockedAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=TurnoversAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=PersonalFoulsAverage',      'https://events.sports.sina.com.cn/bps/peony/mersh/beitai/fiba/stats/playerdata_order?leagueid=433&ordertype=FieldGoalsAverage'  ]      def fire(url):      file_name = url.split('=')[2]      res = requests.get(url).json()      data = res['playerdata_order']      items = map(get_data, data)      print('save data')      save_to_csv(items, file_name)      def get_data(data):      name = data['CNAlias']      country = data['TeamCNName']      points = data['PointsAverage']      rebounds = data['ReboundsAverage']      steals = data['StealsAverage']      assists = data['AssistsAverage']      fouls = data['PersonalFoulsAverage']      plus_minus = data['PlusMinusAverage']      blocked = data['BlockedAverage']      goals_percentage = data['FieldGoalsPercentage_m']      turnovers = data['TurnoversAverage']      result = {          'name': name,          'country': country,          'points': points,          'rebounds': rebounds,          'steals': steals,          'assists': assists,          'fouls': fouls,          'plus_minus': plus_minus,          'blocked': blocked,          'goals_percentage': goals_percentage,          'turnovers': turnovers      }      return result      def save_to_csv(data, file_name):      with open(file_name + '_data.csv', 'w', encoding='utf-8') as f:          f.write('name,country,points,rebounds,steals,assists,fouls,plus_minus,blocked,goals_percentage,turnoversn')          for d in data:              try:                  row = '{},{},{},{},{},{},{},{},{},{},{}'.format(d['name'],                                                                  d['country'],                                                                  d['points'],                                                                  d['rebounds'],                                                                  d['steals'],                                                                  d['assists'],                                                                  d['fouls'],                                                                  d['plus_minus'],                                                                  d['blocked'],                                                                  d['goals_percentage'],                                                                  d['turnovers'])                  f.write(row)                  f.write('n')              except:                  continue      if __name__ == '__main__':      for url in url_list:          fire(url)          time.sleep(2)  

▼ 数据保存

我分别抓取了以得分、篮板,助攻等排名的数据,并分别保存在不同的 csv 文件当中,最后的文件内容大致如下

全体球员可视化

球员得分排名

几个亮点

韩国的归化球员竟然场均得分最高

阿联成功入选

没有美国人

可能是韩国队打的比赛不多,对手不是很强,这个罗建儿作为迷你型中锋,也可以在内线翻云覆雨。

阿联确实宝刀不老,还记得最后的生死战,如果没有阿联,比赛可能早花了。

再次印证本届美国男篮无大牌,没有绝对的进攻核心,可能是他们兵败中国的最大原因了。

球员篮板排名

有意思了,罗建儿竟然又是第一,要是按照国内排高校的标准,这妥妥的是双一流!

球员得分篮板排名

罗建儿是本届世界杯唯一的一个能拿到得分篮板两双的球员,且是20+10,能力还是毋庸置疑的!

然后就要说说两位老将了,斯科拉和易建联。两位都是17+的场均得分加上7+的篮板,能够看得出,在攻防两端,两名球员都是各自球队不可或缺的一员。真的是家有一老,如有一宝啊。

不过人家阿根廷男篮已经完成了新老交替,未来依旧可期。而中国男篮呢,未来靠谁,是亚洲第一后卫-郭艾伦,还是大魔王-周琦,都还缺乏领袖气质和绝对能力啊!

最佳阵容可视化分析

最佳阵容球员

the_best_lineup = [      '博格达诺维奇',      '富尼耶',      '卢比奥',      '斯科拉',      '加索尔'  ]  

球员能力分析

接下来就来看看本届世界杯,最佳阵容成员的各自数据。能力强不强,数据不说谎。

我分别选取了得分、篮板、助攻、抢断、封盖、犯规和失误为考察点,分别画出了各自的能力雷达图

三个外线,两个内线,各自都以不同的能力,影响着比赛,帮助着团队。

塞尔维亚的博格达诺维奇,得分能力比较强,场均助攻也不错,关键是助攻失误比非常低,妥妥的进攻发动机。

法国队的富尼耶,得分助攻比较平均,从数据上来看,是五个人中较弱的一位。但是其强大的冲击力,是法国队得以击败美国的关键之一。

西班牙的卢比奥,是五个人中助攻最高的一位,但是同时失误次数也最多。他在外线的威胁,是西班牙能够轻松击败阿根廷的重要因素。当年的金童已经蓄起了胡须,岁月的沧桑给了他更多的坚忍。

阿根廷的斯科拉,作为攻守两端的绝对核心,如果不是两鬓的点点白发,不会有人知道他已经39岁了。此时的数据已经不再重要,篮球才是一切!

西班牙的小加索尔,成功的从哥哥手中接过了国家队的大旗,不是十分华丽的数据的背后,是他在球场上的经验,老道和威慑力,有他在,西班牙就不会轻易被击败。

球员投篮命中率对比

没想到,投篮命中率最高的竟然是一名外线球员,也许这样和当今篮球的发展相关,大个往外跑,小个向里冲!

最佳五人组,每个人的命中率都在40%以上,怎一个稳字了得。

球员正负值对比

富尼耶是五个人中正负值最低的,我说他在五个人里最弱,是不是也从侧面得到了印证呢。

而加索尔的正负值是最高的,他就是球队的定海神针。犹记得当阿根廷反攻凶猛时,就是加索尔临危上场,稳定军心,遏制对手的进攻,成功帮助球队拿下比赛。

老兵不死

只是逐渐凋零

来看看阿联的数据,竟然是莫名的心酸

我不想再去分析为啥他的正负值这么低,因为我们都看到了他在球场上的努力和汗水,还有他因为丢失到手的篮板而懊恼的双手砸地的场景。

还有斯科拉,12.9的正负值,43.4%的命中率,场均17.9分,8.1篮板,没有人能够要求他再多做些什么了,尽情释放,努力燃烧,不悔!

最后以天下足球的文案来结尾,再合适不过了。

岁月你别催,该来的我不推;岁月你别催,走远的仍要追。当不得不说再见的时候,挥别的那一刻就如同流水的光阴,谁能抵得过,谁能叹息、奈何。