1. 程式人生 > >計算與推斷思維 十二、為什麼均值重要

計算與推斷思維 十二、為什麼均值重要

十二、為什麼均值重要

在這個課程中,我們已經研究了幾個不同的統計量,包括總編譯距離,最大值,中位數和平均值。在關於隨機性的明確假設下,我們繪製了所有這些統計量的經驗分佈。有些統計量,比如最大和總變異距離,分佈明顯偏向一個方向。但是,無論研究物件如何,樣本均值的經驗分佈幾乎總是接近鐘形。

如果隨機樣本的性質是真的,不管總體如何,它都能成為一個有力的推理工具,因為我們通常不清楚總體中的資料。大型隨機樣本的均值分佈屬於這類性質。這就是隨機抽樣方法廣泛用於資料科學的原因。

在本章中,我們將研究均值,以及我們可以說的一些東西,僅僅使用最基本的底層總體的假設。我們要解決的問題包括:

  • 均值正好測量了什麼?
  • 大部分資料與平均值有多接近?
  • 樣本量如何與樣本的均值相關?
  • 為什麼隨機樣本的經驗分佈出現鐘形?
  • 我們如何有效地使用抽樣方法進行推理?

均值的性質

在這個課程中,我們可以互換地使用“average”和“mean”兩個單詞(譯者注,在中文中都譯為“均值”),後面也一樣。 在你高中甚至更早的時候,你熟悉均值的定義。

定義:數值集合的均值是集合中所有元素的總和,除以集合中元素的數量。

np.averagenp.mean方法返回陣列的均值。

not_symmetric = make_array(2, 3, 3, 9)
np.average(not_symmetric)
4.25
np.mean
(not_symmetric) 4.25

基本性質

上面的定義和例子指出了均值的一些性質。

  • 它不一定是集合中的一個元素。
  • 即使集合的所有元素都是整數,也不一定是整數。
  • 它在集合的最小值和最大值之間。
  • 它不一定在兩個極值的正中間;集合中一半的元素並不總是大於均值。
  • 如果集合含有一個變數的值,以指定單位測量,則均值也具有相同的單位。

我們現在將研究一些其他性質,它有助於理解均值,並與其他統計量相關。

均值是個“平滑器”

你可以將均值視為“均衡”或“平滑”操作。 例如,將上面的not_symmetric中的條目設想為四個不同人的口袋中的美元。 為此,你先把所有的錢都放進一個大袋子,然後平均分配給四個人。 最開始,他們在口袋中裝了不同數量的錢(2 美元,3 美元,3 美元和9 美元),但現在每個人都有平均數量 4.25 美元。

均值的性質

如果一個集合只包含 1 和 0,那麼集合的總和就是集合中 1 的數量,集合的均值就是 1 的比例。

zero_one = make_array(1, 1, 1, 0)
sum(zero_one)
3
np.mean(zero_one)
0.75

捏可以將 1 替換為布林值True,0 替換為False

np.mean(make_array(True, True, True, False))
0.75

因為比例是均值的一個特例,隨機樣本均值的結果也適用於隨機樣本比例。

均值和直方圖

集合{2, 3, 3, 9}的平均值是 4.25,這不是資料的“正中間的點”。 那麼這是什麼意思?

為了瞭解它,請注意,平均值可以用不同的方式計算。

最後一個表示式就是一個普遍事實的例子:當我們計算平均值時,集合中的每個不同的值都由它在集合中出現的時間比例加權。

這有一個重要的結果。 集合的平均值僅取決於不同的值及其比例,而不取決於集合中元素的數量。 換句話說,集合的平均值僅取決於集合中值的分佈。

因此,如果兩個集合具有相同的分佈,則它們具有相同的均值。

例如,這裡是另一個集合,它的分佈與not_symmetric相同,因此均值也相同。

not_symmetric
array([2, 3, 3, 9])
same_distribution = make_array(2, 2, 3, 3, 3, 3, 9, 9)
np.mean(same_distribution)
4.25

均值是分佈直方圖的物理屬性。這裡是not_symmetric的分佈直方圖,或者等價的same_distribution的分佈直方圖。

想象一下,直方圖是由紙板組成的圖形,它附著在一條線上,線沿著橫軸延伸。並且,將這些條形想象為附加在值 2, 3 和 9 上的權重。假設你嘗試在線上的某個點平衡這個圖形。如果該點接近 2,圖形就向右傾斜。如果該點接近 9,則圖形就向左傾斜。之間的某個地方是這個數字取得平衡的點。這個點是 4.25,就是均值。

均值是直方圖的重心或平衡點。

為了理解這是為什麼,瞭解一些物理會有幫助。重心的計算與我們計算平均值的方法完全相同,通過將不同值按它們比例加權。

因為均值是一個平衡點,有時在直方圖的底部顯示為一個支點或三角形。

均值和中位數

如果一個學生的考試成績低於平均水平,這是否意味著該學生在該考試中處於後一半?

對於學生來說,回答是“不一定”。 原因與直方圖的平衡點即均值,和資料的“中間點”即中位數之間的關係有關。

通過這個關係很容易看到一個簡單的例子。 這裡是陣列symmetric的集合{2, 3, 3, 4}的直方圖。 分佈對稱於 3。均值和中位數都等於 3。

symmetric = make_array(2, 3, 3, 4)

np.mean(symmetric)
3.0
percentile(50, symmetric)
3

一般來說,對於對稱分佈,均值和中位數是相等的。

如果分佈不對稱呢? 我們來比較symmetricnot_symmetric

藍色直方圖表示原始的symmetric分佈。 not_symmetric的金色從左端起始,和藍色一樣,但是最右邊的條形到了數值 9。棕色部分是兩個直方圖重疊的位置。

