# 假設檢驗和置信區間
> 原文:[https://www.textbook.ds100.org/ch/18/hyp_introduction.html](https://www.textbook.ds100.org/ch/18/hyp_introduction.html)
```
# HIDDEN
# Clear previously defined variables
%reset -f
# Set directory for data loading to work properly
import os
os.chdir(os.path.expanduser('~/notebooks/18'))
```
```
# HIDDEN
import warnings
# Ignore numpy dtype warnings. These warnings are caused by an interaction
# between numpy and Cython and can be safely ignored.
# Reference: https://stackoverflow.com/a/40846742
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
import ipywidgets as widgets
from ipywidgets import interact, interactive, fixed, interact_manual
import nbinteract as nbi
sns.set()
sns.set_context('talk')
np.set_printoptions(threshold=20, precision=2, suppress=True)
pd.options.display.max_rows = 7
pd.options.display.max_columns = 8
pd.set_option('precision', 2)
# This option stops scientific notation for pandas
# pd.set_option('display.float_format', '{:.2f}'.format)
```
在本節中,我們將簡要回顧使用引導測試和置換測試的假設測試。我們假設對這個主題很熟悉,因為它在計算和推理思維(數據 8 的教科書)中有詳細介紹。關于這里解釋的概念的更深入的解釋,請參見計算和推理思維的[第 11 章](https://www.inferentialthinking.com/chapters/11/Testing_Hypotheses)、[第 12 章](https://www.inferentialthinking.com/chapters/12/Comparing_Two_Samples)和[第 13 章](https://www.inferentialthinking.com/chapters/13/Estimation)。
## 假設檢驗
當把數據科學技術應用到不同的領域時,我們經常會遇到關于世界的問題。例如,喝咖啡會導致睡眠不足嗎?自動駕駛車輛比非自動駕駛車輛更容易撞車嗎?藥物 X 有助于治療肺炎嗎?為了幫助回答這些問題,我們使用假設檢驗根據觀察到的證據/數據做出明智的結論。
由于數據收集通常是一個不精確的過程,所以我們常常不確定數據集中的模式是由噪聲還是真實現象造成的。假設檢驗有助于我們確定一個模式是否會因為數據收集中的隨機波動而發生。
為了探索假設檢驗,我們從一個例子開始。表`baby`包含出生時嬰兒體重的信息。它記錄了 1174 名嬰兒的出生體重(盎司),以及母親是否在懷孕期間吸煙。
```
# HIDDEN
baby = pd.read_csv('baby.csv')
baby = baby.loc[:, ["Birth Weight", "Maternal Smoker"]]
baby
```
| | 出生體重 | 母親吸煙者 |
| --- | --- | --- |
| 零 | 一百二十 | 錯誤 |
| --- | --- | --- |
| 1 個 | 一百一十三 | False |
| --- | --- | --- |
| 二 | 一百二十八 | 對 |
| --- | --- | --- |
| …… | …… | ... |
| --- | --- | --- |
| 一千一百七十一 | 一百三十 | True |
| --- | --- | --- |
| 一千一百七十二 | 一百二十五 | False |
| --- | --- | --- |
| 一千一百七十三 | 117 個 | False |
| --- | --- | --- |
1174 行×2 列
### 設計[?](#Design)
我們想看看母親吸煙是否與出生體重有關。為了建立我們的假設檢驗,我們可以使用以下空假設和可選假設來表示世界的兩種觀點:
**無效假設**在人口中,嬰兒出生體重的分布對于不吸煙的母親和不吸煙的母親是一樣的。樣品的差異是由于偶然性造成的。
**另一種假設:在人口中,吸煙的母親的嬰兒平均出生體重低于不吸煙的嬰兒。**
我們的最終目標是在這兩個數據生成模型之間做出決定。值得注意的一點是,我們構建了關于數據生成模型的 _ 參數 _ 的假設,而不是實驗結果。例如,我們不應該構建一個無效的假設,例如“吸煙母親的出生體重將等于非吸煙母親的出生體重”,因為這一過程的結果存在自然的變異性。
零假設強調,如果數據看起來與零假設預測的不同,那么差異只由偶然性造成。非正式地,另一種假設認為觀察到的差異是“真實的”。
我們應該仔細看看我們的替代假設的結構。在我們當前的設置中,請注意,如果吸煙母親的嬰兒出生體重顯著低于不吸煙母親的嬰兒出生體重,我們將拒絕無效假設。換句話說,替代假設包含/支持分布的一側。我們稱之為**單邊**替代假設。一般來說,如果我們有充分的理由相信吸煙的母親的嬰兒平均出生體重更高是不可能的,那么我們只想使用這種替代假設。
為了可視化數據,我們繪制了母親吸煙者和非吸煙者所生嬰兒體重的柱狀圖。
```
# HIDDEN
plt.figure(figsize=(9, 6))
smokers_hist = (baby.loc[baby["Maternal Smoker"], "Birth Weight"]
.hist(normed=True, alpha=0.8, label="Maternal Smoker"))
non_smokers_hist = (baby.loc[~baby["Maternal Smoker"], "Birth Weight"]
.hist(normed=True, alpha=0.8, label="Not Maternal Smoker"))
smokers_hist.set_xlabel("Baby Birth Weights")
smokers_hist.set_ylabel("Proportion per Unit")
smokers_hist.set_title("Distribution of Birth Weights")
plt.legend()
plt.show()
```

吸煙母親的嬰兒的平均體重似乎比不吸煙母親的嬰兒的平均體重要低。這種差異可能是由于隨機變化引起的嗎?我們可以嘗試用假設檢驗來回答這個問題。
為了進行假設檢驗,我們假設一個生成數據的特定模型;然后,我們問自己,我們將看到與我們觀察到的結果一樣極端的結果的可能性有多大?直觀地說,如果看到我們觀察到的結果的機會很小,我們假設的模型可能不是合適的模型。
特別是,我們假設零假設及其概率模型**零模型**是真的。換言之,我們假設零假設是真的,并關注統計值在零假設下的值。這個機會模型表示沒有潛在的差異;樣本中的分布只是因為偶然而有所不同。
### 測試統計[?](#Test-Statistic)
在我們的例子中,我們假設母親吸煙對嬰兒體重沒有影響(觀察到的任何差異都是由于偶然性)。為了在我們的假設之間進行選擇,我們將使用兩組方法之間的差異作為我們的**檢驗統計**。從形式上講,我們的測試統計是
$$\mu \text 吸煙-\mu \text 不吸煙$$
因此,這個統計的小值(即大負值)將有利于替代假設。讓我們計算測試統計的觀察值:
```
nonsmoker = baby.loc[~baby["Maternal Smoker"], "Birth Weight"]
smoker = baby.loc[baby["Maternal Smoker"], "Birth Weight"]
observed_difference = np.mean(smoker) - np.mean(nonsmoker)
observed_difference
```
```
-9.266142572024918
```
如果這兩種分布在基礎人群中真的沒有差別,那么每個母親是否是一個吸煙者不應該影響平均出生體重。換言之,與母親吸煙有關的標簽“真”或“假”不應與平均值有任何差異。
因此,為了模擬零假設下的檢驗統計量,我們可以將所有出生體重隨機地放入母親中。我們在下面進行這種隨機排列。
```
def shuffle(series):
'''
Shuffles a series and resets index to preserve shuffle when adding series
back to DataFrame.
'''
return series.sample(frac=1, replace=False).reset_index(drop=True)
```
```
baby["Shuffled"] = shuffle(baby["Birth Weight"])
baby
```
| | Birth Weight | Maternal Smoker | 無序播放 |
| --- | --- | --- | --- |
| 0 | 120 | False | 一百二十二 |
| --- | --- | --- | --- |
| 1 | 113 | False | 167 個 |
| --- | --- | --- | --- |
| 2 | 128 | True | 一百一十五 |
| --- | --- | --- | --- |
| ... | ... | ... | ... |
| --- | --- | --- | --- |
| 1171 | 130 | True | 一百一十六 |
| --- | --- | --- | --- |
| 1172 | 125 | False | 一百三十三 |
| --- | --- | --- | --- |
| 1173 | 117 | False | 120 |
| --- | --- | --- | --- |
1174 行×3 列
### 進行置換試驗
基于數據隨機排列的測試稱為**排列測試**。在下面的單元中,我們將多次模擬測試統計數據,并收集數組中的差異。
```
differences = np.array([])
repetitions = 5000
for i in np.arange(repetitions):
baby["Shuffled"] = shuffle(baby["Birth Weight"])
# Find the difference between the means of two randomly assigned groups
nonsmoker = baby.loc[~baby["Maternal Smoker"], "Shuffled"]
smoker = baby.loc[baby["Maternal Smoker"], "Shuffled"]
simulated_difference = np.mean(smoker) - np.mean(nonsmoker)
differences = np.append(differences, simulated_difference)
```
我們繪制了以下平均值中模擬差異的柱狀圖:
```
# HIDDEN
differences_df = pd.DataFrame()
differences_df["differences"] = differences
diff_hist = differences_df.loc[:, "differences"].hist(normed = True)
diff_hist.set_xlabel("Birth Weight Difference")
diff_hist.set_ylabel("Proportion per Unit")
diff_hist.set_title("Distribution of Birth Weight Differences");
```

從直覺上講,差異的分布集中在 0 附近,因為在零假設下,兩組的平均值應該相同。
為了得出這個假設檢驗的結論,我們應該計算 p 值。試驗的經驗 p 值是模擬差異等于或小于觀察差異的比例。
```
p_value = np.count_nonzero(differences <= observed_difference) / repetitions
p_value
```
```
0.0
```
在假設檢驗開始時,我們通常選擇一個 P 值**顯著性閾值**(通常表示為 alpha)。如果我們的 p 值低于顯著性閾值,那么我們拒絕無效假設。最常用的閾值是 0.01 和 0.05,其中 0.01 被認為更“嚴格”,因為我們需要更多的證據支持替代假設來拒絕無效假設。
在這兩種情況下,我們都拒絕了無效假設,因為 p 值小于顯著性閾值。
## 引導置信區間
數據科學家必須經常使用隨機樣本估計未知的人口參數。雖然理想情況下,我們希望從人群中采集大量樣本,以生成一個樣本分布,但我們通常僅限于金錢和時間上的單一樣本。
幸運的是,一個隨機采集的大樣本看起來像原始種群。引導過程使用這個事實,通過從原始樣本重新采樣來模擬新樣本。
要執行引導,我們執行以下步驟:
1. 從原始樣本替換的樣本(現在是引導填充)。這些樣本稱為引導樣本。我們通常會抽取數千個自舉樣本(通常是 10000 個)。
2. 計算每個引導樣本的興趣統計。這種統計稱為引導統計,這些引導統計的經驗分布近似于引導統計的抽樣分布。

我們可以使用引導抽樣分布來創建一個置信區間,用來估計總體參數的值。
由于出生體重數據提供了一個大的隨機樣本,因此我們可以將不吸煙母親的數據視為非吸煙母親群體的代表。同樣,我們的行為就好像吸煙母親的數據代表了吸煙母親的人口。
因此,我們將原始樣本作為引導填充來執行引導過程:
1. 從不吸煙的母親身上提取一個替代品樣本,并計算這些母親的平均出生體重。我們還從吸煙的母親那里提取了一個替代品樣本,并計算出平均出生體重。
2. 計算平均差。
3. 重復上述過程 10000 次,得到 10000 個平均差。
該程序給出了嬰兒平均體重差異的經驗抽樣分布。
```
def resample(sample):
return np.random.choice(sample, size=len(sample))
def bootstrap(sample, stat, replicates):
return np.array([
stat(resample(sample)) for _ in range(replicates)
])
```
```
nonsmoker = baby.loc[~baby["Maternal Smoker"], "Birth Weight"]
smoker = baby.loc[baby["Maternal Smoker"], "Birth Weight"]
nonsmoker_means = bootstrap(nonsmoker, np.mean, 10000)
smoker_means = bootstrap(smoker, np.mean, 10000)
mean_differences = smoker_means - nonsmoker_means
```
我們繪制了平均值差異的經驗分布:
```
# HIDDEN
mean_differences_df = pd.DataFrame()
mean_differences_df["differences"] = np.array(mean_differences)
mean_diff = mean_differences_df.loc[:, "differences"].hist(normed=True)
mean_diff.set_xlabel("Birth Weight Difference")
mean_diff.set_ylabel("Proportion per Unit")
mean_diff.set_title("Distribution of Birth Weight Differences");
```

最后,為了構建一個 95%的置信區間,我們取引導統計數據的 2.5%和 97.5%。
```
(np.percentile(mean_differences, 2.5),
np.percentile(mean_differences, 97.5))
```
```
(-11.36909646997882, -7.181670323140913)
```
這個置信區間可以讓我們 95%的置信度說明出生體重的總體平均差異在-11.37 至-7.18 盎司之間。
## 摘要[?](#Summary)
在本節中,我們將回顧使用置換測試的假設測試和使用引導的置信區間。為了進行假設檢驗,我們必須陳述我們的無效假設和替代假設,選擇適當的檢驗統計量,并執行檢驗程序來計算 p 值。為了建立一個置信區間,我們選擇適當的測試統計量,引導原始樣本生成測試統計量的經驗分布,并選擇與我們期望的置信水平相對應的分位數。
- 一、數據科學的生命周期
- 二、數據生成
- 三、處理表格數據
- 四、數據清理
- 五、探索性數據分析
- 六、數據可視化
- Web 技術
- 超文本傳輸協議
- 處理文本
- python 字符串方法
- 正則表達式
- regex 和 python
- 關系數據庫和 SQL
- 關系模型
- SQL
- SQL 連接
- 建模與估計
- 模型
- 損失函數
- 絕對損失和 Huber 損失
- 梯度下降與數值優化
- 使用程序最小化損失
- 梯度下降
- 凸性
- 隨機梯度下降法
- 概率與泛化
- 隨機變量
- 期望和方差
- 風險
- 線性模型
- 預測小費金額
- 用梯度下降擬合線性模型
- 多元線性回歸
- 最小二乘-幾何透視
- 線性回歸案例研究
- 特征工程
- 沃爾瑪數據集
- 預測冰淇淋評級
- 偏方差權衡
- 風險和損失最小化
- 模型偏差和方差
- 交叉驗證
- 正規化
- 正則化直覺
- L2 正則化:嶺回歸
- L1 正則化:LASSO 回歸
- 分類
- 概率回歸
- Logistic 模型
- Logistic 模型的損失函數
- 使用邏輯回歸
- 經驗概率分布的近似
- 擬合 Logistic 模型
- 評估 Logistic 模型
- 多類分類
- 統計推斷
- 假設檢驗和置信區間
- 置換檢驗
- 線性回歸的自舉(真系數的推斷)
- 學生化自舉
- P-HACKING
- 向量空間回顧
- 參考表
- Pandas
- Seaborn
- Matplotlib
- Scikit Learn