python求均值标准差不用numpy_【Python】不用numpy用纯python求极差、平均数、中位数、众数与方差,python的打印...
在数据分析领域中拥有一席之地的Python语言(语言:Python),其强大的数据处理能力使得计算各种基本统计指标成为极为常见的任务(任务:计算)。尽管如此,在Python中执行统计分析通常需要依赖外部库 numpy(名称:numpy)。安装这个库相对容易(难度:简单)。但如果是只需要计算这些指标的话(情况:单纯需求),还是自己编写代码更为直接(目的:直接性)。这是因为如果将这段代码分享给其他机器的话(目的:分发性),可能会让对方费尽周折去安装或运行 numpy (名称:numpy) ... 这样效率不高(效果:低效)。具体情况具体分析的话(情况:具体情况),建议在处理大数据量时配置相应的环境以支持 numpy 的使用(目的:支持性)。
先给大家回归一下极差、平均数、中位数、众数与方差是什么鬼:
1、极差:最大值与最小值之差。它是标志值变动的最大范围。英文:range
公式:R=Xmax-Xmin(其中,Xmax为最大值,Xmin为最小值)
2、均值:将一组数据的所有数值相加后均分到每一项而得到的结果。其能够有效反映一组数据的整体水平与集中趋势的重要指标,在统计学领域具有重要应用价值,并在实际分析中被广泛采用作为核心统计量之一。英文:mean
公式:
3、中位數:在包含有限個數據的数据集中,將所有觀測值得按照大小順序排列後確定其中間位置的那个數值得為中位數。當數據點數量為偶數時,則取 中間兩個數據點 的 平均 值作為 中位數 值。英語:median
公式:从小到大排序为 则N为奇数时,N为偶数时,
众数是指在统计学中用以反映观察数据集中出现频率最高的那个区间组中值的指标,在大规模调查研究中具有重要的应用价值。英文:mode
例如:1,2,3,3,4的众数是3。
然而,在一组数据中如果存在两个及以上数值具有最高频次,则这些数值即为该数据集合的众数。
例如:1,2,2,3,3,4的众数是2和3。
还有,如果所有数据出现的次数都一样,那么这组数据没有众数。
例如:1,2,3,4,5没有众数。
5、方差:基于实际值与期望值之间的差异平方计算得到的平均数被称为方差;它被用来衡量随机变量或数据集在概率论和统计学中的离散程度。英文:variance
在《概率论与数理统计》一书中提到的那个公式是这样的:或者理解为方差等于平方的期望减去期望的平方
因此,根据上述的理论,得到如下的代码:
#--coding:utf-8--
import time;
import random;
class Math:
#求极差
@staticmethod
def range(l):
return max(l)-min(l);
#求平均数
@staticmethod
def avg(l):
return float(sum(l))/len(l);
#求中位数
@staticmethod
def median(l):
l=sorted(l);#先排序
if len(l)%2==1:
return l[len(l)/2];
else:
return (l[len(l)/2-1]+l[len(l)/2])/2.0;
#求众数
@staticmethod
def mode(l):
#统计list中各个数值出现的次数
count_dict={};
for i in l:
if count_dict.has_key(i):
count_dict[i]+=1;
else:
count_dict[i]=1;
#求出现次数的最大值
max_appear=0
for v in count_dict.values():
if v>max_appear:
max_appear=v;
if max_appear==1:
return;
mode_list=[];
for k,v in count_dict.items():
if v==max_appear:
mode_list.append(k);
return mode_list;
#求方差
@staticmethod
def variance(l):#平方的期望-期望的平方
s1=0;
s2=0;
for i in l:
s1+=i**2;
s2+=i;
return float(s1)/len(l)-(float(s2)/len(l))**2;
#求方差2
@staticmethod
def variance2(l):#平方-期望的平方的期望
ex=float(sum(l))/len(l);
s=0;
for i in l:
s+=(i-ex)**2;
return float(s)/len(l);
#主函数,测试
arr=[1,2,3,2,3,1,4];
print "极差为:{0}".format(Math.range(arr));
print "平均数为:{0:.2f}".format(Math.avg(arr));
print "中位数为:{0}".format(Math.median(arr));
print "众数为:{0}".format(Math.mode(arr));
print "方差为:{0:.2f}".format(Math.variance(arr));
print "方差为:{0:.2f}".format(Math.variance2(arr));
print;
#性能测试
arraylist=[];
for i in range(1,1000000):
arraylist.append(i);
random.shuffle(arraylist);
time_start=time.time();
print "方差为:{0:.2f}".format(Math.variance(arraylist));
time_end=time.time();
print "{0}s".format(time_end-time_start);
time_start=time.time();
print "方差为:{0:.2f}".format(Math.variance2(arraylist));
time_end=time.time();
print "{0}s".format(time_end-time_start);
运行结果如下:
关于这个程序有几点说明的:
时间模块和random模块被引入的主要目的是为了评估两种求方差方式的性能比较。通常情况下会采用自定义开发的Math类来实现相关功能,并无需导入其他Python库。
(2)计算任意一个统计量时需要用到除法运算,请注意在程序中将整数类型转换为浮点数(即int转float),否则可能会导致精度问题而不获得正确的计算结果。
(3) Python自带了计算列表所有元素之和的sum函数;获取列表中的最大值与最小值分别为max和min;而对列表进行从小到大排序的方法sort()同样被使用;其余则只能由我们来实现了。
这里无需考虑如果形式参数被传递为字符串数组的情况, 因为这些工具类是我们自行编写的, 在传递数值时完全掌控主动权.
Python
Python
由于计算方差的方法共有两种,在程序设计时我们选择了将大量数据(一百万级别)随机排序后存储在一个列表中,并对这两种计算方式展开性能测试。结果发现出乎意料之外的是这种方法竟然被我们人类误认为是最笨重的方式之一、也是应用效果最差的选择!然而令人惊喜的是它实际上比那些更容易记忆但应用起来不够直观的一种方法要快得多:即其计算效率快于传统方法的速度大约是一倍半左右!从上述的结果可以看出这种计算方式的优势在于它的高效性和简洁性!
(7) 最后一个问题在于,在Python中打印到控制台。你可以更加灵活地使用print函数,并避免换行并在print后添加逗号以补充内容。确保所有数值都转换为字符串以便与纯文本连接起来,并且这类似于C语言中的printf函数。Python中的format语法使用{}占位符来表示参数位置,并且{0:.2f}代表以保留两位小数的方式输出第一个参数值。
