# 九、经验分布 大部分数据科学都涉及来自大量随机样本的数据。 在本节中,我们将研究这些样本的一些属性。 我们将从一个简单的实验开始:多次掷骰子并跟踪出现的点数。 `die `表包含骰子面上的点数。 所有的数字只出现一次,因为我们假设骰子是平等的。 ```py die = Table().with_column('Face', np.arange(1, 7, 1)) die ``` | Face | | --- | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | ### 概率分布 下面的直方图帮助我们可视化,每个面出现概率为 1/6 事实。 我们说直方图显示了所有可能的面的概率分布。 由于所有的条形表示相同的百分比几率,所以这个分布成为整数 1 到 6 上的均匀分布。 ```py die_bins = np.arange(0.5, 6.6, 1) die.hist(bins = die_bins) ``` 递增值由相同的固定量分隔,例如骰子面上的值(递增值由 1 分隔),这样的变量被称为离散值。上面的直方图被称为离散直方图。它的桶由数组`die_bins`指定,并确保每个条形的中心是对应的整数值。 重要的是要记住,骰子不能显示 1.3 个点或 5.2 个点 - 总是显示整数个点。但是我们的可视化将每个值的概率扩展到条形区域。虽然在本课程的这个阶段这看起来有些随意,但是稍后当我们在离散直方图上叠加平滑曲线时,这将变得很重要。 在继续之前,让我们确保轴域上的数字是有意义的。每个面的概率是 1/6,四舍五入到小数点后两位的概率是 16.67%。每个桶的宽度是 1 个单位。所以每个条形的高度是每单位 16.67%。这与图形的水平和垂直比例一致。 ### 经验分布 上面的分布由每个面的理论概率组成。 这不基于数据。 不投掷任何骰子,它就可以被研究和理解。 另一方面,经验分布是观测数据的分布。 他们可以通过经验直方图可视化。 让我们通过模拟一个骰子的投掷来获得一些数据。 这可以通过 1 到 6 的整数的带放回随机抽样来完成。为了使用 Python 来实现,我们将使用`Table`的`sample`方法,它带放回地随机抽取表中的行。它的参数是样本大小,它返回一个由选定的行组成的表。 `with_replacement=False`的可选参数指定了应该抽取样本而不放回,但不适用于投掷骰子。 这是一个十次骰子投掷的结果。 ```py die.sample(10) ``` | Face | | --- | | 5 | | 3 | | 3 | | 4 | | 2 | | 2 | | 4 | | 1 | | 6 | | 6 | 我们可以使用相同的方法来模拟尽可能多的投掷,然后绘制结果的经验直方图。 因为我们要反复这样做,所以我们定义了一个函数`empirical_hist_die`,它以样本大小为参数;该函数根据其参数多次投掷骰子,然后绘制直方图。 ```py def empirical_hist_die(n): die.sample(n).hist(bins = die_bins) ``` ### 经验直方图 这是十次投掷的经验直方图。 它看起来不像上面的概率直方图。 运行该单元格几次,看看它如何变化。 ```py empirical_hist_die(10) ``` 当样本量增加时,经验直方图开始看起来更像是理论概率的直方图。 ```py empirical_hist_die(100) ``` ```py empirical_hist_die(1000) ``` 当我们增加模拟中的投掷次数时,每个条形的面积接近 16.67%,这是概率直方图中每个条形的面积。 我们在实例中观察到了一般规则: ### 平均定律 如果偶然的实验在相同的条件下独立重复,那么从长远来看,事件发生的频率越来越接近事件的理论概率。 例如,从长远来看,四点的比例越来越接近 1/6。 这里“独立地且在相同的条件下”意味着,无论所有其他重复的结果如何,每个重复都以相同的方式执行。 ## 从总体中取样 当随机样本来自较大总体时,平均定律也成立。 作为一个例子,我们将研究航班延误时间的总体。 `united `表包含 2015 年夏天从旧金山出发的美联航国内航班的数据。数据由[美国运输部运输统计局](http://www.transtats.bts.gov/Fields.asp?Table_ID=293)公布。 这里有 13,825 行,每行对应一个航班。 列是航班日期,航班号,目的地机场代码和以分钟为单位的出发延误时间。有些延误时间是负的;那些航班提前离开。 ```py united = Table.read_table('united_summer2015.csv') united ``` | Date | Flight Number | Destination | Delay | | --- | --- | | 6/1/15 | 73 | HNL | 257 | | 6/1/15 | 217 | EWR | 28 | | 6/1/15 | 237 | STL | -3 | | 6/1/15 | 250 | SAN | 0 | | 6/1/15 | 267 | PHL | 64 | | 6/1/15 | 273 | SEA | -6 | | 6/1/15 | 278 | SEA | -8 | | 6/1/15 | 292 | EWR | 12 | | 6/1/15 | 300 | HNL | 20 | | 6/1/15 | 317 | IND | -10 | (省略了 13815 行) 一个航班提前 16 分钟起飞,另一个航班延误 580 分钟。 其他延迟时间几乎都在 -10 分钟到 200 分钟之间,如下面的直方图所示。 ```py united.column('Delay').min() -16 united.column('Delay').max() 580 delay_bins = np.append(np.arange(-20, 301, 10), 600) united.select('Delay').hist(bins = delay_bins, unit = 'minute') ``` 就本节而言,仅仅关注部分数据就足够了,我们忽略延迟超过 200 分钟的 0.8% 的航班。 这个限制只是为了视觉便利。 该表仍然保留所有的数据。 ```py united.where('Delay', are.above(200)).num_rows/united.num_rows 0.008390596745027125 delay_bins = np.arange(-20, 201, 10) united.select('Delay').hist(bins = delay_bins, unit = 'minute') ``` `[0,10)`的条形高度不到每分钟 3%,这意味着只有不到 30% 的航班延误了 0 到 10 分钟。 这是通过行的计数来确认的: ```py united.where('Delay', are.between(0, 10)).num_rows/united.num_rows 0.2935985533453888 ``` ### 样本的经验分布 现在让我们将这 13,825 个航班看做一个总体,并从中带放回地抽取随机样本。 将我们的分析代码打包成一个函数是有帮助的。 函数`empirical_hist_delay`以样本大小为参数,绘制结果的经验直方图。 ```py def empirical_hist_delay(n): united.sample(n).select('Delay').hist(bins = delay_bins, unit = 'minute') ``` 正如我们用骰子所看到的,随着样本量的增加,样本的经验直方图更接近于总体的直方图。 将这些直方图与上面的总体直方图进行比较。 ```py empirical_hist_delay(10) ``` ```py empirical_hist_delay(100) ``` 最一致的可见差异在总体中罕见的值之中。 在我们的示例中,这些值位于分布的最右边。 但随着样本量的增加,这些值以大致正确的比例,开始出现在样本中。 ```py empirical_hist_delay(1000) ``` ### 样本的经验直方图的总结 我们在本节中观察到的东西,可以总结如下: 对于较大的随机样本,样本的经验直方图类似于总体的直方图,概率很高。 这证明了,在统计推断中使用大量随机样本是合理的。 这个想法是,由于较大的随机样本可能类似于从中抽取的总体,从样本中计算出的数量可能接近于总体中相应的数量。 ## 轮盘赌 上面的分布让我们对整个随机样本有了印象。但有时候我们只是对基于样本计算的一个或两个量感兴趣。 例如,假设样本包含一系列投注的输赢。那么我们可能只是对赢得的总金额感兴趣,而不是输赢的整个序列。 使用我们的几率长期行为的新知识,让我们探索赌博游戏。我们将模拟轮盘赌,它在拉斯维加斯和蒙特卡洛等赌场中受欢迎。 在内华达,轮盘赌的主要随机器是一个带有 38 个口袋的轮子。其中两个口袋是绿色的,十八个黑色,十八个红色。轮子在主轴上,轮子上有一个小球。当轮子旋转时,球体跳起来,最后落在其中一个口袋里。这就是获胜的口袋。 `wheel`表代表内华达轮盘赌的口袋。 ```py wheel ``` | Pocket | Color | | --- | --- | | 0 | green | | 00 | green | | 1 | red | | 2 | black | | 3 | red | | 4 | black | | 5 | red | | 6 | black | | 7 | red | | 8 | black | (省略了 28 行) 您可以在轮盘赌桌上展示的几个预先指定的口袋下注。 如果你下注“红色”,如果球落在红色的口袋里,你就赢了。 红色的下注返回相等的钱。 也就是说,它支付一比一。为了理解这是什么意思,假设你在“红色”下注一美元。 第一件事情发生之前,即使在车轮旋转之前,你必须交出你的一美元。 如果球落在绿色或黑色的口袋里,你就失去它了。 如果球落在红色的口袋里,你会把你的钱拿回来(让你不输不赢),再加上另外一美元的奖金。 函数`red_winnings`以一个颜色作为参数,如果颜色是红色,则返回`1`。 对于所有其他颜色,它返回`-1`。 我们将`red_winnings`应用于`wheel`的`Color`列,来获得新的表`bets`,如果您在红色下注一美元,它显示每个口袋的净收益。 ```py def red_winnings(color): if color == 'red': return 1 else: return -1 bets = wheel.with_column( 'Winnings: Red', wheel.apply(red_winnings, 'Color') ) bets ``` | Pocket | Color | Winnings: Red | | --- | --- | | 0 | green | -1 | | 00 | green | -1 | | 1 | red | 1 | | 2 | black | -1 | | 3 | red | 1 | | 4 | black | -1 | | 5 | red | 1 | | 6 | black | -1 | | 7 | red | 1 | | 8 | black | -1 | (省略了 28 行) 假设我们决定在红色下注一美元,会发生什么呢? 这里是一轮的模拟。 ```py one_spin = bets.sample(1) one_spin ``` | Pocket | Color | Winnings: Red | | --- | --- | | 14 | red | 1 |