九、經(jīng)驗(yàn)分布
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
大部分?jǐn)?shù)據(jù)科學(xué)都涉及來自大型隨機(jī)樣本的數(shù)據(jù)。 在本節(jié)中,我們將研究這些樣本的一些屬性。
我們將從一個簡單的實(shí)驗(yàn)開始:多次擲骰子并跟蹤出現(xiàn)的點(diǎn)數(shù)。 die
表包含骰子面上的點(diǎn)數(shù)。 所有的數(shù)字只出現(xiàn)一次,因?yàn)槲覀兗僭O(shè)骰子是平等的。
die = Table().with_column('Face', np.arange(1, 7, 1))
die
Face |
---|
1 |
2 |
3 |
4 |
5 |
6 |
概率分布
下面的直方圖幫助我們可視化,每個面出現(xiàn)概率為 1/6 事實(shí)。 我們說直方圖顯示了所有可能的面的概率分布。 由于所有的條形表示相同的百分比幾率,所以這個分布成為整數(shù) 1 到 6 上的均勻分布。
die_bins = np.arange(0.5, 6.6, 1)
die.hist(bins = die_bins)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-1.png
遞增值由相同的固定量分隔,例如骰子面上的值(遞增值由 1 分隔),這樣的變量被稱為離散值。上面的直方圖被稱為離散直方圖。它的桶由數(shù)組die_bins
指定,并確保每個條形的中心是對應(yīng)的整數(shù)值。
重要的是要記住,骰子不能顯示 1.3 個點(diǎn)或 5.2 個點(diǎn) - 總是顯示整數(shù)個點(diǎn)。但是我們的可視化將每個值的概率擴(kuò)展到條形區(qū)域。雖然在本課程的這個階段這看起來有些隨意,但是稍后當(dāng)我們在離散直方圖上疊加平滑曲線時,這將變得很重要。
在繼續(xù)之前,讓我們確保軸域上的數(shù)字是有意義的。每個面的概率是 1/6,四舍五入到小數(shù)點(diǎn)后兩位的概率是 16.67%。每個桶的寬度是 1 個單位。所以每個條形的高度是每單位 16.67%。這與圖形的水平和垂直比例一致。
經(jīng)驗(yàn)分布
上面的分布由每個面的理論概率組成。 這不基于數(shù)據(jù)。 不投擲任何骰子,它就可以被研究和理解。
另一方面,經(jīng)驗(yàn)分布是觀測數(shù)據(jù)的分布。 他們可以通過經(jīng)驗(yàn)直方圖可視化。
讓我們通過模擬一個骰子的投擲來獲得一些數(shù)據(jù)。 這可以通過 1 到 6 的整數(shù)的帶放回隨機(jī)抽樣來完成。為了使用 Python 來實(shí)現(xiàn),我們將使用Table
的sample
方法,它帶放回地隨機(jī)抽取表中的行。它的參數(shù)是樣本量,它返回一個由選定的行組成的表。 with_replacement=False
的可選參數(shù)指定了應(yīng)該抽取樣本而不放回,但不適用于投擲骰子。
這是一個十次骰子投擲的結(jié)果。
die.sample(10)
Face |
---|
5 |
3 |
3 |
4 |
2 |
2 |
4 |
1 |
6 |
6 |
我們可以使用相同的方法來模擬盡可能多的投擲,然后繪制結(jié)果的經(jīng)驗(yàn)直方圖。 因?yàn)槲覀円磸?fù)這樣做,所以我們定義了一個函數(shù)empirical_hist_die
,它以樣本量為參數(shù);該函數(shù)根據(jù)其參數(shù)多次投擲骰子,然后繪制直方圖。
def empirical_hist_die(n):
die.sample(n).hist(bins = die_bins)
經(jīng)驗(yàn)直方圖
這是十次投擲的經(jīng)驗(yàn)直方圖。 它看起來不像上面的概率直方圖。 運(yùn)行該單元格幾次,看看它如何變化。
empirical_hist_die(10)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-2.png
當(dāng)樣本量增加時,經(jīng)驗(yàn)直方圖開始看起來更像是理論概率的直方圖。
empirical_hist_die(100)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-3.png
empirical_hist_die(1000)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-4.png
當(dāng)我們增加模擬中的投擲次數(shù)時,每個條形的面積接近 16.67%,這是概率直方圖中每個條形的面積。
我們在實(shí)例中觀察到了一般規(guī)則:
平均定律
如果偶然的實(shí)驗(yàn)在相同的條件下獨(dú)立重復(fù),那么從長遠(yuǎn)來看,事件發(fā)生的頻率越來越接近事件的理論概率。
例如,從長遠(yuǎn)來看,四點(diǎn)的比例越來越接近 1/6。
這里“獨(dú)立地且在相同的條件下”意味著,無論所有其他重復(fù)的結(jié)果如何,每個重復(fù)都以相同的方式執(zhí)行。
從總體中取樣
當(dāng)隨機(jī)樣本來自較大總體時,平均定律也成立。
作為一個例子,我們將研究航班延誤時間的總體。 united
表包含 2015 年夏天從舊金山出發(fā)的美聯(lián)航國內(nèi)航班的數(shù)據(jù)。數(shù)據(jù)由美國運(yùn)輸部運(yùn)輸統(tǒng)計(jì)局公布。
這里有 13,825 行,每行對應(yīng)一個航班。 列是航班日期,航班號,目的地機(jī)場代碼和以分鐘為單位的出發(fā)延誤時間。有些延誤時間是負(fù)的;那些航班提前離開。
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 分鐘之間,如下面的直方圖所示。
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')
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-5.png
就本節(jié)而言,僅僅關(guān)注部分?jǐn)?shù)據(jù)就足夠了,我們忽略延遲超過 200 分鐘的 0.8% 的航班。 這個限制只是為了視覺便利。 該表仍然保留所有的數(shù)據(jù)。
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')
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-6.png
[0,10)
的條形高度不到每分鐘 3%,這意味著只有不到 30% 的航班延誤了 0 到 10 分鐘。 這是通過行的計(jì)數(shù)來確認(rèn)的:
united.where('Delay', are.between(0, 10)).num_rows/united.num_rows
0.2935985533453888
樣本的經(jīng)驗(yàn)分布
現(xiàn)在讓我們將這 13,825 個航班看做一個總體,并從中帶放回地抽取隨機(jī)樣本。 將我們的分析代碼打包成一個函數(shù)是有幫助的。 函數(shù)empirical_hist_delay
以樣本量為參數(shù),繪制結(jié)果的經(jīng)驗(yàn)直方圖。
def empirical_hist_delay(n):
united.sample(n).select('Delay').hist(bins = delay_bins, unit = 'minute')
正如我們用骰子所看到的,隨著樣本量的增加,樣本的經(jīng)驗(yàn)直方圖更接近于總體的直方圖。 將這些直方圖與上面的總體直方圖進(jìn)行比較。
empirical_hist_delay(10)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-7.png
empirical_hist_delay(100)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-8.png
最一致的可見差異在總體中罕見的值之中。 在我們的示例中,這些值位于分布的最右邊。 但隨著樣本量的增加,這些值以大致正確的比例,開始出現(xiàn)在樣本中。
empirical_hist_delay(1000)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-9.png
樣本的經(jīng)驗(yàn)直方圖的總結(jié)
我們在本節(jié)中觀察到的東西,可以總結(jié)如下:
對于大型隨機(jī)樣本,樣本的經(jīng)驗(yàn)直方圖類似于總體的直方圖,概率很高。
這證明了,在統(tǒng)計(jì)推斷中使用大型隨機(jī)樣本是合理的。 這個想法是,由于大型隨機(jī)樣本可能類似于從中抽取的總體,從樣本中計(jì)算出的數(shù)量可能接近于總體中相應(yīng)的數(shù)量。
輪盤賭
上面的分布讓我們對整個隨機(jī)樣本有了印象。但有時候我們只是對基于樣本計(jì)算的一個或兩個量感興趣。
例如,假設(shè)樣本包含一系列投注的輸贏。那么我們可能只是對贏得的總金額感興趣,而不是輸贏的整個序列。
使用我們的幾率長期行為的新知識,讓我們探索賭博游戲。我們將模擬輪盤賭,它在拉斯維加斯和蒙特卡洛等賭場中受歡迎。
在內(nèi)華達(dá),輪盤賭的主要隨機(jī)器是一個帶有 38 個口袋的輪子。其中兩個口袋是綠色的,十八個黑色,十八個紅色。輪子在主軸上,輪子上有一個小球。當(dāng)輪子旋轉(zhuǎn)時,球體跳起來,最后落在其中一個口袋里。這就是獲勝的口袋。
wheel
表代表內(nèi)華達(dá)輪盤賭的口袋。
wheel
Color | |
---|---|
0 | green |
00 | green |
1 | red |
2 | black |
3 | red |
4 | black |
5 | red |
6 | black |
7 | red |
8 | black |
(省略了 28 行)
你可以對輪盤賭桌上展示的幾個預(yù)先指定的口袋下注。 如果你對“紅色”下注,如果球落在紅色的口袋里,你就贏了。
紅色的下注返回相等的錢。 也就是說,它支付一比一。為了理解這是什么意思,假設(shè)你在“紅色”下注一美元。 第一件事情發(fā)生之前,即使在車輪旋轉(zhuǎn)之前,你必須交出你的一美元。 如果球落在綠色或黑色的口袋里,你就失去它了。 如果球落在紅色的口袋里,你會把你的錢拿回來(讓你不輸不贏),再加上另外一美元的獎金。
函數(shù)red_winnings
以一個顏色作為參數(shù),如果顏色是紅色,則返回1
。 對于所有其他顏色,它返回-1
。 我們將red_winnings
應(yīng)用于wheel
的Color
列,來獲得新的表bets
,如果你對紅色下注一美元,它顯示每個口袋的凈收益。
def red_winnings(color):
if color == 'red':
return 1
else:
return -1
bets = wheel.with_column(
'Winnings: Red', wheel.apply(red_winnings, 'Color')
)
bets
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 行)
假設(shè)我們決定對紅色下注一美元,會發(fā)生什么呢?
這里是一輪的模擬。
one_spin = bets.sample(1)
one_spin
Color | Winnings: Red | |
---|---|---|
14 | red | 1 |
這輪的顏色是Color
列中的值。 無論你的賭注如何,結(jié)果可能是紅色,綠色或黑色。 要看看這些事件發(fā)生的頻率,我們可以模擬許多這樣的單獨(dú)輪次,并繪制出我們所看到的顏色的條形圖。 (我們可以稱之為經(jīng)驗(yàn)條形圖。)
為了實(shí)現(xiàn)它,我們可以使用for
循環(huán)。 我們在這里選擇了重復(fù) 5000 次,但是當(dāng)你運(yùn)行這個單元格時,你可以改變它。
num_simulations = 5000
colors = make_array()
winnings_on_red = make_array()
for i in np.arange(num_simulations):
spin = bets.sample(1)
new_color = spin.column("Color").item(0)
colors = np.append(colors, new_color)
new_winnings = spin.column('Winnings: Red')
winnings_on_red = np.append(winnings_on_red, new_winnings)
Table().with_column('Color', colors)\
.group('Color')\
.barh('Color')
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-10.png
38 個口袋里有 18 個是紅色的,每個口袋都是等可能的。 因此,在 5000 次模擬中,我們預(yù)計(jì)大致(但可能不是完全)看到18/38*5000
或者 2,368 次紅色。模擬證明了這一點(diǎn)。
在模擬中,我們也記錄了你的獎金。 這些經(jīng)驗(yàn)直方圖顯示了,你對紅色下注的不同結(jié)果的(近似)幾率。
Table().with_column('Winnings: Red', winnings_on_red)\
.hist(bins = np.arange(-1.55, 1.65, .1))
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-11.png
每個模擬的唯一可能的結(jié)果是,你贏了一美元或輸了一美元,這反映在直方圖中。 我們也可以看到,你贏的次數(shù)要比輸?shù)拇螖?shù)少一點(diǎn)。 你喜歡這個賭博策略嗎?
多次游戲
大多數(shù)輪盤賭玩家玩好幾輪。 假設(shè)你在 200 次獨(dú)立輪次反復(fù)下注一美元。 你總共會賺多少錢?
這里是一套 200 輪的模擬。 spins
表包括所有 200 個賭注的結(jié)果。 你的凈收益是Winnings: Red
列中所有 +1 和 -1 的和。
spins = bets.sample(200)
spins.column('Winnings: Red').sum()
-26
運(yùn)行幾次單元格。 有時你的凈收益是正的,但更多的時候它似乎是負(fù)的。
為了更清楚地看到發(fā)生了什么,讓我們多次模擬 200 輪,就像我們模擬一輪那樣。 對于每次模擬,我們將記錄來自 200 輪的總獎金。 然后我們將制作 5000 個不同的模擬總獎金的直方圖。
num_spins = 200
net_gain = make_array()
for i in np.arange(num_simulations):
spins = bets.sample(num_spins)
new_net_gain = spins.column('Winnings: Red').sum()
net_gain = np.append(net_gain, new_net_gain)
Table().with_column('Net Gain on Red', net_gain).hist()
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-12.png
注意橫軸上 0 的位置。 這就是你不賺不賠的地方。 通過使用這個賭博策略,你喜歡這個賺錢幾率嗎?
如果對紅色下注不吸引人,也許值得嘗試不同的賭注。 “分割”(Split)是輪盤賭桌上兩個相鄰號碼的下注,例如 0 和 00。分割的回報是 17 比 1。
split_winnings
函數(shù)將口袋作為參數(shù),如果口袋是 0 或 00,則返回 17。對于所有其他口袋,返回 -1。
表格more_bets
是投注表格的一個版本,擴(kuò)展的一列是對 0/00 分割下注的情況下,每個口袋的獎金。
def split_winnings(pocket):
if pocket == '0':
return 17
elif pocket == '00':
return 17
else:
return -1
more_bets = wheel.with_columns(
'Winnings: Red', wheel.apply(red_winnings, 'Color'),
'Winnings: Split', wheel.apply(split_winnings, 'Pocket')
)
more_bets
Color | Winnings: Red | Winnings: Split | |
---|---|---|---|
0 | green | -1 | 17 |
00 | green | -1 | 17 |
1 | red | 1 | -1 |
2 | black | -1 | -1 |
3 | red | 1 | -1 |
4 | black | -1 | -1 |
5 | red | 1 | -1 |
6 | black | -1 | -1 |
7 | red | 1 | -1 |
8 | black | -1 | -1 |
(省略了 28 行)
下面的代碼模擬了兩個投注的結(jié)果 - 紅色和 0/00 分割 - 在 200 輪中。 代碼與以前的模擬相同,除了添加了 Split。 (注意:num_simulations
和num_spins
之前分別定義為 5,000 和 200,所以我們不需要再次定義它們。)
net_gain_red = make_array()
net_gain_split = make_array()
for i in np.arange(num_simulations):
spins = more_bets.sample(num_spins)
new_net_gain_red = spins.column('Winnings: Red').sum()
net_gain_red = np.append(net_gain_red, new_net_gain_red)
new_net_gain_split = spins.column('Winnings: Split').sum()
net_gain_split = np.append(net_gain_split, new_net_gain_split)
Table().with_columns(
'Net Gain on Red', net_gain_red,
'Net Gain on Split', net_gain_split
).hist(bins=np.arange(-200, 200, 20))
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-13.png
橫軸上 0 的位置表明,無論你選擇哪種賭注,你都更有可能賠錢而不是賺錢。在兩個直方圖中,不到 50% 的區(qū)域在 0 的右側(cè)。
然而,分割的賭注賺錢幾率更大,賺取超過 50 美元的機(jī)會也是如此。 金色直方圖有很多區(qū)域在五十美元的右側(cè),而藍(lán)色直方圖幾乎沒有。 那么你應(yīng)該對分割下注嗎?
這取決于你愿意承擔(dān)多少風(fēng)險,因?yàn)橹狈綀D還表明,如果你對分割下注,你比對紅色下注更容易損失超過 50 美元。
輪盤賭桌上,所有賭注的單位美元的預(yù)期凈損失相同(除了線注,這是更糟的)。 但一些賭注的回報比其他賭注更為可變。 你可以選擇這些賭注,只要你準(zhǔn)備好可能會大輸一場。
統(tǒng)計(jì)量的經(jīng)驗(yàn)分布
平均定律意味著,大型隨機(jī)樣本的經(jīng)驗(yàn)分布類似于總體的分布,概率相當(dāng)高。
在兩個直方圖中可以看到相似之處:大型隨機(jī)樣本的經(jīng)驗(yàn)直方圖很可能類似于總體的直方圖。
提醒一下,這里是所有美聯(lián)航航班延誤的直方圖,以及這些航班的大小為 1000 的隨機(jī)樣本的經(jīng)驗(yàn)直方圖。
united = Table.read_table('united_summer2015.csv')
delay_bins = np.arange(-20, 201, 10)
united.select('Delay').hist(bins = delay_bins, unit = 'minute')
plots.title('Population');
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-14.png
sample_1000 = united.sample(1000)
sample_1000.select('Delay').hist(bins = delay_bins, unit = 'minute')
plots.title('Sample of Size 1000');
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-15.png
兩個直方圖明顯相似,雖然他們并不等價。
參數(shù)
我們經(jīng)常對總體相關(guān)的數(shù)量感興趣。
在選民的總體中,有多少人會投票給候選人 A 呢?
在 Facebook 用戶的總體中,用戶最多擁有的 Facebook 好友數(shù)是多少?
在美聯(lián)航航班的總體中,起飛延誤時間的中位數(shù)是多少?
與總體相關(guān)的數(shù)量被稱為參數(shù)。 對于美聯(lián)航航班的總體,我們知道參數(shù)“延誤時間的中位數(shù)”的值:
np.median(united.column('Delay'))
2.0
NumPy 函數(shù)median
返回?cái)?shù)組的中值(中位數(shù))。 在所有的航班中,延誤時間的中位數(shù)為 2 分鐘。 也就是說,總體中約有 50% 的航班延誤了 2 分鐘以內(nèi):
united.where('Delay', are.below_or_equal_to(2)).num_rows/united.num_rows
0.5018444846292948
一半的航班在預(yù)定起飛時間的 2 分鐘之內(nèi)起飛。 這是非常短暫的延誤!
注意。 由于“重復(fù)”,百分比并不完全是 50,也就是說,延誤了 2 分鐘的航班有 480 個。數(shù)據(jù)集中的重復(fù)很常見,我們不會在這個課程中擔(dān)心它。
united.where('Delay', are.equal_to(2)).num_rows
480
統(tǒng)計(jì)
在很多情況下,我們會感興趣的是找出未知參數(shù)的值。 為此,我們將依賴來自總體的大型隨機(jī)樣本的數(shù)據(jù)。
統(tǒng)計(jì)量(注意是單數(shù)!)是使用樣本中數(shù)據(jù)計(jì)算的任何數(shù)字。 因此,樣本中位數(shù)是一個統(tǒng)計(jì)量。
請記住,sample_1000
包含來自united
的 1000 個航班的隨機(jī)樣本。 樣本中位數(shù)的觀測值是:
np.median(sample_1000.column('Delay'))
2.0
我們的樣本 - 一千個航班 - 給了我們統(tǒng)計(jì)量的觀測值。 這提出了一個重要的推論問題:
統(tǒng)計(jì)量的數(shù)值可能會有所不同。 使用基于隨機(jī)樣本的任何統(tǒng)計(jì)量時,首先考慮的事情是,樣本可能不同,因此統(tǒng)計(jì)量也可能不同。
np.median(united.sample(1000).column('Delay'))
3.0
運(yùn)行單元格幾次來查看答案的變化。 通常它等于 2,與總體參數(shù)值相同。 但有時候不一樣。
統(tǒng)計(jì)量有多么不同? 回答這個問題的一種方法是多次運(yùn)行單元格,并記下這些值。 這些值的直方圖將告訴我們統(tǒng)計(jì)量的分布。
我們將使用for
循環(huán)來“多次運(yùn)行單元格”。 在此之前,讓我們注意模擬中的主要步驟。
模擬統(tǒng)計(jì)量
我們將使用以下步驟來模擬樣本中位數(shù)。 你可以用任何其他樣本量來替換 1000 的樣本量,并將樣本中位數(shù)替換為其他統(tǒng)計(jì)量。
第一步:生成一個統(tǒng)計(jì)量。 抽取大小為 1000 的隨機(jī)樣本,并計(jì)算樣本的中位數(shù)。 注意中位數(shù)的值。
第二步:生成更多的統(tǒng)計(jì)值。 重復(fù)步驟 1 多次,每次重新抽樣。
第三步:結(jié)果可視化。 在第二步結(jié)束時,你將會記錄許多樣本中位數(shù),每個中位數(shù)來自不同的樣本。 你可以在表格中顯示所有的中位數(shù)。 你也可以使用直方圖來顯示它們 - 這是統(tǒng)計(jì)量的經(jīng)驗(yàn)直方圖。
我們現(xiàn)在執(zhí)行這個計(jì)劃。 正如在所有的模擬中,我們首先創(chuàng)建一個空數(shù)組,我們在其中收集我們的結(jié)果。
- 上面的第一步是
for
循環(huán)的主體。 - 第二步,重復(fù)第一步“無數(shù)次”,由循環(huán)完成。 我們“無數(shù)次”是5000次,但是你可以改變這個。
- 第三步是顯示表格,并在后面的單元格中調(diào)用
hist
。
該單元格需要大量的時間來運(yùn)行。 那是因?yàn)樗趫?zhí)行抽取大小為 1000 的樣本,并計(jì)算其中位數(shù)的過程,重復(fù) 5000 次。 這是很多抽樣和重復(fù)!
medians = make_array()
for i in np.arange(5000):
new_median = np.median(united.sample(1000).column('Delay'))
medians = np.append(medians, new_median)
Table().with_column('Sample Median', medians)
Sample Median |
---|
3 |
2 |
2 |
3 |
2 |
2 |
2 |
3 |
1 |
3 |
(省略了 4990 行)
Table().with_column('Sample Median', medians).hist(bins=np.arange(0.5, 5, 1))
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-16.png
你可以看到樣本中位數(shù)很可能接近 2,這是總體中位數(shù)的值。 由于 1000 次航班延誤的樣本可能與延誤總體相似,因此這些樣本的延誤中位數(shù)應(yīng)接近總體的延誤中位數(shù),也就不足為奇了。
這是一個例子,統(tǒng)計(jì)量如何較好估計(jì)參數(shù)。
模擬的威力
如果我們能夠生成所有可能的大小為 1000 的隨機(jī)樣本,我們就可以知道所有可能的統(tǒng)計(jì)量(樣本中位數(shù)),以及所有這些值的概率。我們可以在統(tǒng)計(jì)量的概率直方圖中可視化所有值和概率。
但在許多情況下(包括這個),所有可能的樣本數(shù)量足以超過計(jì)算機(jī)的容量,概率的純粹數(shù)學(xué)計(jì)算可能有些困難。
這是經(jīng)驗(yàn)直方圖的作用。
我們知道,如果樣本量很大,并且如果重復(fù)抽樣過程無數(shù)次,那么根據(jù)平均定律,統(tǒng)計(jì)量的經(jīng)驗(yàn)直方圖可能類似于統(tǒng)計(jì)量的概率直方圖。
這意味著反復(fù)模擬隨機(jī)過程是一種近似概率分布的方法,不需要在數(shù)學(xué)上計(jì)算概率,或者生成所有可能的隨機(jī)樣本。因此,計(jì)算機(jī)模擬成為數(shù)據(jù)科學(xué)中的一個強(qiáng)大工具。他們可以幫助數(shù)據(jù)科學(xué)家理解隨機(jī)數(shù)量的特性,這些數(shù)據(jù)會以其他方式進(jìn)行分析。
這就是這種的模擬的經(jīng)典例子。
估計(jì)敵軍飛機(jī)的數(shù)量
在第二次世界大戰(zhàn)中,為盟軍工作的數(shù)據(jù)分析師負(fù)責(zé)估算德國戰(zhàn)機(jī)的數(shù)量。 這些數(shù)據(jù)包括盟軍觀察到的德國飛機(jī)的序列號。 這些序列號為數(shù)據(jù)分析師提供了答案。
為了估算戰(zhàn)機(jī)總數(shù),數(shù)據(jù)分析人員必須對序列號做出一些假設(shè)。 這里有兩個這樣的假設(shè),大大簡化,使我們的計(jì)算更容易。
戰(zhàn)機(jī)有
N
架,編號為1,2, ..., N
。觀察到的飛機(jī)從
N
架飛機(jī)中均勻、隨機(jī)帶放回地抽取。
目標(biāo)是估計(jì)數(shù)字N
。 這是未知的參數(shù)。
假設(shè)你觀察一些飛機(jī)并記下他們的序列號。 你如何使用這些數(shù)據(jù)來猜測N
的值? 用于估計(jì)的自然和簡單的統(tǒng)計(jì)量,就是觀察到的最大的序列號。
讓我們看看這個統(tǒng)計(jì)量如何用于估計(jì)。 但首先是另一個簡化:現(xiàn)在一些歷史學(xué)家估計(jì),德國的飛機(jī)制造業(yè)生產(chǎn)了近 10 萬架不同類型的戰(zhàn)機(jī),但在這里我們只能想象一種。 這使得假設(shè) 1 更易于證明。
假設(shè)實(shí)際上有N = 300
個這樣的飛機(jī),而且你觀察到其中的 30 架。 我們可以構(gòu)造一個名為serialno
的表,其中包含序列號1
到N
。 然后,我們可以帶放回取樣 30 次(見假設(shè) 2),來獲得我們的序列號樣本。 我們的統(tǒng)計(jì)量是這 30 個數(shù)字中的最大值。 這就是我們用來估計(jì)參數(shù)N
的東西。
N = 300
serialno = Table().with_column('serial Number', np.arange(1, N+1))
serialno
serial number |
---|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
(省略了 290 行)
serialno.sample(30).column(0).max()
291
與所有涉及隨機(jī)抽樣的代碼一樣,運(yùn)行該單元幾次;來查看變化。你會發(fā)現(xiàn),即使只有 300 個觀測值,最大的序列號通常在 250-300 范圍內(nèi)。
原則上,最大的序列號可以像 1 那樣小,如果你不幸看到了 30 次 1 號機(jī)。如果你至少觀察到一次 300 號機(jī),它可能會增大到 300。但通常情況下,它似乎處于非常高的 200 以上。看起來,如果你使用最大的觀測序列號作為你對總數(shù)的估計(jì),你不會有太大的錯誤。
模擬統(tǒng)計(jì)
讓我們模擬統(tǒng)計(jì),看看我們能否證實(shí)它。模擬的步驟是:
第一步。從 1 到 300 帶放回地隨機(jī)抽樣 30 次,并注意觀察到的最大數(shù)量。這是統(tǒng)計(jì)量。
第二步。重復(fù)步驟一 750 次,每次重新取樣。你可以用任何其他的大數(shù)值代替 750。
第三步。創(chuàng)建一個表格來顯示統(tǒng)計(jì)量的 750 個觀察值,并使用這些值繪制統(tǒng)計(jì)量的經(jīng)驗(yàn)直方圖。
sample_size = 30
repetitions = 750
maxes = make_array()
for i in np.arange(repetitions):
sampled_numbers = serialno.sample(sample_size)
maxes = np.append(maxes, sampled_numbers.column(0).max())
Table().with_column('Max Serial Number', maxes)
Max Serial Number |
---|
280 |
253 |
294 |
299 |
298 |
237 |
296 |
297 |
293 |
295 |
(省略了 740 行)
every_ten = np.arange(1, N+100, 10)
Table().with_column('Max Serial Number', maxes).hist(bins = every_ten)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-17.png
這是 750 個估計(jì)值的直方圖,每個估計(jì)值是統(tǒng)計(jì)量“觀察到的最大序列號”的觀測值。
正如你所看到的,盡管在理論上它們可能會小得多,但估計(jì)都在 300 附近。直方圖表明,作為飛機(jī)總數(shù)的估計(jì),最大的序列號可能低了大約 10 到 25 個。但是,飛機(jī)的真實(shí)數(shù)量低了 50 個是不太可能的。
良好的近似
我們前面提到過,如果生成所有可能的樣本,并計(jì)算每個樣本的統(tǒng)計(jì)量,那么你將準(zhǔn)確了解統(tǒng)計(jì)量可能有多么不同。事實(shí)上,你將會完整地列舉統(tǒng)計(jì)量的所有可能值及其所有概率。
換句話說,你將得到統(tǒng)計(jì)量的概率分布和概率直方圖。
統(tǒng)計(jì)量的概率分布也稱為統(tǒng)計(jì)量的抽樣分布,因?yàn)樗谒锌赡艿臉颖尽?/p>
但是,我們上面已經(jīng)提到,可能的樣本總數(shù)往往非常大。例如,如果有 300 架飛機(jī),你可以看到的,30 個序列號的可能序列總數(shù)為:
300**30
205891132094649000000000000000000000000000000000000000000000000000000000000
這是很多樣本。 幸運(yùn)的是,我們不必生成所有這些。 我們知道統(tǒng)計(jì)量的經(jīng)驗(yàn)直方圖,基于許多但不是全部可能的樣本,是概率直方圖的很好的近似。 因此統(tǒng)計(jì)量的經(jīng)驗(yàn)分布讓我們很好地了解到,統(tǒng)計(jì)量可能有多么不同。
確實(shí),統(tǒng)計(jì)量的概率分布包含比經(jīng)驗(yàn)分布更準(zhǔn)確的統(tǒng)計(jì)量信息。 但是,正如在這個例子中一樣,通常經(jīng)驗(yàn)分布所提供的近似值,足以讓數(shù)據(jù)科學(xué)家了解統(tǒng)計(jì)量可以變化多少。 如果你有一臺計(jì)算機(jī),經(jīng)驗(yàn)分布更容易計(jì)算。 因此,當(dāng)數(shù)據(jù)科學(xué)家試圖理解統(tǒng)計(jì)的性質(zhì)時,通常使用經(jīng)驗(yàn)分布而不是精確的概率分布。
參數(shù)的不同估計(jì)
這里舉一個例子來說明這一點(diǎn)。 到目前為止,我們已經(jīng)使用了最大的觀測序號作為飛機(jī)總數(shù)的估計(jì)。 但還有其他可能的估計(jì),我們現(xiàn)在將考慮其中之一。
這個估計(jì)的基本思想是觀察到的序列號的平均值可能在1到N
之間。 因此,如果A
是平均值,那么:
因此,可以使用一個新的統(tǒng)計(jì)量化來估計(jì)飛機(jī)總數(shù):取觀測到的平均序列號并加倍。
與使用最大的觀測數(shù)據(jù)相比,這種估計(jì)方法如何? 計(jì)算新統(tǒng)計(jì)量的概率分布并不容易。 但是和以前一樣,我們可以模擬它來近似得到概率。 我們來看看基于重復(fù)抽樣的統(tǒng)計(jì)量的經(jīng)驗(yàn)分布。 為了便于比較,重復(fù)次數(shù)選擇為 750,與之前的模擬相同。
maxes = make_array()
twice_ave = make_array()
for i in np.arange(repetitions):
sampled_numbers = serialno.sample(sample_size)
new_max = sampled_numbers.column(0).max()
maxes = np.append(maxes, new_max)
new_twice_ave = 2*np.mean(sampled_numbers.column(0))
twice_ave = np.append(twice_ave, new_twice_ave)
results = Table().with_columns(
'Repetition', np.arange(1, repetitions+1),
'Max', maxes,
'2*Average', twice_ave
)
results
Repetition | Max | 2*Average |
---|---|---|
1 | 296 | 312.067 |
2 | 283 | 290.133 |
3 | 290 | 250.667 |
4 | 296 | 306.8 |
5 | 298 | 335.533 |
6 | 281 | 240 |
7 | 300 | 317.267 |
8 | 295 | 322.067 |
9 | 296 | 317.6 |
10 | 299 | 308.733 |
(省略了 740 行)
請注意,與所觀察到的最大數(shù)字不同,新的估計(jì)值(“平均值的兩倍”)可能會高估飛機(jī)的數(shù)量。 當(dāng)觀察到的序列號的平均值接近于N
而不是1
時,就會發(fā)生這種情況。
下面的直方圖顯示了兩個估計(jì)的經(jīng)驗(yàn)分布。
results.drop(0).hist(bins = every_ten)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/9-18.png
你可以看到,原有方法幾乎總是低估; 形式上,我們說它是有偏差的。 但它的變異性很小,很可能接近真正的飛機(jī)總數(shù)。
新方法高估了它,和低估的頻率一樣,因此從長遠(yuǎn)來看,平均而言大致沒有偏差。 然而,它比舊的估計(jì)更可變,因此容易出現(xiàn)較大的絕對誤差。
這是一個偏差 - 變異性權(quán)衡的例子,在競爭性估計(jì)中并不罕見。 你決定使用哪種估計(jì)取決于對你最重要的誤差種類。 就敵機(jī)而言,低估總數(shù)可能會造成嚴(yán)重的后果,在這種情況下,你可能會選擇使用更加可變的方法,它一半幾率都是高估的。 另一方面,如果高估導(dǎo)致了防范不存在的飛機(jī)的不必要的高成本,那么你可能會對低估的方法感到滿意。
技術(shù)注解
事實(shí)上,“兩倍均值”不是無偏的。平均而言,它正好高估了 1。例如,如果N
等于 3,來自1,2,3
的抽取結(jié)果的均值是2
,2 x 2 = 4
,它比N
多了 1。“兩倍均值”減 1 是N
的無偏估計(jì)量。