首先上文档
numpy:
然后是pandas:
所以此处区别就明显了,np中求平均的时候除以的是数据的总数N,而pd中却是N-1。
为什么要除以N-1呢?
这就涉及到一个名词:wiki: 贝塞尔校正
这个问题在numpy文档的下面紧接着也解释了,照例,还是先上文档:
关键句在这里:
In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population
意思就是在统计学的实践中,往往遇到的情况是数据集特别大(infinite population),所以通常来判断数据集的std是通过抽样一部分数据来计算std从而来推断整个数据集的std,但是就会有一个问题,在一个分布不均匀的数据集中抽样,会导致std过小。为什么呢?看这个例子:
比如一个数据集是关于乐高积木块的种类,整个乐高积木的种类假设很多很多,数万种,而我从中抽取一部分积木,来计算std,因为抽样出来的种类的分布比率很大概率上不会跟总数保持一致(比如有可能某种积木在总数中只有几块,导致抽样时无法抽取到它),所以就会造成抽样数据中的分布有可能相对没那么离散,std相对没那么大。为了解决这个问题,希望std稍微大一些,从而能更好的判断总数据集的std,怎么办?就把求平均时候的N改成N-1,std就会“人为”的大一些。(具体为什么是-1,不是-2,-3或者/2,/3这我就不太清楚了,应该是前人经验得出。。。)
总结
所以一定要搞清楚numpy跟pandas中求std结果不同的原因,直接原因是因为默认的ddof参数不同,numpy是0,pandas是1,算法本身是没有区别的。然后追究深层次的原因来理解为什么不同,就要知道-1的目的是什么。
而至于为什么numpy不减1,pandas减1,我个人理解是因为numpy主要是处理数据本身,对于numpy来说解决的是运算上的问题。而pandas是直接面向数据所代表的含义的,使用pandas通常来说数据是有具体含义的。所以pandas会根据经验帮你做了-1的操作,而numpy仅仅是按照数学计算定义层面来求平均值。
初学者,如果有哪里说得不对或者不全面的话,希望大家多多指教。谢谢。