概率統計基礎(三):常見分佈與假設檢驗

這次概率統計學習基於:Datawhale概率統計組隊學習文檔

1. 寫在前面

這次藉着在Datawhale組織的概率統計專題學習的機會再重新溫習一遍數學基礎,所謂機器學習和深度學習, 背後的邏輯都是數學, 所以數學基礎在這個領域非常關鍵, 而統計學又是重中之重, 機器學習從某種意義上來說就是一種統計學習, 所以這次依然是感謝組織的這次學習機會, 這一版塊是整理概率統計的相關內容, 具體知識點可以看上面的鏈接文檔, 基礎知識點整理的很全了,所以這次又是站在了大佬的肩膀上前行, 主要是其中的重點知識進行整理和補充, 然後補充一些代碼實現上的內容。

這次是學習概率統計的第三篇文章, 基於前兩篇文章進行展開, 在第一篇文章的概率論基礎學習了離散型隨機變量和連續型隨機變量及其分佈, 這篇文章的第一部分常見分佈就是從機器學習的角度對第一篇文章的分佈又進行了細節上的補充並使用Scipy包進行實現, 大部分機器學習算法都是根據已有的歷史數據,去學習數據的分佈規律, 這樣才能去進行預測。 所以數據分佈對於機器學習來說至關重要, 這裏會學習七種機器學習領域中常見的數據分佈。 而這篇文章的第二部分假設檢驗, 這個屬於第二篇數理統計的內容, 假設檢驗是統計推斷中的一類重要問題,在總體的分佈函數完全未知或只知其形式,不知其參數的情況,爲了推斷總體的某些未知特性,提出某些關於總體的假設,然後收集數據去構造統計量測試,以決定總體假設的正確性, 這就是假設檢驗的過程。

大綱如下

  • 常見分佈(正態, 拉普勞斯, 伯努利, 二項, 均勻, 泊松, 指數)
  • 假設檢驗(t檢驗, F檢驗, 卡方檢驗,正態, ANOVA, Mann-Whitne U)

Ok, let’s go!

2. 常見分佈

在介紹常見分佈之前, 我們先來聊兩個題外的話題, 畢竟概率統計如果一上來就整理各種分佈和知識點會變得比較有些枯燥, 並且關於這些知識點DataWhale的大佬們已經幫我們整理的非常詳細了, 這裏整理肯定還是那些東西, 但總感覺一上來寫這些會讓文章顯得生硬, 所以可以先說點題外的東西緩解一下這種無聊的氣氛,哈哈。

第一個話題就是獨立同分布, 這個詞相信我們不管是教科書還是機器學習的書籍都會碰到吧, 英文名:independent and identically distributed, 簡稱i.i.d(這種簡寫要認識喲)。 那麼究竟什麼是獨立同分布呢? 下面我們就用拋硬幣的例子來解釋獨立和同分佈, 這樣可能會更加清楚:

拋擲一枚硬幣, 記出現正面爲事件XX, 事件XX發生的概率爲P(X)P(X)且爲0.4。

接下來開始做拋擲硬幣實驗,第一次拋擲硬幣出現正面的概率爲 0.4,第二次拋擲硬幣出現正面的概率P(X2)P(X_2)也爲 0.4, 第ii次正面出現的概率P(Xi)P(X_i)也爲0.4, 也就是說每次拋擲硬幣得到的結果沒有任何關係, 那麼我們就說這些試驗結果是相互獨立的。 而如果拋擲一枚智能硬幣, 如果第i1i-1出現反面, 那麼第ii次一定是正面, 這樣的就不是獨立的, 後面的結果依賴於前面的實驗結果。

同分布指的是每次拋擲試驗, 我們都使用的同一枚硬幣, 也就是必須保證P(X)P(X)始終一樣, 不能說我第一次有了正面概率是0.4的硬幣, 第二次換成了正面概率是0.6的硬幣, 這樣就不是同分布了。

