使用stats包处理分布和概率问题

stats包

scipy计算包提供了scipy.stats子模块来支持与分布概率相关的计算.

stats子包中包含了几乎所有可能见到的连续分布离散分布类型. 而对于所有的连续分布有着同样的方法来进行操作, 离散部分同理, 只是部分函数与连续的有区别.

因此在使用时, 需要首先选择一种分布, 然后使用这个分布中的某些方法来达成目的.

首先了解连续分布离散分布共有的一些方法.

分布的可用方法

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pyplot import rcParams
rcParams["figure.figsize"] = 15, 6

这里借助连续的正态分布, 离散的二项分布, 统计学三大分布其中的连续的卡方分布来进行说明.

from scipy.stats import norm, binom, chi2

参数

对于每种分布, 都有其自己的参数, 不同的参数对应着不同的分布. 在scipy.stats中, 最常见的参数为locscale, 无论在连续还是离散分布中.

这两个参数顾名思义, 分别代表着:

  • loc: 位置, 在很多分布中代表均值, 期望.

  • scale: 缩放, 在很多分布中代表标准差的意思.

如果分布是与均值和标准差有关, 即这个分布中的参数包含这两者, 就使用这两者定义即可. 例如, 正态分布, 即norm, 就可以完全只用这两个参数定义. 我们定义一个标准正态分布:

png

有的分布, 例如卡方分布, 需要使用额外的参数, 对于卡方分布, 需要使用自由度参数.

备注, 与本章目的无关, 对于卡方分布, 往往使用其标准分布, 它也可以像正态分布一样, 有位置的平移和峰度的区别. 如果使用locscale, chi.pdf(x, df, loc, scale)等价于chi.pdf(y, df) / scale, 其中y = (x - loc) / scale.

png

有的分布, 完全与这两个参数无关, 例如常见的二项分布. 它需要的是n, p两个参数表示次数和单次概率. 这里我们模型投掷20次硬币的分布情况.

png

统计函数

对于连续和离散分布, 有着共有的一些常用的方法.

stats

stats(*args, moments="mv")

给出分布的统计量. 可以给出的统计量有:

  • m: 均值, mean

  • v: 方差, variance

  • s: 偏度, skew

  • k: 峰度, kurtosis

使用moments函数指定.

cdf

  • cdf(x, *args) 连续

  • cdf(k, *args) 离散

Cumulative distribution function, 累积分布函数. 返回给定的x(连续)或k离散坐标值对应的累计概率值.

sf

  • cdf(x, *args) 连续

  • cdf(k, *args) 离散

Survival function, 剩余密度的累计, 也可以定义为1 - cdf

ppf

  • ppf(q, *args)

Percent point function, 百分位函数. 给定一个百分数, 返回这个分布累计密度为这个数时对应的随机变量的值(即百分位).

cdf的反函数.

mean, median, var, std

  • mean(*args)

  • median(*args)

  • var(*args)

  • std(*args)

均值, 中位数, 方差, 标准差. 选定分布, 传入分布的参数, 得到对应的统计量.

expect

  • 正态分布

    • expect(func, args=(), loc=0, scale=1, lb=None, ub=None, conditional=False, **kwds)

  • 二项分布

    • expect(func, args=(n, p), loc=0, lb=None, ub=None, conditional=False)

函数的期望. 函数是关于该随机变量单变量函数. 求在自变量为指定的分布情况下, 对应函数的期望值.

其中分布的参数args, loc, scale参数共同指定. 如果像正态分布一样, 只使用到locscale, args传空tuple即可.

统计推断方法

interval

  • interval(alpha, *args)

给定置信水平α\alpha, 求出对应的区间范围. 如对于α=0.05\alpha=0.05的双向zz检验, 使用的就是标准正态分布, 对应的区间为:

采样

rvs

  • rvs(*args, size=1, random_state=None)

选定分布类型和分布参数, 就可以进行采样了. size参数指定采样样本的数量, random_state可以指定随机种子.

拟合

fit

  • fit(data, *args)

使用数据拟合得到分布的参数. 假设这些数据来自于这种类型分布的抽样, 现在要推算出分布对应的参数.

也可以指定参数, 这里指定的参数作为先验分布来使用.

推算参数的方法为: Maximum Likelihood Estimation, MLE, 最大似然法.

只有部分分布支持拟合(原因: 参数的可导性). 以正态分布为例子进行说明.

首先使用标准正态分布, 抽样生成数据, 再对数据进行拟合.

使用更大的数据量, 拟合更准确.

在大样本量的情况下, 先验参数的选择并不重要.

连续分布和离散分布不同的方法

pdf和pmf

  • pdf: Probability density function, 连续随机变量的概率密度函数

  • pmf: Probability mass function, 离散随机变量的概率质量函数

两者的意义是一样的, 只是对应连续和离散的问题.

  • pdf(x, *args)

  • pmf(k, *args)

即给定随机变量的一个值, 返回这个值对应的概率密度(连续)或概率(离散).

最后更新于

这有帮助吗?