numpy统计相关函数
1. 次序统计
1. 1 计算最小值
np.amin(a,axis=0/1) #a表示矩阵,axis表示选中矩阵的列或者行(0列1行)
- y = np.amin(x) %矩阵x所有数的最小值
- y = np.amin(x, axis=0) %矩阵x每一列的最小值,axis表示行还是列:0列,1行
- y = np.amin(x, axis=1) %矩阵x每一行的最小值
import numpy as np
x=np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
a1=np.amin(x) #对矩阵A全局搜索最小值
print('a1= ',a1) #结果:11
a2=np.amin(x,axis=0) #对矩阵A每一列寻找最小值
a3=np.amin(x,axis=1) #对矩阵A每一行寻找最小值
print('a2= ',a2) #结果:[11 12 13 14 15]
print('a3= ',a3) #结果:[11 16 21 26 31]
1.2 计算最大值
np.amax (a,axis=0/1) #a表示矩阵,axis表示选中矩阵的列或者行(0列1行)
- y = np.amax(x) %矩阵x所有数的最大值
- y = np.amax(x, axis=0) %矩阵x每一列的最大值
- y = np.amax(x, axis=1) %矩阵x每一行的最大值
import numpy as np
x=np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
a1=np.amax(x) #对矩阵A全局搜索最小值
print('a1= ',a1) #结果:35
a2=np.amax(x,axis=0) #对矩阵A每一列寻找最小值
a3=np.amax(x,axis=1) #对矩阵A每一行寻找最小值
print('a2= ',a2) #结果:a2= [31 32 33 34 35]
print('a3= ',a3) #结果:a3= [15 20 25 30 35]
1.3 计算极差(最大值与最小值的差)
np.ptp(a,axis=0/1) #a表示矩阵,axis表示选中矩阵的列或者行(0列1行)
- y = np.ptp(x) %矩阵x所有数的极差
- y = np.ptp(x, axis=0) %矩阵x每一列的极差
- y = np.ptp(x, axis=1) %矩阵x每一行的极差
import numpy as np
np.random.seed(20201128) #固定随机数,某一时刻的随机数
x = np.random.randint(0, 20, size=[4, 5]) #生成一个随机数矩阵,范围为0-20,四行五列的矩阵
print('x=',x)
#x= [[10 2 1 1 16]
# [18 11 10 14 10]
# [11 1 9 18 8]
# [16 2 0 15 16]]
a1=np.ptp(x) #对矩阵A全局搜索最小值
print('a1= ',a1) #结果:a1= 18
a2=np.ptp(x,axis=0) #对矩阵A每一列寻找最小值
a3=np.ptp(x,axis=1) #对矩阵A每一行寻找最小值
print('a2= ',a2) #结果:a2= [ 8 10 10 17 8]
print('a3= ',a3) #结果:a3= [15 8 17 16]
1.4 计算分位数
功能介绍:百分位数是统计中使用的度量,表示小于这个值的观察值的百分比
numpy.percentile(a, q, axis=0/1) #常用到三个变量
- a:矩阵或者向量
- q:需要分的数,以百分比表示,可以设多个
- axis:如果是矩阵,那么可以对列和行分别进行分数(0列1行)
import numpy as np
#np.random.seed(20201128) #固定随机数,某一时刻的随机数
#x = np.random.randint(0, 20, size=[4, 5]) #生成一个随机数矩阵,范围为0-20,四行五列的矩阵
#print('x=',x)
x=np.array([[1, 2 ,3, 4 ,5],
[6, 7 ,8, 9, 10 ],
[11,12,13 ,14, 15],
[16 ,17 ,18,19, 20]])
a1=np.percentile(x,[50,75]) #大小处于50%的数,大小处于75%的数
print('a1= ',a1) #a1= [10.5 15.25]
a2=np.percentile(x,[50,75],axis=0) #大小处于50%的数,大小处于%的数,对矩阵A每一列寻找
a3=np.percentile(x,[50,75],axis=1) #大小处于50%的数,大小处于%的数,对矩阵A每一行寻找
print('a2= ',a2)
#结果:a2= [[ 8.5 9.5 10.5 11.5 12.5 ]
# [12.25 13.25 14.25 15.25 16.25]]
print('a3= ',a3)
#结果:a3= [[ 3. 8. 13. 18.]
# [ 4. 9. 14. 19.]]
2. 均值与方差
2.1 计算中位数
numpy.median(a,axis=0/1)
- numpy.median(x) %矩阵x所有数的中位数
- numpy.median(x,axis=0) %矩阵x每一列的中位数
- numpy.median(x,axis=1) %矩阵x每一行的中位数
import numpy as np
np.random.seed(20201128) #固定随机数,某一时刻的随机数
x = np.random.randint(0, 20, size=[4, 5]) #生成一个随机数矩阵,范围为0-20,四行五列的矩阵
print('x=',x)
a1=np.median(x) #大小处于50%的数,大小处于75%的数
print('a1= ',a1) #a1= 9.0
a2=np.median(x,axis=0) #大小处于50%的数,大小处于%的数,对矩阵A每一列寻找
print('a2= ',a2) #结果:a2= [ 3.5 11. 2.5 7.5 13. ]
a3=np.median(x,axis=1) #大小处于50%的数,大小处于%的数,对矩阵A每一行寻找
print('a3= ',a3) #结果:a3= [ 4. 10. 10. 3.]
2.2 计算平均值
numpy.mean(a,axis=0/1)
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = np.mean(x) #对矩阵A全局搜索最小值
print(y) # 23.0
y = np.mean(x, axis=0) #对矩阵A每一列寻找最小值
print(y) # [21. 22. 23. 24. 25.]
y = np.mean(x, axis=1) #对矩阵A每一行寻找最小值
print(y) # [13. 18. 23. 28. 33.]
2.3 计算加权平均值
numpy.average(a, axis=None, weights=None)
- a:指定的矩阵
- axis:0指定为列,1指定为行
- weights:权重矩阵,大小和a同
mean()和average()函数的区别:
如果average()函数不指定矩阵,那么两者一样,如果加上权重矩阵,average()求解的加权平均值
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = np.average(x) #如果不指定权重,那么mean()函数和average()函数一致
y1 = np.mean(x)
print(y) # 23.0
print(y1) # 23.0import numpy as np
y = np.arange(1, 26).reshape([5, 5]) #定义权重矩阵
print(y)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]
# [11 12 13 14 15]
# [16 17 18 19 20]
# [21 22 23 24 25]]
z = np.average(x, weights=y) #全局的加权平均值
print(z) # 27.0
z = np.average(x, axis=0, weights=y) #每一列的加权平均值
print(z)
# [25.54545455 26.16666667 26.84615385 27.57142857 28.33333333]
z = np.average(x, axis=1, weights=y) #每一行的加权平均值
print(z)
# [13.66666667 18.25 23.15384615 28.11111111 33.08695652]
2.4 方差和样本方差(无偏估计)
方差:是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量
numpy.var(a, axis=None,ddof=0)
- a:被操作的矩阵
- axis:选择矩阵a的行或者列(0列1行),然后对其操作
- ddof:如果ddof为1的话,那么就是计算样本方差的无偏估计
计算公式:
- 方差
s 2 = 1 n ∑ i = 1 n ( x i − x ‾ ) 2 {s^2} = \frac{1}{n}{\sum\limits_{i = 1}^n {({x_i} - \overline x )} ^2} s2=n1i=1∑n(xi−x)2 - 样本方差
S 2 = 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) 2 {S^2} = \frac{1}{{n - 1}}{\sum\limits_{i = 1}^n {({x_i} - \overline x )} ^2} S2=n−11i=1∑n(xi−x)2
方差与样本方差的区别:其分母一个为n,一个为n-1
求解函数:
方差:
- np.var(x)
- np.mean((x ‐ np.mean(x)) ** 2)
样本方差:
- numpy.cov(x)
- numpy.var(x,ddof=1)
- np.sum((x ‐ np.mean(x)) ** 2) / (x.size ‐ 1)
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = np.var(x) #求矩阵x的方差
print(y) # 52.0
y = np.mean((x ‐ np.mean(x)) ** 2) #用公式求方差
print(y) # 52.0
y = np.var(x, ddof=1) #样本方差无偏估计
print(y) # 54.166666666666664
y = np.sum((x ‐ np.mean(x)) ** 2) / (x.size ‐ 1) #基础公式法求样本方差无偏估计
print(y) # 54.166666666666664
y = np.cov(x) #用协方差的公式求样本方差无偏估计
y = np.var(x, axis=0) #求矩阵x每一列的的方差
print(y) # [50. 50. 50. 50. 50.]
y = np.var(x, axis=1) #求矩阵x每一行的的方差
print(y) # [2. 2. 2. 2. 2.]
2.5 标准差
标准差: 标准差是一组数据平均值分散程度的一种度量,是方差的算术平方根
numpy.std(a, axis=None)
- a:被操作的矩阵
- axis:选择矩阵a的行或者列(0列1行),然后对其操作
计算公式:
- 总体标准差
s = 1 n ∑ i = 1 n ( x i − x ‾ ) 2 s = \sqrt {\frac{1}{n}{{\sum\limits_{i = 1}^n {({x_i} - \overline x )} }^2}} s=n1i=1∑n(xi−x)2
- 样本标准差
s = 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) 2 s = \sqrt {\frac{1}{{n - 1}}{{\sum\limits_{i = 1}^n {({x_i} - \overline x )} }^2}} s=n−11i=1∑n(xi−x)2
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = np.std(x)
print(y) # 7.211102550927978 #用函数计算矩阵x的总体标准差
y = np.sqrt(np.var(x))
print(y) # 7.211102550927978 #通过方差求根计算标准差
y = np.std(x, axis=0) #用函数计算矩阵x每一列的总体标准差
print(y)
# [7.07106781 7.07106781 7.07106781 7.07106781 7.07106781]
y = np.std(x, axis=1) #用函数计算矩阵x每一行的总体标准差
print(y)
# [1.41421356 1.41421356 1.41421356 1.41421356 1.41421356]
3. 相关性
3.1 协方差
协方差: 协方差在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
numpy.cov(x,y) #向量x与y的协方差
计算公式:
- 协方差
cov ( X , Y ) = 1 n − 1 ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) \operatorname{cov} (X,Y) = \frac{1}{{n - 1}}\sum\limits_{i = 1}^n {({X_i} - \overline X } )({Y_i} - \overline Y ) cov(X,Y)=n−11i=1∑n(Xi−X)(Yi−Y)
- 协方差矩阵
import numpy as np
x = [1, 2, 3, 4, 6] #定义向量x
y = [0, 2, 5, 6, 7] #定义向量y
#只有单个向量的时候,求解的是样本方差
print(np.cov(x)) # 3.7 #样本x的方差
print(np.var(x,ddof=1)) # 3.7 #样本x的方差
print(np.cov(y)) # 8.5 #样本y的方差
print(np.var(y,ddof=1)) # 8.5 #样本y的方差
#函数中有两个向量的时候,求的是协方差矩阵
print(np.cov(x, y)) #样本协方差矩阵
# [[3.7 5.25]# [5.25 8.5 ]]
z = np.mean((x-np.mean(x)) * (y-np.mean(y))) #协方差
print(z) # 4.2
z = np.sum((x-np.mean(x)) * (y-np.mean(y))) / (len(x)-1) #样本x与y的协方差
print(z) # 5.25
z = np.dot(x-np.mean(x), y-np.mean(y)) / (len(x)-1) #样本x与y协方差
print(z) # 5.25
3.2 相关系数
相关系数: 相关系数实际上是正则化的协方差
numpy.corrcoef(x,y) #向量x与y的相关系数
计算公式:
ρ
x
,
y
=
cov
(
X
,
Y
)
s
(
X
)
∗
s
(
Y
)
{\rho _{x,y}} = \frac{{\operatorname{cov} (X,Y)}}{{s(X)*s(Y)}}
ρx,y=s(X)∗s(Y)cov(X,Y)
函数中分子是x与y的协方差,分母是x和y的标准差,也叫作皮尔逊相关系数
import numpy as np
np.random.seed(20200623) #固定一个时刻的随机数
x, y = np.random.randint(0, 20, size=(2, 4)) #随机生成一组范围为0-20的两行四列的随机数
print(x) # [10 2 1 1] #第一行和第二行分别用x,y表示
print(y) # [16 18 11 10]
z = np.corrcoef(x, y) #通过函数求解x与y的相关系数
print(z)
# [[1. 0.48510096]
# [0.48510096 1. ]]
#通过初始公式计算相关系数
a = np.dot(x-np.mean(x), y-np.mean(y)) #首先求解的是x与y的协方差
b = np.sqrt(np.dot(x-np.mean(x), x-np.mean(x)) #计算x的标准差
c = np.sqrt(np.dot(y-np.mean(y), y-np.mean(y))) #计算y的标准差
print(a / (b * c)) # 0.4851009629263671
协方差公式的图片来源:https://blog.csdn.net/Mr_HHH/article/details/78490576