如何检验一个变量的一组取值是否符合某种分布
图形分析
使用样本数字特征
使用假设检验
什么是假设检验
统计分析的经典框架
p值
从样本分布构建检验
K-S检验(检验某一个样本是否来自于某个分布)
以及其他分布检验()正态分布
Scipy
练习与问题
1、如何检验数据的抽样在某个维度是符合某种分布的?譬如,是否是正态分布,或,是否与总体的分布相同?
2、用某两个维度构造的二维列联表,以及相应的可视化如柱状图,是否可以做出
导入sicpy中的统计库
from scipy import stats
tips[‘tips_pct’]=tips[‘tip’]/tips[‘total_bill’]
tips[‘tip’].hist(bind=50)
tips[‘tip’].hist(bins=50)
用数字特征检验
看分布的数字特征是否与理论的数字特征一致?
期望(一阶矩)和方差(二阶矩)都是一个分布的数字特征,偏度(三阶矩)和峰度(四阶矩)
一、t分布
(1)例:生成一个t分布序列(模拟出一个t分布的样本)
t分布 设随机变量X服从标准正态分布N(0,1),Y服从 (n),且X与Y相互独立,记 ,则随机变量T服从自由度为n的t分布,记作T~t(n)
((在概率论和统计学中,学生t-分布(t-distribution),可简称为t分布,用于根据小样本来估计呈正态分布且方差未知的总体的均值。如果总体方差已知(例如在样本数量足够多时),则应该用正态分布来估计总体均值。 [1]
t分布曲线形态与n(确切地说与自由度df)大小有关。与标准正态分布曲线相比,自由度df越小,t分布曲线愈平坦,曲线中间愈低,曲线双侧尾部翘得愈高;自由度df愈大,t分布曲线愈接近正态分布曲线,当自由度df=∞时,t分布曲线为标准正态分布曲线。
在概率论和统计学中,学生t-分布(Student's t-distribution)经常应用在对呈正态分布的总体的均值进行估计。它是对两个样本均值差异进行显著性测试的学生t测定的基础。t检定改进了Z检定(en:Z-test),不论样本数量大或小皆可应用。在样本数量大(超过120等)时,可以应用Z检定,但Z检定用在小的样本会产生很大的误差,因此样本很小的情况下得改用学生t检定。在数据有三组以上时,因为误差无法压低,此时可以用变异数分析代替学生t检定。 [2]
当母群体的标准差是未知的但却又需要估计时,我们可以运用学生t-分布。))
np.random.seed(28124135) #种子生成器也就是种子确定的情况下比如写了左边的函数的情况下,里面数字不管写几,那么生成的随机序列都是一定的,会重复的,下次生成它是一样的。
x=stats.t.rvs(10,size=1000) #服从t分布的1000个点,其中10表示为t分布中的自由度。引用.t分布下面的.rvs (random+values+series)
(2)计算数字特征(样本的数据)
print(x.max() x.min() x.mean() x.var()) #x.var()是有偏估计量,没有调整的
n,(smin,smax),sm,sv,ss,sk=stats.describe(x) #将描述性统计的值赋值给变量
print(n,(smin,smax),sm,sv,ss,sk) #sm均值,sv方差(样本方差与x.var()结果不一样),ss偏度,sk峰度
(3)计算理论数字特征(前面生成的t分布的样本,假设不知道是从t分布中出来的,想验证一下。我们拿到样本之后,先统计出来其数字特征后,然后比较一下与理论的值有多大区别,其实相当于做一个检验,这个样本是不是来自一个自由度为10的t分布)
m,v,s,k=stats.t.stats(10,moments=’mvsk’) #理论值。其中mvsk为:一次矩,二次矩,三次矩,四次矩
print(m,v,s,k) #与上面样本值计算的sm,sv,ss,sk进行比较
这些只是初步的比较
(4)更严格的检验
t-test 检验是检验一个和两个样本之间的均值是否有明显的差别。两个变量之间的差异是否是显著的,比如受教育水平在男性与女性之间的差异是否是显著的。
print(’t-statistic=%6.3f pvalue=%6.4f’%) #输出两个值:t_value,p_value(p值越大就越不能拒绝样本均值和m有很大差别这个结论,也就是p_value越大,那么就认为这个分布接近于t分布。我们做的是一个t-test,我们有一个假设:这是一个t分布,均值为m,就认为x是从均值为m的t分布提取出来的,那么就做一个假设检验,如果p_values值很小那么就拒绝原假设,如果p_values很大就可以接受,不能拒绝。p<0.05的时候,认为有95%的把握拒绝原假设。
stats.ttest_1samp(x,m) #x为样本数据,m=0为理论的期望均值。输出两个统计量:第一个为t_value,第二个为p值
(5) K-Stest (The Kolmogorov-Smirnov test) 为.kstest的缩写。不仅可以检验是否为t分布,还可以检验是否为正态分布。
stats.kstest(x,’t’,(10,)) #x(x为样本数据)和t分布进行比较,参数为10。也就是检验x是不是来自于自由度为10的t分布。结果输出两个统计量:第一个为t_value,第二个为p_value。
print(‘KS-statisticD=%6.3fpvalue=%6.4f’%stats.kstest(x,’t’,(10,))
>>’KS-statisticD=0.016pvalue=0.9606’
如何解读:p>0.05 表明至少有95%的把握拒绝原假设,也就是介绍样本数据为t分布。
是否符合正态分布?
stats.ktest(x,’normal’,(x.mean(),x.std())) #正态分布有两个参数(均值、方差),检验的时候要指定参数。想要分析来自于什么样的正态分布,就用样本x进行检验,与normal进行比较,用样本的均值x.mean()进行估计以及用样本的方差x.std()进行估计。结果输出两个值,第一个统计量,第二个是p值。
>>KS-statisticD=0.032pvalue=0.2402
如何解读?
只看p值就可以了,结果显示不能拒绝原假设,也就是认为样本x符合正态分布。其实正态分布和t分布是长得非常像的。这说明我们的检验方法不够强大,样本还不够多。
卡方检验(卡方分布的尾部检验)
卡方分布:假设x服从标准正态分布,那么他的平方和是服从卡方分布的。卡方检验:构造一个统计量,它应该服从某个卡方分布,就是检验一下样本与理论样本只检验尾部(正态分布与卡方分布尾部区别还是比较大的。)
quantiles=[0.0,0.01,0.05,0.1,1-0.10,1-0.05,1-0.01,1.0] #定义了概率分布函数是0-0.01;0.01-0.05;0.05-0.1;0.1-0.9;0.9-0.95;0.95-1;将数据分进每个区间中。然后先找到理论的分为数在哪,把他们都装到这些隔段中,然后数数有多少个。然后与理论的应该有多少个进行比较。
crit=stats.t.ppf(quantiles,10) #生成一个服从自由度为10的t分布所对应的分位数数据。
crit #([-inf, -2.76376946,-1.81246112, -1.37218364, 1.37218364,1.81246112, 2.76376946, inf]) 0分为数对应的t分布的数是- ,1分为数对应的t分布的数是+ 。
n_sample=x.size #样本量
np.histogram(x,bins=crit) #将样本x按照给定的分位数画直方图,看看每段分位数之间有多少数量的样本,以及所对应的分位数。
freqcount=np.histogram(x,bins=crit)[0] #只查看每段分位数之间样本的数量。
freqcount # array([ 12, 42, 48, 809, 51, 35, 3], dtype=int64)
matplotlib.pyplot.hist(x,bins=crit) #crit不是均匀分布的,画出的图也不是均匀分布的
matplotlib.pyplot.hist(x,bins=50)#这是均匀分布的
我们比较感兴趣的是,按照t分布理论来说这些不同的隔断其实是有概率的,大概分布多少
tprob=np.diff(quantiles)
nprob=np.diff(stats.norm.cdf(crit)) #diff函数就是后一个元素减前一个元素的差,就是前面matplotlib.pyplot.hist(x,bins=crit)作图落在这些区间的概率值 [0.01, 0.04, 0.05, 0.8 , 0.05, 0.04, 0.01]。也就是分成了7段,中间一段最多,也就是有0.8的概率落在中间。然后看看实际落在这期间的数量:freqcount # array([ 12, 42, 48, 809, 51, 35, 3], dtype=int64)理论上落在这期间的数量为:tprob*1000:array([ 10., 40., 50., 800., 50., 40., 10.]),所以就看看这两者到底有多少差别?
另外,再看看是否服从t分布、正态分布,也就是假设是正态分布用同样的方法构造下:
tch,tpval=stats.chisquare(frequcount,tprob*n_sample) # chisquare卡方检验,将实际值与理论值对比下。也就是每一块理论上应该落多少个,这是一个二项分布,(中心极限定理中的扩展:本来有多少概率落再里面,现在实际落在里面,是有误差的,这些误差是由二项分布影响的,二项分布数比较大的时候可以构造成一个正态分布,正态分布标准化之后的平方和就是每一块都有一个概率值落在里面多少个理应的,但是和现在有个差别,但是这个差别,我们认为是服从正态分布的。(特别是除以这个误差,这个误差是怎么算出来的,就是二项分布算出来的,把这些平方和加在一起,理论落多少个和实际落多少个除以他们的误差(二项分布加起来的误差)平方和这就是一个卡方分布,)
print(tch,tpval) #tch是一个卡方变量,tpval是个tp_value也就是越大越不能拒绝原假设(原假设就是这个分布就是来自一个自由度为10的t分布)
nch,npval=stats.chisquare(freqcount,nprob*n_sample) #看看是否符合正态分布
print(nch,tpval) #(33.215999783815129.528528935471424e-06),其中tpval非常接近于0,越小越应该拒绝原假设(原假设:这个分布为正态分布),也就是这个分布与正态分布相差太大。正态分布尾部不应该这么分布的,看看正态分布应该怎样分布:1000*nprob
结果为:([2.85689468,32.10059323, 50.04565043, 829.99372331,50.04565043, 32.10059323, 2.85689468])。实际值freqcount:([ 12, 42, 48, 809, 51, 35, 3], dtype=int64),尾部太厚(12,42),中间值两者相差不大809与829。所以给出的卡方检验是拒绝的。
总结:开始的K-S分布把所有的区域都统一的以为是一样的,等分的去做。