藍色分佈的中位數和均值都等於 3。金色分佈的中值也等於 3,儘管右半部分與左邊的分佈不同。

但金色分佈的平均值不是 3:金色直方圖在 3 時不平衡。平衡點已經向右移動到 4.25。

在金色分佈中,4 個條目中有 3 個(75%)低於平均水平。 因此,低於平均分的學生可以放心。 他或她可能是班上的大多數人。

一般來說,如果直方圖的一邊有尾巴(整數屬於是“偏斜的”),那麼平均值就會從中間拉到尾巴的方向。

示例

sf2015表包含 2015 年舊金山城市員工的薪水和福利資料。與以前一樣,我們將我們的分析僅限於那些等價於至少就業半年的人。

sf2015 = Table.read_table('san_francisco_2015.csv').where('Salaries', are.above(10000))

我們前面看到了,最高薪資高於 60 萬美元,但絕大多數僱員的薪資低於 30 萬美元。

sf2015.select('Total Compensation').hist(bins = np.arange(10000, 700000, 25000))

這個直方圖向右偏斜;它的右側有個尾巴。

平均值拉向了尾巴的方向。 所以我們預計平均薪酬會比中位數大,事實確實如此。

compensation = sf2015.column('Total Compensation')
percentile(50, compensation)
110305.78999999999
np.mean(compensation)
114725.98411824222

大量總體的收入分佈往往是右偏的。 當總體的大部分收入中到低,但很小一部分收入很高時,直方圖的右側有條細長的尾巴。

平均收入受這條尾巴的影響:尾巴向右延伸得越遠,平均值就越大。 但中位數不受分佈極值的影響。 這就是經濟學家經常用收入分佈的中位數來代替平均值的原因。

可變性

平均值告訴我們直方圖平衡的位置。 但是在我們所看到的幾乎所有的直方圖中,值都位於均值的兩邊。 他們距離均值有多遠? 為了回答這個問題,我們將開發一個關於均值的可變性度量。

我們首先描述如何計算度量值。 然後我們就會明白,為什麼這是很好的計算方法。

距離均值的偏差的大致大小

為了簡單起見,我們將在簡單陣列any_numbers的上下文中開始計算,它由四個值組成。 你將會看到,我們的方法非常易於擴充套件到任何其他陣列。

any_numbers = make_array(1, 2, 2, 10)

我們的目標是,大致衡量這些數值離他們的平均水平有多遠。 為了實現它,我們首先需要均值:

# Step 1. The average.

mean = np.mean(any_numbers)
mean
3.75

接下來,我們來看看每個數值離均值有多遠。 這些被稱為到均值的偏差。 “到均值的偏差”只是每個值減去平均值。 calculation_steps表顯示了結果。

# Step 2. The deviations from average.

deviations = any_numbers - mean
calculation_steps = Table().with_columns(
        'Value', any_numbers,
        'Deviation from Average', deviations
        )
calculation_steps
Value Deviation from Average
1 -2.75
2 -1.75
2 -1.75
10 6.25

一些偏差是負的;它們對應於低於均值的值。 正的偏差對應於高於平均值的值。

要計算偏差有多大,計算偏差的平均值是很自然的。 但是當所有的偏差加在一起的時候,會發生一些有趣的事:

sum(deviations)
0.0

正的偏差正好和負的偏差抵消。 無論列表的直方圖是什麼樣子,所有的數字列表都是如此:到均值的偏差總和為零。

由於偏差的總和為零,偏差的均值也將為零:

np.mean(deviations)
0.0

因此,偏差的均值不是偏差大小的有用度量。 我們真正想知道的是偏差有多大,不管它們是正的還是負的。 所以我們需要一種方法來消除偏差的符號。

有兩種歷史悠久的丟掉符號的方式:絕對值和平方。 事實證明,採用平方會構建一個度量,帶有非常強大的性質,其中一些我們將在這個課程中學習。

所以讓我們計算所有偏差的平方,來消除符號。 那麼我們將計算平方的均值:

# Step 3. The squared deviations from average

squared_deviations = deviations ** 2
calculation_steps = calculation_steps.with_column(
   'Squared Deviations from Average', squared_deviations
    )
calculation_steps
Value Deviation from Average Squared Deviations from Average
1 -2.75 7.5625
2 -1.75 3.0625
2 -1.75 3.0625
10 6.25 39.0625
# Step 4. Variance = the mean squared deviation from average

variance = np.mean(squared_deviations)
variance
13.1875

方差:上面計算的偏差平方的均值稱為方差。

雖然方差確實給了我們延展度的概念,但它和原始變數不是一個量綱,因為它的單位是原始變數的平方。 這使得解釋非常困難。

所以我們通過計算方差的算術平方根的來返回原來的量綱:

# Step 5.
# Standard Deviation:    root mean squared deviation from average
# Steps of calculation:   5    4      3       2             1

sd = variance ** 0.5
sd
3.6314597615834874

標準差

我們剛計算出來的數量叫做列表的標準差,簡寫為 SD。 它大致衡量列表中的數字與其平均水平的差距。

定義:列表的 SD 定義為方差(偏差平方的均值)的算術平方根。這很拗口。 但是從左到右閱讀,你需要執行一系列的步驟的計算。

計算:上述五個步驟會產生 SD。 你還可以使用函式np.std來計算陣列中值的標準差:

np.std(any_numbers)
3.6314597615834874

譯者注:寫在一起就是np.mean((arr - arr.mean()) ** 2) ** 0.5

使用 SD

