1 一般隨機變量
1.1 隨機變量的兩種類型
根據隨機變量可能取值的個數分爲離散型(取值有限)和連續型(取值無限)兩類。
1.2 離散型隨機變量
對於離散型隨機變量,使用概率質量函數(probability mass function),簡稱PMF,來描述其分佈律。
假定離散型隨機變量X,共有n個取值,, , …, , 那麼
用到PMF的例子:二項分佈,泊松分佈
1.3 連續型隨機變量
對於連續型隨機變量,使用概率密度函數(probability density function),簡稱PDF,來描述其分佈情況。
連續型隨機變量的特點在於取任何固定值的概率都爲0,因此討論其在特定值上的概率是沒有意義的,應當討論其在某一個區間範圍內的概率,這就用到了概率密度函數的概念。
假定連續型隨機變量X,f(x)爲概率密度函數, 對於任意實數範圍如[a,b],有 用到PDF的例子:均勻分佈,正態分佈,指數分佈
對於連續型隨機變量,通常還會用到累積分佈函數 (cumulative distribution function),簡稱CDF,來描述其性質,在數學上CDF是PDF的積分形式。
分佈函數F(x)在點x處的函數值表示X落在區間(−∞,x]內的概率,所以分佈函數就是定義域爲R的一個普通函數,因此我們可以把概率問題轉化爲函數問題,從而可以利用普通的函數知識來研究概率問題,增大了概率的研究範圍。
2 常見分佈
2.1 離散型分佈
2.1.1 二項分佈(Binomial distribution)
二項分佈可以認爲是一種只有兩種結果(成功/失敗)的單次試驗重複多次後成功次數的分佈概率。
二項分佈需要滿足以下條件:
- 試驗次數是固定的
- 每次試驗都是獨立的
- 對於每次試驗成功的概率都是一樣的
一些二項分佈的例子:
- 銷售電話成功的次數
- 一批產品中有缺陷的產品數量
- 擲硬幣正面朝上的次數
- 在一袋糖果中取糖果喫,拿到紅色包裝的次數
在n次試驗中,單次試驗成功率爲p,失敗率q=1-p,則出現成功次數的概率爲
2.1.2 泊松分佈(Poisson distribution)
泊松分佈是用來描述泊松試驗的一種分佈,滿足以下兩個特徵的試驗可以認爲是泊松試驗:
- 所考察的事件在任意兩個長度相等的區間裏發生一次的機會均等
- 所考察的事件在任何一個區間裏發生與否和在其他區間裏發生與否沒有相互影響,即是獨立的
泊松分佈需要滿足一些條件:
- 試驗次數n趨向於無窮大
- 單次事件發生的概率p趨向於0
- np是一個有限的數值
泊松分佈的一些例子:
- 一定時間段內,某航空公司接到的訂票電話數
- 一定時間內,到車站等候公交汽車的人數
- 一匹布上發現的瑕疵點的個數
- 一定頁數的書刊上出現的錯別字個數
一個服從泊松分佈的隨機變量X,在具有比率參數(rate parameter)λ (λ=np)的一段固定時間間隔內,事件發生次數爲i的概率爲
2.1.3 二項分佈,泊松分佈,正態分佈的關係
這三個分佈之間具有非常微妙的關聯。
當n很大,p很小時,如n ≥ 100 and np ≤ 10時,二項分佈可以近似爲泊松分佈。
當λ很大時,如λ≥1000時,泊松分佈可以近似爲正態分佈。
當n很大時,np和n(1-p)都足夠大時,如n ≥ 100 , np ≥10,n(1-p) ≥10時,二項分佈可以近似爲正態分佈。
2.1.4 其他離散型隨機分佈
除了二項分佈和泊松分佈以外,還有其他一些不太常用的離散型分佈。
幾何分佈(Geometric distribution)
考慮獨立重複試驗,幾何分佈描述的是經過k次試驗才首次獲得成功的概率,假定每次成功率爲p,
負二項分佈(Negative binomial distribution)
考慮獨立重複試驗,負二項分佈描述的是試驗一直進行到成功r次的概率,假定每次成功率爲p,
超幾何分佈(Hypergeometric Distribution)
超幾何分佈描述的是在一個總數爲N的總體中進行有放回地抽樣,其中在總體中k個元素屬於一組,剩餘N-k個元素屬於另一組,假定從總體中抽取n次,其中包含x個第一組的概率爲
2.2 連續型分佈
2.2.1 均勻分佈 (Uniform distribution)
均勻分佈指的是一類在定義域內概率密度函數處處相等的統計分佈。
若X是服從區間[a,b]上的均勻分佈,則記作X~U[a,b]。
均勻分佈X的概率密度函數爲 分佈函數爲 均勻分佈的一些例子:
- 一個理想的隨機數生成器
- 一個理想的圓盤以一定力度旋轉後靜止時的角度
2.2.2 正態分佈 (Normal distribution)
正態分佈,也叫做高斯分佈,是最爲常見的統計分佈之一,是一種對稱的分佈,概率密度呈現鐘擺的形狀,其概率密度函數爲 記爲X ~ N(μ, ) , 其中μ爲正態分佈的均值,σ爲正態分佈的標準差
有了一般正態分佈後,可以通過公式變換將其轉變爲標準正態分佈 Z ~ N(0,1), 正態分佈的一些例子:
- 成人的身高
- 不同方向的氣體分子的運動速度
- 測量物體質量時的誤差
正態分佈在現實生活有着非常多的例子,這一點可以從中心極限定理來解釋,中心極限定理說的是一組獨立同分布的隨機樣本的平均值近似爲正態分佈,無論隨機變量的總體符合何種分佈。
2.2.3 指數分佈 (Exponential distribution)
指數分佈通常被廣泛用在描述一個特定事件發生所需要的時間,在指數分佈隨機變量的分佈中,有着很少的大數值和非常多的小數值。
指數分佈的概率密度函數爲 記爲 X~E(λ), 其中λ被稱爲率參數(rate parameter),表示每單位時間發生該事件的次數。
分佈函數爲 指數分佈的一些例子:
- 顧客到達一家店鋪的時間間隔
- 從現在開始到發生地震的時間間隔
- 在產線上收到一個問題產品的時間間隔
關於指數分佈還有一個有趣的性質的是指數分佈是無記憶性的,假定在等候事件發生的過程中已經過了一些時間,此時距離下一次事件發生的時間間隔的分佈情況和最開始是完全一樣的,就好像中間等候的那一段時間完全沒有發生一樣,也不會對結果有任何影響,用數學語言來表述是
2.2.4 其他連續分佈
分佈
常用來描述某個事件總共要發生n次的等待時間的分佈
威布爾分佈 (Weibull distribution)
2.4 Python 代碼實戰
2.4.1 生成一組符合特定分佈的隨機數
在Numpy庫中,提供了一組random類可以生成特定分佈的隨機數
常用來描述在工程領域中某類具有“最弱鏈”對象的壽命
import numpy
# 生成大小爲1000的符合b(10,0.5)二項分佈的樣本集
s = numpy.random.binomial(n=10,p=0.5,size=1000)
# 生成大小爲1000的符合P(1)的泊松分佈的樣本集
s = numpy.random.poisson(lam=1,size=1000)
# 生成大小爲1000的符合U(0,1)均勻分佈的樣本集,注意在此方法中邊界值爲左閉右開區間
s = numpy.random.uniform(low=0,high=1,size=1000)
# 生成大小爲1000的符合N(0,1)正態分佈的樣本集,可以用normal函數自定義均值,標準差,也可以直接使用standard_normal函數
s = numpy.random.normal(loc=0,scale=1,size=1000)
s = numpy.random.standard_normal(size=1000)
# 生成大小爲1000的符合E(1/2)指數分佈的樣本集,注意該方法中的參數爲指數分佈參數λ的倒數
s = numpy.random.exponential(scale=2,size=1000)
除了Numpy,Scipy也提供了一組生成特定分佈隨機數的方法
# 以均勻分佈爲例,rvs可用來生成一組隨機變量的值
from scipy import stats
stats.uniform.rvs(size=10)
2.4.2 計算統計分佈的PMF和PDF
Scipy庫提供了一組用於計算離散型隨機變量PMF和連續型隨機變量PDF的方法。
from scipy import stats
# 計算二項分佈B(10,0.5)的PMF
x=range(11)
p=stats.binom.pmf(x, n=10, p=0.5)
# 計算泊松分佈P(1)的PMF
x=range(11)
p=stats.poisson.pmf(x, mu=1)
# 計算均勻分佈U(0,1)的PDF
x = numpy.linspace(0,1,100)
p= stats.uniform.pdf(x,loc=0, scale=1)
# 計算正態分佈N(0,1)的PDF
x = numpy.linspace(-3,3,1000)
p= stats.norm.pdf(x,loc=0, scale=1)
# 計算指數分佈E(1)的PDF
x = numpy.linspace(0,10,1000)
p= stats.expon.pdf(x,loc=0,scale=1)
2.4.3 計算統計分佈的CDF
類似計算概率質量/密度函數的方法,只需將上節中的pmf或pdf替換爲cdf,即可得到分佈函數的值
# 以正態分佈爲例,計算正態分佈N(0,1)的CDF
x = numpy.linspace(-3,3,1000)
p = stats.norm.cdf(x,loc=0, scale=1)
2.4.4 統計分佈可視化
- 二項分佈
比較n=10,p=0.5的二項分佈的真實概率質量和10000次隨機抽樣的結果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x = range(11) # 二項分佈成功的次數(X軸)
t = stats.binom.rvs(10,0.5,size=10000) # B(10,0.5)隨機抽樣10000次
p = stats.binom.pmf(x, 10, 0.5) # B(10,0.5)真實概率質量
fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=10,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.scatterplot(x,p,color='purple')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Binomial distribution')
plt.legend(bbox_to_anchor=(1.05, 1))
- 泊松分佈
比較λ=2的泊松分佈的真實概率質量和10000次隨機抽樣的結果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=range(11)
t= stats.poisson.rvs(2,size=10000)
p=stats.poisson.pmf(x, 2)
fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=10,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.scatterplot(x,p,color='purple')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Poisson distribution')
plt.legend()
比較不同參數λ對應的概率質量函數,可以驗證隨着參數增大,泊松分佈開始逐漸變得對稱,分佈也越來越均勻,趨近於正態分佈
x=range(50)
fig, ax = plt.subplots()
for lam in [1,2,5,10,20] :
p=stats.poisson.pmf(x, lam)
sns.lineplot(x,p,label='lamda= '+ str(lam))
plt.title('Poisson distribution')
plt.legend()
- 均勻分佈
比較U(0,1)的均勻分佈的真實概率密度和10000次隨機抽樣的結果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(0,1,100)
t= stats.uniform.rvs(0,1,size=10000)
p=stats.uniform.pdf(x, 0, 1)
fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=10,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Uniforml distribution')
plt.legend(bbox_to_anchor=(1.05, 1))
- 正態分佈
比較N(0,1)的正態分佈的真實概率密度和10000次隨機抽樣的結果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(-3,3,100)
t= stats.norm.rvs(0,1,size=10000)
p=stats.norm.pdf(x, 0, 1)
fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=100,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Normal distribution')
plt.legend(bbox_to_anchor=(1.05, 1))
比較不同均值和標準差組合的正態分佈的概率密度函數
x=numpy.linspace(-6,6,100)
p=stats.norm.pdf(x, 0, 1)
fig, ax = plt.subplots()
for mean, std in [(0,1),(0,2),(3,1)]:
p=stats.norm.pdf(x, mean, std)
sns.lineplot(x,p,label='Mean: '+ str(mean) + ', std: '+ str(std))
plt.title('Normal distribution')
plt.legend()
- 指數分佈
比較E(1)的指數分佈的真實概率密度和10000次隨機抽樣的結果
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
x=numpy.linspace(0,10,100)
t= stats.expon.rvs(0,1,size=10000)
p=stats.expon.pdf(x, 0, 1)
fig, ax = plt.subplots(1, 1)
sns.distplot(t,bins=100,hist_kws={'density':True}, kde=False,label = 'Distplot from 10000 samples')
sns.lineplot(x,p,color='purple',label='True mass density')
plt.title('Exponential distribution')
plt.legend(bbox_to_anchor=(1, 1))
比較不同參數的指數分佈的概率密度函數
x=numpy.linspace(0,10,100)
fig, ax = plt.subplots()
for scale in [0.2,0.5,1,2,5] :
p=stats.expon.pdf(x, scale=scale)
sns.lineplot(x,p,label='lamda= '+ str(1/scale))
plt.title('Exponential distribution')
plt.legend()
3 假設檢驗
3.1 基本概念
假設檢驗問題時統計推斷中的一類重要問題,在總體的分佈函數完全未知或只知其形式,不知其參數的情況,爲了推斷總體的某些未知特性,提出某些關於總體的假設,這類問題被稱爲假設檢驗。
3.2 基本步驟
一個假設檢驗問題可以分爲5步,無論細節如果變化,都一定會遵循這5個步驟。
- 陳述研究假設,包含原假設(null hypothesis)和備擇假設(alternate hypothesis)
- 爲驗證假設收集數據
- 構造合適的統計測試量並測試
- 決定是接受還是拒絕原假設
- 展示結論
步驟1:
通常來說,我們會把原假設的描述寫成變量之間不存在某種差異,或不存在某種關聯,備擇假設則爲存在某種差異或關聯。
例如,原假設:男人和女人的平均身高沒有差別, 備擇假設男人和女人的平均身高存在顯著差別。
步驟2:
爲了統計檢驗的結果真實可靠,需要根據實際的假設命題從總體中抽取樣本,要求抽樣的數據要具有代表性,例如在上述男女平均身高的命題中,抽取的樣本要能覆蓋到各類社會階級,各個國家等所有可能影響到身高的因素。
步驟3:
統計檢驗量有很多種類,但是所有的統計檢驗都是基於組內方差和組間方差的比較,如果組間方差足夠大,使得不同組之間幾乎沒有重疊,那麼統計量會反映出一個非常小的P值,意味着不同組之間的差異不可能是由偶然性導致的。
步驟4:
基於統計量的結果做出接受或拒絕原假設的判斷,通常我們會以P=0.05作爲臨界值(單側檢驗)。
步驟5:
展示結論。
3.3 統計量的選擇
選擇合適的統計量是進行假設檢驗的關鍵步驟,最常用的統計檢驗包括迴歸檢驗(regression test),比較檢驗(comparison test)和關聯檢驗(correlation test)三類。
迴歸檢驗
迴歸檢驗適用於預測變量是數值型的情況,根據預測變量的數量和結果變量的類型又分爲以下幾種。
比較檢驗
比較檢驗適用於預測變量是類別型,結果變量是數值型的情況,根據預測變量的分組數量和結果變量的數量又可以分爲以下幾種。
關聯檢驗
關聯檢驗常用的只有卡方檢驗一種,適用於預測變量和結果變量均爲類別型的情況。
非參數檢驗
此外,由於一般來說上述參數檢驗都需滿足一些前提條件,樣本之間獨立,不同組的組內方差近似和數據滿足正態性,所以當這些條件不滿足的時候,我們可以嘗試用非參數檢驗來代替參數檢驗。
3.4 兩類錯誤
事實上當我們進行假設檢驗的過程中是存在犯錯誤的可能的,並且理論上來說錯誤是無法完全避免的。根據定義,錯誤分爲兩類,一類錯誤(type I error)和二類錯誤(type II error)。
-
一類錯誤:拒絕真的原假設
-
二類錯誤:接受錯誤的原假設
一類錯誤可以通過α值來控制,在假設檢驗中選擇的 α(顯著性水平)對一類錯誤有着直接影響。α可以認爲是我們犯一類錯誤的最大可能性。以95%的置信水平爲例,a=0.05,這意味着我們拒絕一個真的原假設的可能性是5%。從長期來看,每做20次假設檢驗會有一次犯一類錯誤的事件發生。
二類錯誤通常是由小樣本或高樣本方差導致的,二類錯誤的概率可以用β來表示,和一類錯誤不同的是,此類錯誤是不能通過設置一個錯誤率來直接控制的。對於二類錯誤,可以從功效的角度來估計,首先進行功效分析(power analysis)計算出功效值1-β,進而得到二類錯誤的估計值β。
一般來說這兩類錯誤是無法同時降低的,在降低犯一類錯誤的前提下會增加犯二類錯誤的可能性,在實際案例中如何平衡這兩類錯誤取決於我們更能接受一類錯誤還是二類錯誤。
3.5 Python代碼實戰
本節通過一些例子來講解如何使用python進行假設檢驗。
3.5.1 正態檢驗
Shapiro-Wilk Test是一種經典的正態檢驗方法。
H0: 樣本總體服從正態分佈
H1: 樣本總體不服從正態分佈
import numpy as np
from scipy.stats import shapiro
data_nonnormal = np.random.exponential(size=100)
data_normal = np.random.normal(size=100)
def normal_judge(data):
stat, p = shapiro(data)
if p > 0.05:
return 'stat={:.3f}, p = {:.3f}, probably gaussian'.format(stat,p)
else:
return 'stat={:.3f}, p = {:.3f}, probably not gaussian'.format(stat,p)
# output
normal_judge(data_nonnormal)
# 'stat=0.850, p = 0.000, probably not gaussian'
normal_judge(data_normal)
# 'stat=0.987, p = 0.415, probably gaussian'
3.5.2 卡方檢驗
目的:檢驗兩組類別變量是相關的還是獨立的
H0: 兩個樣本是獨立的
H1: 兩組樣本不是獨立的
from scipy.stats import chi2_contingency
table = [[10, 20, 30],[6, 9, 17]]
stat, p, dof, expected = chi2_contingency(table)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably independent')
else:
print('Probably dependent')
# output
#stat=0.272, p=0.873
#Probably independent
3.5.3 T-test
目的:檢驗兩個獨立樣本集的均值是否具有顯著差異
H0: 均值是相等的
H1: 均值是不等的
from scipy.stats import ttest_ind
import numpy as np
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
stat, p = ttest_ind(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably the same distribution')
else:
print('Probably different distributions')
# output
# stat=-1.382, p=0.184
# Probably the same distribution
3.5.4 ANOVA
目的:與t-test類似,ANOVA可以檢驗兩組及以上獨立樣本集的均值是否具有顯著差異
H0: 均值是相等的
H1: 均值是不等的
from scipy.stats import f_oneway
import numpy as np
data1 = np.random.normal(size=10)
data2 = np.random.normal(size=10)
data3 = np.random.normal(size=10)
stat, p = f_oneway(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably the same distribution')
else:
print('Probably different distributions')
# output
# stat=0.189, p=0.829
# Probably the same distribution
3.5.5 Mann-Whitney U Test
目的:檢驗兩個樣本集的分佈是否相同
H0: 兩個樣本集的分佈相同
H1: 兩個樣本集的分佈不同
from scipy.stats import mannwhitneyu
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = mannwhitneyu(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
print('Probably the same distribution')
else:
print('Probably different distributions')
# output
# stat=40.000, p=0.236
# Probably the same distribution
參考資料
- Ross S . 概率論基礎教程[M]. 人民郵電出版社, 2007.
- 盛驟, 謝式千, 潘承毅, 等. 概率論與數理統計 (第四版)[J]. 2008.
- https://www.thoughtco.com/difference-between-type-i-and-type-ii-errors-3126414