scipy.stats模块包含了统计工具以及概率分析工具。
分布: 直方图和概率密度函数
给定随机过程的观测值,其直方图是随机过程的概率密度函数PDF的估计量:
示例
import numpy as np samples = np.random.normal(size=1000) bins = np.arange(-4, 5) bins histogram = np.histogram(samples, bins=bins, normed=True)[0] bins = 0.5*(bins[1:] + bins[:-1]) bins from scipy import stats pdf = stats.norm.pdf(bins) # norm是一个分布对象 import matplotlib.pyplot as plt plt.plot(bins, histogram) plt.plot(bins, pdf) # plt.savefig('./st1-1.png') # 保存要显示的图片 plt.show()
输出
如果我们知道随机过程属于一个给定的随机过程家族,比如正态过程,我们就可以对观测值进行最大似然拟合来估计潜在分布的参数。这里我们将一个正态过程与观察到的数据进行拟合:
loc, std = stats.norm.fit(samples) print(loc, std)
输出
0.0030534094701394794 1.0143664443890137
分布对象
scipy.stats.norm是一个分布对象: scipy.stats中的每个分布都表示为一个对象。例如:正态分布对象,还有PDF, CDF等等。
平均值、中位数和百分位数
均值是样本的平均值:
np.mean(samples)
中位数是样本的中间值:
np.mean(samples)
中位数也是百分位数50,因为50%的观察值低于它:
stats.scoreatpercentile(samples, 50)
同样,我们可以计算百分位数90:
stats.scoreatpercentile(samples, 90)
统计检验
统计检验是一种决策指标。例如,如果我们有两组观测值,假设是高斯过程产生的,我们可以用T检验来判断两组观测值的均值是否存在显著差异:
a = np.random.normal(0, 1, size=100) b = np.random.normal(1, 1, size=10) stats.ttest_ind(a, b)
输出
Ttest_indResult(statistic=-1.497229887954618, pvalue=0.1372503797899352)
产生的输出包括:
- T统计值/statistic: 是一个数字,其符号与两个随机过程的差值成正比,其大小与该差值的显著性有关。
- p值/pvalue: 两个过程相同的概率。如果它接近1,这两个过程几乎肯定是相同的。越接近于零,这些过程就越有可能有不同均值。