第二個話題就是我們爲啥要關心數據的分佈呢?

大部分機器學習算法都是根據已有歷史數據,去學習它們的分佈規律,也就是分佈的參數。一旦學習到分佈的參數後,當再進來新的、未知的數據時,學到的算法模型便會預測或決策出一個結果。這是大部分機器學習的學習過程。

考慮這種情況,如果我們拿訓練使用的數據來評價模型好快時,得分肯定高,但是完全沒有意義,相信也不會有人這麼做,因爲它們已經對模型完全學習到、完全已熟悉。

再考慮另一種情況,如果測試用的數據來自完全不同的數據分佈,模型預測它們的結果得分往往不會好,雖然也會得到一個分數。測試數據集的分佈和訓練數據集的數據分佈差異太大,訓練的模型即便泛化的再好,預測與己分佈差異很大數據時也無能爲力。

基於以上兩種極端情況,我們的希望便是測試數據集要儘可能匹配訓練模型所使用的的數據分佈,在這個前提下,再去優化調參模型才更有意義,努力纔不會白費。

所以如果滿足訓練數據集和測試數據集的分佈近似相同,算法模型才更能發揮威力,這也就是我們爲啥要知道一些基本分佈的原因。

好了, 鋪墊了這麼多, 下面就正式學習常見分佈了: 我們先從連續型隨機變量和分佈開始。

2.1 連續型隨機變量及常見分佈

對於連續型隨機變量,使用概率密度函數(probability density function),簡稱PDF,來描述其分佈情況。

連續型隨機變量的特點在於取任何固定值的概率都爲0,因此討論其在特定值上的概率是沒有意義的,應當討論其在某一個區間範圍內的概率,這就用到了概率密度函數的概念。

假定連續型隨機變量XXf(x)f(x)爲概率密度函數, 對於任意實數範圍如[a,b],有
P{aXb}=abf(x)dxP\{a \leq X \leq b\}=\int_{a}^{b} f(x) \mathrm{d} x

對於連續型隨機變量,通常還會用到累積分佈函數 (cumulative distribution function),簡稱CDF,來描述其性質,在數學上CDF是PDF的積分形式。

分佈函數F(x)F(x)在點xx處的函數值表示XX落在區間(,x](−∞,x]內的概率,所以分佈函數就是定義域爲RR的一個普通函數,因此我們可以把概率問題轉化爲函數問題,從而可以利用普通的函數知識來研究概率問題,增大了概率的研究範圍。

下面介紹常見的連續型分佈: 均勻分佈、指數分佈、正態分佈和拉普拉斯分佈

2.1.1 均勻分佈

