欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python学习-Scipy库统计操作(随机变量、概率密度、累积分布密度、期望、方差、描述性统计(最大最小值、均值、方差、偏差、峰度)、核密度估计)

程序员文章站 2022-04-27 15:09:53
...

Python学习-Scipy库统计操作

目录

1、正态连续随机变量:norm
2、概率密度函数norm.pdf()
3、累积分布函数norm.cdf()
4、统计随机变量的期望值和方差stats()
5、描述性统计函数 stat.describe(),求最大最小值、均值、方差、偏差、峰度
6、核密度估计(单变量估计stats.gaussian_kde, 多变量估计)

导入库

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

1、正态连续随机变量:norm

抽取随机变量函数norm.rvs()
参数说明:
loc: 指定平均值;
scale: 指定标准偏差;
size: 大小,整数或元组

print(norm.rvs(size=10))
print(norm.rvs(size=(2, 3)))

输出

[ 1.36819314 -0.6923591  -0.46103573  0.52013108 -0.04312324  
0.46946896  1.07127949  1.00747313  0.84670697 -0.69049129]
[[1.68036634 0.10630058 0.09252581]
 [1.67264465 1.81589265 1.55676792]]

2、概率密度函数norm.pdf()

给定随机变量的x处的概率密度函数
参数说明:
x: 指定位置;
loc: 指定平均值;
scale: 指定标准偏差

print(norm.pdf(20, 20, 10))  # 求正态连续随机变量在20处的概率密度值
print(norm.pdf(20, [20, 10, 30, 40, 20]))

输出

0.03989422804014327
[3.98942280e-01 7.69459863e-23 7.69459863e-23 5.52094836e-88
 3.98942280e-01]

3、累积分布函数norm.cdf():pdf的积分

print(norm.cdf(20, 20, 10))  # 求正态连续随机变量在20处的累积概率密度值
print(norm.cdf(20, [20, 10, 30, 40, 20]))

输出

0.5
[5.00000000e-01 1.00000000e+00 7.61985302e-24 2.75362412e-89
 5.00000000e-01]

4、统计随机变量的期望值和方差stats()

参数说明:
loc: 指定平均值;
scale: 指定标准偏差
moments: m均值;v方差;s费舍尔偏差;k费舍尔峰度

print(norm.stats(moments='mv'))
print(norm.stats(20, moments='mvsk'))
print(norm.stats(moments='mvsk', loc=9, scale=1))

输出

(array(0.), array(1.))
(array(20.), array(1.), array(0.), array(0.))
(array(9.), array(1.), array(0.), array(0.))

5、描述性统计函数 stat.describe()

参数描述:
a: 样本数据,数组对象
axis: 指定数组的统计轴,值为整型或None,None计算整个数组
ddof: 三角*度(仅限于方差),整型,默认1
bias: False,校正偏度和峰度计算,统计偏差
nan_policy: {‘propagate’, ‘raise’,‘omit’}, ‘propagate’:返回nan;‘raise’:抛出错误;‘omit’:忽略nan值
返回值:
nobs: 观察次数(沿轴的数据长度)
minmax: 最大最小值
mean: 均值
variance: 方差
skewness: 偏差
kurtosis: 峰度

设置数据集

plt.rc('font', family='simhei', size=15)  # 设置中文显示,字体大小
plt.rc('axes', unicode_minus=False)  # 该参数解决负号显示的问题
np.random.seed(1975)
x = stats.t.rvs(df=10, size=1000)  # 产生1000个*度为10的t分布随机变量
plt.hist(x=x, bins=40, range=None, density=False, weights=None, cumulative=False, bottom=None, \
         histtype='stepfilled', align='mid', alpha=0.9, orientation='vertical', rwidth=None, log=False, \
         color='g', stacked=True, edgecolor='black')
plt.xlabel('概率分布区间')
plt.ylabel('频数or频率')
plt.title('分布直方图')
plt.show()

输出
Python学习-Scipy库统计操作(随机变量、概率密度、累积分布密度、期望、方差、描述性统计(最大最小值、均值、方差、偏差、峰度)、核密度估计)

print('min: ', x.min())  # 最小值
print('max: ', x.max())  # 最大值
print('mean: ', x.mean())  # 均值
print('variance: ', x.var())  # 方差

m, v, s, k = stats.t.stats(df=10, moments='mvsk')
n, (smin, smax), sm, sv, ss, sk = stats.describe(x)

s1 = '%-14s 均值 = %6.4f,方差 = %6.4f,费舍尔偏差 = %6.4f,费舍尔峰度 = %6.4f'
print(s1 % ('连续分布:', m, v, s, k))
print(s1 % ('离散样本:', sm, sv, ss, sk))

输出

min:  -4.0181014966326885
max:  6.2240174880715795
mean:  -0.06367299923581096
variance:  1.3075051415861059
连续分布:          均值 = 0.0000,方差 = 1.2500,费舍尔偏差 = 0.0000,费舍尔峰度 = 1.0000
离散样本:          均值 = -0.0637,方差 = 1.3088,费舍尔偏差 = 0.1155,费舍尔峰度 = 1.0614

6、核密度估计

核密度估计是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。可以用于预测地理空间点数据的分布规律,或用于金融领域的基于密度的预测。

1)单变量估计
X = np.array([-8, -6, 0, 3, 5, 7], dtype=np.float)
X_plot = np.linspace(-10, 10, 100)  # 对于单变量要使用1D array
kde1 = stats.gaussian_kde(dataset=X, bw_method='scott')  # 高斯核密度估计
kde2 = stats.gaussian_kde(dataset=X, bw_method='silverman')  # 高斯核密度估计

plt.rc('font', family='simhei', size=15)  # 设置中文显示,字体大小
plt.rc('axes', unicode_minus=False)  # 该参数解决负号显示的问题

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(X, np.zeros(X.shape), 'b+', ms=20)
ax.plot(X_plot, kde1(X_plot), 'k--', label='Scott')
ax.plot(X_plot, kde2(X_plot), 'g-', label='silverman')
plt.title('gaussian_kde')
plt.legend()
plt.show()

输出
Python学习-Scipy库统计操作(随机变量、概率密度、累积分布密度、期望、方差、描述性统计(最大最小值、均值、方差、偏差、峰度)、核密度估计)

2)多变量估计样例
# 2)多变量估计样例


def measure(n):
    m1 = np.random.normal(size=n)
    m2 = np.random.normal(scale=0.5, size=n)
    return m1+m2, m1-m2


m1, m2 = measure(2000)
xmin = m1.min()
xmax = m1.max()
ymin = m2.min()
ymax = m2.max()
X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([X.ravel(), Y.ravel()])
values = np.vstack([m1, m2])
kernel = stats.gaussian_kde(values)
z = np.reshape(kernel.evaluate(positions).T, X.shape)
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
ax.imshow(np.rot90(z), cmap=None, extent=[xmin, xmax, ymin, ymax])

ax.plot(m1, m2, 'k.', markersize=2)
ax.set_xlim([xmin, xmax])
ax.set_ylim([ymin, ymax])
plt.show()

输出
Python学习-Scipy库统计操作(随机变量、概率密度、累积分布密度、期望、方差、描述性统计(最大最小值、均值、方差、偏差、峰度)、核密度估计)