python卡方拟合性检验_重温统计学--抽样分布

小文 | 公众号 小文的数据之旅

推断统计学的重要作用就是通过从总体中抽取样本构造适当的统计量,由样本性质去推断关于总体的性质。统计量是样本的函数,它不依赖于任何未知参数。常用的统计量包括样本均值、方差、变异系数、峰度、偏度等。

正态分布中的几个重要分布:卡方分布、t分布、F分布,称为统计三大分布,常用于样本估计与假设验证。

1、卡方分布(连续、离散)

定义:设随机变量X1,X2,...Xn互相独立,且Xi(i=1,2,...,n)服从标准正态分布N(0,1),则它们的平方和(构成新的随机变量)服从自由度为n的卡方分布。

新的随机变量是一个平方和,对于平方和的统计量我们想到了什么呢?没错就是方差,卡方分布的应用往往跟方差挂钩。卡方分布是正态分布构造而成的一个新的分布,当自由度n很大时,卡方分布近似正态分布。

期望:

equation?tex=E%28%5Cchi%5E%7B2%7D%29+%3D+n

方差:

equation?tex=D%28%5Cchi%5E%7B2%7D%29+%3D+2n

公式:

equation?tex=%5Cchi%5E%7B2%7D+%3D+%5Csum%28%5Cfrac+%7B%28O-E%29%5E%7B2%7D%7D%7BE%7D%29

作用:

equation?tex=%5Cchi%5E%7B2%7D+ 用来衡量观测值(O)与期望值(E)的差异程度,当观测值与期望值存在差异时,检验差异是随机波动还是人为所致。因此卡方统计量可以用来检验拟合优度(即观测值与指定的分布的吻合程度)和检验两个变量的独立性(即两个变量是否存在显著性差异)。

形状特征:当自由度n<=2,先高后低,意味着检验统计量等于较小值的概率远远大于较大值,即观察频数越接近期望频数;

当自由度n>2,先低后高再低,n越大,越接近正态分布。图片来源于网络

python验证:方法:scipy.stats.ks_2samp(data1,data2,alternative='two-sided',mode='auto'),检验指定的两个数据是否服从相同分布;

返回:statistic - 统计值;pvalue - p值

2、 t分布(连续)

定义:设随机变量X~N(0,1),Y~

equation?tex=%5Cchi%5E%7B2%7D%28n%29 ,且X与Y独立,则

equation?tex=t%28n%29%3D+%5Cfrac%7BX%7D%7B%5Csqrt%7B%28%5Cfrac%7BY%7D%7Bn%7D%29%7D%7D ,其分布称为t分布,n为自由度。

t分布是正态分布构造而成的一个新的分布,当自由度n很大时(n>=30),根据中心极限定理,t分布近似正态分布。t分布主要用于检验均值是否不同。

期望:当自由度>=2,

equation?tex=E%28t%28n%29%29%3D0

方差:当自由度>=3,

equation?tex=D%28t%28n%29%29%3D%5Cfrac%7Bn%7D%7Bn-2%7D

公式:

equation?tex=t%28n%29%3D+%5Cfrac%7BX%7D%7B%5Csqrt%7B%28%5Cfrac%7BY%7D%7Bn%7D%29%7D%7D

作用:应用于小样本(n<30)的假设检验以及小样本均值的估计,可以轻松排除异常值的干扰,准确把握住数据的特征。

形状特征:与正态分布类似,但是尾部比正态分布要高,高高的长尾让它对异常值的包容性更好,因此能够减少异常值的干扰,更好的捕捉数据的特征。图片来源于网络

python验证:方法:scipy.stats.ks_2samp(data1,data2,alternative='two-sided',mode='auto'),检验指定的两个数据是否服从相同分布;

返回:statistic - 统计值;pvalue - p值

3、F分布(连续)

定义:设随机变量Y与Z互相独立,且Y与Z分别服从自由度为m和n的卡方分布,随机变量X有如下表达式:

equation?tex=X+%3D+%5Cfrac%7B%5Cfrac%7BY%7D%7Bm%7D%7D%7B%5Cfrac%7BZ%7D%7Bn%7D%7D ,则称X服从第一自由度m,第二自由度n的F分布。

与t统计量、F统计量的关系:当自由度等于1时,F统计量等于t统计量的平方。

F统计量 = 两个卡方统计量分别除以自身的自由度后两者的比值

思想:总变异分解为多个部分,每个部分由某因素的作用来解释,通过将某因素所致的变异与随机误差比较,从而推断该因素对测定结果是否有影响。听起来是不是跟卡方检验有点相似呢?bingo!当比较的组合次数很多(大于2),若采用卡方检验,会随着组合次数的增多而降低了统计推论可靠性的概率,增大了犯错误的概率,因此这时候就需要F统计量来帮帮忙了!F检验主要是用于检验多组合间方差是否存在差异。

