在對數據建模前需要做數據探索,比如做特徵相關性的時候,經常會用到假設檢驗,很多時候我們需要對數據做正態性檢驗,進而通過檢驗結果確定下一步的分析方案。下面介紹 Python 中常用的幾種正態性檢驗方法:
scipy.stats.kstest(K-S檢驗)
kstest 是一個很強大的檢驗模塊,除了正態性檢驗,還能檢驗 scipy.stats 中的其他數據分佈類型,僅適用於連續分佈的檢驗,
原假設:數據符合正態分佈
kstest(rvs, cdf, args=(), N=20, alternative='two_sided', mode='approx', **kwds)
對於正態性檢驗,我們只需要手動設置三個參數即可:
rvs:待檢驗的一組一維數據
cdf:檢驗方法,例如'norm','expon','rayleigh','gamma',這裡我們設置為'norm',即正態性檢驗
alternative:默認為雙尾檢驗,可以設置為'less'或'greater'作單尾檢驗
model:'approx'(默認),使用檢驗統計量的精確分佈的近視值,
'asymp':使用檢驗統計量的漸進分佈
輸出結果中第一個為統計量,第二個為P值(注:統計量越接近0就越表明數據和標準正態分佈擬合的越好,如果P值大於顯著性水平,通常是0.05,接受原假設,則判斷樣本的總體服從正態分佈)
scipy.stats.shapiro(W檢驗)
與 kstest 不同,shapiro 是專門用來做正態性檢驗的模塊
原假設:樣本數據符合正態分佈
注意:shapiro是用來檢驗小樣本數據(數據量<50),不適合做(樣本數>5000)的正態性檢驗,檢驗結果的P值可能不準確
scipy.stats.shapiro(x, a=None, reta=False)
一般我們只用 x 參數就行,x 即待檢驗的數據
輸出結果中第一個為統計量,第二個為P值(統計量越接近1越表明數據和正態分佈擬合的好,P值大於指定的顯著性水平,接受原假設,認為樣本來自服從正態分佈的總體)
scipy.stats.normaltest
normaltest 也是專門做正態性檢驗的模塊,原理是基於數據的skewness和kurtosis
scipy.stats.normaltest(a, axis=0, nan_policy='propagate')
a:待檢驗的數據
axis:默認為0,表示在0軸上檢驗,即對數據的每一行做正態性檢驗,我們可以設置為 axis=None 來對整個數據做檢驗
nan_policy:當輸入的數據中有空值時的處理辦法。默認為 'propagate',返回空值;設置為 'raise' 時,拋出錯誤;設置為 'omit' 時,在計算中忽略空值。
輸出結果中第一個為統計量,第二個為P值(注:p值大於顯著性水平0.05,認為樣本數據符合正態分佈)
scipy.stats.anderson
anderson 是修改版的 kstest,說是增強版也不為過。也可以做多種分佈的檢驗,默認的檢驗時正態性檢驗。
scipy.stats.anderson(x, dist='norm')
參數x表示輸入數據,輸出結果:
anderson 有三個輸出值,第一個為統計數,第二個為評判值,第三個為顯著性水平, 評判值與顯著性水平對應
對於正態性檢驗,顯著性水平為:15%, 10%, 5%, 2.5%, 1%
基於偏度和峰度的檢驗,可用於檢驗樣本數據是否來自正態分佈,易受異常值影響,不能用於小樣本。(雅克-貝拉檢驗Jarque-Bera test:正態性檢驗)
偏度檢驗:H0 : 樣本數據的偏度=0 H1 :樣本數據的偏度≠0
拒絕原假設則認為樣本數據不是來自正態總體,但不拒絕原假設不能說明樣本數據來自正態總體,只能說明數據對稱,只有在確定對稱性是影響分佈的形態的唯一因素時,偏度檢驗才適用。
峰度檢驗:H0 : 樣本數據的峰度=3 H1 :樣本數據的峰度≠3
拒絕原假設則認為樣本數據不是來自正態總體,但不拒絕原假設不能說明樣本數據來自正態總體,容易出錯不推薦使用。
(二)SPSS中正態性檢驗的方法
1、計算偏度(Skewness)和峰度(Kurtosis) ,當它們接近0時,為正態。
閱讀更多 愛數據的小司機 的文章