均勻分佈指的是一類在定義域內概率密度函數處處相等的統計分佈。若XX是服從區間[a,b][a,b]上的均勻分佈,則記作XU[a,b]X\sim U[a,b]。概率密度函數:
f(x)={1ba,axb0, others f(x)=\left\{\begin{array}{ll} \frac{1}{b-a}, & a \leq x \leq b \\ 0, & \text { others } \end{array}\right.
分佈函數:
F(x)={0,x<a(xa)(ba),axb1,x>bF(x)=\left\{\begin{array}{ll} 0, & x<a \\ (x-a)(b-a), & a \leq x \leq b \\ 1, & x>b \end{array}\right.
均勻分佈的例子:

  • 理想的隨機數生成器
  • 一個理想的圓盤以一定力度選擇後靜止時的角度

下面是均勻分佈的python代碼:

  1. 生成隨機數

    """生成一組符合均勻分佈的隨機數"""
    np.random.rand(10)         # (0-1)的一組均勻分佈的數
    np.random.uniform(low=0, high=100, size=10)   # 從一個均勻分佈[low,high)中隨機採樣,注意定義域是左閉右開,即包含low,不包含high
    # 生成大小爲1000的符合U(0,1)均勻分佈的樣本集,注意在此方法中邊界值爲左閉右開區間
    s = np.random.uniform(low=0,high=1,size=1000)
    
    
    # Scipy版
    stats.uniform.rvs(size=10)
    
  2. 計算統計分佈的PDF和CDF

    x = np.linspace(0, 1, 100)
    p = stats.uniform.pdf(x, loc=0, scale=1)
    c = stats.uniform.cdf(x, loc=0, scale=1)
    plt.plot(x, p)
    plt.plot(x, c)
    
    stats.uniform.ppf(0.2)
    

    結果如下:
    在這裏插入圖片描述

  3. 均勻分佈統計可視化

    """均勻分佈統計可視化"""
    x=np.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))
    

    結果如下:
    在這裏插入圖片描述

2.1.2 正態分佈

正態分佈,也叫做高斯分佈,是最爲常見的統計分佈之一,是一種對稱的分佈,概率密度呈現鐘擺的形狀,其概率密度函數爲
f(x)=12πσe(xu)22σ2f(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{\frac{-(x-u)^{2}}{2 \sigma^{2}}}
記爲X ~ N(μ, σ2) , 其中μ爲正態分佈的均值,σ爲正態分佈的標準差

有了一般正態分佈後,可以通過公式變換將其轉變爲標準正態分佈 Z ~ N(0,1)
Z=XμσZ=\frac{X-\mu}{\sigma}
正態分佈的例子:成人身高, 不同方向氣體分子的運動速度, 測量物體質量時的誤差。

正態分佈在現實生活有着非常多的例子,這一點可以從中心極限定理來解釋,中心極限定理說的是一組獨立同分布的隨機樣本的平均值近似爲正態分佈,無論隨機變量的總體符合何種分佈。

下面看代碼實現:

  1. 產生正態分佈的隨機數

    # 生成大小爲1000的符合N(0,1)正態分佈的樣本集,可以用normal函數自定義均值,標準差,也可以直接使用standard_normal函數
    s = np.random.normal(loc=0,scale=1,size=1000)
    s1 = np.random.standard_normal(size=1000)   # 標準正態
    plt.subplot(1, 2, 1)
    plt.hist(s1)
    plt.subplot(1, 2, 2)
    plt.hist(s)
    
    # Scipy版本
    stats.norm.rvs(0., 1., size=100)
    

    結果如下:
    在這裏插入圖片描述

  2. 計算pdf和cdf

    # 計算正態分佈N(0,1)的PDF
    x = np.linspace(-3,3,1000)
    p= stats.norm.pdf(x,loc=0, scale=1)
    c = stats.norm.cdf(x, loc=0, scale=1)
    plt.plot(x, p, label='pdf')
    plt.plot(x, c, label='cdf')
    plt.legend()
    
    stats.norm.pdf(0)  #pdf也可以直接求某個點的概率密度   0.398
    stats.norm.ppf(0.5)   # ppf  可以在累積分佈函數上求y對應的x     0.0
    

    結果如下:
    在這裏插入圖片描述

  3. 統計可視化

    """統計可視化"""
    x=np.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))
    

    結果如下:
    在這裏插入圖片描述

  4. 不同均值和方差組合的正態分佈概率密度函數

    """比價不同的均值和方差組合的正態分佈概率密度函數"""
    x=np.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()
    

    結果如下:
    在這裏插入圖片描述
    方差越大,取值越離散,表現出來的形狀就更矮胖。

  5. 使用正態分佈生成實驗使用的幾簇數據集,用於做聚類等任務的實驗數據。

    # 原理: 想生成幾簇數據, 就創建幾條線段, 然後在y上進行高斯平移
    plt.figure(figsize=(12, 8))
    blob1 = 500
    x1 = np.linspace(0.5, 3, blob1)
    y1 = 2 * x1 + 10 + stats.norm.rvs(0., 2., size=(blob1,))
    
    blob2 = 800
    x2 = np.linspace(5,8,blob2) 
    y2 = 2 * x2 - 4 + stats.norm.rvs(0.,3.0,size=(blob2,))
    
    blob3 =300
    x3 = np.linspace(2,3,blob3) 
    y3 = 2 * x3 -1 + stats.norm.rvs(0.,1.0,size=(blob3,))
    
    plt.scatter(x1,y1,label='cluster0')
    plt.scatter(x2,y2,label='cluster1')
    plt.scatter(x3,y3,label='cluster2')
    
    plt.legend()
    plt.show()
    

    結果如下:
    在這裏插入圖片描述

2.1.3 指數分佈

指數分佈通常被廣泛用在描述一個特定事件發生所需要的時間,在指數分佈隨機變量的分佈中,有着很少的大數值和非常多的小數值。

指數分佈的概率密度函數爲
f(x)={λeλz,x00,x<0f(x)=\left\{\begin{array}{ll} \lambda e^{-\lambda z}, & x \geq 0 \\ 0, & x<0 \end{array}\right.
記爲 X~E(λ), 其中λ被稱爲率參數(rate parameter),表示每單位時間發生該事件的次數。
分佈函數:
F(a)=P{Xa}=1eλa,a0F(a)=P\{X \leq a\}=1-e^{-\lambda a}, a \geq 0
例子: 顧客到達一家店鋪的時間間隔、從現在開始到發生地震的時間間隔、在產線上收到一個問題產品的時間間隔

關於指數分佈還有一個有趣的性質的是指數分佈是無記憶性的,假定在等候事件發生的過程中已經過了一些時間,此時距離下一次事件發生的時間間隔的分佈情況和最開始是完全一樣的,就好像中間等候的那一段時間完全沒有發生一樣,也不會對結果有任何影響,用數學語言來表述是:
PX>s+tX>t=PX>sP X>s+t \mid X>t=P X>s
下面是代碼實現:

  1. 隨機數和計算pdf, cdf

    # 生成大小爲1000的符合E(1/2)指數分佈的樣本集,注意該方法中的參數爲指數分佈參數λ的倒數
    s = np.random.exponential(scale=2,size=1000)
    
    # 計算指數分佈E(1)的PDF
    x = np.linspace(0,10,1000)
    p= stats.expon.pdf(x,loc=0,scale=1)
    c = stats.expon.cdf(x, loc=0, scale=1)
    plt.plot(x, p)
    plt.plot(x, c)
    

    結果如下:
    在這裏插入圖片描述

  2. 統計可視化

    x=np.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))
    

    結果如下:
    在這裏插入圖片描述

  3. 不同參數下的概率密度函數

    x=np.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()
    

    結果如下:
    在這裏插入圖片描述

2.1.4 拉普拉斯分佈

這個分佈在機器學習領域挺常見,並且和L1正則也有關係, 所以在這裏簡單整理一下, 它和標準正態很像, 標準的正態分佈概率密度函數爲:
f(x)=exp(x2/2)2πf(x)=\frac{\exp \left(-x^{2} / 2\right)}{\sqrt{2 \pi}}
標準的拉普拉斯分佈的概率密度函數爲:
f(x)=12exp(x)f(x)=\frac{1}{2} \exp (-|x|)
如果僅僅是對比公式, 估計看不出啥感覺, 下面繪圖看一下:

plt.figure(figsize=(12,8))
x = np.linspace(-5,5,100)
y1 = stats.norm.pdf(x)
y2 = stats.laplace.pdf(x)
plt.grid()
plt.xlabel('x')
plt.ylabel('pdf')
plt.title('probability density function')
plt.xticks(ticks=np.arange(-5,5))
plt.plot(x,y1,color='blue',label='norm')
plt.plot(x,y2,color='red',label='laplace')
plt.legend()
plt.show()

看結果:
在這裏插入圖片描述
比較頂端,正態分佈相比拉普拉斯分佈更加平滑,拉普拉斯概率分佈卻形成一個尖端。

關於兩者的對比應用之一就是正則化,其中L1 正則化可看做是拉普拉斯先驗,L2 正則化看作是正態分佈的先驗。所以要想深度理解正則化,首先要理解這兩個概率分佈。

拉普拉斯的兩個形狀參數與正態分佈意義相似:

plt.figure(figsize=(12,8))
x = np.linspace(-5,5,100)
y1 = stats.laplace.pdf(x)
y2 = stats.laplace.pdf(x,loc=0.0,scale=2.)
y3 = stats.laplace.pdf(x,loc=1.0,scale=2.)
plt.grid()
plt.xlabel('x')
plt.ylabel('pdf')
plt.title('probability density function')
plt.xticks(ticks=np.arange(-5,5))
plt.plot(x,y1,label='u=0;r=1')
plt.plot(x,y2,label='u=0;r=2')
plt.plot(x,y3,label='u=1,r=2')
plt.legend()
plt.show()

結果:
在這裏插入圖片描述

好了,關於連續型分佈常用的先總結這四種。 下面看離散型分佈:

2.2 離散型隨機變量及常見分佈

對於離散型隨機變量,使用概率質量函數(probability mass function),簡稱PMF,來描述其分佈律。

假定離散型隨機變量XXXX, 共有nn個取值, X1,X2,..XnX_1, X_2, ..X_n, 那麼
P(X=Xn)0Σ1nP(X=Xn)=1\begin{array}{c} P\left(X=X_{n}\right) \geq 0 \\ \\ \Sigma_{1}^{n} P\left(X=X_{n}\right)=1 \end{array}

下面介紹常見的離散型分佈: 伯努利分佈、二項分佈、泊松分佈

2.2.1 伯努利分佈

伯努利分佈比較簡單, 它描述的是離散型變量且發生1次的概率分佈,且XX取值只有2個, 要麼是0, 要麼是1, 且P(X=1)=pP(X=1)=p, P(X=0)=1pP(X=0)=1-p

# 創建分佈參數p=0.4的伯努利分佈,生成滿足此分佈的 10 個樣本點
bern = stats.bernoulli(0.4)
bern.rvs(size=(10,))

2.2.2 二項分佈

二項分佈可以認爲是一種只有兩種結果(成功/失敗)的單次試驗重複多次後成功次數的分佈概率。

nn次試驗中, 單次試驗成功率爲pp, 失敗率q=1pq=1-p, 則出現成功次數的概率爲
P(X=x)=CnxpxqnxP(X=x)=C_{n}^{x} p^{x} q^{n-x}

例子: 拋硬幣正面朝上的次數, 一批產品中有缺陷的產品數量等

# 生成大小爲1000的符合b(10,0.5)二項分佈的樣本集
s = numpy.random.binomial(n=10,p=0.5,size=1000)

# 計算二項分佈B(10,0.5)的PMF
x=range(11)
p=stats.binom.pmf(x, n=10, p=0.5)

# 統計可視化
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))