要看看我們可以從SD中學到什麼,讓我們轉向一個比any_numbers更有趣的資料集。 nba13表包含了 2013 年 NBA 的球員資料。對於每個球員來說,表格中記錄了球員通常的位置,他的身高(英寸),體重(磅)和年齡。

nba13 = Table.read_table('nba2013.csv')
nba13
Name Position Height Weight Age in 2013
DeQuan Jones Guard 80 221 23
Darius Miller Guard 80 235 23
Trevor Ariza Guard 80 210 28
James Jones Guard 80 215 32
Wesley Johnson Guard 79 215 26
Klay Thompson Guard 79 205 23
Thabo Sefolosha Guard 79 215 29
Chase Budinger Guard 79 218 25
Kevin Martin Guard 79 185 30
Evan Fournier Guard 79 206 20

(省略了 495 行)

這裡是球員身高的直方圖。

nba13.select('Height').hist(bins=np.arange(68, 88, 1))

NBA 球員身材高大並不奇怪! 他們的平均身高只有 79 英寸(6’7”),比美國男子的平均身高高出 10 英寸。

mean_height = np.mean(nba13.column('Height'))
mean_height
79.065346534653472

球員的身高距離平均有多遠? 這通過身高的 SD 來測量,大約是 3.45 英寸。

sd_height = np.std(nba13.column('Height'))
sd_height
3.4505971830275546

俄克拉荷馬雷霆的高個中鋒雜湊姆·塔位元(Hasheem Thabeet)是最高的球員,身高 87 英寸。

nba13.sort('Height', descending=True).show(3)
Name Position Height Weight Age in 2013
Hasheem Thabeet Center 87 263 26
Roy Hibbert Center 86 278 26
Tyson Chandler Center 85 235 30

(省略了 502 行)

Thabeet 比平均身高高了大約 8 英寸。

87 - mean_height
7.9346534653465284

這個就是距離均值的偏差,大約是 2.3 乘標準差。

(87 - mean_height)/sd_height
2.2995015194397923

換句話說,最高球員的身高比均值高了 2.3 個 SD。

以賽亞·托馬斯(Isaiah Thomas)身高 69 英寸,是 2013 年 NBA 最矮的球員之一。他的身高比均值低了 2.9 個 SD。

nba13.sort('Height').show(3)
Name Position Height Weight Age in 2013
Isaiah Thomas Guard 69 185 24
Nate Robinson Guard 69 180 29
John Lucas III Guard 71 157 30

(省略了 502 行)

(69 - mean_height)/sd_height
-2.9169868288775844

我們觀察到,最高和最矮的球員都距離平均身高只有幾個標準差。 這是例子,說明了為什麼 SD 是延展度的有效度量。無論直方圖的形狀如何,平均值和 SD 一起告訴你很多東西,關於直方圖在數軸上的位置。

使用 SD 度量延展度的最主要原因

非正式宣告:在所有的數值資料集中,大部分條目都在“均值上下幾個標準差”的範圍內。

現在,先剋制住自己,不要了解“散”,“少”等模糊詞的確切含義。 我們將在本節的後面進行詳細說明。 我們僅僅在更多示例的背景下研究這個陳述。

我們已經看到,所有 NBA 球員的身高都在“均值上下幾個標準差”的範圍內。

那年齡呢? 這裡是分佈的直方圖,以及年齡的平均值和標準差。

nba13.select('Age in 2013').hist(bins=np.arange(15, 45, 1))

ages = nba13.column('Age in 2013')
mean_age = np.mean(ages)
sd_age = np.std(ages)
mean_age, sd_age
(26.19009900990099, 4.3212004417203067)

平均年齡只有 26 歲,標準差大約是 4.3 歲。

年齡與均值相差多遠? 就像我們對身高所做的那樣,讓我們看看兩個年齡的極端值。

Juwan Howard 是年齡最大的球員 40 歲。

nba13.sort('Age in 2013', descending=True).show(3)
Name Position Height Weight Age in 2013
Juwan Howard Forward 81 250 40
Marcus Camby Center 83 235 39
Derek Fisher Guard 73 210 39

(省略了 502 行)

Howard 的年齡比均值高了 3.2 個標準差。

(40 - mean_age)/sd_age
3.1958482778922357

年齡最小的是 15 歲的 Jarvis Varnado,他當年在邁阿密熱火隊(Miami Heat)奪得了 NBA 總冠軍。 他的年齡比均值低了 2.6 個標準差。

nba13.sort('Age in 2013').show(3)
Name Position Height Weight Age in 2013
Jarvis Varnado Forward 81 230 15
Giannis Antetokounmpo Forward 81 205 18
Sergey Karasev Guard 79 197 19

(省略了 502 行)

(15 - mean_age)/sd_age
-2.5895811038670811

對於高度和年齡,我們觀察到的東西非常普遍。 對於所有列表,大部分條目都不超過平均值 2 或 3 個標準差。

切比雪夫邊界

俄羅斯數學家切比雪夫(Pafnuty Chebychev,1821-1894)證明了這個結論,使我們的粗略陳述更加精確。

對於所有列表和所有數字z,“均值上下z個標準差”範圍內的條目比例至少為

值得注意的是,結果給出了一個界限,而不是一個確切的數值或近似值。

是什麼讓結果變得強大,對於所有列表來說都是這樣呢 - 所有的分佈,無論多麼不規則?

具體來說,對於每個列表:

在“均值上下兩個標準差”範圍內的比例至少是1 - 1/4 = 0.75

在“均值上下三個標準差”範圍內的比例至少為1 - 1/9 ≈ 0.89

在“均值上下 4.5 個標準差”範圍內的比例至少為1 - 1/4.5^2 ≈ 0.95