公式:F统计量=组间均方与组内均方的比值

作用:应用于比较多组数据均值之间是否存在差异和方差分析。

形状特征:

注意:方差分析的结果若拒绝H0,接受H1,不能说明各组总体均数两两间都有差别。如果要分析哪些两组间有差别,要进行多个均数间的多重比较(卡方检验)。

4、Python 如何检验正态性

(1) Shapiro-Wilk test:方法:scipy.stats.shapiro(x)

参数:x - 待检验数据

返回:W - 统计数;p-value - p值

(2)scipy.stats.kstest:方法:scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative ='two-sided', mode ='approx')

参数:rvs - 待检验数据,可以是字符串、数组;

cdf - 需要设置的检验,这里设置为 norm,也就是正态性检验;

alternative - 设置单双尾检验,默认为 two-sided

返回:D - 统计数;p-value - p值

(3)scipy.stats.normaltest:方法:scipy.stats.normaltest (a, axis=0)

参数:a - 待检验数据;axis - 可设置为整数或置空,如果设置为 none,则待检验数据被当作单独的数据集来进行检验。该值默认为 0,即从 0 轴开始逐行进行检验。

返回:statistic - 统计值;pvalue - p值

5、python实践

import pandas as pd

import numpy as np

from scipy import stats

import seaborn as sns

import matplotlib.pyplot as plt

%matplotlib inline

data = pd.read_excel('./desktop/data.xlsx')

# 判断年龄是否服从正态分布,先从直方图看起

sns.distplot(data['Age'],bins=10)

plt.title('Age')

plt.xlim(0,80)

# 验证是否服从正态分布

ks_test = stats.kstest(data['Age'], 'norm')

shapiro_test = stats.shapiro(data['Age'])

normaltest_test = stats.normaltest(data['Age'],axis=0)

print('ks_test:',ks_test)

print('shapiro_test:',shapiro_test)

print('normaltest_test:',normaltest_test)

结果:ks_test: KstestResult(statistic=0.9649422367998306, pvalue=0.0)

shapiro_test: (0.9815102219581604, 7.906476895414016e-08)

normaltest_test: NormaltestResult(statistic=18.12938011101228, pvalue=0.00011567916063448067)

结论:由于p值都小于0.05,拒绝原假设,数据不服从正态分布

#因为使用ks_2samp的方式验证,因此需要先基于原数据做t拟合

np.random.seed(1000)

ks = stats.t.fit(data['Age'])

df = ks[0]

loc = ks[1]

scale = ks[2]

ks2 = stats.t.rvs(df=df, loc=loc, scale=scale, size=len(data['Age']))

stats.ks_2samp(data['Age'], ks2)

结果:Ks_2sampResult(statistic=0.06460674157303371, pvalue=0.09840600308212365)

结论:由于p值大于0.05,不能拒绝原假设,数据服从t分布

# 绘制拟合的T分布图

plt.figure()

data['Age'].plot(kind = 'kde')

T = stats.t(df,loc,scale)

x = np.linspace(T.ppf(0.01), T.ppf(0.99), 100)

plt.plot(x, TDistribution.pdf(x), c='orange')

plt.xlabel('age')

plt.title('T Distribution')

plt.legend(['age', 'T'])

#因为使用ks_2samp的方式验证,因此需要先基于原数据做卡方拟合

np.random.seed(1000)

chi_S = stats.chi2.fit(data['Age'])

df_chi = chi_S[0]

loc_chi = chi_S[1]

scale_chi = chi_S[2]

chi2 = stats.chi2.rvs(df=df_chi, loc=loc_chi, scale=scale_chi, size=len(data['Age']))

stats.ks_2samp(data['Age'], chi2)

结果:Ks_2sampResult(statistic=0.07724719101123596, pvalue=0.026989502005622588)

结论:由于p值小于0.05,拒绝原假设,数据不服从卡方分布

# 绘制拟合的卡方分布图

plt.figure()

data['Age'].plot(kind = 'kde')

chi = stats.chi2(df_chi, loc_chi,scale_chi)

x = np.linspace(chi.ppf(0.01), chi.ppf(0.99), 100)

plt.plot(x, chi.pdf(x), c='orange')

plt.xlabel('age')

plt.title('chi-square_Distribution')

plt.legend(['age', 'chi-square'])

— end —

小文的数据之旅

戳右上角「+关注」获取最新share

如果喜欢,请分享or点赞

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值