一、前言
早就接触到统计学的知识,一直想认真学一下,看过一些书,大多不能坚持。这种情况在我偶然看到《爱上统计学》一书时改变了,我把它看完了,而且觉得是看懂了。于是决定再看一遍,用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 | 累积积 |
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四、用图表说明数据
相对用于平均数和标准差这两个数字,图表能够更形象有效地描述数据分布特征和数据集的特征。
直方图
原始数据
| 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 |
| 组距 | 频数 |
|---|---|
| 45~49 | 1 |
| 40~44 | 2 |
| 35~39 | 4 |
| 30~34 | 8 |
| 25~29 | 10 |
| 20~24 | 10 |
| 15~19 | 8 |
| 10~14 | 4 |
| 5~9 | 2 |
| 0~4 | 1 |
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版权协议,转载请附上原文出处链接和本声明。