如上所述,切比雪夫的結果給出了一個下界,而不是一個確切的答案或近似值。例如,“均值上下兩個標準差”範圍內的條目百分比可能比 75% 大得多。但它不會更小。

標準單位

在上面的計算中,z的數量是標準單位,高於平均水平的標準差的數量。

標準單位的某些值是負值,對應於低於均值的原始值。 標準單位的其他是正值。 但是無論列表的分佈如何,切比雪夫邊界意味著標準單位一般在(-5, 5)範圍內。

要將一個值轉換為標準單位,首先要求出距離平均值有多遠,然後將該偏差與標準差比較。

我們將會看到,標準單位經常用於資料分析。 所以定義一個函式,將數值的陣列轉換為標準單位是很有用的。

def standard_units(numbers_array):
    "Convert any array of numbers to standard units."
    return (numbers_array - np.mean(numbers_array))/np.std(numbers_array)    

示例

我們在前面的章節中看到,united表包含了Delay列,包括 2015 年夏天聯合航空數千航班的起飛延誤時間,以分鐘為單位。我們將建立一個名為Delay (Standard Units)的新列, 通過將函式standard_units應用於Delay列。 這使我們可以看到所有延誤時間(分鐘)以及標準單位的相應值。

united = Table.read_table('united_summer2015.csv')
united = united.with_column(
    'Delay (Standard Units)', standard_units(united.column('Delay'))
)
united
Date Flight Number Destination Delay Delay (Standard Units)
6/1/15 73 HNL 257 6.08766
6/1/15 217 EWR 28 0.287279
6/1/15 237 STL -3 -0.497924
6/1/15 250 SAN 0 -0.421937
6/1/15 267 PHL 64 1.19913
6/1/15 273 SEA -6 -0.573912
6/1/15 278 SEA -8 -0.62457
6/1/15 292 EWR 12 -0.117987
6/1/15 300 HNL 20 0.0846461
6/1/15 317 IND -10 -0.675228

(省略了 13815 行)

我們看到的標準單位與我們根據切比雪夫邊界的預期一致。 大部分都是相當小的值;只有一個大於 6。

但是,當我們將延誤時間從高到低排序時,會發生一些驚人的事情。 我們看到的標準單位是非常高的!

united.sort('Delay', descending=True)
Date Flight Number Destination Delay Delay (Standard Units)
6/21/15 1964 SEA 580 14.269
6/22/15 300 HNL 537 13.1798
6/21/15 1149 IAD 508 12.4453
6/20/15 353 ORD 505 12.3693
8/23/15 1589 ORD 458 11.1788
7/23/15 1960 LAX 438 10.6722
6/23/15 1606 ORD 430 10.4696
6/4/15 1743 LAX 408 9.91236
6/17/15 1122 HNL 405 9.83637
7/27/15 572 ORD 385 9.32979

(省略了 13815 行)

這表明,資料有可能高於均值很多個標準差(對於延誤了 10 個小時的航班)。 延誤的最高值超過 14 個標準單位。

然而,這些極端值的比例很小,切比雪夫邊界仍然是真的。 例如,讓我們計算在“均值上下三個標準差”範圍內的延誤百分比。 這與標準單位在(-3, 3)範圍內的時間百分比相同。 這大約是 98%,計算在下面,和切比雪夫邊界“至少 89%”一致。

within_3_sd = united.where('Delay (Standard Units)', are.between(-3, 3))
within_3_sd.num_rows/united.num_rows
0.9790235081374322

延誤時間的直方圖如下所示,橫軸以標準單位表示。 從上表中可以看出,右邊的尾巴一直延伸到z = 14.27個標準單位(580 分鐘)。 在z = -3z = 3範圍外的直方圖面積大約是 2%,加起來非常小,在直方圖中幾乎不可見。

united.hist('Delay (Standard Units)', bins=np.arange(-5, 15.5, 0.5))
plots.xticks(np.arange(-6, 17, 3));

標準差和正態曲線

我們知道均值是直方圖的平衡點。 標準差與平均值不同,通常不容易通過檢視直方圖來識別。

然而,有一種分佈形狀,它的標準差與平均值幾乎一樣清晰可辨。 這是鐘形分佈。 本節將檢視該形狀,因為它經常出現在概率直方圖中,也出現在一些資料的直方圖中。

資料的大致鐘形的直方圖

讓我們看看母親的身高分佈,它們在我們熟悉的 1174 對母親和新生兒的樣本中。母親的平均身高為 64 英寸,SD 為 2.5 英寸。 與籃球運動員的身高不同,母親身高關於鐘形曲線中的平均值對稱分佈。

baby = Table.read_table('baby.csv')
heights = baby.column('Maternal Height')
mean_height = np.round(np.mean(heights), 1)
mean_height
64.0
sd_height = np.round(np.std(heights), 1)
sd_height
2.5
baby.hist('Maternal Height', bins=np.arange(55.5, 72.5, 1), unit='inch')
positions = np.arange(-3, 3.1, 1)*sd_height + mean_height
plots.xticks(positions);

上面單元格中的最後兩行程式碼更改了橫軸的標籤。 現在,對於z=0, ±1, ±2, ±3,標籤對應於“標籤上下z個標準差”。 由於分佈的形狀,“中心”具有明確的含義,在 64 處清晰可見。

如何定位鐘形曲線上的 SD

要看 SD 如何與曲線相關,請從曲線頂部開始,向右看。 請注意,曲線有一個地方,從看起來像“倒扣的杯子”,變為“朝右的杯子”。 在形式上,曲線有一個拐點。 這個點高於均值一個 SD。 這是z = 1的點,即“均值加一個標準差”,為 66.5 英寸。

