SciPy 统计
所有的统计函数都位于 scipy.stats 子包中,使用 info(stats) 函数可以获得这些函数的一个相当完整的列表。可用的随机变量列表也可以从stats子包的 文档串中 获得。这个模块包含了大量的概率分布,以及一个不断增长的统计函数库。
每个单变量分布都有自己的子类,如下表所示
序号 | 类和描述 |
---|---|
1 | rv_continuous 一个通用的连续随机变量类,用于子类化。 |
2 | rv_discrete 一个通用的离散型随机变量类,用于子类化。 |
3 | rv_histogram 产生一个由直方图给出的分布。 |
正态连续随机变量
一个概率分布,其中随机变量X可以取任何值,是连续随机变量。位置(loc)关键字指定了平均值。刻度(scale)关键字指定标准差。
作为 rv_continuous 类的一个实例, norm 对象从它那里继承了一系列的通用方法,并以这个特定分布的具体细节来完善它们。
为了计算若干点的CDF,我们可以传递一个列表或一个NumPy数组。让我们考虑下面的例子。
from scipy.stats import norm
import numpy as np
print norm.cdf(np.array([1,-1., 0, 1, 3, 4, -2, 6]))
上述程序将产生以下输出。
array([ 0.84134475, 0.15865525, 0.5 , 0.84134475, 0.9986501 ,
0.99996833, 0.02275013, 1. ])
为了找到分布的中位数,我们可以使用百分比点函数(PPF),它是CDF的逆值。让我们用下面的例子来理解。
from scipy.stats import norm
print norm.ppf(0.5)
上述程序将产生以下输出。
0.0
为了生成一个随机变量序列,我们应该使用大小关键字参数,如下例所示。
from scipy.stats import norm
print norm.rvs(size = 5)
上述程序将产生以下输出。
array([ 0.20929928, -1.91049255, 0.41264672, -0.7135557 , -0.03833048])
上面的输出是不可复制的。要产生相同的随机数,请使用种子函数。
均匀分布
可以使用均匀函数生成一个均匀分布。让我们考虑下面的例子。
from scipy.stats import uniform
print uniform.cdf([0, 1, 2, 3, 4, 5], loc = 1, scale = 4)
上述程序将产生以下输出。
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
建立离散分布
让我们生成一个随机样本,将观察到的频率与概率进行比较。
二项式分布
作为 rv_discrete类 的一个实例, binom对象 从它那里继承了一系列的通用方法,并以这个特定分布的细节来完善它们。让我们考虑下面的例子。
from scipy.stats import uniform
print uniform.cdf([0, 1, 2, 3, 4, 5], loc = 1, scale = 4)
上述程序将产生以下输出。
array([ 0. , 0. , 0.25, 0.5 , 0.75, 1. ])
描述性统计
像Min, Max, Mean和Variance这样的基本统计需要NumPy数组作为输入并返回相应的结果。下表描述了 scipy.stats包中 的一些基本统计函数。
序号 | 功能和描述 |
---|---|
1 | describe() 计算通过的数组的几个描述性统计数字 |
2 | gmean() 计算沿指定轴的几何平均数 |
3 | hmean() 计算沿指定轴的谐波平均数 |
4 | kurtosis() 计算峰度 |
5 | mode() 返回模态值 |
6 | skew() 测试数据的偏斜度 |
7 | f_oneway() 进行单因子方差分析 |
8 | iqr() 计算数据在指定坐标轴上的四分位数范围。 |
9 | zscore() 计算样本中每个值相对于样本平均值和标准差的z分数 |
10 | sem() 计算输入数组中数值的平均值的标准误差(或测量的标准误差)。 |
这些函数中的几个在 scipy.stats.mstats 中都有类似的版本,它们对屏蔽数组起作用。让我们通过下面的例子来理解。
from scipy import stats
import numpy as np
x = np.array([1,2,3,4,5,6,7,8,9])
print x.max(),x.min(),x.mean(),x.var()
上述程序将产生以下输出。
(9, 1, 5.0, 6.666666666666667)
T-test
让我们了解一下T检验在SciPy中是如何发挥作用的。
ttest_1samp
计算一组分数的平均值的T检验。这是一个双侧检验,用于检验独立观察样本’a’的期望值(平均值)等于给定的群体平均值 popmean 的无效假设 。 让我们考虑下面的例子。
from scipy import stats
rvs = stats.norm.rvs(loc = 5, scale = 10, size = (50,2))
print stats.ttest_1samp(rvs,5.0)
上述程序将产生以下输出。
Ttest_1sampResult(statistic = array([-1.40184894, 2.70158009]),
pvalue = array([ 0.16726344, 0.00945234]))
比较两个样本
在下面的例子中,有两个样本,它们可以来自相同或不同的分布,我们想测试这些样本是否具有相同的统计特性。
ttest_ind - 计算两个独立样本分数的平均值的T检验。这是对两个独立样本具有相同的平均(预期)值这一无效假设的双侧检验。该检验默认假设种群具有相同的变异。
如果我们观察到来自相同或不同种群的两个独立样本,我们可以使用这个检验。让我们考虑下面的例子。
from scipy import stats
rvs1 = stats.norm.rvs(loc = 5,scale = 10,size = 500)
rvs2 = stats.norm.rvs(loc = 5,scale = 10,size = 500)
print stats.ttest_ind(rvs1,rvs2)
上述程序将产生以下输出。
Ttest_indResult(statistic = -0.67406312233650278, pvalue = 0.50042727502272966)
你可以用一个同样长度的新数组来测试,但要有不同的平均值。在 loc 中使用一个不同的值,并进行同样的测试。