日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python正态检验_Python检验数据是否正态分布

發(fā)布時(shí)間:2025/3/19 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python正态检验_Python检验数据是否正态分布 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在對(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。