1. 程式人生 > 程式設計 >Python資料正態性檢驗實現過程

Python資料正態性檢驗實現過程

在做資料分析或者統計的時候,經常需要進行資料正態性的檢驗,因為很多假設都是基於正態分佈的基礎之上的,例如:T檢驗。

在Python中,主要有以下檢驗正態性的方法:

1.scipy.stats.shapiro ——Shapiro-Wilk test,屬於專門用來做正態性檢驗的模組,其原假設:樣本資料符合正態分佈。

注:適用於小樣本。

其函式定位為:

def shapiro(x):
  """
  Perform the Shapiro-Wilk test for normality.

  The Shapiro-Wilk test tests the null hypothesis that the
  data was drawn from a normal distribution.

  Parameters
  ----------
  x : array_like
    Array of sample data.

  Returns
  -------
  W : float
    The test statistic.
  p-value : float
    The p-value for the hypothesis test.

x引數為樣本值序列,返回值中第一個為檢驗統計量,第二個為P值,當P值大於指定的顯著性水平,則接受原假設。

2.scipy.stats.kstest(K-S檢驗):可以檢驗多種分佈,不止正態分佈,其原假設:資料符合正態分佈。

其函式定義為:

def kstest(rvs,cdf,args=(),N=20,alternative='two-sided',mode='approx'):
  """
  Perform the Kolmogorov-Smirnov test for goodness of fit.

  This performs a test of the distribution G(x) of an observed
  random variable against a given distribution F(x). Under the null
  hypothesis the two distributions are identical,G(x)=F(x). The
  alternative hypothesis can be either 'two-sided' (default),'less'
  or 'greater'. The KS test is only valid for continuous distributions.

  Parameters
  ----------
  rvs : str,array or callable
    If a string,it should be the name of a distribution in `scipy.stats`.
    If an array,it should be a 1-D array of observations of random
    variables.
    If a callable,it should be a function to generate random variables;
    it is required to have a keyword argument `size`.
  cdf : str or callable
    If a string,it should be the name of a distribution in `scipy.stats`.
    If `rvs` is a string then `cdf` can be False or the same as `rvs`.
    If a callable,that callable is used to calculate the cdf.
  args : tuple,sequence,optional
    Distribution parameters,used if `rvs` or `cdf` are strings.
  N : int,optional
    Sample size if `rvs` is string or callable. Default is 20.
  alternative : {'two-sided','less','greater'},optional
    Defines the alternative hypothesis (see explanation above).
    Default is 'two-sided'.
  mode : 'approx' (default) or 'asymp',optional
    Defines the distribution used for calculating the p-value.

     - 'approx' : use approximation to exact distribution of test statistic
     - 'asymp' : use asymptotic distribution of test statistic

  Returns
  -------
  statistic : float
    KS test statistic,either D,D+ or D-.
  pvalue : float
    One-tailed or two-tailed p-value.

引數是:

rvs:待檢驗資料。

cdf:檢驗分佈,例如'norm','expon','rayleigh','gamma'等分佈,設定為'norm'時表示正態分佈。

alternative:預設為雙側檢驗,可以設定為'less'或'greater'作單側檢驗。

model:'approx'(預設值),表示使用檢驗統計量的精確分佈的近視值;'asymp':使用檢驗統計量的漸進分佈。

其返回值中第一個為統計量,第二個為P值。

3.scipy.stats.normaltest:正態性檢驗,其原假設:樣本來自正態分佈。

其函式定義為:

def normaltest(a,axis=0,nan_policy='propagate'):
  """
  Test 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 [1]_,[2]_ test that combines skew and kurtosis to
  produce an omnibus test of normality.


  Parameters
  ----------
  a : array_like
    The array containing the sample to be tested.
  axis : int or None,optional
    Axis along which to compute test. Default is 0. If None,compute over the whole array `a`.
  nan_policy : {'propagate','raise','omit'},optional
    Defines how to handle when input contains nan. 'propagate' returns nan,'raise' throws an error,'omit' performs the calculations ignoring nan
    values. Default is 'propagate'.

  Returns
  -------
  statistic : float or array
    ``s^2 + k^2``,where ``s`` is the z-score returned by `skewtest` and
    ``k`` is the z-score returned by `kurtosistest`.
  pvalue : float or array
    A 2-sided chi squared probability for the hypothesis test.

其引數:

axis=None 可以表示對整個資料做檢驗,預設值是0。

nan_policy:當輸入的資料中有nan時,'propagate',返回空值;'raise' 時,丟擲錯誤;'omit' 時,忽略空值。

其返回值中,第一個是統計量,第二個是P值。

4.scipy.stats.anderson:由 scipy.stats.kstest 改進而來,用於檢驗樣本是否屬於某一分佈(正態分佈、指數分佈、logistic 或者 Gumbel等分佈)

其函式定義為:

def anderson(x,dist='norm'):
  """
  Anderson-Darling test for data coming from a particular distribution

  The Anderson-Darling tests the null hypothesis that a sample is
  drawn from a population that follows a particular distribution.
  For the Anderson-Darling test,the critical values depend on
  which distribution is being tested against. This function works
  for normal,exponential,logistic,or Gumbel (Extreme Value
  Type I) distributions.

  Parameters
  ----------
  x : array_like
    array of sample data
  dist : {'norm','expon','logistic','gumbel','gumbel_l',gumbel_r','extreme1'},optional
    the type of distribution to test against. The default is 'norm'
    and 'extreme1','gumbel_l' and 'gumbel' are synonyms.

  Returns
  -------
  statistic : float
    The Anderson-Darling test statistic
  critical_values : list
    The critical values for this distribution
  significance_level : list
    The significance levels for the corresponding critical values
    in percents. The function returns critical values for a
    differing set of significance levels depending on the
    distribution that is being tested against.

其引數:

x和dist分別表示樣本資料和分佈。

返回值有三個,第一個表示統計值,第二個表示評價值,第三個是顯著性水平;評價值和顯著性水平對應。

對於不同的分佈,顯著性水平不一樣。

Critical values provided are for the following significance levels:

  normal/exponenential
    15%,10%,5%,2.5%,1%
  logistic
    25%,1%,0.5%
  Gumbel
    25%,1%

關於統計值與評價值的對比:當統計值大於這些評價值時,表示在對應的顯著性水平下,原假設被拒絕,即不屬於某分佈。

If the returned statistic is larger than these critical values then for the corresponding significance level,the null hypothesis that the data come from the chosen distribution can be rejected.

5.skewtest 和kurtosistest 檢驗:用於檢驗樣本的skew(偏度)和kurtosis(峰度)是否與正態分佈一致,因為正態分佈的偏度=0,峰度=3。

偏度:偏度是樣本的標準三階中心矩。

Python資料正態性檢驗實現過程

峰度:峰度是樣本的標準四階中心矩。

Python資料正態性檢驗實現過程

6. 程式碼如下:

import numpy as np
from scipy import stats

a = np.random.normal(0,2,50)
b = np.linspace(0,10,100)

# Shapiro-Wilk test
S,p = stats.shapiro(a)
print('the shapiro test result is:',S,',p)

# kstest(K-S檢驗)
K,p = stats.kstest(a,'norm')
print(K,p)

# normaltest
N,p = stats.normaltest(b)
print(N,p)

# Anderson-Darling test
A,C,p = stats.anderson(b,dist='norm')
print(A,p)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。