暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python-59 scipy.stats 统计检验

Rhonin晴朗台风天 2021-09-23
2318

 自从在官网学scipy,我又重新去看了pandas官网,有些知识点很多还蛮重要,我后期打算再把需要的学学。我突然想到excl,尽管我号称精通,但事实我会的也是常用的函数和透视,但已经秒杀70%的人了(哈哈,乱说的)不过肯定基本能覆盖我的工作内容了,excl其实很强大的,常用的也不过其中3或4,同理Python库如此之多,每个库的功能都挺繁杂,或许我们应该选择能覆盖工作的某些功能即可,全学会固然很好,毕竟精力和记忆还有练习时间有限,掌握基本通用即可,其它如果需要用到再升级






01



统计检验


1、夏皮罗维尔克检验法 (Shapiro-Wilk)小样本正态性检验

scipy.stats.shapiro(x)

x样本数据数组

return:statistic检验统计量 pvalueP值

    x=stats.norm.rvs(size=20)


    x
    Out[5]:
    array([ 0.60092388, -0.35671157, 0.29553121, -0.1350738 , 0.80450288,
    -0.34456702, -0.35974578, 0.22295746, -0.03304878, 1.41436338,
    -1.79731486, -0.26340209, 0.70876276, -0.88942301, -0.64495342,
    -0.3082458 , 2.02883298, -0.05070303, 0.68227095, -0.75282314])


    stats.shapiro(x)
    Out[6]: ShapiroResult(statistic=0.9680454134941101, pvalue=0.7131816744804382)

    2、科尔莫戈罗夫检验(Kolmogorov-Smirnov test)检验样本数据是否服从某一分布kstest,仅适用于连续分布的检验

    scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two_sided', mode='approx', **kwds)

    rvs是待检验的一组一维数据;

    cdf是给定的分布,例如'norm','expon','rayleigh','gamma';

    args=()是分布的参数

    N :如果rvs是字符串或调用的,N表示样本大小

    alternative='two_sided'   :H0 : G(x)=F(x)   H1 : G(x)≠F(x),'less'   :H0 : G(x)=F(x)   H1 : G(x)≤F(x),'greater'   :H0 : G(x)=F(x)   H1 : G(x)≥F(x)

    mode : 定义用于计算 p 值的分布。以下选项可用(默认为“auto”):'auto' :选择其他选项之一。'exact' :使用测试统计量的精确分布。'approx' : 以单边概率的两倍近似双边概率。'asymp':使用检验统计量的渐近分布

    return:ks统计量和p值,如果p值大于显著性水平(比如5%),接受原假设H0,可以认为样本数据来自给定分布F(x)

      x=stats.norm.rvs(size=100)
      stats.kstest(x,'norm')
      Out[8]: KstestResult(statistic=0.1190221486130757, pvalue=0.10833782801369352)

      3、方差齐性检验levene,检验两组或多组数据与其均值偏离程度是否存在差异

      levene(*args, center='median', proportiontocut=0.05)

      center:'mean'推荐用于对称、中尾分布, 'median'默认推荐用于偏态(非正态)分布, 'trimmed'推荐用于重尾分布。

      return:统计量和p值, p 值<0.05,表明总体方差不相等。

      scipy.stats.levene(*args, center='median', proportiontocut=0.05)

        a = [8.88, 9.12, 9.04, 8.98, 9.00, 9.08, 9.01, 8.85, 9.06, 8.99]
        b = [8.88, 8.95, 9.29, 9.44, 9.15, 9.58, 8.36, 9.18, 8.67, 9.05]
        c = [8.95, 9.12, 8.95, 8.85, 9.03, 8.84, 9.07, 8.98, 8.86, 8.98]
        stats.levene(a,b,c)
        Out[9]: LeveneResult(statistic=7.584952754501659, pvalue=0.002431505967249681)

        4、单样本t检验ttest_1samp,用于检验数据是否来自一致均值的总体,T检验主要是以均值为核心的检验。注意以下几种T检验都是双侧T检验scipy.stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate', alternative='two-sided')

        popmean:float 或 array_like,原假设中的期望值。如果是array_like,则它必须与不包括轴维度的a具有相同的形状.

        【这里是难点,费脑子!!和我们之前学的N维计算同理,顺便复习下好了,
        1、单个期望值(浮点数),会根据轴计算0列,1行,None数组。2、同size期望一维数组,轴0时,第一列-数组1值,第二列-数组2值…,轴1时,a.T,第一行-数组1值,第二行=数组2值…,轴None时,数组a-期望数组1值和2值,3、二维数组,轴0时,第一列-数组1值和2值,第二列-数组1值和2值…,其它轴同理】

        axis:默认0每列,1每行,None整个数组。

        alternative:‘two-sided’默认,‘less’: one-sided,‘greater’: one-sided

        return:统计量与两侧P值,P<0.05,差异显著,拒绝原假设,也就是不服从正态分布(栗子用了norm)

          #均值=3时,不拒绝原假设,均值=0时,拒绝原假设
          x=stats.norm.rvs(loc=3,size=(50,2))
          stats.ttest_1samp(x,3.0)
          Out[17]: Ttest_1sampResult(statistic=array([-1.48234972-0.56090362]), pvalue=array([0.144650510.57741933]))
          stats.ttest_1samp(x,0.0)
          Out[18]: Ttest_1sampResult(statistic=array([19.63811218, 21.58884159]), pvalue=array([7.15767389e-25, 1.10753243e-26]))


          #1、单个期望值(浮点数),会根据轴计算0列,1行,None数组。
          x=stats.norm.rvs(loc=3,size=(25,2))
          stats.ttest_1samp(x,3.0)
          Out[36]: Ttest_1sampResult(statistic=array([-1.96960446-0.95643968]), pvalue=array([0.060530630.348386  ]))
          x=stats.norm.rvs(loc=3,size=(25,2))
          stats.ttest_1samp(x,3.0,axis=1)
          Out[37]:
          Ttest_1sampResult(statistic=array([ 6.02606640e-01, -1.15913613e+01, -3.54490104e-01, -4.89869139e-01,
          -3.06433042e+00, -1.45865469e-01, -1.04664872e-01, -4.45193019e-01,
          2.53372388e+00, -1.25947392e+02, -3.04189656e+00, -2.17940019e-01,
          4.10893522e+00, -2.21756737e+02, 1.20959434e+00, 2.41548204e+00,
          -1.34927759e-01, -8.10160137e-01, 7.40057951e-01, -4.52610570e-01,
          -8.08344426e-01, -3.34823315e+01, -3.29664273e+00, 9.32058376e+00,
          -1.81318881e-01]), pvalue=array([0.65473949, 0.05478627, 0.78312319, 0.71001325, 0.20081496,
          0.90778947, 0.93361 , 0.73335228, 0.23931066, 0.00505454,
          0.20219867, 0.86339122, 0.15198083, 0.00287078, 0.43979264,
          0.24988179, 0.91461797, 0.56652208, 0.59440459, 0.72942211,
                 0.567220570.019007950.187495470.068042280.88580943]))
          x=stats.norm.rvs(loc=3,size=(25,2))
          stats.ttest_1samp(x,3.0,axis=None)
          Out[38]: Ttest_1sampResult(statistic=1.6049361040252983, pvalue=0.11493450330550206)


          #2、同size期望一维数组,轴0时,第一列-数组1值,第二列-数组2值…,轴1时,a.T,第一行-数组1值,第二行=数组2值…,轴None时,数组a-期望数组1值和2
          stats.ttest_1samp(x.T,[3.0,0.0],axis=1)
          Out[51]: Ttest_1sampResult(statistic=array([ 0.4196251417.06609848]), pvalue=array([6.78491881e-016.33556143e-15]))
          stats.ttest_1samp(x,[3.0,0.0],axis=None)
          Out[52]: Ttest_1sampResult(statistic=array([ 0.7962654924.10473043]), pvalue=array([4.29718775e-017.88515806e-29]))
          np.random.seed(10)
          x=stats.norm.rvs(loc=3,size=(25,2))
          stats.ttest_1samp(x,[3.0,0.0])
          Out[53]: Ttest_1sampResult(statistic=array([ 0.41962514, 17.06609848]), pvalue=array([6.78491881e-01, 6.33556143e-15]))


          #3、二维数组,轴0时,第一列-数组1值和2值,第二列-数组1值和2值…,其它轴同理
          np.random.seed(10)
          x=stats.norm.rvs(loc=3,size=(25,2))
          stats.ttest_1samp(x,[[3.0],[0.0]])
          Out[55]:
          Ttest_1sampResult(statistic=array([[ 0.41962514, 0.69621341],
          [16.68794122, 17.06609848]]), pvalue=array([[6.78491881e-01, 4.92983194e-01],
          [1.04203353e-14, 6.33556143e-15]]))

          5、独立样本t检验ttest_ind,比较两组数据是否来自于同一正态分布的总体

          scipy.stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0)

          equal_var:方差齐性True,False该检验不假定总体方差相等

          return:统计量与两侧P值,P<0.05,差异显著,拒绝原假设

            np.random.seed(10)
            a=stats.norm.rvs(loc=3,scale=10,size=25)
            b=stats.norm.rvs(loc=3,scale=10,size=25)
            stats.ttest_ind(a,b)
            Out[56]: Ttest_indResult(statistic=-0.04126042724127445, pvalue=0.967259431321202)


            np.random.seed(10)
            a=stats.norm.rvs(loc=3,scale=10,size=25)
            b=stats.norm.rvs(loc=3,scale=10,size=25)
            stats.ttest_ind(a,b,equal_var=False)
            Out[57]: Ttest_indResult(statistic=-0.04126042724127445, pvalue=0.9672839217241189)


            np.random.seed(10)
            a=stats.norm.rvs(loc=3,scale=10,size=25)
            b=stats.norm.rvs(loc=3,scale=20,size=25)
            stats.ttest_ind(a,b,equal_var=False)
            Out[58]: Ttest_indResult(statistic=-0.3280542001710502, pvalue=0.7444139033282802)

            6、配对样本t检验ttest_rel

            scipy.stats.ttest_rel(a, b, axis=0, nan_policy='propagate', alternative='two-sided')

            数组必须具有相同的形状

            return:统计量与两侧P值,P<0.05,差异显著,拒绝均值相等的原假设

              np.random.seed(10)
              a=stats.norm.rvs(loc=3,scale=10,size=25)
              b=stats.norm.rvs(loc=3.1,scale=10,size=25)
              stats.ttest_rel(a,b)
              Out[59]: Ttest_relResult(statistic=-0.092096422105424, pvalue=0.9273858664551353)

              7、检验样本是否不同于正态分布normaltest
              scipy.stats.normaltest(a, axis=0, nan_policy='propagate')

                np.random.seed(10)
                a=stats.norm.rvs(loc=1,scale=10,size=100)
                stats.normaltest(a)
                Out[60]: NormaltestResult(statistic=0.343083607335683, pvalue=0.8423650533350869)

                8、单因素拟合度卡方检验chisquare,卡方检验检验分类数据具有给定频率的原假

                scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)

                f_obs:在每个类别中观察到的频率

                f_exp :每个类别中的预期频率。默认情况下,假设类别的可能性相等,并由观察频率的平均值给出

                ddof:“Delta 自由度”:调整 p 值的自由度。p 值是使用具有自由度的卡方分布计算的,其中k 是观察到的频率数。ddof的默认值为 0。k - 1 - ddof


                建议样本总数大于 13,否则应使用精确检验(如 Barnard's Exact 检验)因为他们不会过度拒绝。

                此外,观察频率和预期频率的总和必须相同才能使测试有效

                  stats.chisquare([3,3,3,3,5])
                  Out[61]: Power_divergenceResult(statistic=0.9411764705882354, pvalue=0.9185804823533448)

                  9、秩和检验法 U检验(曼惠特尼)mannwhitneyu,零假设的非参数检验,即样本x的基础分布与样本y的分布相同。它通常用作分布之间位置差异的测试

                  scipy.stats.mannwhitneyu(x, y, use_continuity=True, alternative='two-sided', axis=0, method='auto')

                  use_continuity:是否应应用连续性校正 (1/2)。默认值为True时方法是'asymptotic'; 否则没有任何影响。

                    females = [20, 11, 17, 12]
                    males = [19, 22, 16, 29, 24]
                    stats.mannwhitneyu(males,females)
                    Out[64]: MannwhitneyuResult(statistic=3.0, pvalue=0.055673443266570206)

                    10、威尔克松符号秩和或等级检验法wilcoxon,Wilcoxon 符号秩检验检验两个相关配对样本来自同一分布的原假设。特别是,它测试差值 x - y 的分布是否关于零对称。它是配对 T 检验的非参数版本
                    scipy.stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False, alternative='two-sided', mode='auto')


                    x:要么是第一组测量值(在这种情况下y是第二组测量值),要么是两组测量值之间的差异(在这种情况下y不指定)。必须是一维的。

                    y:要么是第二组测量值(如果x是第一组测量值),要么未指定(如果x是两组测量值之间的差异)。必须是一维的。

                    zero_method:以下选项可用(默认为“wilcox”):“pratt”:在排名过程中包括零差,但会降低零的排名,参见[4],(更保守)。“wilcox”:丢弃所有零差异,默认值。“zsplit”:在排名过程中包含零差,并将零排名在正负之间进行拆分。

                      #两组样本的差值
                      d = [6, 8, 14, 16, 23, 24, 28, 29, 41, -48, 49, 56, 60, -67, 75]
                      stats.wilcoxon(d)
                      Out[67]: WilcoxonResult(statistic=24.0, pvalue=0.041259765625)

                      11、克-瓦式H检验法kruskal,Kruskal-Wallis H 检验检验所有组的总体中位数相等的原假设。它是 ANOVA 的非参数版本。该测试适用于 2 个或更多独立样本,这些样本可能具有不同的大小。请注意,拒绝零假设并不表示哪个组不同。需要在组之间进行事后比较以确定哪些组不同。
                      scipy.stats.kruskal(*args, nan_policy='propagate')

                      样本必须是一维的

                      由于假设H具有卡方分布,每组的样本数一定不能太少。一个典型的规则是每个样本必须至少有 5 次测量。

                        a=[1,3,5,7,9]
                        b=[2,4,6,8,10]
                        stats.kruskal(a,b)
                        Out[69]: KruskalResult(statistic=0.2727272727272734, pvalue=0.6015081344405895)

                        12、费里德曼等级方差分析friedmanchisquare,弗里德曼检验检验相同个体的重复测量具有相同分布的原假设。它通常用于测试以不同方式获得的测量值之间的一致性。例如,如果对同一组个体使用两种测量技术,则可以使用弗里德曼检验来确定这两种测量技术是否一致。

                        scipy.stats.friedmanchisquare(*args)

                        所有数组必须具有相同数量的元素。必须至少给出 3 组测量值

                        p 值仅对于 n > 10 和超过 6 次重复测量是可靠的


                        13、二项式检验执行成功概率为 p 的测试binomtest
                        scipy.stats.binom_test(k, n, p=0.5, alternative='two-sided')

                        k:成功次数

                        n:试验次数

                        p:成功的假设概率,即成功的预期比例。该值必须在区间内 。默认值为:0 <= p <= 1p = 0.5

                        return:P值
                        以下我的代码出不来,建议大家自行测试

                        croportion_estimate成功比例的估计

                        proportion_ci(confidence_level=0.95, method=’exact’) 计算置信区间

                          A=stats.binom_test(3,n=15,p=0.1)


                          A
                          Out[79]: 0.18406106910639114





                          文章转载自Rhonin晴朗台风天,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论