結果如下:
在這裏插入圖片描述
不同參數下的概率質量函數:

plt.figure(figsize=(12,8))
x = np.arange(1,51)
y1 = stats.binom.pmf(x,p=0.4,n=50)
y2 = stats.binom.pmf(x,p=0.6,n=50)
y3 = stats.binom.pmf(x,p=0.8,n=50)
plt.grid()
plt.xlabel('x')
plt.ylabel('pdf')
plt.title('probability mass function')
plt.xticks(ticks=np.arange(1,51,2))
plt.plot(x,y1,label='p=0.4')
plt.plot(x,y2,label='p=0.6')
plt.plot(x,y3,label='p=0.8')
plt.legend()
plt.show()

結果如下:
在這裏插入圖片描述

2.2.3 泊松分佈

假設已知事件在單位時間(或者單位面積)內發生的平均次數爲 λλ,則泊松分佈描述了事件在單位時間(或者單位面積)內發生的具體次數爲kk的概率。

一個服從泊松分佈的隨機變量XX,在具有比率參數(rate parameter)λ (λ=np)的一段固定時間間隔內,事件發生次數爲ii的概率爲
P{X=i}=eλλii!P\{X=i\}=e^{-\lambda} \frac{\lambda^{i}}{i !}
例子: 交通流的預測、一定時間內,到車站等候公交汽車的人數等

