数值型描述统计

算数平均值

S = [ s 1 , s 2 , . . . , s n ] S = [s_1, s_2, ..., s_n] S=[s1,s2,...,sn]

样本中的每个值都是真值与误差的和。

m e a n = ( s 1 + s 2 + . . . + s n ) n mean = \frac{(s_1 + s_2 + ... + s_n) }{n} mean=n(s1+s2+...+sn)

算数平均值表示对真值的无偏估计。

1
2
3
m = np.mean(array)
m = array.mean()
m = df.mean(axis=0)

案例:针对电影评分数据做均值分析:

1
2
3
mean = ratings['John Carson'].mean()
mean = np.mean(ratings['John Carson'])
means = ratings.mean(axis=1)

加权平均值

求平均值时,考虑不同样本的重要性,可以为不同的样本赋予不同的权重。

样本: S = [ s 1 , s 2 , s 3 . . . s n ] S = [s_1, s_2, s_3 ... s_n] S=[s1,s2,s3...sn]

权重: W = [ w 1 , w 2 , w 3 . . . w n ] W =[w_1, w_2, w_3 ... w_n] W=[w1,w2,w3...wn]

加权平均值:

a = s 1 w 1 + s 2 w 2 + . . . + s n w n w 1 + w 2 + . . . + w n a = \frac{s_1w_1 + s_2w_2 + ... + s_nw_n}{w_1+w_2+...+w_n} a=w1+w2+...+wns1w1+s2w2+...+snwn

代码实现:

1
2
a = np.average(array, weights=volumes)

案例:自定义权重,求加权平均。

1
2
3
4
5
6
# 加权均值
w = np.array([3,1,1,1,1,1,1])
np.average(ratings.loc['Inception'], weights=w)

mask = ~pd.isna(ratings.loc['Inception'])
np.average(ratings.loc['Inception'][mask], weights=w[mask])

最值

np.max() / np.min() / np.ptp():返回一个数组中最大值/最小值/极差(最大值减最小值)

1
2
3
4
5
import numpy as np
# 产生9个介于[10, 100)区间的随机数
a = np.random.randint(10, 100, 9)
print(a)
print(np.max(a), np.min(a), np.ptp(a))

np.argmax() np.argmin()pd.idxmax() pd.idxmin(): 返回一个数组中最大/最小元素的下标

1
2
3
4
5
6
# 在np中,使用argmax获取到最大值的下标
print(np.argmax(a), np.argmin(a))

# 在pandas中,使用idxmax获取到最大值的下标
print(series.idxmax(), series.idxmin())
print(dataframe.idxmax(), dataframe.idxmin())

中位数

将多个样本按照大小排序,取中间位置的元素。

若样本数量为奇数,中位数为最中间的元素

[ 1 , 2000 , 3000 , 4000 , 10000000 ] [1, 2000, 3000, 4000, 10000000] [1,2000,3000,4000,10000000]

若样本数量为偶数,中位数为最中间的两个元素的平均值

[ 1 , 2000 , 3000 , 4000 , 5000 , 10000000 ] [1,2000,3000,4000,5000,10000000] [1,2000,3000,4000,5000,10000000]

案例:分析中位数的算法,测试numpy提供位数API

1
2
3
4
5
6
7
8
9
10
11
12
np.median()  中位数

import numpy as np
closing_prices = np.loadtxt('../../data/aapl.csv',
delimiter=',', usecols=(6), unpack=True)
size = closing_prices.size
sorted_prices = np.msort(closing_prices)
median = (sorted_prices[int((size - 1) / 2)] +
sorted_prices[int(size / 2)]) / 2
print(median)
median = np.median(closing_prices)
print(median)

标准差

​可以评估一组数据的震荡幅度,到底稳定不稳定

样本(sample):

S = [ s 1 , s 2 , s 3 , . . . , s n ] S = [s_1, s_2, s_3, ..., s_n] S=[s1,s2,s3,...,sn]

平均值:

m = s 1 + s 2 + s 3 + . . . + s n n m = \frac{s_1 + s_2 + s_3 + ... + s_n}{n} m=ns1+s2+s3+...+sn

离差(deviation):表示某组数据距离某个中心点的偏离程度

D = [ d 1 , d 2 , d 3 , . . . , d n ] D = [d_1, d_2, d_3, ..., d_n] D=[d1,d2,d3,...,dn]

d i = S i − m d_i = S_i-m di=Sim

用每一个数据,减去均值,得到离差
如果离差的绝对值比较大,距离中心点比较远,所以震荡幅度大
离差有正有负,做离差方,将其全都变成正数

离差方:

Q = [ q 1 , q 2 , q 3 , . . . , q n ] Q = [q_1, q_2, q_3, ..., q_n] Q=[q1,q2,q3,...,qn]

q i = d i 2 q_i=d_i^2 qi=di2

总体方差(variance):

v = ( q 1 + q 2 + q 3 + . . . + q n ) n v = \frac{(q_1+q_2+q_3 + ... + q_n)}{n} v=n(q1+q2+q3+...+qn)

最整组离差方 , /n 得到离差的均值,为方差
方差越大,震荡越剧烈
方差越小,震荡越平缓

总体标准差(standard deviation):

s = v s = \sqrt{v} s=v

样本方差:

v ′ = ( q 1 + q 2 + q 3 + . . . + q n ) n − 1 , v = ( q 1 + q 2 + q 3 + . . . + q n ) n v' = \frac{(q_1+q_2+q_3 + ... + q_n)}{n-1} , v = \frac{(q_1+q_2+q_3 + ... + q_n)}{n} v=n1(q1+q2+q3+...+qn),v=n(q1+q2+q3+...+qn)

其中,n-1称之为“贝塞尔校正”,这是因为抽取样本时候,采集的样本主要是落在中心值附近,那么通过这些样本计算的方差会小于等于对总体数据集方差的无偏估计值。为了能弥补这方面的缺陷,那么我们把公式的n改为n-1,以此来提高方差的数值。称为贝塞尔校正系数。

样本标准差:

s ′ = v ′ s' = \sqrt{v'} s=v

案例: 根据标准差理论,针对评分数据进行方差分析:

1
ratings.std(axis=0)