数据描述主要有三部分:
- 集中趋势的测度
- 离散程度的测度
- 分布形态的测度
集中趋势的测度
平均数也叫做集中趋势量数(measures of central tendency),一般有三种形式:均值、中位数和众数。
- 均值(mean):数据组中所有数值的总和除以该组数值的个数。
- 中位数(median):一系列数据的中点。中位数对极值不敏感,均值对极值敏感。
- 众数(mode) :出现数据最多的数值。如果每个数字都相同则没有众数。
numpy
numpy的基本的数组统计方法
方法 | 说明 |
---|---|
sum | 求和 |
mean | 均值 |
std,var | 标准差和方差 |
min,max | 最小值和最大值 |
argmin,argmax | 最小值和最大值的索引 |
cumsum | 累积和 |
cumprod | 累积积 |
python3 代码实现
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 get_mode(arr):
mode = [];
arr_appear = dict((a, arr.count(a)) for a in arr); # 统计各个元素出现的次数
if max(arr_appear.values()) == 1: # 如果最大的出现为1
return; # 则没有众数
else:
for k, v in arr_appear.items():
# 否则,出现次数最大的数字,就是众数
if v == max(arr_appear.values()):
mode.append(k);
return mode;
print("mean number:",np.mean(scores))
print ('median:\t', np.median(scores))
print("mode nodes:",get_mode(scores))
>运行结果 >
mean number: 28.425
median: 25.5
mode nodes: [23]
离散程度的测度
- 方差
- 标准差
- 极差(最大值最小值)
- 四分位数四分位数(Quartile)是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。多应用于统计学中的箱线图绘制。
- 变异系数:变异性(variability)反映数值之间的不同。如三组数据(7,6,3,3,1)、(3,4,4,5,4)和(4,4,4,4,4),它们的均值都是4, 第一组数据变异性最大,第二组次之,第三组没有变异性。平均数和变异性可共同描述数据分布的特征,并说明数据分布之间的差异。变异性的三种量数:极差(range)、标准差(standard deviation,缩写s或SD)、方差(variance 标准差的平方)。这三组量数用于反映一组数据的变异性、散布或者离散度。
python3 代码实现(承接上边那部分代码)
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("std:\t",np.std(scores))
print ("var:\t",np,var(scores))
运行结果
max : 52
min: 12
sum: 1137
mean: 28.425
std: 10.3123409079
var: 106.344375
分布形态
偏度和峰度都是统计量
偏度Skewness(三阶) ——三阶中心距除以标准差的三次方
峰度Kurtosis (四阶) —— 概率密度在均值处峰值高低的特征,常定义四阶中心矩除以方差的平方,减去三;
- 偏度
- 峰度
python3 代码如下
import matplotlib.pyplot as plt
import math
import numpy as np
def calc(data):
n = len(data)
niu = 0.0
niu2 = 0.0
niu3 = 0.0
for a in data:
niu += a
niu2 += a**2
niu3 += a**3
niu/= n #这是求E(X)
niu2 /= n #这是E(X^2)
niu3 /= n #这是E(X^3)
sigma = math.sqrt(niu2 - niu*niu) #这是D(X)的开方,标准差
return [niu,sigma,niu3] #返回[E(X),标准差,E(X^3)]
def calc_stat(data):
[niu,sigma,niu3] = calc(data)
n = len(data)
niu4 = 0.0
for a in data:
a -= niu
niu4 += a ** 4
niu4 /= n
skew = (niu3 - 3*niu*sigma**2 - niu**3)/(sigma**3)
kurt = niu4/(sigma**2)
return [niu,sigma,skew,kurt] #返回了均值,标准差,偏度,峰度
if __name__== "__main__":
data = list(np.random.randn(10000))#关于此处的数组与列表
data2 = list(2*np.random.randn(10000))
data3 = [x for x in data if x> -0.5]
data4 = list(np.random.uniform(0,4,10000))
[niu,sigma,skew,kurt] = calc_stat(data)
[niu2,sigma2,skew2,kurt2] = calc_stat(data2)
[niu3,sigma3,skew3,kurt3] = calc_stat(data3)
[niu4,sigma4,skew4,kurt4] = calc_stat(data4)
print (niu,sigma,skew,kurt)
print (niu2,sigma2,skew2,kurt2)
print (niu3,sigma3,skew3,kurt3)
print (niu4,sigma4,skew4,kurt4)
info = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$'%(niu,sigma,skew,kurt)
info2 =r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$'%(niu2,sigma2,skew2,kurt2)
plt.text(1,0.38,info,bbox=dict(facecolor='red',alpha=0.25))
plt.text(1,0.35,info2,bbox=dict(facecolor='green',alpha=0.25))
#plt.text(x的位置,y的位置,面板内写的信息,标签框的属性=dict(facecolor='面板颜色',alpha='深浅度'))
plt.hist(data,50,normed=True,facecolor='r',alpha=0.9)
#hist直方图/箱式图(
#将data中的元素分到50个等间隔的范围内,返回每个范围内元素的个数作为一个行向量,
#50代表要分的元素的个数
#
#facecolor,alpha都是代表颜色的)
plt.hist(data2,80,normed=True,facecolor='g',alpha = 0.8)
plt.grid(True)
plt.show()
运行结果:
-0.00241190361881 1.0059141362583934 -0.00347353634748 3.02650097917 -0.0406145249329 1.9987755488361851 0.00397656086968 12.05297778 0.514274840973 0.6981234945311516 0.806392176818 1.67244275992 2.00400226754 1.13943015382368 0.00731046737307 2.37842465848