在均值的左邊也對稱,拐點在z = -1處,也就是“均值減一個標準差”,為 61.5 英寸。

一般來說,對於鐘形分佈,SD 是均值和任一側的拐點之間的距離。

標準正態曲線

除了軸上的標籤,我們所看到的所有鐘形直方圖,看起來基本相同。 的確,通過適當地重新標記座標軸,從所有這些曲線中,實際上只能繪製一條曲線。

為了繪製這條基本曲線,我們將使用標準單位,我們可以將每個列表轉換成它。所得到的曲線因此被稱為標準正態曲線。

標準正態曲線的方程令人印象深刻。 但是現在,最好把它看作是變數直方圖的平滑輪廓,變數以標準單位測量並具有鐘形分佈。

與往常一樣,當你檢查新的直方圖時,首先檢視橫軸。在標準正態曲線的橫軸上,這些值是標準單位。

這裡是曲線的一些屬性。有些是通過觀察顯而易見的,有些則需要大量的數學才能建立起來。

曲線下面的總面積是1.所以你可以把它看作是繪製為密度標度的直方圖。

曲線是對稱的。所以如果一個變數具有這個分佈,它的平均值和中位數都是 0。

曲線的拐點在 -1 和 +1 處。

如果一個變數具有這種分佈,那麼它的 SD 是 1。正態曲線是 SD 清晰可辨的極少數分佈之一。

由於我們將曲線視為平滑的直方圖,因此我們希望用曲線下方的面積來表示資料總量的比例。

平滑曲線下的面積通常是通過微積分來計算的,使用一種稱為積分的方法。然而,一個數學的事實是,標準的正態曲線不能通過任何微積分方式來積分。

因此,曲線下方的面積必須近似。這就是幾乎所有的統計教科書,都帶有曲線下方的面積的原因。這也是所有統計系統,包括 Python 模組在內,都包含提供這些面積的優秀近似的方法的原因。

from scipy import stats

標準正態的累積分佈函式(CDF)

用於求出正態曲線下的面積的基本函式是stats.norm.cdf。 它接受一個數值引數,並返回曲線下,該數值的左側的所有面積。 它在形式上被稱為標準正態曲線的“累積分佈函式”。 在口語裡縮寫為 CDF。

讓我們使用這個函式來求出標準正態曲線下,z=1左側的面積。

陰影區域的數值可以通過呼叫stats.norm.cdf來求出。

stats.norm.cdf(1)
0.84134474606854293

這大概是 84%。 現在我們可以使用曲線的對稱性,以及曲線下面的總面積為 1 事實,來求出其他面積。

z = 1右側的面積大概是100% - 84% = 16%

1 - stats.norm.cdf(1)
0.15865525393145707

z = -1z = 1之間的面積可以用幾種不同的方式來計算。 它是下面的曲線下方的金色區域。

例如,我們可以將面積計算為“100% -兩個相等的尾巴”,結果大致是100% - 2X16% = 68%

或者我們可以注意到,z = 1z = -1之間的區域等於z = 1左邊的所有區域,減去z = -1左邊的所有區域。

stats.norm.cdf(1) - stats.norm.cdf(-1)
0.68268949213708585

通過類似的計算,我們看到-22之間的區域大約是 95%。

stats.norm.cdf(2) - stats.norm.cdf(-2)
0.95449973610364158

換句話說,如果一個直方圖大致是鐘形,那麼在“均值上下兩個標準差”範圍內的資料比例大約是 95%。

這比切比雪夫的下界 75% 還要多。 切比雪夫邊界較弱,因為它必須適用於所有的分佈。 如果我們知道一個分佈是正態的,那麼我們就有很好的比例近似,而不僅僅是邊界。

下表比較了我們對所有分佈和正態分佈的瞭解。 請注意,當z = 1時,切比雪夫的邊界是正確的,但沒有啟發性。

Percent in Range All Distributions: Bound Normal Distribution: Approximation
均值上下一個標準差 至少 0% 約 68%
均值上下兩個標準差 至少 75% 約 95%
均值上下三個標準差 至少 88.888…% 約 99.73%

中心極限定律

我們在本課程中看到的很少資料直方圖是鐘形的。 當我們遇到一個鐘形的分佈時,它幾乎總是一個基於隨機樣本的統計量的經驗直方圖。

下面的例子顯示了兩個非常不同的情況,其中在這樣的直方圖中出現了近似的鐘形。

輪盤賭的淨收益

在前面的章節中,如果我們在輪盤的不同輪次上重複下相同的賭注,那麼我們所花費的總金額的粗略形狀就會成為鐘形。

wheel
Pocket Color
0 green
00 green
1 red
2 black
3 red
4 black
5 red
6 black
7 red
8 black

(省略了 28 行)

回想一下,紅色的下注返回相等的錢,1 比 1。我們定義的函式red_winnings返回對紅色下注一美元的淨收益。具體來說,該函式將顏色作為引數,如果顏色為紅色,則返回 1。 對於所有其他顏色,它返回 -1。

def red_winnings(color):
    if color == 'red':
        return 1
    else:
        return -1

red表展示了紅色情況下,每個口袋的獎金。

red = wheel.with_column(
    'Winnings: Red', wheel.apply(red_winnings, 'Color')
    )
red
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 行)

你在賭注上的淨收益Winnings: Red的隨機抽樣。 有 1/18 的機率賺一美元,20/38 的機率損失一美元。 這個概率分佈顯示在下面的直方圖中。

red.select('Winnings: Red').hist(bins=np.arange(-1.5, 1.6, 1))

現在假設你多次對紅色下注。 你的淨收益將是來自上述分佈的,多個帶放回隨機抽樣的總和。