代碼實現:

# 生成大小爲1000的符合P(1)的泊松分佈的樣本集
s = numpy.random.poisson(lam=1,size=1000)

# 計算泊松分佈P(1)的PMF
x=range(11)
p=stats.poisson.pmf(x, mu=1)

# 統計可視化
# 比較λ=2的泊松分佈的真實概率質量和10000次隨機抽樣的結果
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()

結果:
在這裏插入圖片描述
下面是不同參數λ\lambda對應的概率質量函數:

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()

結果如下:
在這裏插入圖片描述
隨着參數增大,泊松分佈開始逐漸變得對稱,分佈也越來越均勻,趨近於正態分佈。 當λ\lambda很大時, 比如大於1000, 泊松分佈可以近似爲正態。

下面看一下泊松和二項分佈的比較:

plt.figure(figsize=(12,8))
x = np.arange(1,51)
y1 = stats.binom.pmf(x,p=0.4,n=50)
y2 = stats.poisson.pmf(x,20)
plt.grid()
plt.xlabel('x')
plt.ylabel('pmf')
plt.title('probability mass function')
plt.xticks(ticks=np.arange(1,51,2))
plt.plot(x,y1,label='binom:p=0.4,n=50')
plt.plot(x,y2,label='u=20')
plt.legend()
plt.show()

