用 Python 檢驗數據正態分布的幾種方法
一、總結
一句話總結:
scipy.stats.anderson(x, dist ='norm' ) 該方法是由 scipy.stats.kstest 改進而來的,可以做正態分布、指數分布、Logistic 分布、Gumbel 分布等多種分布檢驗。
scipy.stats.normaltest(a,axis=0) 該方法專門用來檢驗數據是否為正態性分布
二、用 Python 檢驗數據正態分布的幾種方法
轉自或參考:用 Python 檢驗數據正態分布的幾種方法
https://zhuanlan.zhihu.com/p/40447523
什么是正態分布
關於什么是正態分布,早在中學時老師就講過了。通俗來講,就是當我們把數據繪制成頻率直方圖,所構成曲線的波峰位於中間,兩邊對稱,並且隨着往兩側延伸逐漸呈下降趨勢,這樣的曲線就可以說是符合數學上的正態分布。由於任何特征的頻率總和都為100%或1,所以該曲線和橫軸之間部分的面積也為100%或1,這是正態分布的幾何意義。
如下圖,是數據統計實例中出現的正態分布性數據:
為什么要做正態性檢驗
對此我的理解是,正態性可以保證隨機性,因為隨機數就是正態分布的,這里可以用高爾頓板來形象化地理解:
高爾頓板為一塊豎直放置的板,上面有交錯排列的釘子。讓小球從板的上端自由下落,當其碰到釘子后會隨機向左或向右落下。最終,小球會落至板底端的某一格子中。假設板上共有 n 排釘子,每個小球撞擊釘子后向右落下的概率為(當左、右概率相同時
為 0.5),則小球落入第 k 個格子概率為二項分布,根據中心極限定理,當 n 足夠大時,該分布近似於正態分布。此時,將大量小球落至格中,格子中的小球數量即近似於正態分布的鍾形曲線。
高爾頓繪制的高爾頓板示意圖
高爾頓板是多個二次分布的累加,是離散的,但如果是無數次進行累加,那么它的極限狀態就是一個鍾形曲線的正態分布。舉個通俗的例子,如果統計全國成年女性的身高,那么結果曲線的波峰大概率落在 160-165cm 這個范圍內,然后左側對應偏低數據與右側對應的偏高數據,占據比例極小,如果收集的數據足夠多又保證隨機,那么最后的曲線就應該近似正態分布。
因此許多統計方法都是以正態分布為基礎的,如方差分析、相關和回歸分析等等。也有許多統計方法雖然不要求必須服從正態分布,但具有統計意義的數據量在極大的時候,是接近正態分布的,所以針對其使用的統計方法依然是以正態分布為理論基礎進行改進的。
用 Python 如何檢驗正態性
方法:scipy.stats.shapiro(x)
官方文檔:SciPy v1.1.0 Reference Guide
參數:x - 待檢驗數據
返回:W - 統計數;p-value - p值
2. scipy.stats.kstest
方法:scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative ='two-sided', mode ='approx')
官方文檔:SciPy v0.14.0 Reference Guide
參數:rvs - 待檢驗數據,可以是字符串、數組;
cdf - 需要設置的檢驗,這里設置為 norm,也就是正態性檢驗;
alternative - 設置單雙尾檢驗,默認為 two-sided
返回:W - 統計數;p-value - p值
方法:scipy.stats.anderson (x, dist ='norm' )
該方法是由 scipy.stats.kstest 改進而來的,可以做正態分布、指數分布、Logistic 分布、Gumbel 分布等多種分布檢驗。默認參數為 norm,即正態性檢驗。
官方文檔:SciPy v1.1.0 Reference Guide
參數:x - 待檢驗數據;dist - 設置需要檢驗的分布類型
返回:statistic - 統計數;critical_values - 評判值;significance_level - 顯著性水平
4. scipy.stats.normaltest
方法:scipy.stats.normaltest (a, axis=0)
該方法專門用來檢驗數據是否為正態性分布,官方文檔的描述為:
Tests whether a sample differs from a normal distribution.
This function tests the null hypothesis that a sample comes from a normal distribution. It is based on D’Agostino and Pearson’s [R251], [R252] test that combines skew and kurtosis to produce an omnibus test of normality.
官方文檔:SciPy v0.14.0 Reference Guide
參數:a - 待檢驗數據;axis - 可設置為整數或置空,如果設置為 none,則待檢驗數據被當作單獨的數據集來進行檢驗。該值默認為 0,即從 0 軸開始逐行進行檢驗。
返回:k2 - s^2 + k^2,s 為 skewtest 返回的 z-score,k 為 kurtosistest 返回的 z-score,即標准化值;p-value - p值