這將需要一些數學,來列出淨收益的所有可能值,以及所有的記錄。 我們不會那樣做;相反,我們將通過模擬來逼近概率分佈,就像我們在這個過程中一直做的那樣。

下面的程式碼模擬你的淨收益,如果你在輪盤賭的 400 個不同的輪次中,對紅色下注一美元。

num_bets = 400
repetitions = 10000

net_gain_red = make_array()

for i in np.arange(repetitions):
    spins = red.sample(num_bets)
    new_net_gain_red = spins.column('Winnings: Red').sum()
    net_gain_red = np.append(net_gain_red, new_net_gain_red)


results = Table().with_column(
    'Net Gain on Red', net_gain_red
    )
results.hist(bins=np.arange(-80, 50, 6))

這是一個大致鐘形的直方圖,即使我們正在繪製的分佈並不是鐘形。

中心。分佈集中在-$20附近。 要知道為什麼,請注意,你的獎金在 18/38 左右的下注中為 1 美元,剩下的 20/38 則為負一美元。 所以每個一美元賭注的平均獎金大概是 -5.26 美分:

average_per_bet = 1*(18/38) + (-1)*(20/38)
average_per_bet
-0.05263157894736842

因此,在 400 次下注中,你預計淨收益大約是 21 美元。

400 * average_per_bet
-21.052631578947366

為了確認,我們可以計算 10,000 次模擬淨收益的平均值:

np.mean(results.column(0))
-20.8992

延展。讓你的眼睛沿著曲線從中心開始,注意到拐點在 0 附近。在鐘形曲線上,SD 是中心到拐點的距離。 中心大概是 -20 美元,這意味著分佈的標準差大約是 20 美元。

在下一節中,我們將看到 20 美元是怎麼來的。 現在,讓我們通過簡單計算 10,000 個模擬淨收益的 SD 來證實我們的觀察:

np.std(results.column(0))
20.043159415621083

總結。 400 次下注的淨收益是每個單獨賭注的 400 個獎金的總和。 這個總和的概率分佈近似正態,我們可以近似它的均值和標準差。

平均航班延誤

united表包含 2015 年夏季舊金山機場出發的 13,825 個聯合航空國內航班的出發延誤資料。正如我們以前所見,延誤的分佈的右側有著很長的尾巴。

united = Table.read_table('united_summer2015.csv')
united.select('Delay').hist(bins=np.arange(-20, 300, 10))

平均延誤約為 16.6 分鐘,SD 約為 39.5 分鐘。 注意 SD 與平均值相比有多大。 但是右側的較大偏差會產生影響,儘管它們在資料中佔很小的比例。

mean_delay = np.mean(united.column('Delay'))
sd_delay = np.std(united.column('Delay'))

mean_delay, sd_delay
(16.658155515370705, 39.480199851609314)

現在假設我們隨機抽取了 400 個延誤。 如果你願意,你可以無放回抽樣,但是結果與放回抽樣非常相似。 如果你從 13,825 箇中無放回地抽取幾百個,那麼每當你抽出一個值時,幾乎不會改變總體。

在樣本中,平均延誤會是多少? 我們預計在 16 或 17 左右,因為這是總體的均值。 但可能會有些偏差。 讓我們看看我們通過抽樣得到了什麼。 我們將處理delay表,僅包含延遲的列。

delay = united.select('Delay')
np.mean(delay.sample(400).column('Delay'))
16.68

樣本均值根據樣本的出現方式而變化,因此我們將重複模擬抽樣過程,並繪製樣本均值的經驗直方圖。 這是樣本均值的概率直方圖的近似值。

sample_size = 400
repetitions = 10000

means = make_array()

for i in np.arange(repetitions):
    sample = delay.sample(sample_size)
    new_mean = np.mean(sample.column('Delay'))
    means = np.append(means, new_mean)

results = Table().with_column(
    'Sample Mean', means
)
results.hist(bins=np.arange(10, 25, 0.5))

即使我們從非常偏斜的分佈抽樣,我們再次看到了大致的鐘形。 正如我們所期望的那樣,這個鐘形的中心在 16 到 17 之間。

中心極限定律

鐘形出現在這樣的環境中的原因,是一個概率理論的顯著結果,稱為中心極限定律。

中心極限定理表明,無論用於抽取樣本的總體分佈如何,帶放回抽取的大型隨機樣本的總和或均值的概率分佈大致是正態的。

我們在研究切比雪夫邊界時指出,不管總體分佈如何,結果都可以應用於隨機樣本,這非常強大,因為在資料科學中,我們很少知道總體的分佈。

如果我們有一個大型隨機樣本,那麼中心極限定理就能夠在總體知識很少的情況下進行推理。 這就是它是統計推斷領域的核心的原因。

紫色的花的分佈

回憶孟德爾的豌豆植物的花朵顏色的概率模型。 該模型表明,植物的花朵顏色類似於來自{紫色,紫色,紫色,白色}的帶放回隨機抽樣。

在植物的大型樣本中,紫色的花約有多少比例? 我們預計答案約為 0.75,模型中紫色的比例。 而且,由於比例是均值,中心極限定理表明,紫色的樣本比例的分佈大致是正態的。

我們可以通過模擬來確認。 我們來模擬 200 株植物樣本中紫色的花的比例。

colors = make_array('Purple', 'Purple', 'Purple', 'White')

model = Table().with_column('Color', colors)

model
Color
Purple
Purple
Purple
White
props = make_array()

num_plants = 200
repetitions = 10000

for i in np.arange(repetitions):
    sample = model.sample(num_plants)
    new_prop = np.count_nonzero(sample.column('Color') == 'Purple')/num_plants
    props = np.append(props, new_prop)

