python求标准差_工具收藏贴:只用一行Python,实现常用统计 —— 提高篇第十六回发布...

大家好!今天我们发布了《全民一起玩Python 提高篇》的第十六回 “字典元素任遍历,元组赋值巧解包”,现在已经可以在网易云课堂观看。另外由于最近录课很紧张,上一节课程的习题尚未整理,我们会在这几天随本节课程的习题一并上传到官网 www.ukoedu.com 上,希望大家见谅。

83b64b95296899bee7c6893c443f083f.png

从平日里课程Q群(群号557820387)同学们的交流内容看,大多数同学还是希望使用 Python 辅助各种数据处理工作。而随着我们对列表、字典等各种容器的理解逐渐加深,特别是学习了各种生成式以及本节课介绍的字典遍历方法、解包操作等技巧,其实已经具备了日常数据处理所必须的知识储备。可以说,如果没有特别的精度和规模要求,我们完全可以不依赖 numpy、pandas 等各种强大但繁琐的第三方模块,只使用 Python 本身的语法,就能一行命令轻松实现常用统计功能。

所以今天这篇公众号里,杨老师就为大家汇总整理一下使用 Python 计算常用统计指标的基本技巧,以便各位需要时可以直接参考。这里我们假设所有数据都已经从Excel、文本文件等地方读入到一维列表中,而需要计算的指标包括:个数极值总和均值标准差频次众数中位数

下图就是我们用于举例的原始数据,保存在列表 a 中。

886ac10c6271b6d7f037d2461ed79c8e.png

  1.  个数、极值、总和

    这几个指标直接采用Python提供的内置函数就可以实现:数据个数就是列表的长度,因此可以使用 len() 函数,极大值和极小值可以使用 max() 和 min() 函数,而总和则可以直接使用 sum() 函数。以前面的列表 a 为例,实际操作如下:

80dbd0a547433d704c97153e59e8d430.png

2. 均值(期望)和标准差

与前面直接调用函数不同,这两个指标就要稍微动一点脑筋了。

首先,均值其实就是 “总和” 除以 “个数”,所以将前面的 sum 和 len 配合使用就可以得到结果。

接下来,我们在数学课上都学过 “标准差” 的计算过程(简单起见、我们这里的标准差不考虑样本和自由度问题):

(1) 计算每一个数据与均值之差的平方

(2) 求这些差值的总和 

(3) 将总和除以这些差值的个数(也就是原始数据的个数),得到平均值

(4) 对平均值开平方,得到最终标准差

这个计算过程首先要用到原始数据的均值,而这正是我们刚刚已经算出的结果,可以直接拿来使用。至于开平方则可以使用 Python 标准模块 math 中的 sqrt() 函数。唯一比较麻烦的是第一步 “计算每一个数据与均值之差的平方” 。

这里介绍一个小窍门:只要看到需求里面出现 “每一个” 的字样,就考虑生成一个列表(或字典等容器)。比如这个需求里,我们只要创建一个新列表、其中每个元素都代表一个 “差值” 就行。

显然,这个列表的长度与原始数据列表 a 的长度是一样的。而这个创建列表的操作,自然是“列表生成式”来得最快。假设前面计算出的原始数据均值保存在变量 e 中,那么这个列表的生成式就是:[ ( i - e )**2 for i  in  a ] 。

有了这个列表,后面三步就可以逐次写出,也就是用 sum 求总和、用 len(a) 得到总个数,从而可以算出均值;再使用 math.sqrt() 将均值开方就得到最终结果。

所以,求取原始数据的期望和标准差的过程,就如下图所示:

c882436a1550b0ed9e8bd994cf8b94a5.png

3. 频次、众数

频次统计,就是说列表中每个数据分别出现过多少次。比如在这个 a 列表中,数字3出现过6次,数字5出现过5次等等。我们在上一节课中演示过不下三种计算频次的方法,最后都能以字典形式输出统计结果,所以这里不再赘述,直接使用上节课演示过的字典生成式就可以得到结果。

至于众数,则是指原始数据集中出现次数最多(出镜率最高)的那些元素。比如现在列表 a 中,出现次数最多的当属数字 3 ,一共6次。所以该数据集的众数就是 3 。众数的求解需要用到字典的 values() 方法,具体算法我们在本节课程中已经作为案例详细解释,所以这里也是直接给大家列出代码,具体原理请看第16回课程视频。

下图就是对列表 a 统计频次和求取众数的操作过程:

71230ee42968e9ec8fdf2c9731c757c2.png

4. 中位数

中位数可以说是这些基本统计指标中最麻烦的一个,其含义就是:把原始数据从小到大排列好,然后站在最中间位置的那一个就是“中位数”。这个定义听起来好像不难:只要把列表 a 调用 sort() 方法排序,然后取出下标为 len(a)//2 的那一个就行。( 这里之所以使用整除符号 // 而不是普通除号 / ,是因为普通除法得到的是一个浮点数,比如 7.0 ,而我们后面需要将该数字作为列表的下标使用,但Python列表禁止使用浮点数作为下标)

不过仔细想想就会发现 “麻烦” 所在:如果列表中的数据个数是奇数,那么中间位置正好是 (len(a)-1) // 2 。比如一共15个原始数据,那么中间位置的下标就是 (15-1)//2 = 7 。

可是假如有偶数个原始数据,那么根据中位数的定义,就要取中间两个元素的平均值,也就是下标分别为 len(a)//2 len(a)//2 -1 的两个元素的均值。

所以正常操作的话,我们需要用 if ... else 做一个判断结构、分别应对这两种情况。

不过,杨老师在网上看到了一个非常聪明的解法(https://www.cnblogs.com/Lands-ljk/p/5763935.html),巧妙利用了计算机 “位运算” 中 “补码” 运算的特点,只用一行就可以得到中位数!由于涉及到位运算和数字表示等很多深入知识,所以这里我们就不再详细解释,大家直接取经就好(注意Python中补码运算使用的是波浪线符号 ~ ):

589a499322d5f189fd2a4e99f0baf2fd.png

以上就是在不导入任何第三方模块的情况下,完全使用Python原生功能搞定数据统计的基本技巧。这些代码写起来并不复杂,基本都是一行搞定,所以大家完全可以收藏本文随时备查。不过需要注意的是,假如我们要统计的数据量非常巨大,或者有各自特殊的要求或极高的精度要求,那么还是要使用各自专业的第三方模块更好。我们下节课就会简单介绍一下其中的代表性工具 —— numpy 和 pandas 。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值