結果如下:
在這裏插入圖片描述
nn很大, pp很小的時候,如n>=100n>=100或者np<=10np<=10的時候, 二項分佈可以近似泊松。
在這裏插入圖片描述
關於泊松分佈, 更詳細的可以參考https://www.zhihu.com/question/26441147

好了, 常見的分佈已經差不多介紹完了, 下面放兩張神圖(來自組隊的學習文檔), 這是離散和連續型分佈的均值和方差的計算表:
離散型分佈:
在這裏插入圖片描述
連續型分佈:
在這裏插入圖片描述

3. 假設檢驗

假設檢驗問題時統計推斷中的一類重要問題,在總體的分佈函數完全未知或只知其形式,不知其參數的情況,爲了推斷總體的某些未知特性,提出某些關於總體的假設,這類問題被稱爲假設檢驗。

一個假設檢驗問題可以分爲5步,無論細節如果變化,都一定會遵循這5個步驟。

  1. 陳述研究假設,包含原假設(null hypothesis)和備擇假設(alternate hypothesis)
    通常來說,我們會把原假設的描述寫成變量之間不存在某種差異,或不存在某種關聯,原假設是被保護的假設, 如果沒有確鑿的證據不能推翻。備擇假設則爲存在某種差異或關聯。例如,原假設:男人和女人的平均身高沒有差別, 備擇假設男人和女人的平均身高存在顯著差別。
  2. 爲驗證假設收集數據
    爲了統計檢驗的結果真實可靠,需要根據實際的假設命題從總體中抽取樣本,要求抽樣的數據要具有代表性,例如在上述男女平均身高的命題中,抽取的樣本要能覆蓋到各類社會階級,各個國家等所有可能影響到身高的因素。
  3. 構造合適的統計測試量並測試
    統計檢驗量有很多種類,但是所有的統計檢驗都是基於組內方差和組間方差的比較,如果組間方差足夠大,使得不同組之間幾乎沒有重疊,那麼統計量會反映出一個非常小的P值,意味着不同組之間的差異不可能是由偶然性導致的。
  4. 決定是接受還是拒絕原假設
    基於統計量的結果做出接受或拒絕原假設的判斷,通常我們會以P=0.05作爲臨界值(單側檢驗)。

