集中趋势

统计学分类

统计学可以分成两类:

  • 描述性统计学

    有一堆数据, 希望在不告诉别人所有数据的情况下介绍这些数据的情况,可以通过找到一些指示性的数字来代表所有的数据。

  • 推断统计学

    运用数据来对事物做结论,例如从总体中得到一个样本,对样本做一些数学运算,就可以推断出总体的整体情况。


我们从描述性统计学开始学习。

数据集中趋势

集中趋势(central tendency): 一组数字的集中趋势,也叫“平均数(average)”。这里的平均数和我们常见的均值不一样,是广义上的平均数,表示能反应一组数据集中趋势的数字。包括如下统计量:

  • 均值(mean)

    定义:均值有很多种,我们这里指的仅仅是算数平均数(arithmetic mean)。我们还知道有调和平均数(harmonic mean)
    计算公式:

    Meann=a1+a2+a3+...+ann

    其中 an 是样本的元素, n 是样本个数。

  • 中位数(median)

    定义:对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
    计算公式:
    X1,…, XN 从小到大排列顺序为: X(1) ,…, X(N)

    N 为奇数的时候:

    MedianN=X(N+12)

    N 为偶数的时候:
    MedianN=XN2+XN2+12

  • 众数(mode)

    定义:在统计分布上具有明显集中趋势点的数值,代表数据的一般水平(众数可以不存在或多于一个)。
    修正定义:是一组数据中出现次数最多的数值,叫众数,有时众数在一组数中有好几个。
    理性理解:简单的说,就是一组数据中占比例最多的那个数。

  • 极差(range)

    定义:最大值与最小值之差。它是标志值变动的最大范围。

  • 方差 (variance)

    定义:方差是实际值与期望值之差平方的平均值,方差是在概率论和统计方差衡量随机变量或一组数据是离散程度的度量.
    计算公式:

    • 样本减去期望的平方的期望
      s2=1n[(x1x)2+(x2x)2+...+(xnx)2]
    • 平方的期望减去期望的平方
      D(x)=E(x2)(E(x))2
  • 中程数 (midrange)

    定义:最大值与最小值的算数平均数
    计算公式:

    Midrange=Xmax+Xmin2

动手写代码

样例数据

  • 数据样本a: 1 1 2 3 4
  • 数据样本b: 1 1 2 3 4 4

Python 实现

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 02 15:31:43 2016

@author: zang
"""
import time;  
import random;  
class Math:  
    #求极差  
    @staticmethod  
    def range(l):  
        return max(l)-min(l)
    #求中程数
    @staticmethod
    def midrange(l):
        return float(max(l) + min(l))/2
    #求均值
    @staticmethod  
    def mean(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:
            count_dict[i] = count_dict.get(i,0) + 1
        #求出现次数的最大值  
        max_appear = 0  
        for v in count_dict.values():  
            if v > max_appear:  
                max_appear = v
        if max_appear == 1:  
            return "no mode in input data!"
        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)
sa = [1,1,2,3,4]
sb = [1,1,2,3,4,4]
print "sa极差为:{0}".format(Math.range(sa))
print "sa中程数为:{0}".format(Math.midrange(sa))
print "sa均值为:{0:.2f}".format(Math.mean(sa)) 
print "sa中位数为:{0}".format(Math.median(sa)) 
print "sa众数为:{0}".format(Math.mode(sa))
print "sa方差为:{0:.2f}".format(Math.variance(sa)) 
print "sa方差为:{0:.2f}".format(Math.variance2(sa))
sa极差为:3
sa中程数为:2.5
sa均值为:2.20
sa中位数为:2
sa众数为:[1]
sa方差为:1.36
sa方差为:1.36
print "sb极差为:{0}".format(Math.range(sb))
print "sb中程数为:{0}".format(Math.midrange(sa))
print "sb均值为:{0:.2f}".format(Math.mean(sb))
print "sb中位数为:{0}".format(Math.median(sb)) 
print "sb众数为:{0}".format(Math.mode(sb)) 
print "sb方差为:{0:.2f}".format(Math.variance(sb))
print "sb方差为:{0:.2f}".format(Math.variance2(sb))
sb极差为:3
sb中程数为:2.5
sb均值为:2.50
sb中位数为:2.5
sb众数为:[1, 4]
sb方差为:1.58
sb方差为:1.58

两种方差计算方法性能比较

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);  
方差为:83333166666.67
1.35199999809s
方差为:83333166666.21
0.457999944687s

统计量对数据集中趋势的描述

到底哪个统计量能很好的描述数据呢,其实实际中是多个统计量一起考虑,才能从多个角度去反映数据的特性。举个例子。

数据样本sc: 3 3 3 3 3 100

其中有个离群值:100

sc= [3,3,3,3,3,100]
print "sc极差为:{0}".format(Math.range(sc))
print "sc中程数为:{0}".format(Math.midrange(sc))
print "sc均值为:{0:.2f}".format(Math.mean(sc))
print "sc中位数为:{0}".format(Math.median(sc)) 
print "sc众数为:{0}".format(Math.mode(sc)) 
print "sc方差为:{0:.2f}".format(Math.variance(sc))
print "sc方差为:{0:.2f}".format(Math.variance2(sc))
sc极差为:97
sc中程数为:51.5
sc均值为:19.17
sc中位数为:3.0
sc众数为:[3]
sc方差为:1306.81
sc方差为:1306.81

从结果可以看出,极差,中程数,均值都收到离群值的影响,有所偏移。
离群值目前没有直接的定义,通常离群值是异于数据样本其他值的数值,离群值的产生来源于测量误差和其他原因。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值