results = Table().with_column('Sample Proportion: 200', props)
results.hist(bins=np.arange(0.65, 0.85, 0.01))

正如你所期望的那樣,中央極限定理預測了,正態曲線再次集中於 0.75 左右。

如果我們增加樣本量,這個分佈如何變化? 讓我們再次執行程式碼,樣本量為 800 ,並將模擬結果收集在同一個表中,我們在裡面收集了樣本量為 200 的模擬結果。我們使重複次數與之前相同,以便兩列具有相同的長度。

props2 = make_array()

num_plants = 800

for i in np.arange(repetitions):
    sample = model.sample(num_plants)
    new_prop = np.count_nonzero(sample.column('Color') == 'Purple')/num_plants
    props2 = np.append(props2, new_prop)

results = results.with_column('Sample Proportion: 800', props2)
results.hist(bins=np.arange(0.65, 0.85, 0.01))

兩個分佈都大致是正態,但一個比另一個更窄。 樣本量為 800 的比例,比樣本量為 200 的比例更緊密地聚集在 0.75 左右。增加樣本量可以減少樣本比例的可變性。

這應該不會令人驚訝。 我們多次產生了這樣的直覺,更大的樣本量通常會降低統計量的可變性。 然而,在樣本均值的案例中,我們可以量化樣本量和可變性之間的關係。

樣本量究竟是如何影響樣本均值或比例的可變性呢? 這是我們將在下一節中討論的問題。

樣本均值的可變性

根據中心極限定理,大型隨機樣本的均值的概率分佈是大致正態的。 鐘形曲線以總體平均值為中心。 一些樣本均值較高,有些則較低,但距離總體均值的偏差在兩邊大致對稱,正如我們已經看到的那樣。 形式上,概率論表明樣本均值是總體均值的無偏估計。

在我們的模擬中,我們也注意到較大樣本的均值,相對較小樣本的平均值更傾向於緊密聚集於總體均值附近。 在本節中,我們將量化樣本均值的可變性,並建立可變性和樣本量之間的關係。

我們從航班延誤表開始。 平均延誤時間約為 16.7 分鐘,延誤分佈右傾。

united = Table.read_table('united_summer2015.csv')
delay = united.select('Delay')
pop_mean = np.mean(delay.column('Delay'))
pop_mean
16.658155515370705

現在我們來隨機抽樣,來檢視樣本均值的概率分佈。 像往常一樣,我們將使用模擬來得到這種分佈的經驗近似。

我們將定義一個函式simulate_sample_mean來實現,因為我們將在稍後改變樣本量。 引數是表的名稱,包含變數的列標籤,樣本量和模擬次數。

"""Empirical distribution of random sample means"""

def simulate_sample_mean(table, label, sample_size, repetitions):

    means = make_array()

    for i in range(repetitions):
        new_sample = table.sample(sample_size)
        new_sample_mean = np.mean(new_sample.column(label))
        means = np.append(means, new_sample_mean)

    sample_means = Table().with_column('Sample Means', means)

    # Display empirical histogram and print all relevant quantities
    sample_means.hist(bins=20)
    plots.xlabel('Sample Means')
    plots.title('Sample Size ' + str(sample_size))
    print("Sample size: ", sample_size)
    print("Population mean:", np.mean(table.column(label)))
    print("Average of sample means: ", np.mean(means))
    print("Population SD:", np.std(table.column(label)))
    print("SD of sample means:", np.std(means))

讓我們模擬 100 個延誤的隨機樣本的均值,然後是 400 個,最後是 625 個延誤的均值。 我們將對這些過程中的每一個執行 10,000 次重複。 xlimylim在所有圖表中設定一致的座標軸,以便比較。 你可以忽略每個單元格中的這兩行程式碼。

simulate_sample_mean(delay, 'Delay', 100, 10000)
plots.xlim(5, 35)
plots.ylim(0, 0.25);
Sample size:  100
Population mean: 16.6581555154
Average of sample means:  16.662059
Population SD: 39.4801998516
SD of sample means: 3.90507237968

相關推薦

計算推斷思維 為什麼均值重要

十二、為什麼均值重要 在這個課程中,我們已經研究了幾個不同的統計量,包括總編譯距離,最大值,中位數和平均值。在關於隨機性的明確假設下,我們繪製了所有這些統計量的經驗分佈。有些統計量,比如最大和總變異距離,分佈明顯偏向一個方向。但是,無論研究物件如何,樣本均

計算推斷思維 迴歸的推斷

十四、迴歸的推斷 到目前為止,我們對變數之間關係的分析純粹是描述性的。我們知道如何找到穿過散點圖的最佳直線來繪製。在所有直線中它的估計的均方誤差最小,從這個角度來看,這條線是最好的。 但是,如果我們的資料是更大總體的樣本呢?如果我們在樣本中發現了兩個變數

計算推斷思維 十三預測

十三、預測 資料科學的一個重要方面,是發現數據可以告訴我們什麼未來的事情。氣候和汙染的資料說了幾十年內溫度的什麼事情?根據一個人的網際網路個人資訊,哪些網站可能會讓他感興趣?病人的病史如何用來判斷他或她對治療的反應? 為了回答這樣的問題,資料科學家已經開

計算推斷思維函式和表格

七、函式和表格 通過使用 Python 中已有的函式,我們正在建立一個使用的技術清單,用於識別資料集中的規律和主題。 現在我們將探索Python程式語言的核心功能:函式定義。 我們在本書中已經廣泛使用了函式,但從未定義過我們自己的函式。定義一個函式的目的

