https://www.youtube.com/user/rasmusab/feed
本文将通过贝叶斯理论来分析棒球选手的命中率,手把手教你如何利用贝叶斯理论进行分析。说实话,我不是一个体育迷,也很少看体育比赛。
那么为什么选择棒球?
“不论你了解与否,但棒球的魅力就在于精确度。没有其他运动像棒球这样完全依赖于运动数据的连续性,统计性和有序性。棒球球迷比注册会计师还要关注数字。”
——体育记者Jim Murray
“不论你了解与否,但棒球的魅力就在于精确度。没有其他运动像棒球这样完全依赖于运动数据的连续性,统计性和有序性。棒球球迷比注册会计师还要关注数字。”
——体育记者Jim Murray
有人说棒球可能是世界上数据记录得最详细的运动。历史上已经累积了近百年来的棒球统计数据。
然而,仅仅收集统计数据并不会让棒球在统计方面变得有趣,也许更重要的是这项运动本身的特点。
举例来说,在完成一次打数(At Bats,是棒球运动中的一个成绩计算名词,指击球手完成打击的次数)过程中,谁在外野打球对于击球手是否可以击中本垒打影响甚微。
在其他体育运动,尤其是足球和篮球运动中,球员统计数据的意义可能会因球场内其他地方发生的重要事件而被淡化。而棒球这项运动中,统计数据在比较球员表现上发挥了重要作用。
棒球统计数据包含很多指标,有些指标的定义很直观,有些则比较复杂。我选择观察的测量指标是打击率 (Batting Average,AVG)。在棒球中,打击率由安打(Hits,安打是棒球运动中的一个名词)次数除以打数来定义,通常精确到小数点后三位。
有人质疑打击率的作用,但正如C. Trent Rosecrans所说,“尽管如此,打击率相较于其他统计数据而言确实是有历史和背景意义。我们都知道AVG为0.300打者的水平怎么样,我们也知道AVG为0.200打者有多糟,以及AVG为0.400打者有多棒。”
在美国职业棒球大联盟(MLB)中,春季训练是在常规赛季开始之前的一系列练习和表演赛。
我会尝试解决以下两个问题:
如何解读2018年春季训练中的打击率
怎么比较两名球员的打击率
在进入代码内容之前,我会简要介绍一下Rasmus Bååth在他的视频中所讲的内容。
首先,我们需要三样东西来完成贝叶斯分析。
1.数据
2.生成模型
3.先验概率
就我的例子而言,数据就是我们所观察到的2018年春季训练的打击率。
生成模型就是当给定参数作为输入时生成数据的模型。这些输入参数用于生成一个概率分布。例如,如果知道平均值和标准差,则可以通过运行以下代码轻松生成所选数据集的正态分布数据。稍后我们会看到其他类型的分布在贝叶斯分析中的运用。
import matplotlib.pyplot as pltimport numpy as npmu, sigma = 0, 0.1 # mean and standard deviations = np.random.normal(mu, sigma, 1000)plt.hist(s)
就贝叶斯分析而言,我们会逆向生成模型并尝试用观测数据推断参数。
贝叶斯数据分析简介第1部分
最后,先验概率是指模型在处理数据之前就已有的信息。比如,事件是否等概率?是否有一些先前的数据可以利用?是否可以做出有依据的推测?
首先我将定义一个从Fox Sports抓取球员数据的函数,然后抓取球员的春季训练或常规赛季的击球统计数据。
Fox Sports链接:
https://www.foxsports.com/mlb/stats
import pandas as pdimport seaborn as snsimport requestsfrom bs4 import BeautifulSoupplt.style.use('fivethirtyeight')%matplotlib inline%config InlineBackend.figure_format = 'retina'def batting_stats(url,season): r = requests.get(url) soup = BeautifulSoup(r.text, 'lxml') table = soup.find_all("table",{"class": "wisbb_standardTable tablesorter"})[0] table_head = soup.find_all("thead",{"class": "wisbb_tableHeader"})[0]if season == 'spring'