Python 數(shù)據(jù)正態(tài)性檢驗及Python、R、SPSS正態(tài)檢測方法

前提:數(shù)據(jù)正態(tài)性是諸如回歸分析、方差分析等進行前需要進行的判斷。

1. 所有方法:

  • 首先最常用的方法是圖示法,包括正態(tài)圖和P-P/Q-Q圖。正態(tài)圖看一下是不是“鐘形”分布曲線;P-P是查看實際數(shù)據(jù)累積比例與對應(yīng)正態(tài)分布累積比例的散點圖;Q-Q是查看實際數(shù)據(jù)與對應(yīng)正態(tài)分布分位數(shù)的符合程度。

  • 其次是正態(tài)性檢驗方法,利用觀測數(shù)據(jù)判斷總體是否服從正態(tài)分布的檢驗稱為正態(tài)性檢驗,它是統(tǒng)計判決中重要的一種特殊的擬合優(yōu)度假設(shè)檢驗。

  • 最后是描述法(偏度-峰度檢驗法),即通過描述數(shù)據(jù)偏度和峰度系數(shù)來檢驗數(shù)據(jù)的正態(tài)性。參考正態(tài)分布的偏度為0,峰度為3(實際應(yīng)用中通常將峰度值減去3,根據(jù)具體的軟件需要注意)。一般現(xiàn)實數(shù)據(jù)是不可能達到這個要求的,所以如果峰度絕對值小于10并且偏度絕對值小于3,即可判定數(shù)據(jù)基本為正態(tài)分布。

幾種方法對比。從上面介紹可以看出,正態(tài)性檢驗最為苛刻,而實際中可能存在樣本不足的情況,此時如果數(shù)據(jù)的圖示法基本符合正態(tài)分布也是可行的。同時,采用偏度峰度的判別方法也簡單可行,但容易受到異常值的影響。

一般而言,如果原始數(shù)據(jù)不滿足正態(tài)分布(比如偏態(tài)分布),通過取對數(shù)、開根號這種數(shù)據(jù)變換方法可使數(shù)據(jù)更接近正態(tài)性。

2. 正態(tài)性檢驗方法:

檢驗方法
  • Shapiro-Wilktest(夏皮羅維爾克檢驗法,W檢驗):Shapiro-Wilk檢驗需要首先對數(shù)據(jù)進行排序,統(tǒng)計量可以看做是排序值與最佳無偏線性估計值之間的平方,值越高,代表樣本與正態(tài)分布更匹配。W統(tǒng)計量計算公式參見Shapiro-Wilk
  • Kolmogorov-Smirnov(科爾莫戈羅夫檢驗法,K-S檢驗):Kolmogorov-Smirnov檢驗是基于累計分布函數(shù)的,單樣本K-S檢驗可用于檢測一個數(shù)據(jù)的觀測值是否符合特定的理論分布(比如正態(tài)分布等);兩樣本的K-S檢驗可用于比較兩個觀測樣本的經(jīng)驗函數(shù)是否存在顯著差異。K-S檢驗是一種穩(wěn)健的非參數(shù)化方法,不依賴于均值位置、適用范圍廣。K-S統(tǒng)計量的計算公式參見Kolmogorov-Smirnov。
檢驗思路【重點】
  • 檢驗問題:W檢驗與K-S檢驗的原假設(shè)H0為:總體服從正態(tài)分布。
  • 判斷思路:因為原始假設(shè)為數(shù)據(jù)符合正態(tài)分布,所以如果得到的顯著性值很?。ㄐ∮谠O(shè)定的0.01,0.005,0.001等),那么原假設(shè)被推翻,說明數(shù)據(jù)不符合正態(tài)分布;反之,如果統(tǒng)計變量的顯著性值大于設(shè)定的顯著性水平,那么原假設(shè)成立,數(shù)據(jù)符合正態(tài)分布(簡單來說,p>0.05是我們的目標,如果滿足,即可說明數(shù)據(jù)滿足正態(tài)性分布)。
方法對比
  • 原理不同:上述可知兩個方法的基本原理不一致。
  • 樣本量大?。涸谶x擇時,經(jīng)常依據(jù)樣本量的大小進行選擇。對于W檢驗,適用于小樣本,作者推薦樣本量小于20的時候使用(參考Shapiro-Wilk),SPSS統(tǒng)計軟件以及搜索資料發(fā)現(xiàn),在樣本量小于50時,推薦使用W檢驗;在樣本量位于50-5000的情況下,可以同時考慮W檢驗和K-S檢驗;在樣本量大于5000時,一般只使用K-S檢驗(SPSS在樣本量大于5000時只顯示K-S統(tǒng)計量)。

3. SPSS、R和Python語言代碼實戰(zhàn)

SPSS
R語言
# W 檢驗
shapiro.test(mydata$age)

# K-S檢驗采用nortest包中的lillie.test()函數(shù)來實現(xiàn)
library(ggplot2)
head(diamonds)
install.packages("nortest")
library(nortest)

lillie.test(diamonds$price)
Python語言

下面展示下用Python中的scipy包進行檢驗。

from scipy import stats
rng = np.random.default_rng()
x = stats.norm.rvs(loc=5, scale=3, size=100, random_state=rng)

shapiro_test = stats.shapiro(x)

shapiro_test
ShapiroResult(statistic=0.9813305735588074, pvalue=0.16855233907699585)

shapiro_test.statistic
0.9813305735588074

shapiro_test.pvalue
0.16855233907699585
  • K-S檢驗
    函數(shù)形式:scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two-sided', mode='auto')
    官方鏈接:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html
    主要參數(shù):rvs為待檢驗的數(shù)組或列表;cdf為檢驗方法,如果是單樣本檢驗,數(shù)值為'norm', 'expon', 'rayleigh', 'gamma'等,設(shè)置為'norm’即為正態(tài)性檢驗;默認是雙邊檢驗;N設(shè)置輸入的rvs為變量生成函數(shù)時指定數(shù)組的長度;其他變量不解釋了。
from scipy import stats
x = np.linspace(-15, 15, 9)
stats.kstest(x, 'norm')
# 輸出:KstestResult(statistic=0.444356027159..., pvalue=0.038850140086...)
  • 偏度-峰度檢驗
    函數(shù)形式:scipy.stats.normaltest(a, axis=0, nan_policy='propagate')
    官方鏈接:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html
    主要參數(shù):a,為包含待測試樣本的數(shù)組;axis,計算測試所沿著的軸,默認值為0,如果為None,則計算整個數(shù)組a;nan_policy定義當(dāng)輸入包含nan時如何處理。
from scipy import stats
rng = np.random.default_rng()
pts = 1000
a = rng.normal(0, 1, size=pts)
b = rng.normal(2, 1, size=pts)
x = np.concatenate((a, b))

k2, p = stats.normaltest(x)

4 完結(jié)

從應(yīng)用角度來看很簡單,在Python下,就是stats.normaltest(x)、stats.kstest(x, 'norm')以及stats.shapiro(x)三個的調(diào)用,后兩者在樣本量為50和5000時進行區(qū)分調(diào)用。

其他參考資料:
https://zhuanlan.zhihu.com/p/70755099
https://www.statsref.com/HTML/index.html
https://www.51xxziyuan.com/58/1287.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容