统计学分类
统计学可以分成两类:
描述性统计学
有一堆数据, 希望在不告诉别人所有数据的情况下介绍这些数据的情况,可以通过找到一些
指示性
的数字来代表所有的数据。推断统计学
运用数据来对事物做结论,例如从总体中得到一个样本,对样本做一些数学运算,就可以推断出总体的整体情况。
我们从描述性统计学开始学习。
数据集中趋势
集中趋势(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[(x1−x)2+(x2−x)2+...+(xn−x)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
从结果可以看出,极差,中程数,均值都收到离群值的影响,有所偏移。
离群值目前没有直接的定义,通常离群值是异于数据样本其他值的数值,离群值的产生来源于测量误差和其他原因。