在求标准差(std)时所遇到的问题
今天在处理数据时发现pandas中用std方法计算的标准差蜜汁诡异,所以就在网上进行了搜索,发现pandas求std与numpy有所差异,怕自己之后忘掉,所以把学习过程记录如下(用ipython编辑)。本人新入门菜鸟,如有错误,请指出!
先定义一个DataFrame
:
In [1]: import pandas as pd
In [2]: import numpy as np
data = pd.DataFrame([[3,6,9],[4,8,7],[15,2,85]],columns=['a','b','c'])
In [6]: data
Out[6]:
a b c
0 3 6 9
1 4 8 7
2 15 2 85
计算标准差(默认为按列进行运算):
In [7]: data.std()
Out[7]:
a 6.658328
b 3.055050
c 44.467216
dtype: float64
然后抽取其中第一列放在numpy数组arr里,计算std并进行比较:
In [16]: arr = np.array([3,4,15])
In [17]: arr.std()
Out[17]: 5.436502143433364
我们发现,两种计算方式算出的标准差并不相同,查阅之后发现默认情况下,numpy 计算的是总体标准偏差,ddof = 0。另一方面,pandas 计算的是样本标准偏差,ddof = 1。如果我们知道所有的分数,那么我们就有了总体——因此,要使用 pandas 进行归一化处理,我们需要将“ddof”设置为 0。
换一种说法:
numpy.std() 求标准差的时候默认是除以 n 的,即是有偏的,np.std无偏样本标准差方式为 ddof = 1;
pandas.std() 默认是除以n-1 的,即是无偏的,如果想和numpy.std() 一样有偏,需要加上参数ddof=0 ,即pandas.std(ddof=0)
补:ddof是什么?
ddof : int, optional
Means Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. By default ddof is zero.
此时再进行计算
In [15]: data.std(ddof=0)
Out[15]:
a 5.436502
b 2.494438
c 36.307330
dtype: float64
这样第一列的结果就相同了。
特别的,pandas中的describe方法统计信息中也含有std,但此std的ddof无法调整,故std还是默认ddof=1的值:
In [18]: data.describe()
Out[18]:
a b c
count 3.000000 3.000000 3.000000
mean 7.333333 5.333333 33.666667
std 6.658328 3.055050 44.467216
min 3.000000 2.000000 7.000000
25% 3.500000 4.000000 8.000000
50% 4.000000 6.000000 9.000000
75% 9.500000 7.000000 47.000000
max 15.000000 8.000000 85.000000
参考博文:
1、https://blog.csdn.net/Gooooa/article/details/78923469
2、https://blog.csdn.net/grape875499765/article/details/78647937?utm_source=blogxgwz1
3、https://blog.csdn.net/u011587322/article/details/80934096
感谢各位大佬栽树,让新手乘凉