計算推斷思維 翻譯完成

面向(未來的)資料科學家的入門課來咯~ 前一半講 Python 程式設計,後一半講統計學基本概念並用 Python 模擬。 電子書還沒生成好,由於存在 SVG 圖片,工具會報錯,線上和本地都沒辦法。 贊助我 KivyCN 學習資源

Linux 進程信號---進程創建(續)

裏的 close %s 關閉 lee else wro 執行 靜態 22.2 父子進程操作文件 文件操作由兩種模式:   IO 系統調用操作文件   標準C IO 操作文件 看代碼: 1 #include <unistd.h> 2 #include <

[Abp 源碼分析]多租戶體系權限驗證

表達式 如何實現 進入 urn tty token asp.net hang 都是 0.簡介 承接上篇文章我們會在這篇文章詳細解說一下 Abp 是如何結合 IPermissionChecker 與 IFeatureChecker 來實現一個完整的多租戶系統的權限校驗的。 1

《激蕩三年》中外合資——上海市長上海大眾

差距 第一個 fff 離開 初步 談判 人在 說了 有趣 在鄧小平南巡之後,中國經濟發展再度揚帆起航。但是,1993年的中國已經不再是一個傳統意義上的計劃經濟國家。在民間,私營經濟快速發展,“投機倒把”成為一個歷史名詞,鄉鎮經濟如火如荼,資本市場作為現代化市場經濟的必要組

JVM(HotSpot)執行緒安全鎖優化----終結篇

注:本博文主要是基於JDK1.7會適當加入1.8內容。 執行緒安全:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為可以獲取正確的結果,那這個物件就是執行緒安全的。 1、Ja

python學習之Django框架():類檢視中介軟體

五、類檢視: 1.類檢視引入: 以函式的方式定義的檢視成為函式檢視,即我們常說的檢視函式. 但是, 檢視函式遭遇不同的請求方法(如get和post),並且需要做不同的處理時,我們如果在一個函式中編寫不同的業務邏輯,程式碼可讀性和複用性都不好. 例如:

C#入門基礎12(泛型,檔案資料流)

一、泛型 什麼是泛型? 泛型是用於處理演算法,資料結構的一種程式設計方法。泛型的目標是採用廣 泛適用和可互動性的形式來表示演算法和資料結構,以似它們能夠直接用 於軟體構造。泛型類,結構,介面,和方法可以根據它們儲存和操作的 資料型別來進行引數化。 泛型能在編譯時提供強大的型別檢查,減少資

C#入門基礎(泛型,檔案資料流)

一、泛型 什麼是泛型? 泛型是用於處理演算法,資料結構的一種程式設計方法。泛型的目標是採用廣 泛適用和可互動性的形式來表示演算法和資料結構,以似它們能夠直接用 於軟體構造。泛型類,結構,介面,和方法可以根據它們儲存和操作的 資料型別來進行引數化。 泛型能在編譯時

Linux 程序訊號——不可靠訊號

32.1 不可靠訊號問題 發生訊號時關聯動作被重置為預設設定 訊號可能丟失 程式片段 在進入 sig_int 與再次呼叫 signal 之間發生的 SIGINT 訊號將不會捕獲 導致程序終止      &nbs

Java的成員變數區域性變數的區別

成員變數與區域性變數的區別: 0、定義的位置上區別: 成員變數:  定義在方法之外,類之內的變數 區域性變數:  定義在方法之內的變數 1、應用範圍的區別          成員變數在整個類內都有效             區域性變數只在其宣告的方法內有效 2、生命

十三周作業【Linux微職位】

馬哥教育一、結合圖形描述LVS的工作原理;lvs-nat模型主要是修改目標IP地址為挑選出新的RS的IP地址。即請求進入負載均衡器時做DNAT,響應出負載均衡器時做SNAT。1.當用戶請求到達Director Server,此時請求的數據報文會先到達內核的PREROUTING鏈,此時報文的源IP是CIP,目標

十三天總結筆記

異常、io、file一:File 1.1 File:文件和目錄(文件夾)路徑名的抽象表示形式。 1.2 File的構造方法: File(String pathname):把一個路徑名稱封裝成File對象 File(String p

計算時代應用設計要素

uil 推薦 ras 相似性 back size ont imp staging 雲計算時代應用設計十二要素 在雲計算時代。應用的整個生命周期將在數據中心裏度過。這跟傳統軟件模式極大不同。 雲應用實際上意味著:代碼 + 配置 + 執行時環境。 什麽樣的軟件才是

samba服務器配置和管理

samba、文件共享12.1、Samba簡介 Linux和Windows是兩種無論在風格還是在技術上都完全不同的操作系統,它們是兩個對立的陣形。各自都擁有自己的用戶群和市場。但是,要實現這兩種系統之間的資源共享,則需要使用Samba。Samba采用的是C/S工作模式,通過它可以將一臺Linux系統主機配置為

英文字母和數字不會換行如何處理

英文 一次 bre word-wrap style 英文字母 ron wrap -a 一次偶然的項目中,遇到一個奇怪的問題,為什麽我都寫了換行的css怎麽還是沒有換行?請教宋老師之後才知道“英文字母和數字是不會換行的”,那如何處理呢? 處理辦法,在所在類上增加下面css:

MySQL用戶管理

mysql用戶管理 MySQL是一個多用戶數據庫,具有功能強大的訪問控制系統,可以為不同用戶指定允許的權限。MySQL用戶可以分為普通用戶和root用戶。root用戶是超級管理員,擁有所有權限,普通用戶只擁有被授予的各種權限。12.1、權限表MySQL服務器通過權限來控制用戶對數據庫的訪問,權限表存放在MyS