3.1 統計檢驗

最常用的統計檢驗包括迴歸檢驗(regression test),比較檢驗(comparison test)和關聯檢驗(correlation test)三類。

  • 迴歸檢驗:適用於預測變量是數值型的情況
    在這裏插入圖片描述
  • 比較檢驗:適用於預測變量是類別型,結果變量是數值型的情況
    在這裏插入圖片描述
  • 關聯檢驗:常用的只有卡方檢驗一種,適用於預測變量和結果變量均爲類別型的情況

關於更詳細的知識, 可以看上面的文檔, 下面補充一些實戰的內容。看看上面的檢驗方法到底如何去用, 什麼情況下用, 我覺得這是很重要的。

  1. t檢驗
    檢驗兩個獨立樣本集的均值是否具有顯著差異。

    • H0: 均值是相等的
    • H1: 均值不相等
    from scipy.stats import ttest_ind
    import numpy as np
    
    data1 = np.random.normal(size=10)
    #data2 = np.random.normal(size=10)
    data2 = np.random.poisson(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')
    
    stat=-1.148, p=0.266
    Probably the same distribution
    

    看個例子吧, 如下爲 101 班 40 名學生某次期末考試的數學和物理分數:

    (array([74, 84, 93, 60, 66, 78, 98, 65, 73, 89, 67, 93, 55, 77, 77, 77, 53,
            73, 65, 68, 82, 61, 68, 85, 66, 89, 78, 81, 85, 59, 73, 91, 68, 69,
            74, 74, 90, 73, 94, 91]),
     array([66, 72, 81, 52, 54, 69, 92, 55, 64, 80, 54, 82, 44, 65, 67, 69, 43,
            61, 58, 62, 71, 55, 61, 73, 57, 80, 70, 70, 75, 52, 63, 82, 57, 58,
            64, 63, 78, 63, 82, 79]))
    

    假設都服從正態, 且方差相等。 問本次期末考試全校的數學和物理成績的平均分有無顯著差異?這是一個典型的雙樣本,滿足正態分佈且方差相等的假設檢驗,判斷兩個正態分佈的期望是否相同,這就是一個 t 檢驗問題。我們構造假設:

    • H0——數學和物理成績的平均分無顯著差異
    • H1——有顯著差異
    math = np.array([74, 84, 93, 60, 66, 78, 98, 65, 73, 89, 67, 93, 55, 77, 77, 77, 53,
            73, 65, 68, 82, 61, 68, 85, 66, 89, 78, 81, 85, 59, 73, 91, 68, 69,
            74, 74, 90, 73, 94, 91])
    phy = np.array([66, 72, 81, 52, 54, 69, 92, 55, 64, 80, 54, 82, 44, 65, 67, 69, 43,
            61, 58, 62, 71, 55, 61, 73, 57, 80, 70, 70, 75, 52, 63, 82, 57, 58,
            64, 63, 78, 63, 82, 79])
    english = np.array([74, 73, 58, 90, 86, 73, 51, 85, 78, 62, 91, 59, 94, 74, 69, 74, 97,
           76, 84, 79, 68, 88, 83, 67, 86, 62, 71, 70, 67, 91, 75, 60, 83, 85,
           76, 75, 60, 74, 54, 54])
    
    #stat, p = ttest_ind(math, phy)   # 3.8494372972079143 0.00024094102526642325
    stat, p = ttest_ind(math, english)  # 0.5729811454106575 0.5683056230099213
    print(stat, p)
    

    假設我們顯著性水平 α=0.05,pvalue 顯著的小於 0.05,我們拒絕原假設 H0。可以發現, 英語和數學的p值大於0.05,物理和數學的p值小於0.05, 所以我們可以認爲數學和物理成績的期望存在顯著性差異。 看圖也能看出來:
    在這裏插入圖片描述
    會發現物理的分數都高於數學, 那麼期望會高。 而再看看英語和數學的
    在這裏插入圖片描述
    p 值表示原假設發生概率大小。p 值越小說明原假設情況發生的概率就越小。

  2. F 檢驗
    t 檢驗是爲檢驗均值是否有顯著性差異,F 檢驗是爲檢驗方差是否有顯著性差異。如下爲兩種車型近 10 天的銷量情況,檢驗兩種車型的銷量方差是否存在顯著差異

    • 原假設 H0 爲兩種車型的銷量方差無顯著差異
    • H1 爲方差有顯著差異。
    car_a = np.array([28, 72, 73, 62, 27, 91, 76, 63, 95, 20])
    car_b = np.array([86, 40, 60, 37, 64, 51, 39, 53, 26, 81])
    
    def varf(a):
        return sum(np.power(a - np.mean(a),2)) / (len(a)-1)
    
    f = varf(car_a) / varf(car_b)
    f  #1.9091713098080834
    

    通過查表,在顯著性上水平等於 0.05,樣本個數都爲 9 的情況下關鍵值爲 3.18,統計值 f 小於 3.18,所以接收原假設 H0,即認爲兩種車型的方差無顯著性差異。

  3. 卡方檢驗
    檢驗兩組類別變量是相關的還是獨立的(列聯表的獨立性角度)

    • 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')
    
    ## 結果:
    stat=0.272, p=0.873
    Probably independent
    

    另一種卡方檢驗的方式是用於檢測分類型變量是否符合期望頻數。例如,投擲一個 6 面篩子共 60 次,期望每一面出現的頻次都爲 10。但是不確定這個篩子是否動過手腳,於是投擲 60 次,得到實驗數據如下:array([11, 8, 9, 8, 10, 14]), 使用卡方檢驗判斷原假設 H0——未動過手腳,H1——動過手腳:

    import scipy.stats as ss
    
    obs = np.array([11, 8, 9, 8, 10, 14])
    exp = np.repeat(10, 6)
    
    #拒絕域 5% 的顯著水平,自由度 5
    jjy=ss.chi2.isf(0.05,5)
    
    # 卡方
    kf = ss.chisquare(obs, exp).statistic
    
    print(jjy, kf)  # 11.070497693516355 2.6
    
    
    #5% 的顯著水平,自由度 5 的拒絕域爲大於 11.1,卡方檢驗計算的卡方值爲 2.6,不在拒絕域內,
    #所以接收原假設,即篩子未動過手腳。
    
  4. 正態檢驗
    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'
    
  5. 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
    
  6. 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
    

好了, 這塊先寫這麼多, 如果學習了數理統計之後,可以發現假設檢驗和參數估計這塊寫起來還真是挺麻煩的,並且很多東西即使整理到這裏也不知道具體如何用。 所以先根據此次組隊學習的知識點整理, 後期如果再用到了,再到相應的版塊進行補充。

4. 總結

這篇文章主要分爲兩個部分, 簡單的梳理一下, 第一部分是常見分佈, 這裏又對概率論中常見的分佈進行一個總結匯總, 因爲數據分佈對於統計或者機器學習來說非常重要, 常見的分佈主要是正態, 拉普勞斯, 伯努利, 二項, 均勻, 泊松, 指數等。 第二部分是假設檢驗的情況, 這塊的理論知識涉及的不是很多, 因爲這個真要是整理起來很複雜, 會有各種情況的各種檢驗方式, 所以這塊就打算後期碰到之後再補充的方式了。 因爲這些知識都是基礎性的知識, 沒法說學完了就能馬上應用去掌握, 所以只能先有一個知識框架, 然後慢慢補充。

下面依然是一張導圖把知識拎一下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章