用Python学习统计学基础-1

一、前言

早就接触到统计学的知识,一直想认真学一下,看过一些书,大多不能坚持。这种情况在我偶然看到《爱上统计学》一书时改变了,我把它看完了,而且觉得是看懂了。于是决定再看一遍,用Python完成书上的习题,记录下来。

描述统计(descriptive statistics)常用于整理、描述所收集数据的特征。推论统计(inferential statistics)通常是(但并非总是)数据收集和汇总后的下一步。推论统计常利用较小群体的数据来推论可能的较大群体的特征。

二、计算和理解平均数

平均数也叫做集中趋势量数(measures of central tendency),一般有三种形式:均值、中位数和众数。

均值(mean):数据组中所有数值的总和除以该组数值的个数。 

中位数(median):一系列数据的中点。中位数对极值不敏感,均值对极值敏感。

众数(mode) :出现数据最多的数值。如果每个数字都相同则没有众数。

在numpy中有直接求总和、平均数、中位数、最大值、最小值的函数,但没有找到求众数的函数,所以自己实现了一个。以下用python计算书上第2章的习题1的代码。

import numpy as np
import operator
scores = [31, 24, 23, 25, 14, 25, 13, 12, 14, 23,
               32, 34, 43, 41, 21, 23, 26, 26, 34, 42,
               43, 25, 24, 23, 24, 44, 23, 14, 52,32,
               42, 44, 35, 28, 17, 21, 32, 42, 12, 34]

def findmode(values):
    bucket = {}
    for value in values:
        if bucket.has_key(value):
            bucket[value] += 1
        else:
            bucket.setdefault(value,1)
    bucket = sorted(bucket.iteritems(),key=operator.itemgetter(1),reverse=True)
    
    modes  = []
    for value in bucket:
        if len(modes) == 0:
            modes.append(value)
        else:
            temp = modes[len(modes)-1][1]
            if temp == value[1]:
                modes.append(value)
            else:
                break
    return modes

print 'max: \t', np.max(scores)
print 'min: \t', np.min(scores)
print 'sum: \t', np.sum(scores)
print 'mean:\t', np.mean(scores)
print 'median:\t', np.median(scores)
modes = findmode(scores)
print 'mode:\t', modes
运行输出结果如下:
max: 	52
min: 	12
sum: 	1137
mean:	28.425
median:	25.5
mode:	[(23, 5)]

三、理解变异性

变异性(variability)反映数值之间的不同。如三组数据(7,6,3,3,1)、(3,4,4,5,4)和(4,4,4,4,4),它们的均值都是4, 第一组数据变异性最大,第二组次之,第三组没有变异性。平均数和变异性可共同描述数据分布的特征,并说明数据分布之间的差异。变异性的三种量数:极差(range)、标准差(standard deviation,缩写s或SD)、方差(variance 标准差的平方)。这三组量数用于反映一组数据的变异性、散布或者离散度。

numpy的基本的数组统计方法

方法说明
sum求和
mean均值
std,var标准差和方差
min,max最小值和最大值
argmin,argmax最小值和最大值的索引
cumsum累积和
cumprod累积积
求极差、标准差、方差的python代码(接上一个例子))

print 'range: \t', np.max(scores) - np.min(scores)
print 'SD:  \t', np.std(scores)
print 'variance: \t', np.var(scores)

运行输出结果如下:

range: 	40
SD:  	10.3123409079
variance: 	106.344375

四、用图表说明数据

相对用于平均数和标准差这两个数字,图表能够更形象有效地描述数据分布特征和数据集的特征。

直方图

原始数据
4710312520
211312521
4414152621
4114162621
730172724
630172724
3532152923
3833192820
3534182921
3632162720
频数分布
组距频数
45~491
40~442
35~394
30~348
25~2910
20~2410
15~198
10~144
5~92
0~41
用python计算和画图,numpy 中的histogram可以计算直方图分布,matplotlib.pyplot中的hist可以计算直方图和画图。
data = [47,10,31,25,20,
        2,11,31,25,21,
        44,14,15,26,21,
        41,14,16,26,21,
        7,30,17,27,24,
        6,30,17,27,24,
        35,32,15,29,23,
        38,33,19,28,20,
        35,34,18,29,21,
        36,32,16,27,20]
a,b = np.histogram(data,bins=[0,5,10,15,20,25,30,35,40,45,50])
print a
print b
plt.hist(data,bins=[0,5,10,15,20,25,30,35,40,45,50])
plt.show()
输出
[ 1  2  4  8 10 10  8  4  2  1]
[ 0  5 10 15 20 25 30 35 40 45 50]

用matplotlib绘图模块可以绘制柱状图、条形图、曲线、饼图等各种图形。


版权声明:本文为hjh00原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。