python正态检验_Python检验数据是否正态分布
在對(duì)數(shù)據(jù)進(jìn)行處理前,有事需要判斷數(shù)據(jù)是否呈正態(tài)分布,比如線性回歸,比如使用3-sigma判斷數(shù)據(jù)是否異常。常用的正態(tài)分布檢測(cè)方法:
Shapiro-Wilk test
Shapiro-Wilk test是一種在頻率上統(tǒng)計(jì)檢驗(yàn)中檢驗(yàn)正態(tài)性的方法。該檢驗(yàn)的零檢驗(yàn)是樣本$x_1,\cdots ,x_n$來自于一個(gè)正態(tài)分布的母體。這個(gè)檢驗(yàn)的統(tǒng)計(jì)量是:
$$W = \frac{(\sum_{i=1}^{n}a_{i}x_{(i)})^2}{\sum_{i=1}^{n}(x_i-\bar{x})^2}$$
其中:
$x_{(i)}$用括號(hào)包含下標(biāo)索引i的;不與x混淆,它是第i階統(tǒng)計(jì)量,即樣本中的第i個(gè)最小數(shù)
$\overline {x}=(x_{1}+\cdots +x_{n})/n$是樣本的平均值。
常量$a_i$通過公式$(a_1,\dots ,a_n)=\frac{m^{T}V^{-1}}{\sqrt{(m^{T}V^{-1}V^{-1}m)}}, m=(m_1,\dots ,m_n)^T$,其中$m_1,\dots ,m_n$是從一個(gè)標(biāo)準(zhǔn)的正態(tài)分布隨機(jī)變量上采樣的有序獨(dú)立同分布的統(tǒng)計(jì)量的期望值。V是這些有序統(tǒng)計(jì)量的協(xié)方差。
這個(gè)統(tǒng)計(jì)檢驗(yàn)的假設(shè)是樣本來自于一個(gè)正態(tài)母體,因此,一方面,如果p值小于選擇的顯著度水平(通常0.05),那么在更大概率下我們應(yīng)該拒絕零假設(shè),數(shù)據(jù)的證據(jù)顯示我們的樣本不是來自一個(gè)正態(tài)分布母體。另一方面,如果p值比選擇的顯著度水平大,那么我們沒有證據(jù)拒絕零假設(shè),數(shù)據(jù)來自于一個(gè)正態(tài)分布。
Python代碼:
import numpy as np
from scipy import stats
np.random.seed(0)
x = np.random.randn(1, 1000)
print(stats.shapiro(x[0]))
# (0.9985557794570923, 0.5914123058319092)
# 輸出(統(tǒng)計(jì)量W的值,P值)
# W的值越接近1就越表明數(shù)據(jù)和正態(tài)分布擬合得越好,P值>指定水平, 不拒絕原假設(shè),可以認(rèn)為樣本數(shù)據(jù)服從正態(tài)分布
# 不適合樣本>5000的情況
參考鏈接:
Kolmogorov-Smirnov test
Kolmogorov-Smirnov是比較一個(gè)頻率分布f(x)與理論分布g(x)或者兩個(gè)觀測(cè)值分布的檢驗(yàn)方法。其原假設(shè)H0:兩個(gè)數(shù)據(jù)分布一致或者數(shù)據(jù)符合理論分布。D=max|f(x)- g(x)|,當(dāng)實(shí)際觀測(cè)值D>D(n,α)則拒絕H0,否則接受H0假設(shè)。
KS檢驗(yàn)與t-檢驗(yàn)之類的其他方法不同是KS檢驗(yàn)不需要知道數(shù)據(jù)的分布情況,可以算是一種非參數(shù)檢驗(yàn)方法。當(dāng)然這樣方便的代價(jià)就是當(dāng)檢驗(yàn)的數(shù)據(jù)分布符合特定的分布時(shí),KS檢驗(yàn)的靈敏度沒有相應(yīng)的檢驗(yàn)來的高。在樣本量比較小的時(shí)候,KS檢驗(yàn)最為非參數(shù)檢驗(yàn)在分析兩組數(shù)據(jù)之間是否不同時(shí)相當(dāng)常用。
Kolmogorov檢驗(yàn)找出在每一個(gè)數(shù)據(jù)點(diǎn)上經(jīng)驗(yàn)累積概率與目標(biāo)分布的累積概率之差的上界,列出公式是這樣的:
$$D_n = \underset{x}{sup}|F_n(x)-F(x)|$$
其中sup函數(shù)表示一組距離中的上確界,這是個(gè)數(shù)學(xué)概念,表示在原假設(shè)$F_n(x)=F(x)$的條件下,$F_n(x)-F(x)$的絕對(duì)值的最小上界。$F_n(x),F(x)$分別代表經(jīng)驗(yàn)的和理論的累積概率。其意圖在于如果原假設(shè)成立,則$D_n$應(yīng)該很小,如果很大,則原假設(shè)不成立。但是,這個(gè)上確界怎么求出來呢?請(qǐng)看下面的公式:
$$D_n = \underset{x}{sup}|F_n(x)-F(x)|=\underset{1\leq k\leq n}{max}\{|F_n(x_k)-F_0(x_k)|,|F_0(x_{k+1}-F_n(x_k)|\}$$
其中k為樣本從小到大排列后的序數(shù)。從公式中看出$D_n$是經(jīng)驗(yàn)和目標(biāo)累積概率之差和錯(cuò)一位后再求出的差中最大的一個(gè)。Kolmogorov還給出了這個(gè)距離的分布函數(shù),并給出了判斷的臨界值。當(dāng)然現(xiàn)在的統(tǒng)計(jì)軟件都直接計(jì)算p值,很少有人查表了。
Kolmogorov-Smirnov檢驗(yàn)(K-S檢驗(yàn))基于累積分布函數(shù),用以檢驗(yàn)一個(gè)經(jīng)驗(yàn)分布是否符合某種理論分布或比較兩個(gè)經(jīng)驗(yàn)分布是否有顯著性差異。
兩樣本K-S檢驗(yàn)由于對(duì)兩樣本的經(jīng)驗(yàn)分布函數(shù)的位置和形狀參數(shù)的差異都敏感而成為比較兩樣本的最有用且常規(guī)的非參數(shù)方法之一。
優(yōu)點(diǎn):該檢驗(yàn)不依賴于要測(cè)試的累積分布函數(shù),相比于卡方擬合檢驗(yàn)(卡方檢驗(yàn)需要50個(gè)以上的樣本),不需要大量的樣本。
缺點(diǎn):只適用于連續(xù)分布;在分布中間敏感,在兩端不夠敏感;最大的局限在于整個(gè)分布需要完全確定,如果位置,形狀等參數(shù)都是從數(shù)據(jù)中估計(jì)的,判定區(qū)間不再有效,因此這些參數(shù)一般只能通過模擬得到。
scipy.stats.kstest是一個(gè)很強(qiáng)大的檢驗(yàn)?zāi)K,除了正態(tài)性檢驗(yàn),還能檢驗(yàn) scipy.stats 中的其他數(shù)據(jù)分布類型。
scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative=’two-sided’, mode=’approx’)
rvs:待檢驗(yàn)的數(shù)據(jù)
cdf:檢驗(yàn)方法,這里我們?cè)O(shè)置為‘norm’,即正態(tài)性檢驗(yàn)
args:分布參數(shù),可選
N:樣本數(shù)量
alternative:默認(rèn)為雙尾檢驗(yàn),可以設(shè)置為‘less’或‘greater’作單尾檢驗(yàn)
mode:定義計(jì)算p-value的方式
使用示例:
import numpy as np
from scipy import stats
np.random.seed(0)
x = np.random.randn(1, 100)
print(stats.kstest(x[0], 'norm'))
# KstestResult(statistic=0.0582486387238324, pvalue=0.8865884365301941)
輸出結(jié)果中第一個(gè)為統(tǒng)計(jì)量,第二個(gè)為P值(注:統(tǒng)計(jì)量越接近0就越表明數(shù)據(jù)和標(biāo)準(zhǔn)正態(tài)分布擬合的越好,如果P值大于顯著性水平,通常是0.05,接受原假設(shè),則判斷樣本的總體服從正態(tài)分布)
參考鏈接:
Anderson-Darling test
這個(gè)方法是由T. W. Anderson和D. A. Darling于1954年提出的,與K-S檢驗(yàn)相比,AD檢驗(yàn)度量經(jīng)驗(yàn)累積概率和理論累積概率之差的方法顯得更加自然。下面的公式就是其方法:
$$Z = n\int_{-\infty}^{\infty}[F_n(x)-F(x)]^{2}w(x)f(x)dx$$
是不是感覺像是計(jì)算方差的公式,我的直觀感覺,就是把每個(gè)數(shù)據(jù)點(diǎn)的差求平方以后相加,得到總的分布偏差,這樣就考慮了所有的差異點(diǎn),而不是像K-S檢驗(yàn)?zāi)菢又豢紤]一個(gè)最大的。
公式中f(x)是理論分布密度函數(shù),w(x)是某個(gè)權(quán)重函數(shù)。若w(x)≡1,則為Cramér-Von Mises統(tǒng)計(jì)量$W^2$。
用上面的積分公式計(jì)算統(tǒng)計(jì)量比較麻煩,因此兩位統(tǒng)計(jì)學(xué)家又推導(dǎo)出了簡(jiǎn)單的計(jì)算方法,見下面的公式:
$$A^2=-n-\sum_{i}^{n}\frac{2i-1}{n}[\ln F(Y_i)+\ln (1-F(Y_{n+1-i})]$$
其中$Y_i=\frac{X_i-\hat{\mu}}{\hat{\sigma}}$
注意這個(gè)公式計(jì)算所采用的數(shù)據(jù)順序是從小到大排列的,不是原來的數(shù)據(jù)排列順序。
scipy.stats.anderson是由 scipy.stats.kstest 改進(jìn)而來的,可以做正態(tài)分布、指數(shù)分布、Logistic 分布、Gumbel 分布等多種分布檢驗(yàn)。默認(rèn)參數(shù)為 norm,即正態(tài)性檢驗(yàn)。
返回:statistic – 統(tǒng)計(jì)數(shù);critical_values – 評(píng)判值;significance_level – 顯著性水平
import numpy as np
from scipy import stats
np.random.seed(0)
x = np.random.randn(1, 100)
print(stats.anderson(x[0], 'norm'))
# AndersonResult(statistic=0.18097695613924714, critical_values=array([0.555, 0.632, 0.759, 0.885, 1.053]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))
# 如果輸出的統(tǒng)計(jì)量值statistic < critical_values,則表示在相應(yīng)的significance_level下,接受原假設(shè),認(rèn)為樣本數(shù)據(jù)來自給定的正態(tài)分布。
參考鏈接:
scipy.stats.normaltest
scipy.stats.normaltest運(yùn)用了D’Agostino–Pearson綜合測(cè)試法,返回(得分值,p值),得分值=偏態(tài)平方+峰態(tài)平方
scipy.stats.normaltest(a, axis=0, nan_policy='propagate')
這里的三個(gè)參數(shù)都有必要看一下:
a:待檢驗(yàn)的數(shù)據(jù)
axis:默認(rèn)為0,表示在0軸上檢驗(yàn),即對(duì)數(shù)據(jù)的每一行做正態(tài)性檢驗(yàn),我們可以設(shè)置為axis=None來對(duì)整個(gè)數(shù)據(jù)做檢驗(yàn)
nan_policy:當(dāng)輸入的數(shù)據(jù)中有空值時(shí)的處理辦法。默認(rèn)為 propagate,返回空值;設(shè)置為raise時(shí),拋出錯(cuò)誤;設(shè)置為omit時(shí),在計(jì)算中忽略空值。
代碼示例:
import numpy as np
from scipy import stats
np.random.seed(0)
x = np.random.randn(1, 100)
print(stats.normaltest(x[0]))
# NormaltestResult(statistic=0.45430460563864783, pvalue=0.7967994182504964)
如果pvalue是>0.05,則代表是正態(tài)分布。
參考鏈接:
Lilliefors-test
檢驗(yàn)樣本數(shù)據(jù)是否來自正態(tài)總體。采用方法是:當(dāng)總體均值和方差未知時(shí),用樣本的均值和方差代替后 再用K-S檢驗(yàn)法。據(jù)說效果不如Anderson-Darling test。原假設(shè) H0:樣本服從正態(tài)分布; 備擇假設(shè) H1:樣本不服從正態(tài)分布
import numpy as np
from statsmodels.stats.diagnostic import lilliefors
np.random.seed(0)
x = np.random.randn(1, 100)
print(lilliefors(x[0]))
# 輸出(統(tǒng)計(jì)量的值,P值)=(0.06433451870420759, 0.40018452551214856),P值>指定水平0.05,接受原假設(shè),可以認(rèn)為樣本數(shù)據(jù)服從正態(tài)分布
參考鏈接:
總結(jié)
以上是生活随笔為你收集整理的python正态检验_Python检验数据是否正态分布的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: autocad完全应用指南_建筑绘图慢?
- 下一篇: python安装不了jupyter_求救