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

Python-56 scipy.stats之概率分布

Rhonin晴朗台风天 2021-09-16
2901

 前面咱们学习了统计知识,但一直没有结合到Python来进行实操,所以咱们这次来补充scipy库关于统计类的操作。







01


scipy库



SciPy 是建立在 Python 的 NumPy 扩展之上的数学算法和便利函数的集合。大家可以直接在官网上进行学习,同理各个库官网学习结合博主文释是很好的途径:https://docs.scipy.org/doc/scipy/reference/tutorial/general.html
包含了以下子库:


分包

描述

cluster

聚类算法

constants

物理和数学常数

fftpack

快速傅立叶变换例程

integrate

积分和常微分方程求解器

interpolate

插值和平滑样条

io

输入和输出

linalg

线性代数

ndimage

N维图像处理

odr

正交距离回归

optimize

优化和寻根程序

signal

信号处理

sparse

稀疏矩阵和相关例程

spatial

空间数据结构和算法

special

特殊功能

stats

统计分布和函数

SciPy 子包需要单独导入,例如:

    from scipy import stats

    我们着重放在stats统计这个子库标黄部分上,它包含大量概率分布、汇总和频率统计、相关函数和统计检验、屏蔽统计、核密度估计、准蒙特卡罗功能等。

    统计是一个非常大的领域,有些主题超出了 SciPy 的范围,并被其他软件包覆盖。其中一些最重要的是:

    • statsmodels:回归、线性模型、时间序列分析、对主题的扩展也由scipy.stats
      .

    • Pandas:表格数据、时间序列功能、与其他统计语言的接口。

    • PyMC3:贝叶斯统计建模,概率机器学习。

    • scikit-learn:分类、回归、模型选择。

    • Seaborn:统计数据可视化。

    • rpy2:Python 到 R 的桥接。



    02



    如何画各种分布图


    之前咱们可以通过公式去画一个正态分布图,

      import math
      import numpy as np
      import matplotlib.pyplot as plt


      u = 0 # 均值μ
      sig = math.sqrt(1) # 标准差δ
      x = np.linspace(u - 3*sig, u + 3*sig, 50) # 定义域
      y = np.exp(-(x - u) ** 2 (2 * sig ** 2)) (math.sqrt(2*math.pi)*sig) # 定义曲线函数
      plt.plot(x, y, "g", linewidth=2) # 加载曲线
      plt.grid(True) # 网格线
      plt.show() # 显示

      嗯,有点长,那么scipy又是怎么操作的呢?没有公式,只需要定义好x,均值,标准差即可。

      一个正常的连续随机变量:scipy.stats.norm.rvs(loc=0, scale=1, size=1, random_state=None)随机变量/.pdf(x, loc=0, scale=1),概率密度函数,画正态分布

        from scipy import stats
        import numpy as np
        import matplotlib.pyplot as plt


        mu=0
        sigma=1
        x=np.arange(-5,5,0.1)
        y=stats.norm.pdf(x,mu,sigma)
        plt.plot(x,y)

        有没让图看起来吊炸天那种,我想说有是有的,只是你们自己去加吧,哈哈

        再来画个泊松分布,如果不记得,可回顾统计-5 正态分布是概率分布的神

        泊松离散随机变量:scipy.stats.poisson.pmf(k, mu, loc=0)

          import numpy as np
          from scipy import stats
          import matplotlib.pyplot as plt


          lam=3 #λ为单位时间内事件的平均发生次数
          k=10 #k为事件发生次数
          x=np.arange(0,k+1,1)
          plist=stats.poisson.pmf(x,lam) #返回列表,1、2、3……次的概率
          print(plist)
          plt.plot(x,plist)
          plt.vlines(x,0,plist)
          plt.show()

          再来个二项分布,一般情况下,出现A的概率是p,B的概率是1-P,这类实验被称为伯努利试验,比如典型的抛硬币,而A会发生x次,则失败次数为n-x,二项分布求的是成功x次的概率,叫二项是因为只有2种结果。

          二项式离散随机变量:scipy.stats.binom.pmf(k, n, p, loc=0)

            import numpy as np
            from scipy import stats
            import matplotlib.pyplot as plt


            p=0.6 #假设事件A概率0.6
            n=10 #次数
            x=np.arange(0,n+1,1)
            plist=stats.binom.pmf(x,n,p) #返回列表,对应概率
            plt.plot(x,plist)
            plt.show()

            二项分布求解的问题是成功x次的概率,而何分布试验x次,才取得第一次成功的概率

            scipy.stats.geom.pmf(k, p, loc=0)

              import numpy as np
              from scipy import stats
              import matplotlib.pyplot as plt


              k=5 #5次就成功的概率
              p=0.4 #成功概率
              x=np.arange(1,k+1,1)
              plist=stats.geom.pmf(x,p)
              print(plist)
              plt.plot(x,plist)
              plt.show()




              03



              再认识更多分布


              我们已经学了正态分布、t分布、F分布、卡方分布、幂律分布、泊松分布,再补充一些其它分布。

              1、指数分布,不同的独立事件发生之间时间间隔值的分布,时间越长发生的概率指数型增大(减小),在我们日常的消费领域,通常的目的是求出在某个时间区间内,会发生随机事件的概率有多大。 

              2、均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的。

              3、0-1分布(伯努利分布)

              4、超几何分布,描述了从有限N个物件(其中包含M个指定种类的物件)中抽出n个物件,成功抽出该指定种类的物件的次数(不放回)。


              我个人感觉比较容易混淆的是,泊松分布、超几何分布、几何分布。建议都看看概念。




              04



              scipy概率分布总结


              一、概率分布scipy.stats,不管你是哪种类型的分布,方法都是通用的,主要都是以下几类,但内部填充的数据会有所不同。
              1、产生随机变量
              rvs(loc=0平均值, scale=1标准偏差, size=1数量或形状都可以, random_state=None)

              2、概率密度函数,画图一般用来做Y轴,前面第一部分已有示例。

              连续:pdf(x, loc=0, scale=1)
              离散:pmf(k, p, loc=0)

              3、累积分布函数:
              cdf(x, loc=0, scale=1)

              4、生存功能
              (1-CDF)sf(x, loc=0, scale=1)
              栗子用标准正态分布,留意结果输出对比差异。

                from scipy import stats
                import numpy as np
                import matplotlib.pyplot as plt
                x=np.arange(0,3)
                stats.norm.cdf(x)
                #结果输出array([0.5 , 0.84134475, 0.97724987])
                stats.norm.sf(x)
                #结果输出array([0.5 , 0.15865525, 0.02275013])

                5、百分比点函数(CDF的逆,(cdf-百分位数的倒数))
                ppf(q, loc=0, scale=1),如果q=0.025或0.975(单侧),返回某概率的统计量数值
                6、逆生存函数(SF的逆)
                isf(q, loc=0, scale=1),ppf的另一侧值
                栗子用标准正态分布,留意结果输出对比差异。

                  stats.norm.ppf(0.975)
                  Out[25]: 1.959963984540054


                  stats.norm.isf(0.975)
                  Out[27]: -1.959963984540054

                  7、返回均值,方差,偏度skew,峰度kurt,
                  stats(loc=0, scale=1, moments='mvsk')
                  8、中位数:median(loc=0, scale=1)
                  9、标准差:std(loc=0, scale=1)
                  10、数学期望:mean(loc=0, scale=1)
                  11、置信区间:interval(alpha置信水平, loc=0, scale=1) 包含分布的分数 alpha [0, 1] 的范围的端点,α0.95即为置信区间
                  栗子用标准正态分布,95%

                    stats.norm.interval(0.95)
                    Out[21]: (-1.959963984540054, 1.959963984540054)


                    二、各分布方法的区别
                    1、由下图可知,正态分布、指数分布、均匀分布方法是通用的,其它分布也是在这个的基础上小范围区别。



                    2、.卡方chi2/学生t .,是在正态分布方法的基础上增加了1个df自由度


                    3、.F.分布是在正态分布方法基础上增加2个df


                    4、.幂函数powerlaw.,在正态分布方法上增加1个a

                    5、分散分布会有些不同,主要是在k\p上
                    .0-1伯努利bernoulli/几何geom.,其中伯努利k在{0,1},几何k≥1

                    6、二项式离散.binom.,在伯努利上增1个n,k在{0,1,…,n}

                    7、超几何分布.hypergeom.,在二项上增1个M、N

                    8、泊松离散.poisson.,伯努利上p改mu单位时间内事件的平均发生次数,k≥0


                    感慨一句,自学不易,特别是接触新知识,人的理解力会变差。但你琢磨几天豁然开朗后又会觉得不过如此。这是一定要经历的过程嘛?



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

                    评论