十一喇潘、估計
原文:Estimation
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
在前一章中,我們開始開發(fā)推斷思維的方法梭稚。特別是颖低,我們學(xué)會了如何使用數(shù)據(jù),在世界的兩個假設(shè)之間做決策弧烤。但是我們通常只想知道忱屑,某件事情有多大。
例如扼褪,在前面的章節(jié)中想幻,我們調(diào)查了敵人可能擁有的戰(zhàn)機(jī)數(shù)量。在選舉年话浇,我們可能想知道有多少選民贊成特定候選人脏毯。為了評估目前的經(jīng)濟(jì)狀況,我們可能會對美國家庭年收入的中位數(shù)感興趣幔崖。
在本章中食店,我們將開發(fā)一種估計未知參數(shù)的方法。請記住赏寇,參數(shù)是總體相關(guān)的數(shù)值吉嫩。
要弄清參數(shù)的值,我們需要數(shù)據(jù)嗅定。如果我們有整個人口的相關(guān)數(shù)據(jù)自娩,我們可以簡單地計算參數(shù)。
但是渠退,如果人口非常龐大(例如忙迁,如果它由美國的所有家庭組成)脐彩,那么收集整個人口的數(shù)據(jù)可能過于昂貴和耗時。在這種情況下姊扔,數(shù)據(jù)科學(xué)家依賴從人口中隨機(jī)抽樣惠奸。
這導(dǎo)致了一個推斷問題:如何根據(jù)隨機(jī)樣本中的數(shù)據(jù),對未知參數(shù)做出正確的結(jié)論恰梢?我們將用推斷思維來回答這個問題佛南。
基于隨機(jī)樣本的統(tǒng)計量可能是總體中未知參數(shù)的合理估計。例如嵌言,你可能希望使用家庭樣本的年收入中位數(shù)嗅回,來估計美國所有家庭的年收入中位數(shù)。
但任何統(tǒng)計量的值都取決于樣本呀页,樣本基于隨機(jī)抽取妈拌。所以每次數(shù)據(jù)科學(xué)家得到了一個基于隨機(jī)樣本的估計,他們都面臨一個問題:
“如果樣本是不同的蓬蝶,這個估計有多大的不同呢?”
在本章中猜惋,你將學(xué)習(xí)一種回答這個問題的方法丸氛。答案將為你提供工具來估算數(shù)值參數(shù),并量化估算中的誤差量著摔。
我們將以百分位數(shù)開始缓窜。最有名的百分位數(shù)是中位數(shù),通常用于收入數(shù)據(jù)的摘要谍咆。在我們即將開發(fā)的估計方法中禾锤,其他百分位數(shù)也是非常重要的。所以我們一開始要仔細(xì)定義百分位數(shù)摹察。
百分位數(shù)
數(shù)值數(shù)據(jù)可以按照升序或降序排序彭则。因此吐葵,數(shù)值數(shù)據(jù)集的值具有等級順序。百分位數(shù)是特定等級的值。
例如北戏,如果你的考試成績在第 95 個百分位,一個常見的解釋是只有 5% 的成績高于你的成績雄卷。中位數(shù)是第 50 個百分位熄驼;通常假定數(shù)據(jù)集中 50% 的值高于中值。
但是劝赔,給予百分位一個精確定義誓焦,適用于所有等級和所有列表,需要一些謹(jǐn)慎着帽。為了明白為什么杂伟,考慮一個極端的例子移层,一個班級的所有學(xué)生在考試中得分為 75 分。那么 75 是中位數(shù)的自然候選稿壁,但是 50% 的分?jǐn)?shù)高于 75 并不是真的幽钢。另外,75 同樣是第 95 個或第 25 個百分位數(shù)傅是,或任何其他百分位數(shù)的自然候選匪燕。在定義百分位數(shù)時,必須將重復(fù) - 也就是相同的數(shù)據(jù)值 - 考慮在內(nèi)喧笔。
當(dāng)相關(guān)的索引不明確時帽驯,你還必須小心列表到底有多長。例如书闸,10 個值的集合的第 87 個百分位數(shù)是多少尼变?有序集合的第 8 個值,還是第 9 個浆劲,還是其中的某個位置嫌术?
數(shù)值的例子
在給出所有百分位數(shù)的一般定義之前,我們將把數(shù)值集合的第80個百分點定義為集合中的(一定條件的)最小值牌借,它至少與所有值的 80% 一樣大度气。
例如,考慮非洲膨报,南極洲磷籍,亞洲,北美洲和南美洲五大洲的大小现柠,四舍五入到最接近的百萬平方英里院领。
sizes = make_array(12, 17, 6, 9, 7)
第 80 個百分位數(shù)是(一定條件的)最小值,至少和 80% 的值一樣大够吩,也就是五個元素的五分之四比然。等于 12:
np.sort(sizes)
array([ 6, 7, 9, 12, 17])
第 80 個百分位數(shù)是列表中的一個值,也就是 12废恋。你可以看到谈秫,80% 的值小于等于它,并且它是列表中滿足這個條件的最小值鱼鼓。
與之類似拟烫,第 70 個百分位數(shù)是該集合中(一定條件的)最小值,至少與 70% 的元素一樣大迄本。 現(xiàn)在 5 個元素中的 70% 是“3.5 個元素”硕淑,所以第 70 個百分位數(shù)是列表中的第 4 個元素。 它是 12,與這些數(shù)據(jù)的第 80 百分位數(shù)相同置媳。
percentile
函數(shù)
percentile
函數(shù)接受兩個參數(shù):一個 0 到 100 之間的等級于樟,和一個數(shù)組。它返回數(shù)組相應(yīng)的百分位數(shù)拇囊。
percentile(70, sizes)
12
一般定義
令p
為 0 到 100 之間的數(shù)字迂曲。集合的第p
個百分位數(shù)是集合中的(一定條件)的最小值,它至少與p%
的所有值一樣大寥袭。
通過這個定義路捧,可以計算任何值的集合的任何 0 到 100 之間的百分位數(shù),并且它始終是集合的一個元素传黄。
實際上杰扫,假設(shè)集合中有n
個元素。 要找到第p
個百分位數(shù):
- 對集合升序排序膘掰。
- 計算
n
的p%
:(p/100) * n
章姓。叫做k
。 - 如果
k
是一個整數(shù)识埋,則取有序集合的第k
個元素凡伊。 - 如果
k
不是一個整數(shù),則將其四舍五入到下一個整數(shù)窒舟,并采用有序集合的那個元素窗声。
示例
scores_and_sections
表包含 359 名學(xué)生,每個學(xué)生一行辜纲。 列是學(xué)生的討論分組和期中分?jǐn)?shù)。
scores_and_sections = Table.read_table('scores_by_section.csv')
scores_and_sections
Section | Midterm |
---|---|
1 | 22 |
2 | 12 |
2 | 23 |
2 | 14 |
1 | 20 |
3 | 25 |
4 | 19 |
1 | 24 |
5 | 8 |
6 | 14 |
(省略了 349 列)
scores_and_sections.select('Midterm').hist(bins=np.arange(-0.5, 25.6, 1))
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-1.png
分?jǐn)?shù)的第 85 個百分位數(shù)是多少拦耐? 為了使用percentile
函數(shù)耕腾,創(chuàng)建包含期中分?jǐn)?shù)的數(shù)組scores
,并找到第 85 個百分位數(shù):
scores = scores_and_sections.column(1)
percentile(85, scores)
22
根據(jù)percentile
函數(shù)杀糯,第 85 個百分點數(shù)是 22扫俺。為了檢查這是否符合我們的新定義,我們直接應(yīng)用定義固翰。
首先狼纬,把分?jǐn)?shù)升序排列:
sorted_scores = np.sort(scores_and_sections.column(1))
數(shù)組中有 359 個分?jǐn)?shù)。所以下面骂际,計算 359 的 85%疗琉,它是 305.15。
0.85 * 359
305.15
這不是一個整數(shù)歉铝。 根據(jù)我們的定義盈简,中位數(shù)是sorted_scores
的第 306 個元素,按 Python 的索引約定,它是數(shù)組的第 305 項柠贤。
# The 306th element of the sorted array
sorted_scores.item(305)
22
它和我們通過使用percentile
得到的答案一樣香浩。以后,我們會僅僅使用percentile
臼勉。
四分位數(shù)
數(shù)值集合的第一個四分位數(shù)是第 25 個百分分?jǐn)?shù)邻吭。 這個術(shù)語(quartile)來自第一個季度(quarter)。 第二個四分位數(shù)是中位數(shù)宴霸,第三個四分位數(shù)是第 75 個百分位數(shù)囱晴。
對于我們的分?jǐn)?shù)數(shù)據(jù),這些值是:
percentile(25, scores)
11
percentile(50, scores)
16
percentile(75, scores)
20
分?jǐn)?shù)的分布有時歸納為“中等 50%”區(qū)間猖败,在第一和第三個四分位數(shù)之間速缆。
自舉法
一個數(shù)據(jù)科學(xué)家正在使用隨機(jī)樣本中的數(shù)據(jù)來估計未知參數(shù)。她使用樣本來計算用作估計值的統(tǒng)計量恩闻。
一旦她計算出了統(tǒng)計量的觀察值艺糜,她就可以把它作為她的估計值,然后順其自然幢尚。 但她是一名數(shù)據(jù)科學(xué)家破停。 她知道她的隨機(jī)樣本只是眾多可能的隨機(jī)樣本之一,因此她的估計只是眾多合理估算之一尉剩。
這些估計的變化有多大真慢? 為了回答這個問題,似乎她需要從總體中抽取另一個樣本理茎,并根據(jù)新樣本計算一個新的估計值黑界。 但是她沒有資源來回到總體中,再抽取一個樣本皂林。
這個數(shù)據(jù)科學(xué)家看起來好像卡住了朗鸠。
幸運的是,一個叫做自舉法的好主意可以幫助她础倍。 由于從總體中生成新樣本是不可行的烛占,自舉法通過稱為重采樣的方法生成新的隨機(jī)樣本:新樣本從原始樣本中隨機(jī)抽取。
在本節(jié)中沟启,我們將看到自舉法的工作方式和原因忆家。 在本章的其余部分,我們將使用自舉法進(jìn)行推理德迹。
舊金山市的雇員薪資
SF OpenData 是一個網(wǎng)站芽卿,舊金山市和縣在上面公開提供他們的一些數(shù)據(jù)。 其中一個數(shù)據(jù)集包含城市雇員的薪資數(shù)據(jù)浦辨。 其中包括市營醫(yī)院的醫(yī)療專業(yè)人員蹬竖,警察沼沈,消防員,運輸工人币厕,民選官員以及市內(nèi)所有其他雇員列另。
2015 日歷年的薪資數(shù)據(jù)見表sf2015
。
sf2015 = Table.read_table('san_francisco_2015.csv')
sf2015
Year Type | Year | Organization Group Code | Organization Group | Department Code | Department | Union Code | Union | Job Family Code | Job Family | Job Code | Job | Employee Identifier | Salaries | Overtime | Other Salaries | Total Salary | Retirement | Health/Dental | Other Benefits | Total Benefits | Total Compensation |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Calendar | 2015 | 2 | Public Works, Transportation & Commerce | WTR | PUC Water Department | 21 | Prof & Tech Engineers - Miscellaneous, Local 21 | 2400 | Lab, Pharmacy & Med Techs | 2481 | Water Qualitytech I/II | 21538 | 82146 | 0 | 0 | 82146 | 16942.2 | 12340.9 | 6337.73 | 35620.8 | 117767 |
Calendar | 2015 | 2 | Public Works, Transportation & Commerce | DPW | General Services Agency - Public Works | 12 | Carpet, Linoleum and Soft Tile Workers, Local 12 | 7300 | Journeyman Trade | 7393 | Soft Floor Coverer | 5459 | 32165.8 | 973.19 | 848.96 | 33987.9 | 0 | 4587.51 | 2634.42 | 7221.93 | 41209.8 |
Calendar | 2015 | 4 | Community Health | DPH | Public Health | 790 | SEIU - Miscellaneous, Local 1021 | 1600 | Payroll, Billing & Accounting | 1636 | Health Care Billing Clerk 2 | 41541 | 71311 | 5757.98 | 0 | 77069 | 14697.6 | 12424.5 | 6370.06 | 33492.2 | 110561 |
Calendar | 2015 | 4 | Community Health | DPH | Public Health | 351 | Municipal Executive Association - Miscellaneous | 0900 | Management | 2620 | Food Service Mgr Administrator | 26718 | 28430.2 | 0 | 763.07 | 29193.3 | 0 | 4223.14 | 5208.51 | 9431.65 | 38625 |
Calendar | 2015 | 2 | Public Works, Transportation & Commerce | MTA | Municipal Transportation Agency | 790 | SEIU - Miscellaneous, Local 1021 | 8200 | Protection & Apprehension | 8201 | School Crossing Guard | 45810 | 7948.75 | 0 | 0 | 7948.75 | 0 | 2873.17 | 616.24 | 3489.41 | 11438.2 |
Calendar | 2015 | 1 | Public Protection | POL | Police | 911 | Police Officers' Association | Q000 | Police Services | Q002 | Police Officer | 32906 | 2235 | 0 | 0 | 2235 | 490.36 | 286.72 | 176.57 | 953.65 | 3188.65 |
Calendar | 2015 | 4 | Community Health | DPH | Public Health | 791 | SEIU - Staff and Per Diem Nurses, Local 1021 | 2300 | Nursing | 2328 | Nurse Practitioner | 7506 | 187247 | 0 | 11704.1 | 198951 | 37683.7 | 12424.5 | 11221.7 | 61329.9 | 260281 |
Calendar | 2015 | 2 | Public Works, Transportation & Commerce | MTA | Municipal Transportation Agency | 253 | Transport Workers - Transit Operators, Local 250-A | 9100 | Street Transit | 9163 | Transit Operator | 36773 | 66988.5 | 3512.88 | 2770.39 | 73271.8 | 19127.2 | 13203 | 5455.1 | 37785.3 | 111057 |
Calendar | 2015 | 6 | General Administration & Finance | CAT | City Attorney | 311 | Municipal Attorneys' Association | 8100 | Legal & Court | 8177 | Attorney (Civil/Criminal) | 12963 | 135190 | 0 | 1562.5 | 136752 | 27501.8 | 12424.5 | 10103 | 50029.3 | 186781 |
Calendar | 2015 | 3 | Human Welfare & Neighborhood Development | DSS | Human Services | 535 | SEIU - Human Services, Local 1021 | 9700 | Community Development | 9703 | Emp & Training Spec 2 | 35179 | 70474.8 | 147.28 | 1647.24 | 72269.3 | 14650.3 | 10696.9 | 5993.11 | 31340.3 | 103610 |
(省略了 42979 行)
共有 42,979 名員工旦装,每個人一行页衙。 有許多列包含市政部門隸屬關(guān)系的信息,以及員工薪酬方案不同部分的詳細(xì)信息阴绢。 這是對應(yīng)市長 Ed Lee 的一行店乐。
sf2015.where('Job', are.equal_to('Mayor'))
Year Type | Year | Organization Group Code | Organization Group | Department Code | Department | Union Code | Union | Job Family Code | Job Family | Job Code | Job | Employee Identifier | Salaries | Overtime | Other Salaries | Total Salary | Retirement | Health/Dental | Other Benefits | Total Benefits | Total Compensation |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Calendar | 2015 | 6 | General Administration & Finance | MYR | Mayor | 556 | Elected Officials | 1100 | Administrative & Mgmt (Unrep) | 1190 | Mayor | 22433 | 288964 | 0 | 0 | 288964 | 58117 | 12424.5 | 20293 | 90834.5 | 379798 |
我們要研究最后一欄,總薪酬呻袭。 這是員工的工資加上市政府對退休和福利計劃的貢獻(xiàn)眨八。
日歷年的財務(wù)方案有時難以理解,因為它們?nèi)Q于雇用日期左电,員工是否在城市內(nèi)部換工作等等廉侧。 例如,Total Compensation
列中的最低值看起來有點奇怪篓足。
sf2015.sort('Total Compensation')
Year Type | Year | Organization Group Code | Organization Group | Department Code | Department | Union Code | Union | Job Family Code | Job Family | Job Code | Job | Employee Identifier | Salaries | Overtime | Other Salaries | Total Salary | Retirement | Health/Dental | Other Benefits | Total Benefits | Total Compensation |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Calendar | 2015 | 1 | Public Protection | FIR | Fire Department | 798 | Firefighters - Miscellaneous, Local 798 | H000 | Fire Services | H002 | Firefighter | 43833 | 0 | 0 | 0 | 0 | 0 | 0 | -423.76 | -423.76 | -423.76 |
Calendar | 2015 | 4 | Community Health | DPH | Public Health | 790 | SEIU - Miscellaneous, Local 1021 | 9900 | Public Service Aide | 9924 | PS Aide Health Services | 27871 | -292.4 | 0 | 0 | -292.4 | 0 | -95.58 | -22.63 | -118.21 | -410.61 |
Calendar | 2015 | 1 | Public Protection | JUV | Juvenile Probation | 790 | SEIU - Miscellaneous, Local 1021 | 8300 | Correction & Detention | 8320 | Counselor, Juvenile Hall | 10517 | 0 | 0 | 0 | 0 | 0 | 0 | -159.12 | -159.12 | -159.12 |
Calendar | 2015 | 6 | General Administration & Finance | CPC | City Planning | 21 | Prof & Tech Engineers - Miscellaneous, Local 21 | 1000 | Information Systems | 1053 | IS Business Analyst-Senior | 18961 | 0 | 0 | 0 | 0 | 0 | 0 | -26.53 | -26.53 | -26.53 |
Calendar | 2015 | 6 | General Administration & Finance | CPC | City Planning | 21 | Prof & Tech Engineers - Miscellaneous, Local 21 | 5200 | Professional Engineering | 5277 | Planner 1 | 19387 | 0 | 0 | 0 | 0 | 0 | 0 | -9.51 | -9.51 | -9.51 |
Calendar | 2015 | 2 | Public Works, Transportation & Commerce | PUC | PUC Public Utilities Commission | 21 | Prof & Tech Engineers - Miscellaneous, Local 21 | 1000 | Information Systems | 1044 | IS Engineer-Principal | 28988 | 0 | 0 | 0 | 0 | 0 | 0 | -3.1 | -3.1 | -3.1 |
Calendar | 2015 | 1 | Public Protection | JUV | Juvenile Probation | 39 | Stationary Engineers, Local 39 | 7300 | Journeyman Trade | 7335 | Senior Stationary Engineer | 19125 | 0 | 0 | 0 | 0 | 0 | 0 | -0.01 | -0.01 | -0.01 |
Calendar | 2015 | 1 | Public Protection | ECD | Department of Emergency Management | 351 | Municipal Executive Association - Miscellaneous | 0900 | Management | 0922 | Manager I | 30025 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Calendar | 2015 | 7 | General City Responsibilities | UNA | General Fund Unallocated | 790 | SEIU - Miscellaneous, Local 1021 | 3200 | Recreation | 3280 | Assistant Recreation Director | 49784 | 0 | 0 | 0 | 0 | 0 | 0 | 1.27 | 1.27 | 1.27 |
Calendar | 2015 | 4 | Community Health | DPH | Public Health | 250 | SEIU - Health Workers, Local 1021 | 2600 | Dietary & Food | 2654 | Cook | 26768 | 0 | 0 | 2.21 | 2.21 | 0 | 0 | 0.17 | 0.17 | 2.38 |
(省略了 42979 行)
為了便于比較段誊,我們將專注于那些工作時間相當(dāng)于至少半年的人。 最低工資約為每小時 10 美元栈拖,52 周每周 20 小時连舍,工資約為 1 萬美元。
sf2015 = sf2015.where('Salaries', are.above(10000))
sf2015.num_rows
36569
總體和參數(shù)
讓這張超過 36500 行的表格成為我們的總體涩哟。 這是總薪資的直方圖索赏。
sf_bins = np.arange(0, 700000, 25000)
sf2015.select('Total Compensation').hist(bins=sf_bins)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-2.png
雖然大部分值都低于 300,000 美元,但有一些還是比較高的贴彼。 例如参滴,首席投資官的總薪資不多是 65 萬美元。 這就是為什么橫軸延伸到了 700,000 美元锻弓。
sf2015.sort('Total Compensation', descending=True).show(2)
Year Type | Year | Organization Group Code | Organization Group | Department Code | Department | Union Code | Union | Job Family Code | Job Family | Job Code | Job | Employee Identifier | Salaries | Overtime | Other Salaries | Total Salary | Retirement | Health/Dental | Other Benefits | Total Benefits | Total Compensation |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Calendar | 2015 | 6 | General Administration & Finance | RET | Retirement System | 351 | Municipal Executive Association - Miscellaneous | 1100 | Administrative & Mgmt (Unrep) | 1119 | Chief Investment Officer | 46881 | 507832 | 0 | 0 | 507832 | 105053 | 12424.5 | 23566.2 | 141044 | 648875 |
Calendar | 2015 | 6 | General Administration & Finance | ADM | General Services Agency - City Admin | 164 | Physicians and Dentists - Miscellaneous | 2500 | Med Therapy & Auxiliary | 2598 | Asst Med Examiner | 1016 | 279311 | 3829.36 | 114434 | 397574 | 56211.6 | 12424.5 | 14299.1 | 82935.2 | 480509 |
(省略了 36567 行)
現(xiàn)在讓參數(shù)為總薪資的中位數(shù)。
既然我們有能力從總體中得到所有數(shù)據(jù)蝌箍,我們可以簡單計算參數(shù):
pop_median = percentile(50, sf2015.column('Total Compensation'))
pop_median
110305.78999999999
所有員工的薪酬總額的中位數(shù)剛剛超過 110,300 美元青灼。
從實際的角度來看,我們沒有理由抽取樣本來估計這個參數(shù)妓盲,因為我們只是知道它的值杂拨。 但在本節(jié)中,我們假裝不知道這個值悯衬,看看我們?nèi)绾胃鶕?jù)隨機(jī)樣本來估計它弹沽。
在后面的章節(jié)中,我們將回到現(xiàn)實,在參數(shù)未知的情況下工作策橘。 就目前而言炸渡,我們是無所不知的。
隨機(jī)樣本和估計
讓我們無放回地隨機(jī)抽取 500 名員工的樣本丽已,并將所選員工的總薪酬的中位數(shù)作為我們的參數(shù)估計量蚌堵。
our_sample = sf2015.sample(500, with_replacement=False)
our_sample.select('Total Compensation').hist(bins=sf_bins)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-3.png
est_median = percentile(50, our_sample.column('Total Compensation'))
est_median
113598.99000000001
樣本量很大。 根據(jù)平均定律沛婴,樣本的分布與總體的分布相似吼畏,因此樣本中位數(shù)與總體中位數(shù)相差不大(盡管當(dāng)然并不完全相同)。
所以現(xiàn)在我們有了參數(shù)的估計嘁灯。 但是泻蚊,如果樣本是不同的,估計的值也會不同丑婿。 我們希望能夠量化估計的值在不同樣本間的差異性雄。 這個變化的測量將有助于我們衡量我們可以將參數(shù)估計得多么準(zhǔn)確。
為了查看樣本有多么不同枯冈,我們可以從總體中抽取另一個樣本毅贮,但這樣做就作弊了。 我們正試圖模仿現(xiàn)實生活尘奏,我們不能掌握所有的人口數(shù)據(jù)滩褥。
用某種方式,我們必須得到另一個隨機(jī)樣本炫加,而不從總體中抽樣瑰煎。
自舉法:從樣本中重采樣
我們所做的是,從樣本中隨機(jī)抽樣俗孝。 我們知道了酒甸,大型隨機(jī)樣本可能類似于用于抽取的總體。 這一觀察使得數(shù)據(jù)科學(xué)家可以通過自舉來提升自己:抽樣過程可以通過從樣本中抽樣來復(fù)制赋铝。
以下是自舉法的步驟插勤,用于生成類似總體的另一個隨機(jī)樣本:
- 將原始樣本看做總體。
- 從樣本中隨機(jī)抽取樣本革骨,與原始樣本大小相同农尖。
二次樣本的大小與原始樣本相同很重要。 原因是估計量的變化取決于樣本的大小良哲。 由于我們的原始樣本由 500 名員工組成盛卡,我們的樣本中位數(shù)基于 500 個值。 為了看看樣本變化多少筑凫,我們必須將其與 500 個其他樣本的中位數(shù)進(jìn)行比較滑沧。
如果我們從大小為 500 的樣本中并村,無放回地隨機(jī)抽取了 500 次,我們只會得到相同的樣本滓技。 通過帶放回抽取哩牍,我們就可以讓新樣本與原始樣本不同,因為有些員工可能會被抽到一次以上殖属,其他人則完全不會姐叁。
為什么這是一個好主意? 按照平均定律洗显,原始樣本的分布可能與總體相似外潜,所有“二次樣本”的分布可能與原始樣本相似。 因此挠唆,所有二次樣本的分布也可能與總體相似处窥。
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-4.png
二次樣本的中位數(shù)
回想一下,使用sample
方法而沒有指定樣本大小時玄组,默認(rèn)情況下樣本大小等于用于抽取樣本的表的行數(shù)滔驾。 這是完美的自舉! 這是從原始樣本中抽取的一個新樣本俄讹,以及相應(yīng)的樣本中位數(shù)哆致。
resample_1 = our_sample.sample()
resample_1.select('Total Compensation').hist(bins=sf_bins)
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-5.png
resampled_median_1 = percentile(50, resample_1.column('Total Compensation'))
resampled_median_1
110001.16
通過重采樣,我們有了總體中位數(shù)的另一個估計患膛。 通過一次又一次的重采樣摊阀,我們得到許多這樣的估計,因此有了估計的經(jīng)驗分布踪蹬。
resample_2 = our_sample.sample()
resampled_median_2 = percentile(50, resample_2.column('Total Compensation'))
resampled_median_2
110261.39999999999
自舉樣本中位數(shù)的經(jīng)驗分布
讓我們定義一個函數(shù)bootstrap_median
胞此,該函數(shù)接受我們的原始樣本,包含變量的列的標(biāo)簽跃捣,以及我們想要的自舉樣本的數(shù)量漱牵,并返回二次樣本的相應(yīng)中值的數(shù)組。
每次我們重采樣并找到中位數(shù)疚漆,我們重復(fù)自舉過程酣胀。 所以自舉樣本的數(shù)量將被稱為重復(fù)數(shù)量。
def bootstrap_median(original_sample, label, replications):
"""Returns an array of bootstrapped sample medians:
original_sample: table containing the original sample
label: label of column containing the variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
medians = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resampled_median = percentile(50, bootstrap_sample.column(0))
medians = np.append(medians, resampled_median)
return medians
我們現(xiàn)在將自舉過程重復(fù) 5000 次娶聘。 數(shù)組bstrap_medians
包含所有 5,000 個自舉樣本的中位數(shù)灵临。 注意代碼的運行時間比我們以前的代碼要長。 因為要做很多重采樣趴荸!
bstrap_medians = bootstrap_median(our_sample, 'Total Compensation', 5000)
這是 5000 個中位數(shù)的直方圖。 紅點是總體的參數(shù):它是整個總體的中位數(shù)宦焦,我們碰巧知道但沒有在自舉過程中使用发钝。
resampled_medians = Table().with_column('Bootstrap Sample Median', bstrap_medians)
#median_bins=np.arange(100000, 130000, 2500)
#resampled_medians.hist(bins = median_bins)
resampled_medians.hist()
plots.scatter(pop_median, 0, color='red', s=30);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-6.png
重要的是要記住顿涣,紅點是固定的:110,305.79 美元,總體的中位數(shù)酝豪。 經(jīng)驗直方圖是隨機(jī)抽取的結(jié)果涛碑,將相對于紅點隨機(jī)定位。
請記住孵淘,所有這些計算的重點是估計人口中位數(shù)蒲障,它是紅點。我們的估計是所有隨機(jī)生成的樣本中位數(shù)瘫证,它們的直方圖你在上面看到了揉阎。 我們希望這些估計量包含參數(shù) - 如果沒有,它們就脫線了背捌。
估計量是否捕獲了參數(shù)
紅點正好落在二次樣本的中位數(shù)的經(jīng)驗直方圖中間毙籽,而不是尾部的幾率有多少? 要回答這個問題毡庆,我們必須定義“中間”坑赡。 讓我們將它看做“紅點落在二次樣本的中位數(shù)的中間 95%”。
以下是二次采樣中位數(shù)的“中間 95%”的兩端:
left = percentile(2.5, bstrap_medians)
left
107652.71000000001
right = percentile(97.5, bstrap_medians)
right
119256.73
總體中位數(shù) 110,305 美元在這兩個數(shù)中間么抗。下面的直方圖展示了區(qū)間和總體中位數(shù)毅否。
#median_bins=np.arange(100000, 130000, 2500)
#resampled_medians.hist(bins = median_bins)
resampled_medians.hist()
plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=3, zorder=1)
plots.scatter(pop_median, 0, color='red', s=30, zorder=2);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-7.png
我們例子中,估計量的“中間 95%”的區(qū)間捕獲了參數(shù)蝇刀。 但是螟加,這是一個偶然嗎?
要查看區(qū)間包含參數(shù)的頻率熊泵,我們必須一遍又一遍地運行整個過程仰迁。具體而言,我們將重復(fù)以下過程 100 次:
- 從總體中抽取一個大小為 500 的原始樣本顽分。
- 執(zhí)行 5000 次重復(fù)的自舉過程徐许,并生成二次樣本的中位數(shù)的“中間 95%”的區(qū)間。
- 我們最后得到了 100 個區(qū)間卒蘸,并計算其中有多少個包含總體中位數(shù)雌隅。
劇透警告:自舉的統(tǒng)計理論表明,這個數(shù)字應(yīng)該在 95 左右缸沃。它可能高于或低于 95恰起,但不會離得太遠(yuǎn)。
# THE BIG SIMULATION: This one takes several minutes.
# Generate 100 intervals, in the table intervals
left_ends = make_array()
right_ends = make_array()
total_comps = sf2015.select('Total Compensation')
for i in np.arange(100):
first_sample = total_comps.sample(500, with_replacement=False)
medians = bootstrap_median(first_sample, 'Total Compensation', 5000)
left_ends = np.append(left_ends, percentile(2.5, medians))
right_ends = np.append(right_ends, percentile(97.5, medians))
intervals = Table().with_columns(
'Left', left_ends,
'Right', right_ends
)
對于 100 個重復(fù)中的每個趾牧,我們得到了一個中位數(shù)估計量的區(qū)間检盼。
intervals
Left | Right |
---|---|
100547 | 115112 |
98788.4 | 112129 |
107981 | 121218 |
100965 | 114796 |
102596 | 112056 |
105386 | 113909 |
105225 | 116918 |
102844 | 116712 |
106584 | 118054 |
108451 | 118421 |
(省略了 90 行)
良好的區(qū)間是那些包含我們試圖估計的參數(shù)的區(qū)間。 通常參數(shù)是未知的翘单,但在本節(jié)中吨枉,我們碰巧知道參數(shù)是什么蹦渣。
pop_median
110305.78999999999
100 個區(qū)間中有多少個包含總體中位數(shù)? 這是左端低于且右端高于總體中位數(shù)的區(qū)間數(shù)量貌亭。
intervals.where('Left', are.below(pop_median)).where('Right', are.above(pop_median)).num_rows
95
構(gòu)建所有區(qū)間需要花費幾分鐘時間柬唯,但如果你有耐心,請再試一次圃庭。最有可能的是锄奢,100 個區(qū)間中有大約 95 個將是良好的:它們將包含參數(shù)。
因為它們有較大的重疊剧腻,所以很難在橫軸上顯示所有的區(qū)間 - 畢竟拘央,它們都試圖估計相同的參數(shù)。下圖通過豎直堆疊恕酸,在相同軸域上展示的每個區(qū)間堪滨。縱軸簡單地是重復(fù)的序號蕊温,區(qū)間從中生成袱箱。
紅線是參數(shù)所在的位置。良好的區(qū)間覆蓋了參數(shù)义矛;通常有大約 95 個发笔。
如果一個區(qū)間不能覆蓋這個參數(shù),就是個糟糕的事情凉翻。在這個地方了讨,你可以看到紅線周圍的“亮光”。他們中只有很少 - 通常是大約 5 個 - 但是他們確實存在制轰。
任何基于抽樣的方法都有可能脫線前计。基于隨機(jī)抽樣的方法的優(yōu)點是垃杖,我們可以量化它們可能脫線的頻率徐鹤。
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-8.png
為了總結(jié)模擬所示的內(nèi)容忙上,假設(shè)你通過以下過程來估計總體中位數(shù):
從總體中隨機(jī)抽取一個大樣本乱豆。
自舉你的隨機(jī)樣本躺盛,并從新的隨機(jī)樣本中獲取估計量。
重復(fù)上述步驟數(shù)千次彩库,并獲得數(shù)千個估計量肤无。
挑選所有估計量的“中間 95%”的區(qū)間。
這給了你一個估計量的區(qū)間『眨現(xiàn)在宛渐,如果重復(fù)整個過程 100 次,會得到 100 個區(qū)間,那么 100 個區(qū)間中的大約 95 個將包含總體的參數(shù)窥翩。
換句話說畴蹭,95% 的時間內(nèi),這個估計過程捕獲了參數(shù)鳍烁。
你可以用一個不同的值代替 95%,只要它不是 100繁扎。假設(shè)你用 80% 代替了 95%幔荒,并保持樣本大小為 500。那么你的估計量的區(qū)間將比我們這里的模擬要短梳玫,因為“中間 80%”是比“中間 95%”更小的范圍爹梁。只有大約 80% 的區(qū)間將包含參數(shù)。
置信區(qū)間
我們已經(jīng)開發(fā)了一種方法提澎,通過使用隨機(jī)抽樣和自舉來估計參數(shù)姚垃。我們的方法產(chǎn)生一個估計區(qū)間,來解釋隨機(jī)樣本的機(jī)會變異盼忌。通過提供一個估計區(qū)間而不是一個估計量积糯,我們給自己一些回旋的余地。
在前面的例子中谦纱,我們看到我們的估計過程在 95% 的時間內(nèi)產(chǎn)生了一個良好的區(qū)間看成,一個“良好”的區(qū)間就是包含這個參數(shù)的區(qū)間。對于這個過程的結(jié)果很好跨嘉,我們說我們有 95% 的置信度(信心)川慌。我們的估計區(qū)間稱為參數(shù)的 95% 置信區(qū)間,95% 稱為區(qū)間的置信度祠乃。
前一個例子中的情況有點不尋常梦重。因為我們碰巧知道參數(shù)的值,所以我們能夠檢查一個區(qū)間是好還是不好亮瓷,這反過來又幫助我們看到琴拧,我們的估計過程每 100 次中有 95 次捕獲了參數(shù)。
但通常情況下寺庄,數(shù)據(jù)科學(xué)家不知道參數(shù)的值艾蓝。這就是他們首先想要估計的原因。在這種情況下斗塘,他們通過使用一些方法赢织,類似我們開發(fā)的方法,獲得未知參數(shù)的估計區(qū)間馍盟。由于統(tǒng)計理論于置,和我們所看到的演示,數(shù)據(jù)科學(xué)家可以確信贞岭,他們產(chǎn)生區(qū)間的過程八毯,會以已知百分比的幾率搓侄,產(chǎn)生一個良好的區(qū)間。
總體中位數(shù)的置信區(qū)間:自舉百分位數(shù)方法
現(xiàn)在我們使用自舉法來估計未知總體的中位數(shù)话速。 數(shù)據(jù)來自大型醫(yī)院系統(tǒng)中的新生兒樣本; 我們將把它看作是一個簡單的隨機(jī)樣本讶踪,雖然抽樣分多個階段完成。 Deborah Nolan 和 Terry Speed 的 Stat Labs 擁有一個大數(shù)據(jù)集的詳細(xì)信息泊交,這個樣本是從中抽取的乳讥。
baby
表中包含以下母嬰偶對的數(shù)量:嬰兒的出生體重(盎司),孕期天數(shù)廓俭,母親的年齡云石,母親身高(英寸),孕期體重(磅)研乒,母親是否在孕期吸煙汹忠。
baby = Table.read_table('baby.csv')
baby
Birth Weight | Gestational Days | Maternal Age | Maternal Height | Maternal Pregnancy Weight | Maternal Smoker |
---|---|---|---|---|---|
120 | 284 | 27 | 62 | 100 | False |
113 | 282 | 33 | 64 | 135 | False |
128 | 279 | 28 | 64 | 115 | True |
108 | 282 | 23 | 67 | 125 | True |
136 | 286 | 25 | 62 | 93 | False |
138 | 244 | 33 | 62 | 178 | False |
132 | 245 | 23 | 65 | 140 | False |
120 | 289 | 25 | 62 | 125 | False |
143 | 299 | 30 | 66 | 136 | True |
140 | 351 | 27 | 68 | 120 | False |
(省略了 1164 行)
出生體重是新生兒健康的一個重要因素 - 較小的嬰兒比較大的嬰兒在初期需要更多的醫(yī)療護(hù)理。 因此雹熬,在嬰兒出生前估計出生體重是有幫助的宽菜。 一種方法是檢查出生體重和懷孕天數(shù)之間的關(guān)系。
這種關(guān)系的一個簡單的衡量標(biāo)準(zhǔn)是出生體重與懷孕天數(shù)的比值橄唬。ratios
表包含baby
的前兩列赋焕,以及一列ratios
。 這一列的第一個條目按以下方式計算:
ratios = baby.select('Birth Weight', 'Gestational Days').with_column(
'Ratio BW/GD', baby.column('Birth Weight')/baby.column('Gestational Days')
)
ratios
| Birth Weight | Gestational Days | Ratio BW/GD |
| --- | --- | --- | --- |
| 120 | 284 | 0.422535 |
| 113 | 282 | 0.400709 |
| 128 | 279 | 0.458781 |
| 108 | 282 | 0.382979 |
| 136 | 286 | 0.475524 |
| 138 | 244 | 0.565574 |
| 132 | 245 | 0.538776 |
| 120 | 289 | 0.415225 |
| 143 | 299 | 0.478261 |
| 140 | 351 | 0.39886 |
(省略了 1164 行)
ratios.select('Ratio BW/GD').hist()
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-9.png
一眼望去仰楚,直方圖看起來相當(dāng)對稱隆判,密度在 4opd 到 4.5opd 的區(qū)間內(nèi)是最大的。 但仔細(xì)一看僧界,就可以看出一些比例相當(dāng)大侨嘀。 比率的最大值剛好超過 0.78opd,幾乎是通常值的兩倍捂襟。
ratios.sort('Ratio BW/GD', descending=True).take(0)
Birth Weight | Gestational Days | Ratio BW/GD |
---|---|---|
116 | 148 | 0.783784 |
中位數(shù)提供了通常比例的感覺咬腕,因為它不受非常大或非常小的比例的影響。 樣本(比值)的中位數(shù)約為 0.429opd葬荷。
np.median(ratios.column(2))
0.42907801418439717
但是總體中位數(shù)是多少涨共? 我們不知道,所以我們會估計它宠漩。
我們的方法將與前一節(jié)完全相同举反。 我們將自舉樣本 5000 次,結(jié)果是 5000 個中位數(shù)的估計量扒吁。 我們 95% 的置信區(qū)間將是我們所有估計量的“中間 95%”火鼻。
回憶前一節(jié)定義的bootstrap_median
函數(shù)。 我們將調(diào)用這個函數(shù),并構(gòu)造總體(比值)中位數(shù)的 95% 置信區(qū)間魁索。請記住融撞,ratios
表包含來自我們的原始樣本的相關(guān)數(shù)據(jù)。
def bootstrap_median(original_sample, label, replications):
"""Returns an array of bootstrapped sample medians:
original_sample: table containing the original sample
label: label of column containing the variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
medians = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resampled_median = percentile(50, bootstrap_sample.column(0))
medians = np.append(medians, resampled_median)
return medians
# Generate the medians from 5000 bootstrap samples
bstrap_medians = bootstrap_median(ratios, 'Ratio BW/GD', 5000)
# Get the endpoints of the 95% confidence interval
left = percentile(2.5, bstrap_medians)
right = percentile(97.5, bstrap_medians)
make_array(left, right)
array([ 0.42545455, 0.43262411])
95% 置信區(qū)間是 0.425opd 到 0.433opd粗蔚。 我們估計的總體(出生重量與懷孕天數(shù)的比值)中位數(shù)尝偎,在 0.425opd 到 0.433opd 的范圍內(nèi)。
基于原始樣本的估計量 0.429 恰好在區(qū)間兩端的中間鹏控,盡管這通常不是真的冬念。
為了使我們的結(jié)果可視化,讓我們畫出我們自舉的中位數(shù)的經(jīng)驗直方圖牧挣,并將置信區(qū)間置于橫軸上。
resampled_medians = Table().with_column(
'Bootstrap Sample Median', bstrap_medians
)
resampled_medians.hist(bins=15)
plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-10.png
這個直方圖和區(qū)間就像我們在前一節(jié)中繪制的直方圖和區(qū)間醒陆,只有一個很大的區(qū)別 - 沒有顯示參數(shù)的紅點瀑构。 我們不知道這個點應(yīng)該在哪里,或者它是否在區(qū)間中刨摩。
我們只是有一個估計區(qū)間寺晌。 這是估計量的 95% 置信區(qū)間,因為生成它的過程在 95% 的時間中產(chǎn)生了良好的區(qū)間澡刹。 那肯定是在隨機(jī)猜測呻征!
請記住,這個區(qū)間是一個大約 95% 的置信區(qū)間罢浇。 計算中涉及到很多近似值陆赋。 近似值并不差,但并不準(zhǔn)確嚷闭。
總體均值的置信區(qū)間:自舉百分位數(shù)方法
我們?yōu)橹形粩?shù)所做的事情也可以用于均值攒岛。 假設(shè)我們想估計總體中的母親的平均年齡。 自然估計量是樣本中的母親的平均年齡胞锰。 這是他們的年齡分布灾锯,他們的平均年齡大約是 27.2 歲。
baby.select('Maternal Age').hist()
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-11.png
np.mean(baby.column('Maternal Age'))
27.228279386712096
母親的平均年齡是多少嗅榕? 我們不知道這個參數(shù)的值顺饮。
我們用自舉法來估計未知參數(shù)。 為此凌那,我們將編輯bootstrap_median
的代碼兼雄,而不是定義函數(shù)bootstrap_mean
。 代碼是相同的案怯,除了統(tǒng)計量是代替中位數(shù)的均值君旦,并且收集在一個名為means
而不是medians
的數(shù)組中。
def bootstrap_mean(original_sample, label, replications):
"""Returns an array of bootstrapped sample means:
original_sample: table containing the original sample
label: label of column containing the variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
means = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resampled_mean = np.mean(bootstrap_sample.column(0))
means = np.append(means, resampled_mean)
return means
# Generate the means from 5000 bootstrap samples
bstrap_means = bootstrap_mean(baby, 'Maternal Age', 5000)
# Get the endpoints of the 95% confidence interval
left = percentile(2.5, bstrap_means)
right = percentile(97.5, bstrap_means)
make_array(left, right)
array([ 26.89778535, 27.55962521])
95% 置信區(qū)間是約 26.9 歲到約 27.6 歲。 也就是說金砍,我們估計的母親的平均年齡在 26.9 歲到 27.6 歲之間局蚀。
注意兩端距原始樣本均值 27.2 歲的距離。 樣本量非常大 - 1174 個母親 - 所以樣本均值變化不大恕稠。 我們將在下一章進(jìn)一步探討這個觀察琅绅。
下面顯示了 5000 個自舉均值的經(jīng)驗直方圖,以及總體均值的 95% 置信區(qū)間鹅巍。
resampled_means = Table().with_column(
'Bootstrap Sample Mean', bstrap_means
)
resampled_means.hist(bins=15)
plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-12.png
原始樣本的均值(27.23 歲)同樣接近區(qū)間中心千扶。 這并不奇怪,因為每個自舉樣本都是從相同的原始樣本中抽取的骆捧。 自舉樣本的均值大約對稱分布原始樣本(從其中抽扰煨摺)的均值的兩側(cè)。
還要注意敛苇,即使所采樣的年齡的直方圖完全不是對稱的妆绞,二次樣本的均值的經(jīng)驗直方圖也是大致對稱的鐘形:
baby.select('Maternal Age').hist()
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-13.png
這是概率統(tǒng)計的中心極限定理的結(jié)果。 在后面的章節(jié)中枫攀,我們將看到這個定理是什么括饶。
80% 置信區(qū)間
你可以使用自舉法來構(gòu)建任意水平的置信區(qū)間。 例如来涨,要為總體中的平均年齡構(gòu)建 80% 置信區(qū)間图焰,可以選取二次樣本的均值的“中間 80%”。 所以你會希望為兩個尾巴的每一個分配 10%蹦掐,因此端點是二次樣本的均值的第 10 和第 90 個百分位數(shù)技羔。
left_80 = percentile(10, bstrap_means)
right_80 = percentile(90, bstrap_means)
make_array(left_80, right_80)
array([ 27.01192504, 27.439523 ])
resampled_means.hist(bins=15)
plots.plot(make_array(left_80, right_80), make_array(0, 0), color='yellow', lw=8);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-14.png
這個 80% 置信區(qū)間比 95% 置信區(qū)間要短得多。 它只是約定 27.0 歲到約 27.4 歲卧抗。 雖然這是估計量的較窄區(qū)間堕阔,你知道這個過程在 80% 的時間內(nèi)產(chǎn)生良好的區(qū)間。
之前過程產(chǎn)生了較寬的區(qū)間颗味,但是我們對產(chǎn)生它的過程擁有更高的置信度超陆。
為了以較高的置信度獲得較窄的置信區(qū)間,你必須從較大的樣本開始浦马。 我們將在下一章看到為什么时呀。
總體比例的置信區(qū)間:自舉百分位數(shù)方法
在樣本中,39% 的母親在懷孕期間吸煙晶默。
baby.where('Maternal Smoker', are.equal_to(True)).num_rows/baby.num_rows
0.3909710391822828
以下對觀察很實用谨娜,這個比例也可以通過數(shù)組操作來計算:
smoking = baby.column('Maternal Smoker')
np.count_nonzero(smoking)/len(smoking)
0.3909710391822828
譯者注:
np.count_nonzero(arr)
等價于np.sum(arr != 0)
。
總體中有百分之多少的母親在懷孕期間吸煙磺陡? 這是一個未知的參數(shù)趴梢,我們可以通過自舉置信區(qū)間來估計漠畜。 這個過程中的步驟與我們用來估計總體均值和中位數(shù)的步驟相似。
我們將首先定義一個函數(shù)bootstrap_proportion
坞靶,返回一個自舉樣本的比例的數(shù)組憔狞。 我們再一次通過編輯bootstrap_median
的定義來實現(xiàn)它。 計算中唯一的變化是用二次樣本的吸煙者比例代替中位數(shù)彰阴。 該代碼假定數(shù)據(jù)列由布爾值組成瘾敢。 其他的改變只是數(shù)組的名字,來幫助我們閱讀和理解我們的代碼尿这。
def bootstrap_proportion(original_sample, label, replications):
"""Returns an array of bootstrapped sample proportions:
original_sample: table containing the original sample
label: label of column containing the Boolean variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
proportions = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resample_array = bootstrap_sample.column(0)
resampled_proportion = np.count_nonzero(resample_array)/len(resample_array)
proportions = np.append(proportions, resampled_proportion)
return proportions
讓我們使用bootstrap_proportion
來構(gòu)建總體的母親吸煙者百分比的 95% 置信區(qū)間簇抵。 該代碼類似于均值和中位數(shù)的相應(yīng)代碼。
# Generate the proportions from 5000 bootstrap samples
bstrap_props = bootstrap_proportion(baby, 'Maternal Smoker', 5000)
# Get the endpoints of the 95% confidence interval
left = percentile(2.5, bstrap_props)
right = percentile(97.5, bstrap_props)
make_array(left, right)
array([ 0.36286201, 0.41908007])
置信區(qū)間是 36% 到 42%射众。原始樣本的百分比 39% 非常接近于區(qū)間的中心碟摆。你可以在下面看到:
resampled_proportions = Table().with_column(
'Bootstrap Sample Proportion', bstrap_props
)
resampled_proportions.hist(bins=15)
plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-15.png
自舉法的注意事項
自舉法是一個優(yōu)雅而強大的方法。在使用之前叨橱,記住一些要點非常重要焦履。
以大型隨機(jī)樣本開始。如果你不這樣做雏逾,該方法可能無法正常工作。它的成功基于大型隨機(jī)樣本(因此也從樣本中重采樣)郑临。平均定律說栖博,如果隨機(jī)樣本很大,這很可能是真的厢洞。
為了近似統(tǒng)計量的概率分布仇让,最好多次復(fù)制重采樣過程。數(shù)千次重復(fù)將產(chǎn)生樣本中位數(shù)分布的正確近似躺翻,特別是如果總體分布存在峰值并且不是非常不對稱的話丧叽。在我們的例子中,我們使用了 5000 次重復(fù)公你,但一般會推薦 10000 次踊淳。
自舉百分位數(shù)方法適用于基于大型隨機(jī)樣本,估計總體中位數(shù)或均值陕靠。但是迂尝,它也有其局限性,所有的估計方法也是如此剪芥。例如垄开,在以下情況下,它預(yù)期沒有效果税肪。
- 目標(biāo)是估計總體中的最小值或最大值溉躲,或非常低或非常高的百分位數(shù)榜田,或受總體中稀有元素影響較大的參數(shù)。
- 統(tǒng)計量的概率分布不是近似鐘形的锻梳。
- 原始樣本非常小箭券,比如 10 或 15。
使用置信區(qū)間
def bootstrap_median(original_sample, label, replications):
"""Returns an array of bootstrapped sample medians:
original_sample: table containing the original sample
label: label of column containing the variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
medians = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resampled_median = percentile(50, bootstrap_sample.column(0))
medians = np.append(medians, resampled_median)
return medians
def bootstrap_mean(original_sample, label, replications):
"""Returns an array of bootstrapped sample means:
original_sample: table containing the original sample
label: label of column containing the variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
means = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resampled_mean = np.mean(bootstrap_sample.column(0))
means = np.append(means, resampled_mean)
return means
def bootstrap_proportion(original_sample, label, replications):
"""Returns an array of bootstrapped sample proportions:
original_sample: table containing the original sample
label: label of column containing the Boolean variable
replications: number of bootstrap samples
"""
just_one_column = original_sample.select(label)
proportions = make_array()
for i in np.arange(replications):
bootstrap_sample = just_one_column.sample()
resample_array = bootstrap_sample.column(0)
resampled_proportion = np.count_nonzero(resample_array)/len(resample_array)
proportions = np.append(proportions, resampled_proportion)
return proportions
置信區(qū)間只有一個目的 - 根據(jù)隨機(jī)樣本中的數(shù)據(jù)估計未知參數(shù)唱蒸。在最后一節(jié)中邦鲫,我們說區(qū)間(36%, 42%)
是總體中吸煙者百分比的約 95% 的置信區(qū)間。正式的表述方式為神汹,據(jù)我們估計庆捺,總體中的吸煙者比例在 36% 到 42% 之間,我們的估計過程在 95% 的時間內(nèi)是正確的屁魏。
克制住將置信區(qū)間用于其他目的的沖動滔以,這很重要。例如氓拼,回想一下你画,我們計算了區(qū)間(26.9 yr, 27.6 yr)
,作為母親平均年齡的約 95% 的置信區(qū)間桃漾。區(qū)間的一個令人驚訝的常見誤用是得出這樣的結(jié)論坏匪,約 95% 的女性在 26.9 歲至 27.6 歲之間。你不需要怎么了解置信區(qū)間撬统,來查看這是不是正確的 - 你不會預(yù)計 95% 的母親的年齡在這個較小的范圍內(nèi)适滓。實際上,抽樣年齡的直方圖顯示出相當(dāng)多的變化恋追。
baby = Table.read_table('baby.csv')
baby.select('Maternal Age').hist()
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-16.png
抽樣年齡的一小部分在(26.9, 27.6)
的區(qū)間內(nèi)凭迹,你可能會預(yù)計總體中的百分比很小。 區(qū)間只是估計一個數(shù)字:總體中所有年齡的平均值苦囱。
但是嗅绸,除了僅僅告訴我們這個參數(shù)有多大之外,用置信區(qū)間來估計一個參數(shù)確實有重要的用處撕彤。
使用置信區(qū)間來檢驗假設(shè)
我們總體(年齡)均值的 95% 置信區(qū)間是 26.9 歲到 27.6 歲鱼鸠。假設(shè)有人想要測試以下假設(shè):
原假設(shè)。人口的平均年齡是 30 歲羹铅。
備選假設(shè)瞧柔。人口的平均年齡不是 30 歲。
那么睦裳,如果你使用 5% 的截斷值作為 P 值造锅,則會拒絕原假設(shè)。這是因為總體平均值 30 不在 95% 置信區(qū)間內(nèi)廉邑。在 5% 的顯著性水平上哥蔚,30 對于人口平均值并不合理倒谷。
置信區(qū)間的使用是置信區(qū)間和檢驗之間二元性結(jié)果:如果你正在測試總體平均值是否是特定值 x,并且你使用的 5% 截斷值作為 P 值糙箍,那么如果 x 不在平均值的 95% 置信區(qū)間內(nèi)渤愁,你將拒絕原零假設(shè)。
這可以由統(tǒng)計理論來確定深夯。在實踐中抖格,它只是歸結(jié)為,檢查原假設(shè)中指定的值是否在置信區(qū)間內(nèi)咕晋。
如果你使用 1% 的截斷值作為 P 值雹拄,你必須檢查,原假設(shè)中指定的值是否在總體均值的 99% 置信區(qū)間內(nèi)掌呜。
粗略地說滓玖,如果樣本量很大,這些陳述也適用于總體比例质蕉。
雖然我們現(xiàn)在有一種方法势篡,使用置信區(qū)間來檢驗一種特定假設(shè),但是你可能想知道模暗,測試總體(年齡)的均值是否等于 30 的意義禁悠。實際上,這個意義并不清楚兑宇。但是在某些情況下碍侦,對這種假設(shè)的檢驗既自然又有用。
我們將在數(shù)據(jù)的背景下來研究它顾孽,這些數(shù)據(jù)是霍奇金病治療的隨機(jī)對照試驗中收集的信息的子集”裙妫霍奇金病是一種通常影響年輕人的癌癥若厚。這種疾病是可以治愈的,但治療可能非常艱難蜒什。該試驗的目的是找出治療癌癥的劑量测秸,并且將對患者的不利影響最小化。
這張表格包含治療對 22 名患者肺部的影響的數(shù)據(jù)灾常。這些列是:
- 身高(厘米)
- 覆蓋物輻射的測量(頸部霎冯,胸部,手臂下)
- 化療的測量
- 基線下钞瀑,即在治療開始時的肺健康得分沈撞;較高的分?jǐn)?shù)對應(yīng)于更健康的肺
- 治療后 15 個月,相同的肺的健康得分
hodgkins = Table.read_table('hodgkins.csv')
hodgkins
height | rad | chemo | base | month15 |
---|---|---|---|---|
164 | 679 | 180 | 160.57 | 87.77 |
168 | 311 | 180 | 98.24 | 67.62 |
173 | 388 | 239 | 129.04 | 133.33 |
157 | 370 | 168 | 85.41 | 81.28 |
160 | 468 | 151 | 67.94 | 79.26 |
170 | 341 | 96 | 150.51 | 80.97 |
163 | 453 | 134 | 129.88 | 69.24 |
175 | 529 | 264 | 87.45 | 56.48 |
185 | 392 | 240 | 149.84 | 106.99 |
178 | 479 | 216 | 92.24 | 73.43 |
(省略了 12 行)
我們將比較基準(zhǔn)和 15 個月的得分雕什。 由于每行對應(yīng)一個病人缠俺,我們說基線得分的樣本和 15 個月得分的樣本是成對的 - 它們不是每組 22 個值的兩組显晶,而是 22 對值,每個病人一個壹士。
一眼望去磷雇,你可以看到,15 個月的得分往往低于基線得分 - 抽樣患者的肺似乎在治療后 15 個月更差躏救。 這個由drop
列主要是正值來證實唯笙,它是基線得分減去 15 個月的得分。
hodgkins = hodgkins.with_column(
'drop', hodgkins.column('base') - hodgkins.column('month15')
)
hodgkins
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-17.png
height | rad | chemo | base | month15 | drop |
---|---|---|---|---|---|
164 | 679 | 180 | 160.57 | 87.77 | 72.8 |
168 | 311 | 180 | 98.24 | 67.62 | 30.62 |
173 | 388 | 239 | 129.04 | 133.33 | -4.29 |
157 | 370 | 168 | 85.41 | 81.28 | 4.13 |
160 | 468 | 151 | 67.94 | 79.26 | -11.32 |
170 | 341 | 96 | 150.51 | 80.97 | 69.54 |
163 | 453 | 134 | 129.88 | 69.24 | 60.64 |
175 | 529 | 264 | 87.45 | 56.48 | 30.97 |
185 | 392 | 240 | 149.84 | 106.99 | 42.85 |
178 | 479 | 216 | 92.24 | 73.43 | 18.81 |
(省略了 12 行)
hodgkins.select('drop').hist(bins=np.arange(-20, 81, 20))
np.mean(hodgkins.column('drop'))
28.615909090909096
但是盒使,這可能是機(jī)會變異的結(jié)果嗎崩掘? 似乎并不如此,但數(shù)據(jù)來自隨機(jī)樣本忠怖。 難道在整個人群中呢堰,平均下降值只有 0 嗎?
為了回答這個問題凡泣,我們可以設(shè)定兩個假設(shè):
原假設(shè):總體(下降值)均值為 0枉疼。
備選假設(shè):總體(下降值)均值不為 0。
為了使用 1% 的截斷值作為 P 值來驗證這個假設(shè)鞋拟,讓我們?yōu)榭傮w(下降值)均值構(gòu)建近似 99% 置信區(qū)間骂维。
bstrap_means = bootstrap_mean(hodgkins, 'drop', 10000)
left = percentile(0.5, bstrap_means)
right = percentile(99.5, bstrap_means)
make_array(left, right)
array([ 17.25045455, 40.60136364])
resampled_means = Table().with_column(
'Bootstrap Sample Mean', bstrap_means
)
resampled_means.hist()
plots.plot(make_array(left, right), make_array(0, 0), color='yellow', lw=8);
https://gitee.com/wizardforcel/data8-textbook-zh/raw/master/img/11-18.png
總體均值的 99% 置信區(qū)間是約 17 到約 40。區(qū)間不包含 0贺纲。因此航闺,我們拒絕原假設(shè)。
但是請注意猴誊,我們所做的不僅僅是簡單得出結(jié)論:總體均值不是 0潦刃,我們估計了均值的幅度是多大。這比僅僅說“不是 0”更有用懈叹。
對于準(zhǔn)確性的注解:我們的置信區(qū)間相當(dāng)寬泛乖杠,主要有兩個原因:
- 置信水平很高(99%)。
- 與我們之前的例子相比澄成,樣本量相對較小胧洒。
在下一章中,我們將研究樣本大小如何影響準(zhǔn)確性墨状。我們還將研究卫漫,樣本均值的經(jīng)驗分布為何經(jīng)常出現(xiàn)鐘形,盡管底層數(shù)據(jù)的分布根本不是鐘形的肾砂。
尾注
一個領(lǐng)域的術(shù)語通常來自該領(lǐng)域的主要研究人員列赎。首先提出自舉技術(shù)的 Brad Efron 用了一個美國血統(tǒng)的術(shù)語。中國統(tǒng)計學(xué)家不甘示弱镐确,提出了自己的方法粥谬。